package org.jboss.as.clustering.infinispan.cs.deployment; import org.infinispan.persistence.spi.AdvancedCacheLoader; import org.infinispan.persistence.spi.AdvancedCacheWriter; import org.infinispan.persistence.spi.AdvancedLoadWriteStore; import org.infinispan.persistence.spi.CacheLoader; import org.infinispan.persistence.spi.CacheWriter; import org.infinispan.persistence.spi.ExternalStore; import org.infinispan.tasks.ServerTask; import org.jboss.as.server.deployment.Attachments; import org.jboss.as.server.deployment.DeploymentPhaseContext; import org.jboss.as.server.deployment.DeploymentUnit; import org.jboss.as.server.deployment.DeploymentUnitProcessingException; import org.jboss.as.server.deployment.DeploymentUnitProcessor; import org.jboss.as.server.deployment.ServicesAttachment; import org.jboss.as.server.deployment.module.ModuleDependency; import org.jboss.as.server.deployment.module.ModuleSpecification; import org.jboss.modules.Module; import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoader; /** * Adds dependency from deployed module to Infinispan core. * * @author Sebastian Laskawiec * @since 7.2 */ public class ServerExtensionDependenciesProcessor implements DeploymentUnitProcessor { private static final ModuleIdentifier API = ModuleIdentifier.create("org.infinispan"); private static final ModuleIdentifier TASKS_API = ModuleIdentifier.create("org.infinispan.tasks.api"); @Override public void deploy(DeploymentPhaseContext ctx) throws DeploymentUnitProcessingException { DeploymentUnit deploymentUnit = ctx.getDeploymentUnit(); if (hasServerTaskExtensions(deploymentUnit)) { addDependencies(deploymentUnit, API, TASKS_API); } else if (hasInfinispanExtensions(deploymentUnit)) { addDependencies(deploymentUnit, API); } } private void addDependencies(DeploymentUnit deploymentUnit, ModuleIdentifier... identifiers) { ModuleSpecification moduleSpec = deploymentUnit.getAttachment(Attachments.MODULE_SPECIFICATION); ModuleLoader moduleLoader = Module.getBootModuleLoader(); for (ModuleIdentifier identifier : identifiers) { moduleSpec.addSystemDependency(new ModuleDependency(moduleLoader, identifier, false, false, false, false)); } } private boolean hasInfinispanExtensions(DeploymentUnit deploymentUnit) { ServicesAttachment sa = deploymentUnit.getAttachment(Attachments.SERVICES); return sa != null && hasDeployableCache(sa); } private boolean hasServerTaskExtensions(DeploymentUnit deploymentUnit) { ServicesAttachment sa = deploymentUnit.getAttachment(Attachments.SERVICES); return sa != null && hasServerTasks(sa); } @Override public void undeploy(DeploymentUnit context) { // No-op } private boolean hasDeployableCache(ServicesAttachment sa) { return hasAdvancedCacheLoaders(sa) || hasAdvancedCacheWriters(sa) || hasAdvancedLoadWriteStores(sa) || hasCacheLoader(sa) || hasCacheWriter(sa) || hasExternalStores(sa); } private boolean hasServerTasks(ServicesAttachment servicesAttachment) { return hasExtension(servicesAttachment, ServerTask.class); } private boolean hasAdvancedCacheLoaders(ServicesAttachment servicesAttachment) { return hasExtension(servicesAttachment, AdvancedCacheLoader.class); } private boolean hasAdvancedCacheWriters(ServicesAttachment servicesAttachment) { return hasExtension(servicesAttachment, AdvancedCacheWriter.class); } private boolean hasAdvancedLoadWriteStores(ServicesAttachment servicesAttachment) { return hasExtension(servicesAttachment, AdvancedLoadWriteStore.class); } private boolean hasCacheLoader(ServicesAttachment servicesAttachment) { return hasExtension(servicesAttachment, CacheLoader.class); } private boolean hasCacheWriter(ServicesAttachment servicesAttachment) { return hasExtension(servicesAttachment, CacheWriter.class); } private boolean hasExternalStores(ServicesAttachment servicesAttachment) { return hasExtension(servicesAttachment, ExternalStore.class); } private boolean hasExtension(ServicesAttachment servicesAttachment, Class<?> extensionClass) { return !servicesAttachment.getServiceImplementations(extensionClass.getName()).isEmpty(); } }