package org.infinispan.server.endpoint.deployments;
import static org.infinispan.server.endpoint.EndpointLogger.ROOT_LOGGER;
import java.util.List;
import org.infinispan.server.endpoint.Constants;
import org.infinispan.server.endpoint.subsystem.ExtensionManagerService;
import org.jboss.as.server.deployment.Attachments;
import org.jboss.as.server.deployment.DeploymentPhaseContext;
import org.jboss.as.server.deployment.annotation.CompositeIndex;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationTarget;
import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;
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.value.InjectedValue;
public abstract class AbstractNamedFactoryExtensionProcessor<T> extends AbstractServerExtensionProcessor<T> {
private static final DotName NAMED_FACTORY = DotName.createSimple("org.infinispan.filter.NamedFactory");
private final ServiceName extensionManagerServiceName;
protected AbstractNamedFactoryExtensionProcessor(ServiceName extensionManagerServiceName) {
this.extensionManagerServiceName = extensionManagerServiceName;
}
@Override
public final void installService(DeploymentPhaseContext ctx, String serviceName, T instance) {
CompositeIndex index = ctx.getDeploymentUnit().getAttachment(Attachments.COMPOSITE_ANNOTATION_INDEX);
List<AnnotationInstance> annotations = index.getAnnotations(NAMED_FACTORY);
if (annotations.isEmpty())
ROOT_LOGGER.noFactoryName(getServiceClass().getName());
else {
for (AnnotationInstance annotation : annotations) {
AnnotationTarget annotationTarget = annotation.target();
if (annotationTarget instanceof ClassInfo) {
ClassInfo classInfo = (ClassInfo) annotationTarget;
DotName target = DotName.createSimple(serviceName);
if (classInfo.name().equals(target)) {
String nameValue = annotation.value("name").asString();
AbstractExtensionManagerService<T> service = createService(nameValue, instance);
ServiceName extensionServiceName = Constants.DATAGRID.append(service.getServiceTypeName(), nameValue.replaceAll("\\.", "_"));
ServiceBuilder<T> serviceBuilder = ctx.getServiceTarget().addService(extensionServiceName, service);
serviceBuilder.setInitialMode(ServiceController.Mode.ACTIVE)
.addDependency(extensionManagerServiceName, ExtensionManagerService.class, service.getExtensionManager());
serviceBuilder.install();
}
}
}
}
}
public abstract AbstractExtensionManagerService<T> createService(String name, T instance);
public static abstract class AbstractExtensionManagerService<T> implements Service<T> {
protected final String name;
protected final T extension;
protected final InjectedValue<ExtensionManagerService> extensionManager = new InjectedValue<>();
protected AbstractExtensionManagerService(String name, T extension) {
assert name != null : ROOT_LOGGER.nullVar("name");
assert extension != null : ROOT_LOGGER.nullVar(getServiceTypeName());
this.extension = extension;
this.name = name;
}
public InjectedValue<ExtensionManagerService> getExtensionManager() {
return extensionManager;
}
public abstract String getServiceTypeName();
}
}