package org.infinispan.server.endpoint.deployments;
import static org.infinispan.server.endpoint.EndpointLogger.ROOT_LOGGER;
import java.lang.reflect.Constructor;
import java.util.List;
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;
public abstract class AbstractServerExtensionProcessor<T> implements DeploymentUnitProcessor {
@Override
public void deploy(DeploymentPhaseContext ctx) throws DeploymentUnitProcessingException {
DeploymentUnit deploymentUnit = ctx.getDeploymentUnit();
Module module = deploymentUnit.getAttachment(Attachments.MODULE);
ServicesAttachment servicesAttachment = deploymentUnit.getAttachment(Attachments.SERVICES);
if (module != null && servicesAttachment != null)
addServices(ctx, servicesAttachment, module);
}
private void addServices(DeploymentPhaseContext ctx, ServicesAttachment servicesAttachment, Module module) {
Class<T> serviceClass = getServiceClass();
List<String> services = servicesAttachment.getServiceImplementations(serviceClass.getName());
ModuleClassLoader classLoader = module.getClassLoader();
for (String serviceName : services) {
try {
Class<? extends T> clazz = classLoader.loadClass(serviceName).asSubclass(serviceClass);
Constructor<? extends T> ctor = clazz.getConstructor();
T instance = ctor.newInstance();
installService(ctx, serviceName, instance);
} catch (Exception e) {
ROOT_LOGGER.cannotInstantiateClass(serviceName, e);
}
}
}
public abstract Class<T> getServiceClass();
public abstract void installService(DeploymentPhaseContext ctx, String serviceName, T instance);
@Override
public void undeploy(DeploymentUnit context) {
// Deploy only adds services, so no need to do anything here
// since these services are automatically removed.
}
}