diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonRequirement.java b/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonRequirement.java index 2b232fb9dcf4..de285b1fdce7 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonRequirement.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonRequirement.java @@ -24,6 +24,7 @@ import javax.management.MBeanServer; +import org.jboss.as.controller.services.path.PathManager; import org.jboss.as.naming.NamingStore; import org.jboss.as.naming.service.NamingService; import org.wildfly.clustering.service.Requirement; @@ -35,6 +36,7 @@ public enum CommonRequirement implements Requirement, ServiceNameFactoryProvider { MBEAN_SERVER("org.wildfly.management.jmx", MBeanServer.class), NAMING_STORE(NamingService.CAPABILITY_NAME, NamingStore.class), + PATH_MANAGER("org.wildfly.management.path-manager", PathManager.class), ; private final String name; private final Class type; diff --git a/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonUnaryRequirement.java b/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonUnaryRequirement.java index 65e8949d4222..aa0e17f41480 100644 --- a/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonUnaryRequirement.java +++ b/clustering/common/src/main/java/org/jboss/as/clustering/controller/CommonUnaryRequirement.java @@ -41,6 +41,7 @@ public enum CommonUnaryRequirement implements UnaryRequirement, UnaryServiceName DATA_SOURCE("org.wildfly.data-source", DataSource.class), KEY_STORE("org.wildfly.security.key-store", KeyStore.class), OUTBOUND_SOCKET_BINDING("org.wildfly.network.outbound-socket-binding", OutboundSocketBinding.class), + PATH("org.wildfly.management.path", String.class), SOCKET_BINDING("org.wildfly.network.socket-binding", SocketBinding.class), SSL_CONTEXT("org.wildfly.security.ssl-context", SSLContext.class), ; diff --git a/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreBuilder.java b/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreBuilder.java index 4c30e96e9ae9..d8217502f322 100644 --- a/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreBuilder.java +++ b/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreBuilder.java @@ -31,26 +31,27 @@ import org.infinispan.configuration.cache.PersistenceConfiguration; import org.infinispan.configuration.cache.SingleFileStoreConfiguration; import org.infinispan.configuration.cache.SingleFileStoreConfigurationBuilder; +import org.jboss.as.clustering.controller.CommonRequirement; import org.jboss.as.clustering.dmr.ModelNodes; import org.jboss.as.controller.OperationContext; import org.jboss.as.controller.OperationFailedException; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.services.path.PathManager; -import org.jboss.as.controller.services.path.PathManagerService; import org.jboss.dmr.ModelNode; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceTarget; -import org.jboss.msc.value.InjectedValue; import org.wildfly.clustering.service.Builder; +import org.wildfly.clustering.service.InjectedValueDependency; +import org.wildfly.clustering.service.ValueDependency; /** * @author Paul Ferraro */ public class FileStoreBuilder extends StoreBuilder { - private final InjectedValue pathManager = new InjectedValue<>(); private final String containerName; + private volatile ValueDependency pathManager; private volatile String relativePath; private volatile String relativeTo; @@ -61,11 +62,12 @@ public class FileStoreBuilder extends StoreBuilder build(ServiceTarget target) { - return super.build(target).addDependency(PathManagerService.SERVICE_NAME, PathManager.class, this.pathManager); + return this.pathManager.register(super.build(target)); } @Override public Builder configure(OperationContext context, ModelNode model) throws OperationFailedException { + this.pathManager = new InjectedValueDependency<>(CommonRequirement.PATH_MANAGER.getServiceName(context), PathManager.class); this.relativePath = ModelNodes.optionalString(RELATIVE_PATH.resolveModelAttribute(context, model)).orElse(InfinispanExtension.SUBSYSTEM_NAME + File.separatorChar + this.containerName); this.relativeTo = RELATIVE_TO.resolveModelAttribute(context, model).asString(); return super.configure(context, model); diff --git a/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreResourceDefinition.java b/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreResourceDefinition.java index 66dbe5e91345..1d1e1a4bf7ee 100644 --- a/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreResourceDefinition.java +++ b/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/FileStoreResourceDefinition.java @@ -22,16 +22,26 @@ package org.jboss.as.clustering.infinispan.subsystem; +import java.util.function.UnaryOperator; +import java.util.stream.Stream; + +import org.jboss.as.clustering.controller.CapabilityReference; +import org.jboss.as.clustering.controller.CommonRequirement; +import org.jboss.as.clustering.controller.CommonUnaryRequirement; import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.ModelVersion; +import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; +import org.jboss.as.controller.capability.RuntimeCapability; import org.jboss.as.controller.registry.AttributeAccess; import org.jboss.as.controller.services.path.ResolvePathHandler; +import org.jboss.as.controller.transform.description.RejectAttributeChecker; import org.jboss.as.controller.transform.description.ResourceTransformationDescriptionBuilder; import org.jboss.as.server.ServerEnvironment; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; +import org.wildfly.clustering.service.Requirement; /** * Resource description for the addressable resource /subsystem=infinispan/cache-container=X/cache=Y/store=STORE @@ -43,19 +53,40 @@ public class FileStoreResourceDefinition extends StoreResourceDefinition { static final PathElement LEGACY_PATH = PathElement.pathElement("file-store", "FILE_STORE"); static final PathElement PATH = pathElement("file"); + enum Capability implements org.jboss.as.clustering.controller.Capability { + RELATIVE_PATH("org.wildfly.clustering.infinispan.cache.store.file.relative-path", CommonRequirement.PATH_MANAGER), + ; + private final RuntimeCapability definition; + + Capability(String name, Requirement... requirements) { + this.definition = RuntimeCapability.Builder.of(name, true).addRequirements(Stream.of(requirements).map(Requirement::getName).toArray(String[]::new)).build(); + } + + @Override + public RuntimeCapability getDefinition() { + return this.definition; + } + + @Override + public RuntimeCapability resolve(PathAddress address) { + PathAddress cacheAddress = address.getParent(); + PathAddress containerAddress = cacheAddress.getParent(); + return this.definition.fromBaseCapability(containerAddress.getLastElement().getValue(), cacheAddress.getLastElement().getValue()); + } + } + enum Attribute implements org.jboss.as.clustering.controller.Attribute { - RELATIVE_PATH("path", ModelType.STRING, null), - RELATIVE_TO("relative-to", ModelType.STRING, new ModelNode(ServerEnvironment.SERVER_DATA_DIR)), + RELATIVE_PATH("path", ModelType.STRING, builder -> builder.setAllowExpression(true)), + RELATIVE_TO("relative-to", ModelType.STRING, builder -> builder.setDefaultValue(new ModelNode(ServerEnvironment.SERVER_DATA_DIR)).setCapabilityReference(new CapabilityReference(Capability.RELATIVE_PATH, CommonUnaryRequirement.PATH))), ; private final AttributeDefinition definition; - Attribute(String name, ModelType type, ModelNode defaultValue) { - this.definition = new SimpleAttributeDefinitionBuilder(name, type) - .setAllowExpression(true) - .setRequired(false) - .setDefaultValue(defaultValue) - .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES) - .build(); + Attribute(String name, ModelType type) { + this(name, type, UnaryOperator.identity()); + } + + Attribute(String name, ModelType type, UnaryOperator configurator) { + this.definition = configurator.apply(new SimpleAttributeDefinitionBuilder(name, type).setRequired(false).setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)).build(); } @Override @@ -67,12 +98,17 @@ public AttributeDefinition getDefinition() { static void buildTransformation(ModelVersion version, ResourceTransformationDescriptionBuilder parent) { ResourceTransformationDescriptionBuilder builder = InfinispanModel.VERSION_4_0_0.requiresTransformation(version) ? parent.addChildRedirection(PATH, LEGACY_PATH) : parent.addChildResource(PATH); + if (InfinispanModel.VERSION_4_2_0.requiresTransformation(version)) { + builder.getAttributeBuilder().addRejectCheck(RejectAttributeChecker.SIMPLE_EXPRESSIONS, Attribute.RELATIVE_TO.getName()); + } + StoreResourceDefinition.buildTransformation(version, builder, PATH); } FileStoreResourceDefinition() { - super(PATH, LEGACY_PATH, new InfinispanResourceDescriptionResolver(PATH, WILDCARD_PATH), descriptor -> descriptor.addAttributes(Attribute.class), address -> new FileStoreBuilder(address.getParent()), registration -> - registration.getPathManager().ifPresent(pathManager -> { + super(PATH, LEGACY_PATH, new InfinispanResourceDescriptionResolver(PATH, WILDCARD_PATH), + descriptor -> descriptor.addAttributes(Attribute.class).addCapabilities(Capability.class), + address -> new FileStoreBuilder(address.getParent()), registration -> registration.getPathManager().ifPresent(pathManager -> { ResolvePathHandler pathHandler = ResolvePathHandler.Builder.of(pathManager) .setPathAttribute(Attribute.RELATIVE_PATH.getDefinition()) .setRelativeToAttribute(Attribute.RELATIVE_TO.getDefinition()) diff --git a/clustering/infinispan/extension/src/test/java/org/jboss/as/clustering/infinispan/subsystem/InfinispanTransformersTestCase.java b/clustering/infinispan/extension/src/test/java/org/jboss/as/clustering/infinispan/subsystem/InfinispanTransformersTestCase.java index 6fa594f12e3a..5e8a5c4e954f 100644 --- a/clustering/infinispan/extension/src/test/java/org/jboss/as/clustering/infinispan/subsystem/InfinispanTransformersTestCase.java +++ b/clustering/infinispan/extension/src/test/java/org/jboss/as/clustering/infinispan/subsystem/InfinispanTransformersTestCase.java @@ -37,6 +37,7 @@ import java.util.LinkedList; import java.util.List; +import org.jboss.as.clustering.controller.CommonRequirement; import org.jboss.as.clustering.controller.CommonUnaryRequirement; import org.jboss.as.clustering.controller.Operations; import org.jboss.as.clustering.jgroups.subsystem.JGroupsSubsystemInitialization; @@ -47,6 +48,7 @@ import org.jboss.as.model.test.ModelFixer; import org.jboss.as.model.test.ModelTestControllerVersion; import org.jboss.as.model.test.ModelTestUtils; +import org.jboss.as.server.ServerEnvironment; import org.jboss.as.subsystem.test.AdditionalInitialization; import org.jboss.as.subsystem.test.KernelServices; import org.jboss.as.subsystem.test.KernelServicesBuilder; @@ -148,6 +150,8 @@ private static String[] getDependencies(ModelTestControllerVersion version) { @Override AdditionalInitialization createAdditionalInitialization() { return new InfinispanSubsystemInitialization() + .require(CommonRequirement.PATH_MANAGER) + .require(CommonUnaryRequirement.PATH, ServerEnvironment.SERVER_TEMP_DIR) .require(CommonUnaryRequirement.OUTBOUND_SOCKET_BINDING, "hotrod-server-1", "hotrod-server-2") .require(CommonUnaryRequirement.DATA_SOURCE, "ExampleDS") .require(JGroupsRequirement.CHANNEL_FACTORY, "maximal-channel") diff --git a/pom.xml b/pom.xml index e27a6169323f..dd9eef1b801f 100644 --- a/pom.xml +++ b/pom.xml @@ -215,7 +215,7 @@ 0.9.30 1.1.8.Final 1.0.5.Final - 3.0.0.Beta12 + 3.0.0.Beta13 1.2.0.Alpha2 2.1.0.Alpha1 1.0.0.Alpha4