package org.jboss.as.subsystem.test; import java.util.ArrayList; import java.util.List; import java.util.ServiceLoader; import java.util.concurrent.atomic.AtomicInteger; import org.jboss.as.controller.Extension; import org.jboss.as.controller.ModelController; import org.jboss.as.controller.ModelVersion; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.extension.ExtensionRegistry; import org.jboss.as.controller.operations.validation.OperationValidator; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.as.controller.services.path.PathManagerService; import org.jboss.as.controller.transform.SubsystemDescriptionDump; import org.jboss.as.model.test.ModelTestKernelServicesImpl; import org.jboss.as.model.test.ModelTestModelControllerService; import org.jboss.as.model.test.ModelTestOperationValidatorFilter; import org.jboss.as.model.test.ModelTestParser; import org.jboss.as.model.test.StringConfigurationPersister; import org.jboss.as.server.Services; import org.jboss.dmr.ModelNode; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceContainer; import org.jboss.msc.service.ServiceTarget; import org.wildfly.legacy.test.spi.subsystem.TestModelControllerFactory; /** * Allows access to the service container and the model controller * * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> */ public abstract class AbstractKernelServicesImpl extends ModelTestKernelServicesImpl<KernelServices> implements KernelServices { protected final String mainSubsystemName; protected final ExtensionRegistry extensionRegistry; protected final boolean registerTransformers; private static final AtomicInteger counter = new AtomicInteger(); protected AbstractKernelServicesImpl(ServiceContainer container, ModelTestModelControllerService controllerService, StringConfigurationPersister persister, ManagementResourceRegistration rootRegistration, OperationValidator operationValidator, String mainSubsystemName, ExtensionRegistry extensionRegistry, ModelVersion legacyModelVersion, boolean successfulBoot, Throwable bootError, boolean registerTransformers) { super(container, controllerService, persister, rootRegistration, operationValidator, legacyModelVersion, successfulBoot, bootError); this.mainSubsystemName = mainSubsystemName; this.extensionRegistry = extensionRegistry; this.registerTransformers = registerTransformers; } public static AbstractKernelServicesImpl create(Class<?> testClass, String mainSubsystemName, AdditionalInitialization additionalInit, ModelTestOperationValidatorFilter validateOpsFilter, ExtensionRegistry controllerExtensionRegistry, List<ModelNode> bootOperations, ModelTestParser testParser, Extension mainExtension, ModelVersion legacyModelVersion, boolean registerTransformers, boolean persistXml) throws Exception { ControllerInitializer controllerInitializer = additionalInit.createControllerInitializer(); PathManagerService pathManager = new PathManagerService() { }; controllerInitializer.setPathManger(pathManager); additionalInit.setupController(controllerInitializer); //Initialize the controller ServiceContainer container = ServiceContainer.Factory.create("subsystem-test" + (legacyModelVersion != null ? "-legacy-" : "-") + counter.incrementAndGet()); ServiceTarget target = container.subTarget(); List<ModelNode> extraOps = controllerInitializer.initializeBootOperations(); List<ModelNode> allOps = new ArrayList<ModelNode>(); if (extraOps != null) { allOps.addAll(extraOps); } allOps.addAll(bootOperations); StringConfigurationPersister persister = new StringConfigurationPersister(allOps, testParser, persistXml); controllerExtensionRegistry.setWriterRegistry(persister); controllerExtensionRegistry.setPathManager(pathManager); //Use the default implementation of test controller for the main controller, and for tests that don't have another one set up on the classpath TestModelControllerFactory testModelControllerFactory = new TestModelControllerFactory() { @Override public ModelTestModelControllerService create (Extension mainExtension, ControllerInitializer controllerInitializer, AdditionalInitialization additionalInit, ExtensionRegistry extensionRegistry, StringConfigurationPersister persister, ModelTestOperationValidatorFilter validateOpsFilter, boolean registerTransformers){ return TestModelControllerService.create(mainExtension, controllerInitializer, additionalInit, extensionRegistry, persister, validateOpsFilter, registerTransformers); } }; if (legacyModelVersion != null) { ServiceLoader<TestModelControllerFactory> factoryLoader = ServiceLoader.load(TestModelControllerFactory.class, AbstractKernelServicesImpl.class.getClassLoader()); for (TestModelControllerFactory factory : factoryLoader) { testModelControllerFactory = factory; break; } } ModelTestModelControllerService svc = testModelControllerFactory.create(mainExtension, controllerInitializer, additionalInit, controllerExtensionRegistry, persister, validateOpsFilter, registerTransformers); ServiceBuilder<ModelController> builder = target.addService(Services.JBOSS_SERVER_CONTROLLER, svc); builder.addDependency(PathManagerService.SERVICE_NAME); // ensure this is up before the ModelControllerService, as it would be in a real server builder.install(); target.addService(PathManagerService.SERVICE_NAME, pathManager).install(); additionalInit.addExtraServices(target); //sharedState = svc.state; svc.waitForSetup(); //processState.setRunning(); AbstractKernelServicesImpl kernelServices = legacyModelVersion == null ? new MainKernelServicesImpl(container, svc, persister, svc.getRootRegistration(), new OperationValidator(svc.getRootRegistration()), mainSubsystemName, controllerExtensionRegistry, legacyModelVersion, svc.isSuccessfulBoot(), svc.getBootError(), registerTransformers, testClass) : new LegacyKernelServicesImpl(container, svc, persister, svc.getRootRegistration() , new OperationValidator(svc.getRootRegistration()), mainSubsystemName, controllerExtensionRegistry, legacyModelVersion, svc.isSuccessfulBoot(), svc.getBootError(), registerTransformers); return kernelServices; } public ModelNode readFullModelDescription(ModelNode pathAddress) { final PathAddress addr = PathAddress.pathAddress(pathAddress); ManagementResourceRegistration reg = (ManagementResourceRegistration)getRootRegistration().getSubModel(addr); try { //This is compiled against the current version of WildFly return SubsystemDescriptionDump.readFullModelDescription(addr, reg); } catch (NoSuchMethodError e) { throw e; } } @Override public ModelNode readTransformedModel(ModelVersion modelVersion) { return readTransformedModel(modelVersion, true); } ExtensionRegistry getExtensionRegistry() { return extensionRegistry; } protected void addLegacyKernelService(ModelVersion modelVersion, KernelServices legacyServices) { super.addLegacyKernelService(modelVersion, legacyServices); } }