package org.infinispan.server.endpoint.deployments;
import static org.infinispan.server.endpoint.EndpointLogger.ROOT_LOGGER;
import org.infinispan.commons.marshall.Marshaller;
import org.infinispan.server.endpoint.Constants;
import org.infinispan.server.endpoint.subsystem.ExtensionManagerService;
import org.jboss.as.server.deployment.DeploymentPhaseContext;
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.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
public class MarshallerExtensionProcessor extends AbstractServerExtensionProcessor<Marshaller> {
private final ServiceName extensionManagerServiceName;
public MarshallerExtensionProcessor(ServiceName extensionManagerServiceName) {
this.extensionManagerServiceName = extensionManagerServiceName;
}
@Override
public Class<Marshaller> getServiceClass() {
return Marshaller.class;
}
@Override
public void installService(DeploymentPhaseContext ctx, String serviceName, Marshaller instance) {
MarshallerService service = new MarshallerService(instance);
ServiceName extensionServiceName = Constants.DATAGRID.append(service.getServiceTypeName());
ServiceBuilder<Marshaller> serviceBuilder = ctx.getServiceTarget().addService(extensionServiceName, service);
serviceBuilder.setInitialMode(ServiceController.Mode.ACTIVE)
.addDependency(extensionManagerServiceName, ExtensionManagerService.class, service.getExtensionManager());
try {
serviceBuilder.install();
} catch (IllegalStateException e) {
ROOT_LOGGER.duplicateMarshallerDeployment(ctx.getDeploymentUnit().getName());
ROOT_LOGGER.debug("Marshaller already installed", e);
}
}
static class MarshallerService implements Service<Marshaller> {
private final Marshaller marshaller;
private final InjectedValue<ExtensionManagerService> extensionManager = new InjectedValue<>();
MarshallerService(Marshaller marshaller) {
assert marshaller != null : ROOT_LOGGER.nullVar(getServiceTypeName());
this.marshaller = marshaller;
}
public InjectedValue<ExtensionManagerService> getExtensionManager() {
return extensionManager;
}
@Override
public void start(StartContext context) throws StartException {
ROOT_LOGGER.debugf("Started marshaller service with marshaller = %s", marshaller);
extensionManager.getValue().setMarshaller(marshaller);
}
@Override
public void stop(StopContext context) {
ROOT_LOGGER.debugf("Stopped marshaller service with marshaller = %s", marshaller);
extensionManager.getValue().setMarshaller(null);
}
@Override
public Marshaller getValue() {
return marshaller;
}
public String getServiceTypeName() {
return "remote-event-marshaller";
}
}
}