/* * * * JBoss, Home of Professional Open Source. * * Copyright 2012, Red Hat, Inc., 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; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.List; import org.jboss.as.controller.access.management.AccessConstraintDefinition; import org.jboss.as.controller.descriptions.DescriptionProvider; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.controller.logging.ControllerLogger; import org.jboss.as.controller.registry.OperationEntry; import org.jboss.dmr.ModelNode; import org.jboss.dmr.ModelType; /** * Defining characteristics of operation in a {@link org.jboss.as.controller.registry.Resource} * * @author <a href="mailto:tomaz.cerar@redhat.com">Tomaz Cerar</a> */ public abstract class OperationDefinition { protected final String name; protected final OperationEntry.EntryType entryType; protected final EnumSet<OperationEntry.Flag> flags; protected final AttributeDefinition[] parameters; protected final ModelType replyType; protected final ModelType replyValueType; protected final boolean replyAllowNull; protected final DeprecationData deprecationData; protected final AttributeDefinition[] replyParameters; protected final List<AccessConstraintDefinition> accessConstraints; protected final DescriptionProvider descriptionProvider; protected OperationDefinition(SimpleOperationDefinitionBuilder builder) { this.name = builder.name; this.entryType = builder.entryType; this.flags = builder.flags; this.parameters = builder.parameters; this.replyType = builder.replyType; this.replyValueType = builder.replyValueType; this.replyAllowNull = builder.replyAllowNull; this.deprecationData = builder.deprecationData; this.replyParameters = builder.replyParameters; if (builder.accessConstraints == null) { this.accessConstraints = Collections.<AccessConstraintDefinition>emptyList(); } else { this.accessConstraints = Collections.unmodifiableList(Arrays.asList(builder.accessConstraints)); } this.descriptionProvider = builder.descriptionProvider; } /** @deprecated use {@link #OperationDefinition(SimpleOperationDefinitionBuilder)}*/ @Deprecated protected OperationDefinition(String name, OperationEntry.EntryType entryType, EnumSet<OperationEntry.Flag> flags, final ModelType replyType, final ModelType replyValueType, final boolean replyAllowNull, final DeprecationData deprecationData, AttributeDefinition[] replyParameters, AttributeDefinition[] parameters, AccessConstraintDefinition... accessConstraints ) { this.name = name; this.entryType = entryType; this.flags = flags; this.parameters = parameters; this.replyType = replyType; this.replyValueType = replyValueType; this.replyAllowNull = replyAllowNull; this.deprecationData = deprecationData; this.replyParameters = replyParameters; if (accessConstraints == null) { this.accessConstraints = Collections.<AccessConstraintDefinition>emptyList(); } else { this.accessConstraints = Collections.unmodifiableList(Arrays.asList(accessConstraints)); } this.descriptionProvider = null; } public String getName() { return name; } public OperationEntry.EntryType getEntryType() { return entryType; } public EnumSet<OperationEntry.Flag> getFlags() { return flags; } public AttributeDefinition[] getParameters() { return parameters; } public ModelType getReplyType() { return replyType; } /** * Only required if the reply type is some form of collection. */ public ModelType getReplyValueType() { return replyValueType; } public List<AccessConstraintDefinition> getAccessConstraints() { return accessConstraints; } public abstract DescriptionProvider getDescriptionProvider(); public DeprecationData getDeprecationData() { return deprecationData; } public boolean isDeprecated(){ return deprecationData != null; } public boolean isReplyAllowNull() { return replyAllowNull; } public AttributeDefinition[] getReplyParameters() { return replyParameters; } /** * Validates operation model against the definition and its parameters * * @param operation model node of type {@link ModelType#OBJECT}, representing an operation request * @throws OperationFailedException if the value is not valid */ public void validateOperation(final ModelNode operation) throws OperationFailedException { if (operation.hasDefined(ModelDescriptionConstants.OPERATION_NAME) && deprecationData != null && deprecationData.isNotificationUseful()) { ControllerLogger.DEPRECATED_LOGGER.operationDeprecated(getName(), PathAddress.pathAddress(operation.get(ModelDescriptionConstants.OP_ADDR)).toCLIStyleString()); } for (AttributeDefinition ad : this.parameters) { ad.validateOperation(operation); } } /** * validates operation against the definition and sets model for the parameters passed. * * @param operationObject model node of type {@link ModelType#OBJECT}, typically representing an operation request * @param model model node in which the value should be stored * @throws OperationFailedException if the value is not valid */ public final void validateAndSet(ModelNode operationObject, final ModelNode model) throws OperationFailedException { validateOperation(operationObject); for (AttributeDefinition ad : this.parameters) { ad.validateAndSet(operationObject, model); } } }