/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.controller.services.path; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.FILESYSTEM_PATH; import org.jboss.as.controller.PathElement; import org.jboss.as.controller.ReadResourceNameOperationStepHandler; import org.jboss.as.controller.SimpleAttributeDefinition; import org.jboss.as.controller.SimpleAttributeDefinitionBuilder; import org.jboss.as.controller.SimpleResourceDefinition; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.controller.descriptions.ResourceDescriptionResolver; import org.jboss.as.controller.descriptions.common.ControllerResolver; import org.jboss.as.controller.operations.validation.StringLengthValidator; import org.jboss.as.controller.registry.ManagementResourceRegistration; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; /** * Definition of a resource type that represents a logical filesystem path. * * @author <a href="kabir.khan@jboss.com">Kabir Khan</a> */ public abstract class PathResourceDefinition extends SimpleResourceDefinition { private static final String SPECIFIED_PATH_RESOURCE_PREFIX = "specified_path"; private static final String NAMED_PATH_RESOURCE_PREFIX = "named_path"; public static final PathElement PATH_ADDRESS = PathElement.pathElement(ModelDescriptionConstants.PATH); static final SimpleAttributeDefinition NAME = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.NAME, ModelType.STRING, false) .setValidator(new StringLengthValidator(1, false)) .setResourceOnly() .build(); static final SimpleAttributeDefinition PATH_SPECIFIED = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.PATH, ModelType.STRING, false) .setAllowExpression(true) .setValidator(new StringLengthValidator(1, false)) .addArbitraryDescriptor(FILESYSTEM_PATH, new ModelNode(true)) .build(); static final SimpleAttributeDefinition PATH_NAMED = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.PATH, ModelType.STRING, true) .setAllowExpression(true) .setValidator(new StringLengthValidator(1, true)) .build(); static final SimpleAttributeDefinition READ_ONLY = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.READ_ONLY, ModelType.BOOLEAN, true) .setDefaultValue(new ModelNode(false)) .setStorageRuntime() .setRuntimeServiceNotRequired() .build(); /** * A path attribute definition */ public static final SimpleAttributeDefinition PATH = SimpleAttributeDefinitionBuilder.create(PATH_SPECIFIED).build(); /** * A relative-to attribute definition */ public static final SimpleAttributeDefinition RELATIVE_TO = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.RELATIVE_TO, ModelType.STRING, true) .setValidator(new StringLengthValidator(1, true)) .build(); private final PathManagerService pathManager; private final boolean specified; private final boolean resolvable; /** * Creates a PathResourceDefinition. * @param pathManager the path manager. May be {@code null} if the type of path only represents * configuration used by other processes and therefore does not * involve interaction with the path manager * @param resolver resolver for text descriptions. Cannot be {@code null} * @param addHandler handler for the add operation. Cannot be {@code null} * @param removeHandler handler for the remove operation. Cannot be {@code null} * @param specified {@code true} if the resource requires details of the path specification; * {@code false} if it can represent a simple logical placeholder for the path * @param resolvable {@code true} if the {@code read-resource} management operation for the resource * should support the {@code resolve-expresssions} parameter */ private PathResourceDefinition(PathManagerService pathManager, ResourceDescriptionResolver resolver, PathAddHandler addHandler, PathRemoveHandler removeHandler, boolean specified, boolean resolvable) { super(PATH_ADDRESS, resolver, addHandler, removeHandler); this.pathManager = pathManager; this.specified = specified; this.resolvable = resolvable; } /** * Creates a resource definition for a path resource that must have the path specified, but * for which the {@code read-resource} management operation should support the * {@code resolve-expresssions} parameter. * @param pathManager the path manager. Cannot be {@code null} * @return the resource definition */ public static PathResourceDefinition createResolvableSpecified(PathManagerService pathManager){ return new SpecifiedPathResourceDefinition(pathManager, true); } /** * Creates a resource definition for a path resource that must have the path specified, but * for which the {@code read-resource} management operation should not support the * {@code resolve-expresssions} parameter. * @param pathManager the path manager. Cannot be {@code null} * @return the resource definition */ public static PathResourceDefinition createSpecified(PathManagerService pathManager) { return new SpecifiedPathResourceDefinition(pathManager, false); } /** * Creates a resource definition for a path resource that does not require that the path details * be specified. Interaction with the path manager will not be part of the execution of management * operations. Only for use by the kernel. * @param pathManager the path manager * @return the resource definition * * @deprecated only for use by the kernel. May be removed at any time. */ @Deprecated public static PathResourceDefinition createNamed(PathManagerService pathManager) { return new NamedPathResourceDefinition(false); } /** * Creates a resource definition for a path resource that does not require that the path details * be specified. Interaction with the path manager will not be part of the execution of management * operations. Only for use by the kernel. * * @return the resource definition */ public static PathResourceDefinition createNamed() { return new NamedPathResourceDefinition(false); } /** * Creates a resource definition for a path resource that must have the path specified, but * for which interaction with the path manager should not be part of the execution of management * operations. Only for use by the kernel. * @param pathManager the path manager * @return the resource definition * * @deprecated only for use by the kernel. May be removed at any time */ @Deprecated public static PathResourceDefinition createSpecifiedNoServices(PathManagerService pathManager) { return new SpecifiedNoServicesPathResourceDefinition(false); } /** * Creates a resource definition for a path resource that must have the path specified, but * for which interaction with the path manager should not be part of the execution of management * operations. Only for use by the kernel. * * @return the resource definition */ public static PathResourceDefinition createSpecifiedNoServices() { return new SpecifiedNoServicesPathResourceDefinition(false); } @Override public void registerOperations(ManagementResourceRegistration interfaces) { super.registerOperations(interfaces); if( resolvable ) { interfaces.registerOperationHandler(org.jboss.as.controller.operations.global.ReadResourceHandler.RESOLVE_DEFINITION, org.jboss.as.controller.operations.global.ReadResourceHandler.RESOLVE_INSTANCE, true); interfaces.registerOperationHandler(org.jboss.as.controller.operations.global.ReadAttributeHandler.RESOLVE_DEFINITION, org.jboss.as.controller.operations.global.ReadAttributeHandler.RESOLVE_INSTANCE, true); interfaces.registerOperationHandler(org.jboss.as.controller.operations.global.ReadAttributeGroupHandler.RESOLVE_DEFINITION, org.jboss.as.controller.operations.global.ReadAttributeGroupHandler.RESOLVE_INSTANCE, true); } if( this.pathManager != null ) { PathInfoHandler.registerOperation(interfaces, PathInfoHandler.Builder.of(pathManager).addAttribute(PATH_SPECIFIED, RELATIVE_TO).build()); } } @Override public void registerAttributes(ManagementResourceRegistration resourceRegistration) { resourceRegistration.registerReadOnlyAttribute(NAME, ReadResourceNameOperationStepHandler.INSTANCE); resourceRegistration.registerReadWriteAttribute(RELATIVE_TO, null, new PathWriteAttributeHandler(pathManager, RELATIVE_TO)); SimpleAttributeDefinition pathAttr = specified ? PATH_SPECIFIED : PATH_NAMED; resourceRegistration.registerReadWriteAttribute(pathAttr, null, new PathWriteAttributeHandler(pathManager, pathAttr)); resourceRegistration.registerReadOnlyAttribute(READ_ONLY, null); } private static class SpecifiedPathResourceDefinition extends PathResourceDefinition { SpecifiedPathResourceDefinition(PathManagerService pathManager, boolean resolvable){ super(pathManager, ControllerResolver.getResolver(SPECIFIED_PATH_RESOURCE_PREFIX), PathAddHandler.createSpecifiedInstance(pathManager), PathRemoveHandler.createSpecifiedInstance(pathManager), true, resolvable); } } private static class NamedPathResourceDefinition extends PathResourceDefinition { NamedPathResourceDefinition(boolean resolvable){ super(null, ControllerResolver.getResolver(NAMED_PATH_RESOURCE_PREFIX), PathAddHandler.createNamedInstance(), PathRemoveHandler.createNamedInstance(), false, resolvable); } } private static class SpecifiedNoServicesPathResourceDefinition extends PathResourceDefinition { SpecifiedNoServicesPathResourceDefinition(boolean resolvable){ super(null, ControllerResolver.getResolver(SPECIFIED_PATH_RESOURCE_PREFIX), PathAddHandler.createSpecifiedNoServicesInstance(), PathRemoveHandler.createSpecifiedNoServicesInstance(), true, resolvable); } } }