package org.infinispan.server.infinispan.task; import java.lang.reflect.Constructor; import java.util.List; import org.infinispan.tasks.ServerTask; import org.jboss.as.clustering.infinispan.InfinispanLogger; import org.jboss.as.clustering.infinispan.InfinispanMessages; 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.modules.Module; import org.jboss.modules.ModuleClassLoader; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceController; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StopContext; import org.jboss.msc.value.InjectedValue; /** * Author: Michal Szynkiewicz, michal.l.szynkiewicz@gmail.com * Date: 1/19/16 * Time: 1:37 PM */ public class ServerTaskProcessor implements DeploymentUnitProcessor { public static final String EXTERNAL_TASK = "ExternalTask"; @Override public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException { DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit(); Module module = deploymentUnit.getAttachment(Attachments.MODULE); ServicesAttachment servicesAttachment = deploymentUnit.getAttachment(Attachments.SERVICES); if (module != null && servicesAttachment != null) addServices(phaseContext, servicesAttachment, module); } private void addServices(DeploymentPhaseContext ctx, ServicesAttachment servicesAttachment, Module module) { List<String> implementationNames = servicesAttachment.getServiceImplementations(ServerTask.class.getName()); ModuleClassLoader classLoader = module.getClassLoader(); for (String serviceClassName : implementationNames) { try { Class<? extends ServerTask> clazz = classLoader.loadClass(serviceClassName).asSubclass(ServerTask.class); Constructor<? extends ServerTask> ctor = clazz.getConstructor(); ServerTask instance = ctor.newInstance(); installService(ctx, serviceClassName, instance); } catch (Exception e) { throw InfinispanMessages.MESSAGES.unableToInstantiateClass(serviceClassName); } } } public final void installService(DeploymentPhaseContext ctx, String implementationClassName, ServerTask instance) { TaskManagerService service = new TaskManagerService(implementationClassName, instance); ServiceName extensionServiceName = ServiceName.JBOSS.append(EXTERNAL_TASK, implementationClassName.replaceAll("\\.", "_")); InfinispanLogger.ROOT_LOGGER.installingDeployedTaskService(implementationClassName); ServiceBuilder<ServerTask> serviceBuilder = ctx.getServiceTarget().addService(extensionServiceName, service); serviceBuilder.setInitialMode(ServiceController.Mode.ACTIVE); serviceBuilder.addDependency(ServerTaskRegistryService.SERVICE_NAME, ServerTaskRegistry.class, service.getDeployedTaskManager()); serviceBuilder.install(); } @Override public void undeploy(DeploymentUnit context) { } protected static class TaskManagerService implements Service<ServerTask> { protected final ServerTask extension; protected final String className; protected InjectedValue<ServerTaskRegistry> deployedTaskRegistry = new InjectedValue<>(); protected TaskManagerService(String className, ServerTask extension) { this.extension = extension; this.className = className; } @Override public void start(StartContext context) { InfinispanLogger.ROOT_LOGGER.registeringDeployedTask(className); deployedTaskRegistry.getValue().addDeployedTask(extension); } @Override public void stop(StopContext context) { InfinispanLogger.ROOT_LOGGER.unregisteringDeployedTask(className); deployedTaskRegistry.getValue().removeDeployedTask(extension.getName()); } public InjectedValue<ServerTaskRegistry> getDeployedTaskManager() { return deployedTaskRegistry; } @Override public ServerTask getValue() { return extension; } } }