PageRenderTime 52ms CodeModel.GetById 23ms RepoModel.GetById 1ms app.codeStats 0ms

/remote-query/remote-query-server/src/main/java/org/infinispan/query/remote/impl/LifecycleManager.java

https://github.com/pferraro/infinispan
Java | 193 lines | 149 code | 30 blank | 14 comment | 11 complexity | 9c6e73f84523587796891cc86b7a9fad MD5 | raw file
  1. package org.infinispan.query.remote.impl;
  2. import static org.infinispan.commons.dataconversion.MediaType.APPLICATION_JSON;
  3. import static org.infinispan.commons.dataconversion.MediaType.APPLICATION_OBJECT;
  4. import static org.infinispan.query.remote.client.ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME;
  5. import java.util.Map;
  6. import javax.management.ObjectName;
  7. import org.infinispan.AdvancedCache;
  8. import org.infinispan.Cache;
  9. import org.infinispan.commons.CacheException;
  10. import org.infinispan.commons.dataconversion.ByteArrayWrapper;
  11. import org.infinispan.commons.dataconversion.MediaType;
  12. import org.infinispan.commons.dataconversion.Transcoder;
  13. import org.infinispan.commons.marshall.AdvancedExternalizer;
  14. import org.infinispan.configuration.cache.Configuration;
  15. import org.infinispan.configuration.cache.ContentTypeConfiguration;
  16. import org.infinispan.configuration.global.GlobalConfiguration;
  17. import org.infinispan.factories.ComponentRegistry;
  18. import org.infinispan.factories.GlobalComponentRegistry;
  19. import org.infinispan.factories.annotations.InfinispanModule;
  20. import org.infinispan.factories.impl.BasicComponentRegistry;
  21. import org.infinispan.jmx.CacheManagerJmxRegistration;
  22. import org.infinispan.lifecycle.ModuleLifecycle;
  23. import org.infinispan.manager.EmbeddedCacheManager;
  24. import org.infinispan.marshall.core.EncoderRegistry;
  25. import org.infinispan.marshall.protostream.impl.SerializationContextRegistry;
  26. import org.infinispan.protostream.SerializationContext;
  27. import org.infinispan.query.backend.KeyTransformationHandler;
  28. import org.infinispan.query.core.stats.IndexStatistics;
  29. import org.infinispan.query.core.stats.impl.LocalQueryStatistics;
  30. import org.infinispan.query.impl.ComponentRegistryUtils;
  31. import org.infinispan.query.impl.EntityLoader;
  32. import org.infinispan.query.remote.ProtobufMetadataManager;
  33. import org.infinispan.query.remote.client.impl.Externalizers.QueryRequestExternalizer;
  34. import org.infinispan.query.remote.client.impl.MarshallerRegistration;
  35. import org.infinispan.query.remote.client.impl.QueryRequest;
  36. import org.infinispan.query.remote.impl.filter.ContinuousQueryResultExternalizer;
  37. import org.infinispan.query.remote.impl.filter.FilterResultExternalizer;
  38. import org.infinispan.query.remote.impl.filter.IckleBinaryProtobufFilterAndConverter;
  39. import org.infinispan.query.remote.impl.filter.IckleContinuousQueryProtobufCacheEventFilterConverter;
  40. import org.infinispan.query.remote.impl.filter.IckleProtobufCacheEventFilterConverter;
  41. import org.infinispan.query.remote.impl.filter.IckleProtobufFilterAndConverter;
  42. import org.infinispan.query.remote.impl.persistence.PersistenceContextInitializerImpl;
  43. import org.infinispan.query.stats.impl.LocalIndexStatistics;
  44. import org.infinispan.registry.InternalCacheRegistry;
  45. import org.infinispan.search.mapper.mapping.SearchMapping;
  46. import org.infinispan.search.mapper.mapping.SearchMappingCommonBuilding;
  47. /**
  48. * Initializes components for remote query. Each cache manager has its own instance of this class during its lifetime.
  49. *
  50. * @author anistor@redhat.com
  51. * @since 6.0
  52. */
  53. @InfinispanModule(name = "remote-query-server", requiredModules = {"core", "query", "server-core"})
  54. public final class LifecycleManager implements ModuleLifecycle {
  55. @Override
  56. public void cacheManagerStarting(GlobalComponentRegistry gcr, GlobalConfiguration globalCfg) {
  57. Map<Integer, AdvancedExternalizer<?>> externalizerMap = globalCfg.serialization().advancedExternalizers();
  58. externalizerMap.put(ExternalizerIds.ICKLE_PROTOBUF_CACHE_EVENT_FILTER_CONVERTER, new IckleProtobufCacheEventFilterConverter.Externalizer());
  59. externalizerMap.put(ExternalizerIds.ICKLE_PROTOBUF_FILTER_AND_CONVERTER, new IckleProtobufFilterAndConverter.Externalizer());
  60. externalizerMap.put(ExternalizerIds.ICKLE_CONTINUOUS_QUERY_CACHE_EVENT_FILTER_CONVERTER, new IckleContinuousQueryProtobufCacheEventFilterConverter.Externalizer());
  61. externalizerMap.put(ExternalizerIds.ICKLE_BINARY_PROTOBUF_FILTER_AND_CONVERTER, new IckleBinaryProtobufFilterAndConverter.Externalizer());
  62. externalizerMap.put(ExternalizerIds.ICKLE_CONTINUOUS_QUERY_RESULT, new ContinuousQueryResultExternalizer());
  63. externalizerMap.put(ExternalizerIds.ICKLE_FILTER_RESULT, new FilterResultExternalizer());
  64. BasicComponentRegistry bcr = gcr.getComponent(BasicComponentRegistry.class);
  65. SerializationContextRegistry ctxRegistry = gcr.getComponent(SerializationContextRegistry.class);
  66. ctxRegistry.addContextInitializer(SerializationContextRegistry.MarshallerType.PERSISTENCE, new PersistenceContextInitializerImpl());
  67. ctxRegistry.addContextInitializer(SerializationContextRegistry.MarshallerType.GLOBAL, MarshallerRegistration.INSTANCE);
  68. initProtobufMetadataManager(bcr);
  69. EmbeddedCacheManager cacheManager = gcr.getComponent(EmbeddedCacheManager.class);
  70. cacheManager.getClassAllowList()
  71. .addClasses(QueryRequest.class, QueryRequestExternalizer.class);
  72. }
  73. private void initProtobufMetadataManager(BasicComponentRegistry bcr) {
  74. ProtobufMetadataManagerImpl protobufMetadataManager = new ProtobufMetadataManagerImpl();
  75. bcr.registerComponent(ProtobufMetadataManager.class, protobufMetadataManager, true).running();
  76. EncoderRegistry encoderRegistry = bcr.getComponent(EncoderRegistry.class).wired();
  77. encoderRegistry.registerWrapper(ProtobufWrapper.INSTANCE);
  78. }
  79. @Override
  80. public void cacheManagerStarted(GlobalComponentRegistry gcr) {
  81. BasicComponentRegistry bcr = gcr.getComponent(BasicComponentRegistry.class);
  82. ProtobufMetadataManagerImpl protobufMetadataManager =
  83. (ProtobufMetadataManagerImpl) bcr.getComponent(ProtobufMetadataManager.class).running();
  84. // if not already running, start it
  85. protobufMetadataManager.getCache();
  86. GlobalConfiguration globalCfg = gcr.getGlobalConfiguration();
  87. if (globalCfg.jmx().enabled()) {
  88. registerProtobufMetadataManagerMBean(protobufMetadataManager, globalCfg, bcr);
  89. }
  90. }
  91. private void registerProtobufMetadataManagerMBean(ProtobufMetadataManagerImpl protobufMetadataManager,
  92. GlobalConfiguration globalConfig, BasicComponentRegistry bcr) {
  93. CacheManagerJmxRegistration jmxRegistration = bcr.getComponent(CacheManagerJmxRegistration.class).running();
  94. try {
  95. jmxRegistration.registerMBean(protobufMetadataManager, getRemoteQueryGroupName(globalConfig));
  96. } catch (Exception e) {
  97. throw new CacheException("Unable to register ProtobufMetadataManager MBean", e);
  98. }
  99. }
  100. private String getRemoteQueryGroupName(GlobalConfiguration globalConfig) {
  101. return "type=RemoteQuery,name=" + ObjectName.quote(globalConfig.cacheManagerName());
  102. }
  103. /**
  104. * Registers the interceptor in the ___protobuf_metadata cache before it gets started. Also creates query components
  105. * for user caches.
  106. */
  107. @Override
  108. public void cacheStarting(ComponentRegistry cr, Configuration cfg, String cacheName) {
  109. BasicComponentRegistry gcr = cr.getGlobalComponentRegistry().getComponent(BasicComponentRegistry.class);
  110. LocalQueryStatistics queryStatistics = cr.getComponent(LocalQueryStatistics.class);
  111. if (PROTOBUF_METADATA_CACHE_NAME.equals(cacheName)) {
  112. // a protobuf metadata cache is starting, need to register the interceptor
  113. ProtobufMetadataManagerImpl protobufMetadataManager =
  114. (ProtobufMetadataManagerImpl) gcr.getComponent(ProtobufMetadataManager.class).running();
  115. protobufMetadataManager.addProtobufMetadataManagerInterceptor(cr.getComponent(BasicComponentRegistry.class));
  116. }
  117. InternalCacheRegistry icr = gcr.getComponent(InternalCacheRegistry.class).running();
  118. if (!icr.isInternalCache(cacheName)) {
  119. // a stop dependency must be added for each non-internal cache
  120. ProtobufMetadataManagerImpl protobufMetadataManager =
  121. (ProtobufMetadataManagerImpl) gcr.getComponent(ProtobufMetadataManager.class).running();
  122. protobufMetadataManager.addCacheDependency(cacheName);
  123. // a remote query manager must be added for each non-internal cache
  124. SerializationContext serCtx = protobufMetadataManager.getSerializationContext();
  125. RemoteQueryManager remoteQueryManager = buildQueryManager(cfg, serCtx, cr);
  126. cr.registerComponent(remoteQueryManager, RemoteQueryManager.class);
  127. SearchMappingCommonBuilding commonBuilding = cr.getComponent(SearchMappingCommonBuilding.class);
  128. SearchMapping searchMapping = cr.getComponent(SearchMapping.class);
  129. if (commonBuilding != null && searchMapping == null) {
  130. AdvancedCache<?, ?> cache = cr.getComponent(Cache.class).getAdvancedCache().withStorageMediaType()
  131. .withWrapping(ByteArrayWrapper.class, ProtobufWrapper.class);
  132. KeyTransformationHandler keyTransformationHandler = ComponentRegistryUtils.getKeyTransformationHandler(cache);
  133. EntityLoader<?> entityLoader = new EntityLoader<>(queryStatistics, cache, keyTransformationHandler);
  134. searchMapping = new LazySearchMapping(commonBuilding, entityLoader, serCtx, cache, protobufMetadataManager);
  135. cr.registerComponent(searchMapping, SearchMapping.class);
  136. BasicComponentRegistry bcr = cr.getComponent(BasicComponentRegistry.class);
  137. bcr.replaceComponent(IndexStatistics.class.getName(), new LocalIndexStatistics(), true);
  138. bcr.rewire();
  139. }
  140. }
  141. }
  142. private RemoteQueryManager buildQueryManager(Configuration cfg, SerializationContext ctx, ComponentRegistry cr) {
  143. ContentTypeConfiguration valueEncoding = cfg.encoding().valueDataType();
  144. MediaType valueStorageMediaType = valueEncoding.mediaType();
  145. AdvancedCache<?, ?> cache = cr.getComponent(Cache.class).getAdvancedCache();
  146. MediaType storageMediaType = cache.getValueDataConversion().getStorageMediaType();
  147. QuerySerializers querySerializers = buildQuerySerializers(cr, storageMediaType);
  148. boolean isObjectStorage = valueStorageMediaType != null && valueStorageMediaType.match(APPLICATION_OBJECT);
  149. if (isObjectStorage) return new ObjectRemoteQueryManager(cache, cr, querySerializers);
  150. return new ProtobufRemoteQueryManager(cache, cr, ctx, querySerializers);
  151. }
  152. private QuerySerializers buildQuerySerializers(ComponentRegistry cr, MediaType storageMediaType) {
  153. EncoderRegistry encoderRegistry = cr.getGlobalComponentRegistry().getComponent(EncoderRegistry.class);
  154. QuerySerializers querySerializers = new QuerySerializers();
  155. DefaultQuerySerializer defaultQuerySerializer = new DefaultQuerySerializer(encoderRegistry);
  156. querySerializers.addSerializer(MediaType.MATCH_ALL, defaultQuerySerializer);
  157. if (encoderRegistry.isConversionSupported(storageMediaType, APPLICATION_JSON)) {
  158. Transcoder jsonStorage = encoderRegistry.getTranscoder(APPLICATION_JSON, storageMediaType);
  159. querySerializers.addSerializer(APPLICATION_JSON, new JsonQuerySerializer(storageMediaType, jsonStorage));
  160. }
  161. return querySerializers;
  162. }
  163. }