PageRenderTime 56ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://github.com/alesj/infinispan
Java | 188 lines | 147 code | 28 blank | 13 comment | 9 complexity | 19d72deb76f5a08e11aff8c13262487d 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.MediaType;
  11. import org.infinispan.commons.dataconversion.Transcoder;
  12. import org.infinispan.commons.logging.LogFactory;
  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.QueryInterceptor;
  28. import org.infinispan.query.remote.ProtobufMetadataManager;
  29. import org.infinispan.query.remote.client.impl.Externalizers.QueryRequestExternalizer;
  30. import org.infinispan.query.remote.client.impl.MarshallerRegistration;
  31. import org.infinispan.query.remote.client.impl.QueryRequest;
  32. import org.infinispan.query.remote.impl.filter.ContinuousQueryResultExternalizer;
  33. import org.infinispan.query.remote.impl.filter.FilterResultExternalizer;
  34. import org.infinispan.query.remote.impl.filter.IckleBinaryProtobufFilterAndConverter;
  35. import org.infinispan.query.remote.impl.filter.IckleContinuousQueryProtobufCacheEventFilterConverter;
  36. import org.infinispan.query.remote.impl.filter.IckleProtobufCacheEventFilterConverter;
  37. import org.infinispan.query.remote.impl.filter.IckleProtobufFilterAndConverter;
  38. import org.infinispan.query.remote.impl.indexing.ProtobufValueWrapperSearchWorkCreator;
  39. import org.infinispan.query.remote.impl.logging.Log;
  40. import org.infinispan.query.remote.impl.persistence.PersistenceContextInitializerImpl;
  41. import org.infinispan.registry.InternalCacheRegistry;
  42. /**
  43. * Initializes components for remote query. Each cache manager has its own instance of this class during its lifetime.
  44. *
  45. * @author anistor@redhat.com
  46. * @since 6.0
  47. */
  48. @InfinispanModule(name = "remote-query-server", requiredModules = {"core", "query", "server-core"})
  49. public final class LifecycleManager implements ModuleLifecycle {
  50. private static final Log log = LogFactory.getLog(LifecycleManager.class, Log.class);
  51. @Override
  52. public void cacheManagerStarting(GlobalComponentRegistry gcr, GlobalConfiguration globalCfg) {
  53. Map<Integer, AdvancedExternalizer<?>> externalizerMap = globalCfg.serialization().advancedExternalizers();
  54. externalizerMap.put(ExternalizerIds.ICKLE_PROTOBUF_CACHE_EVENT_FILTER_CONVERTER, new IckleProtobufCacheEventFilterConverter.Externalizer());
  55. externalizerMap.put(ExternalizerIds.ICKLE_PROTOBUF_FILTER_AND_CONVERTER, new IckleProtobufFilterAndConverter.Externalizer());
  56. externalizerMap.put(ExternalizerIds.ICKLE_CONTINUOUS_QUERY_CACHE_EVENT_FILTER_CONVERTER, new IckleContinuousQueryProtobufCacheEventFilterConverter.Externalizer());
  57. externalizerMap.put(ExternalizerIds.ICKLE_BINARY_PROTOBUF_FILTER_AND_CONVERTER, new IckleBinaryProtobufFilterAndConverter.Externalizer());
  58. externalizerMap.put(ExternalizerIds.ICKLE_CONTINUOUS_QUERY_RESULT, new ContinuousQueryResultExternalizer());
  59. externalizerMap.put(ExternalizerIds.ICKLE_FILTER_RESULT, new FilterResultExternalizer());
  60. BasicComponentRegistry bcr = gcr.getComponent(BasicComponentRegistry.class);
  61. SerializationContextRegistry ctxRegistry = gcr.getComponent(SerializationContextRegistry.class);
  62. ctxRegistry.addContextInitializer(SerializationContextRegistry.MarshallerType.PERSISTENCE, new PersistenceContextInitializerImpl());
  63. ctxRegistry.addContextInitializer(SerializationContextRegistry.MarshallerType.GLOBAL, MarshallerRegistration.INSTANCE);
  64. initProtobufMetadataManager(bcr);
  65. EmbeddedCacheManager cacheManager = gcr.getComponent(EmbeddedCacheManager.class);
  66. cacheManager.getClassWhiteList()
  67. .addClasses(QueryRequest.class, QueryRequestExternalizer.class);
  68. }
  69. private void initProtobufMetadataManager(BasicComponentRegistry bcr) {
  70. ProtobufMetadataManagerImpl protobufMetadataManager = new ProtobufMetadataManagerImpl();
  71. bcr.registerComponent(ProtobufMetadataManager.class, protobufMetadataManager, true).running();
  72. EncoderRegistry encoderRegistry = bcr.getComponent(EncoderRegistry.class).wired();
  73. encoderRegistry.registerWrapper(ProtobufWrapper.INSTANCE);
  74. }
  75. @Override
  76. public void cacheManagerStarted(GlobalComponentRegistry gcr) {
  77. BasicComponentRegistry bcr = gcr.getComponent(BasicComponentRegistry.class);
  78. ProtobufMetadataManagerImpl protobufMetadataManager =
  79. (ProtobufMetadataManagerImpl) bcr.getComponent(ProtobufMetadataManager.class).running();
  80. // if not already running, start it
  81. protobufMetadataManager.getCache();
  82. GlobalConfiguration globalCfg = gcr.getGlobalConfiguration();
  83. if (globalCfg.statistics()) {
  84. registerProtobufMetadataManagerMBean(protobufMetadataManager, globalCfg, bcr);
  85. }
  86. }
  87. private void registerProtobufMetadataManagerMBean(ProtobufMetadataManagerImpl protobufMetadataManager,
  88. GlobalConfiguration globalConfig, BasicComponentRegistry bcr) {
  89. CacheManagerJmxRegistration jmxRegistration = bcr.getComponent(CacheManagerJmxRegistration.class).running();
  90. try {
  91. jmxRegistration.registerMBean(protobufMetadataManager, getRemoteQueryGroupName(globalConfig));
  92. } catch (Exception e) {
  93. throw new CacheException("Unable to register ProtobufMetadataManager MBean", e);
  94. }
  95. }
  96. private String getRemoteQueryGroupName(GlobalConfiguration globalConfig) {
  97. return "type=RemoteQuery,name=" + ObjectName.quote(globalConfig.cacheManagerName());
  98. }
  99. /**
  100. * Registers the interceptor in the cache before it gets started.
  101. */
  102. @Override
  103. public void cacheStarting(ComponentRegistry cr, Configuration cfg, String cacheName) {
  104. BasicComponentRegistry gcr = cr.getGlobalComponentRegistry().getComponent(BasicComponentRegistry.class);
  105. if (PROTOBUF_METADATA_CACHE_NAME.equals(cacheName)) {
  106. // a protobuf metadata cache is starting, need to register the interceptor
  107. ProtobufMetadataManagerImpl protobufMetadataManager =
  108. (ProtobufMetadataManagerImpl) gcr.getComponent(ProtobufMetadataManager.class).running();
  109. protobufMetadataManager.addProtobufMetadataManagerInterceptor(cr.getComponent(BasicComponentRegistry.class));
  110. }
  111. InternalCacheRegistry icr = gcr.getComponent(InternalCacheRegistry.class).running();
  112. if (!icr.isInternalCache(cacheName)) {
  113. // a stop dependency must be added for each non-internal cache
  114. ProtobufMetadataManagerImpl protobufMetadataManager =
  115. (ProtobufMetadataManagerImpl) gcr.getComponent(ProtobufMetadataManager.class).running();
  116. protobufMetadataManager.addCacheDependency(cacheName);
  117. // a remote query manager must be added for each non-internal cache
  118. SerializationContext serCtx = protobufMetadataManager.getSerializationContext();
  119. RemoteQueryManager remoteQueryManager = buildQueryManager(cfg, serCtx, cr);
  120. cr.registerComponent(remoteQueryManager, RemoteQueryManager.class);
  121. }
  122. }
  123. private RemoteQueryManager buildQueryManager(Configuration cfg, SerializationContext ctx, ComponentRegistry cr) {
  124. ContentTypeConfiguration valueEncoding = cfg.encoding().valueDataType();
  125. MediaType valueStorageMediaType = valueEncoding.mediaType();
  126. AdvancedCache<?, ?> cache = cr.getComponent(Cache.class).getAdvancedCache();
  127. MediaType storageMediaType = cache.getValueDataConversion().getStorageMediaType();
  128. QuerySerializers querySerializers = buildQuerySerializers(cr, storageMediaType);
  129. boolean isObjectStorage = valueStorageMediaType != null && valueStorageMediaType.match(APPLICATION_OBJECT);
  130. if (isObjectStorage) return new ObjectRemoteQueryManager(cache, cr, querySerializers);
  131. return new ProtobufRemoteQueryManager(cache, cr, ctx, querySerializers);
  132. }
  133. private QuerySerializers buildQuerySerializers(ComponentRegistry cr, MediaType storageMediaType) {
  134. EncoderRegistry encoderRegistry = cr.getGlobalComponentRegistry().getComponent(EncoderRegistry.class);
  135. QuerySerializers querySerializers = new QuerySerializers();
  136. DefaultQuerySerializer defaultQuerySerializer = new DefaultQuerySerializer(encoderRegistry);
  137. querySerializers.addSerializer(MediaType.MATCH_ALL, defaultQuerySerializer);
  138. if (encoderRegistry.isConversionSupported(storageMediaType, APPLICATION_JSON)) {
  139. Transcoder jsonStorage = encoderRegistry.getTranscoder(APPLICATION_JSON, storageMediaType);
  140. Transcoder jsonObject = encoderRegistry.getTranscoder(APPLICATION_JSON, APPLICATION_OBJECT);
  141. querySerializers.addSerializer(APPLICATION_JSON, new JsonQuerySerializer(storageMediaType, jsonStorage, jsonObject));
  142. }
  143. return querySerializers;
  144. }
  145. @Override
  146. public void cacheStarted(ComponentRegistry cr, String cacheName) {
  147. GlobalComponentRegistry gcr = cr.getGlobalComponentRegistry();
  148. InternalCacheRegistry icr = gcr.getComponent(InternalCacheRegistry.class);
  149. if (!icr.isInternalCache(cacheName)) {
  150. Configuration cfg = cr.getComponent(Configuration.class);
  151. if (cfg.indexing().index().isEnabled()) {
  152. ProtobufMetadataManagerImpl protobufMetadataManager = (ProtobufMetadataManagerImpl) gcr.getComponent(ProtobufMetadataManager.class);
  153. SerializationContext serCtx = protobufMetadataManager.getSerializationContext();
  154. log.debugf("Wrapping the SearchWorkCreator for indexed cache %s", cacheName);
  155. QueryInterceptor queryInterceptor = cr.getComponent(QueryInterceptor.class);
  156. queryInterceptor.setSearchWorkCreator(new ProtobufValueWrapperSearchWorkCreator(queryInterceptor.getSearchWorkCreator(), serCtx).get());
  157. }
  158. }
  159. }
  160. }