/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, 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.HashSet;
import java.util.List;
import java.util.Set;
import org.jboss.as.controller.access.management.AccessConstraintDefinition;
import org.jboss.as.controller.capability.RuntimeCapability;
import org.jboss.as.controller.descriptions.DefaultResourceAddDescriptionProvider;
import org.jboss.as.controller.descriptions.DefaultResourceDescriptionProvider;
import org.jboss.as.controller.descriptions.DescriptionProvider;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
import org.jboss.as.controller.logging.ControllerLogger;
import org.jboss.as.controller.registry.ImmutableManagementResourceRegistration;
import org.jboss.as.controller.registry.ManagementResourceRegistration;
import org.jboss.as.controller.registry.OperationEntry;
import org.wildfly.common.Assert;
/**
* Basic implementation of {@link ResourceDefinition}.
*
* @author Brian Stansberry (c) 2011 Red Hat Inc.
*/
public class SimpleResourceDefinition implements ResourceDefinition {
private static final EnumSet<OperationEntry.Flag> RESTART_FLAGS = EnumSet.of(OperationEntry.Flag.RESTART_NONE,
OperationEntry.Flag.RESTART_RESOURCE_SERVICES, OperationEntry.Flag.RESTART_ALL_SERVICES, OperationEntry.Flag.RESTART_JVM);
private static final RuntimeCapability[] NO_CAPABILITIES = new RuntimeCapability[0];
private final PathElement pathElement;
private final ResourceDescriptionResolver descriptionResolver;
private final DescriptionProvider descriptionProvider;
private final OperationStepHandler addHandler;
private final OperationStepHandler removeHandler;
private final OperationEntry.Flag addRestartLevel;
private final OperationEntry.Flag removeRestartLevel;
private final boolean runtime;
private volatile DeprecationData deprecationData;
private final boolean orderedChild;
private final RuntimeCapability[] capabilities;
private final Set<RuntimeCapability> incorporatingCapabilities;
private final List<AccessConstraintDefinition> accessConstraints;
private final int minOccurs;
private final int maxOccurs;
/**
* {@link ResourceDefinition} that uses the given {code descriptionProvider} to describe the resource.
*
* @param pathElement the path. Can be {@code null}.
* @param descriptionProvider the description provider. Cannot be {@code null}
* @throws IllegalArgumentException if {@code descriptionProvider} is {@code null}.
* @deprecated Use {@link #SimpleResourceDefinition(Parameters)}
*/
@Deprecated
public SimpleResourceDefinition(final PathElement pathElement, final DescriptionProvider descriptionProvider) {
//Can be removed when we get to 3.0.0
Assert.checkNotNullParam("descriptionProvider", descriptionProvider);
this.pathElement = pathElement;
this.descriptionResolver = null;
this.descriptionProvider = descriptionProvider;
this.addHandler = null;
this.removeHandler = null;
this.addRestartLevel = null;
this.removeRestartLevel = null;
this.deprecationData = null;
this.runtime = false;
this.orderedChild = false;
this.capabilities = NO_CAPABILITIES;
this.incorporatingCapabilities = null;
this.accessConstraints = Collections.emptyList();
this.minOccurs = 0;
this.maxOccurs = Integer.MAX_VALUE;
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Cannot be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null}
* @throws IllegalArgumentException if any parameter is {@code null}.
*/
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver) {
this(pathElement, descriptionResolver, null, null, OperationEntry.Flag.RESTART_NONE,
OperationEntry.Flag.RESTART_RESOURCE_SERVICES, null);
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Cannot be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null}
* @param isRuntime tells if resource is runtime
* @throws IllegalArgumentException if any parameter is {@code null}.
* @deprecated Use {@link #SimpleResourceDefinition(Parameters)}
*/
@Deprecated
@SuppressWarnings("deprecation")
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver, boolean isRuntime) {
//Can be removed when we get to 3.0.0
this(pathElement, descriptionResolver, null, null, OperationEntry.Flag.RESTART_NONE,
OperationEntry.Flag.RESTART_RESOURCE_SERVICES, null, isRuntime);
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Cannot be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null} *
* @param addHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "add" operation.
* Can be {null}
* @param removeHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "remove" operation.
* Can be {null}
* @throws IllegalArgumentException if any parameter is {@code null}
*/
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver,
final OperationStepHandler addHandler, final OperationStepHandler removeHandler) {
this(pathElement, descriptionResolver, addHandler, removeHandler, OperationEntry.Flag.RESTART_NONE,
OperationEntry.Flag.RESTART_RESOURCE_SERVICES, null);
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Cannot be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null} *
* @param addHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "add" operation.
* Can be {null}
* @param removeHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "remove" operation.
* Can be {null}
* @param isRuntime tells is resources is runtime or not
* @throws IllegalArgumentException if any parameter is {@code null}
* @deprecated Use {@link #SimpleResourceDefinition(Parameters)}
*/
@Deprecated
@SuppressWarnings("deprecation")
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver,
final OperationStepHandler addHandler, final OperationStepHandler removeHandler, boolean isRuntime) {
//Can be removed when we get to 3.0.0
this(pathElement, descriptionResolver, addHandler, removeHandler, OperationEntry.Flag.RESTART_NONE,
OperationEntry.Flag.RESTART_RESOURCE_SERVICES, null, isRuntime);
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Cannot be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null} *
* @param addHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "add" operation.
* Can be {null}
* @param removeHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "remove" operation.
* Can be {null}
* @param deprecationData Information describing deprecation of this resource. Can be {@code null} if the resource isn't deprecated.
* @throws IllegalArgumentException if any parameter is {@code null}
* @deprecated Use {@link #SimpleResourceDefinition(Parameters)}
*/
@Deprecated
@SuppressWarnings("deprecation")
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver,
final OperationStepHandler addHandler, final OperationStepHandler removeHandler,
final DeprecationData deprecationData) {
//Can be removed when we get to 3.0.0
this(pathElement, descriptionResolver, addHandler, removeHandler, OperationEntry.Flag.RESTART_NONE,
OperationEntry.Flag.RESTART_RESOURCE_SERVICES, deprecationData);
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Can be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null} *
* @param addHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "add" operation.
* Can be {null}
* @param removeHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "remove" operation.
* Can be {null}
* @throws IllegalArgumentException if {@code descriptionResolver} is {@code null}.
* @deprecated Use {@link #SimpleResourceDefinition(Parameters)}
*/
@Deprecated
@SuppressWarnings("deprecation")
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver,
final OperationStepHandler addHandler, final OperationStepHandler removeHandler,
final OperationEntry.Flag addRestartLevel, final OperationEntry.Flag removeRestartLevel) {
//Can be removed when we get to 3.0.0
this(pathElement, descriptionResolver, addHandler, removeHandler, addRestartLevel, removeRestartLevel, null);
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Can be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null} *
* @param addHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "add" operation.
* Can be {null}
* @param removeHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "remove" operation.
* Can be {null}
* @param deprecationData Information describing deprecation of this resource. Can be {@code null} if the resource isn't deprecated.
* @throws IllegalArgumentException if {@code descriptionResolver} is {@code null}.
* @deprecated Use {@link #SimpleResourceDefinition(Parameters)}
*/
@Deprecated
@SuppressWarnings("deprecation")
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver,
final OperationStepHandler addHandler, final OperationStepHandler removeHandler,
final OperationEntry.Flag addRestartLevel, final OperationEntry.Flag removeRestartLevel,
final DeprecationData deprecationData) {
//Can be removed when we get to 3.0.0
this(pathElement, descriptionResolver, addHandler, removeHandler, addRestartLevel, removeRestartLevel, deprecationData, false);
}
/**
* {@link ResourceDefinition} that uses the given {code descriptionResolver} to configure a
* {@link DefaultResourceDescriptionProvider} to describe the resource.
*
* @param pathElement the path. Can be {@code null}.
* @param descriptionResolver the description resolver to use in the description provider. Cannot be {@code null} *
* @param addHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "add" operation.
* Can be {null}
* @param removeHandler a handler to {@link #registerOperations(ManagementResourceRegistration) register} for the resource "remove" operation.
* Can be {null}
* @param deprecationData Information describing deprecation of this resource. Can be {@code null} if the resource isn't deprecated.
* @param runtime Whether this is a runtime resource
* @throws IllegalArgumentException if {@code descriptionResolver} is {@code null}.
* @deprecated Use {@link #SimpleResourceDefinition(Parameters)}
*/
@Deprecated
@SuppressWarnings("deprecation")
public SimpleResourceDefinition(final PathElement pathElement, final ResourceDescriptionResolver descriptionResolver,
final OperationStepHandler addHandler, final OperationStepHandler removeHandler,
final OperationEntry.Flag addRestartLevel, final OperationEntry.Flag removeRestartLevel,
final DeprecationData deprecationData, final boolean runtime) {
//Don't add new constructor variants!
//Use the Parameters variety
//Can be removed when we get to 3.0.0
Assert.checkNotNullParam("descriptionResolver", descriptionResolver);
this.pathElement = pathElement;
this.descriptionResolver = descriptionResolver;
this.descriptionProvider = null;
this.addHandler = addHandler;
this.removeHandler = removeHandler;
this.addRestartLevel = addRestartLevel == null ? OperationEntry.Flag.RESTART_NONE : validateRestartLevel("addRestartLevel", addRestartLevel);
this.removeRestartLevel = removeRestartLevel == null
? OperationEntry.Flag.RESTART_ALL_SERVICES
: validateRestartLevel("removeRestartLevel", removeRestartLevel);
this.deprecationData = deprecationData;
this.runtime = runtime;
this.orderedChild = false;
this.capabilities = NO_CAPABILITIES;
this.incorporatingCapabilities = null;
this.accessConstraints = Collections.emptyList();
this.minOccurs = 0;
this.maxOccurs = Integer.MAX_VALUE;
}
/**
* Constructs a {@link ResourceDefinition} using the passed in parameters object.
*
* @param parameters {@link SimpleResourceDefinition.Parameters} to configure this ResourceDefinition
* @throws IllegalStateException if the parameters object is not valid.
*/
public SimpleResourceDefinition(Parameters parameters) {
this.pathElement = parameters.pathElement;
this.descriptionResolver = parameters.descriptionResolver;
this.addHandler = parameters.addHandler;
this.removeHandler = parameters.removeHandler;
this.addRestartLevel = parameters.addRestartLevel;
this.removeRestartLevel = parameters.removeRestartLevel;
this.deprecationData = parameters.deprecationData;
this.runtime = parameters.runtime;
this.orderedChild = parameters.orderedChildResource;
this.descriptionProvider = null;
this.capabilities = parameters.capabilities;
this.incorporatingCapabilities = parameters.incorporatingCapabilities;
if (parameters.accessConstraints != null) {
this.accessConstraints = Arrays.asList(parameters.accessConstraints);
} else {
this.accessConstraints = Collections.emptyList();
}
this.minOccurs = parameters.minOccurs;
this.maxOccurs = parameters.maxOccurs;
}
@Override
public PathElement getPathElement() {
return pathElement;
}
@Override
public DescriptionProvider getDescriptionProvider(ImmutableManagementResourceRegistration resourceRegistration) {
return descriptionProvider == null
? new DefaultResourceDescriptionProvider(resourceRegistration, descriptionResolver, getDeprecationData())
: descriptionProvider;
}
/**
* {@inheritDoc}
* Registers an add operation handler or a remove operation handler if one was provided to the constructor.
*/
@Override
@SuppressWarnings("deprecation")
public void registerOperations(ManagementResourceRegistration resourceRegistration) {
if (addHandler != null) {
registerAddOperation(resourceRegistration, addHandler, addRestartLevel);
}
if (removeHandler != null) {
registerRemoveOperation(resourceRegistration, removeHandler, removeRestartLevel);
}
}
@Override
public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
// no-op
}
@Override
public void registerNotifications(ManagementResourceRegistration resourceRegistration) {
// no-op
}
@Override
public void registerChildren(ManagementResourceRegistration resourceRegistration) {
// no-op
}
@Override
public void registerCapabilities(ManagementResourceRegistration resourceRegistration) {
if (capabilities!=null) {
for (RuntimeCapability c : capabilities) {
resourceRegistration.registerCapability(c);
}
}
if (incorporatingCapabilities != null) {
resourceRegistration.registerIncorporatingCapabilities(incorporatingCapabilities);
}
}
/**
* Gets the {@link ResourceDescriptionResolver} used by this resource definition, or {@code null}
* if a {@code ResourceDescriptionResolver} is not used.
*
* @return the resource description resolver, or {@code null}
*/
public ResourceDescriptionResolver getResourceDescriptionResolver() {
return descriptionResolver;
}
/**
* Registers add operation
*
* @param registration resource on which to register
* @param handler operation handler to register
* @param flags with flags
* @deprecated use {@link #registerAddOperation(org.jboss.as.controller.registry.ManagementResourceRegistration, AbstractAddStepHandler, org.jboss.as.controller.registry.OperationEntry.Flag...)}
*/
@Deprecated
@SuppressWarnings("deprecation")
protected void registerAddOperation(final ManagementResourceRegistration registration, final OperationStepHandler handler, OperationEntry.Flag... flags) {
if (handler instanceof DescriptionProvider) {
registration.registerOperationHandler(getOperationDefinition(ModelDescriptionConstants.ADD,
(DescriptionProvider) handler, OperationEntry.EntryType.PUBLIC,flags)
, handler);
} else {
registration.registerOperationHandler(getOperationDefinition(ModelDescriptionConstants.ADD,
new DefaultResourceAddDescriptionProvider(registration, descriptionResolver, orderedChild),
OperationEntry.EntryType.PUBLIC,
flags)
, handler);
}
}
private OperationDefinition getOperationDefinition(String operationName, DescriptionProvider descriptionProvider, OperationEntry.EntryType entryType, OperationEntry.Flag... flags){
return new SimpleOperationDefinitionBuilder(operationName, descriptionResolver)
.withFlags(flags)
.setEntryType(entryType)
.setDescriptionProvider(descriptionProvider)
.build();
}
/**
* Registers add operation
* <p/>
* Registers add operation
*
* @param registration resource on which to register
* @param handler operation handler to register
* @param flags with flags
*/
protected void registerAddOperation(final ManagementResourceRegistration registration, final AbstractAddStepHandler handler,
OperationEntry.Flag... flags) {
registration.registerOperationHandler(getOperationDefinition(ModelDescriptionConstants.ADD,
new DefaultResourceAddDescriptionProvider(registration, descriptionResolver, orderedChild), OperationEntry.EntryType.PUBLIC, flags)
, handler);
}
@Deprecated
@SuppressWarnings("deprecation")
protected void registerRemoveOperation(final ManagementResourceRegistration registration, final OperationStepHandler handler,
OperationEntry.Flag... flags) {
if (handler instanceof DescriptionProvider) {
registration.registerOperationHandler(getOperationDefinition(ModelDescriptionConstants.REMOVE,
(DescriptionProvider) handler, OperationEntry.EntryType.PUBLIC,flags)
, handler);
} else {
OperationDefinition opDef = new SimpleOperationDefinitionBuilder(ModelDescriptionConstants.REMOVE, descriptionResolver)
.withFlags(flags)
.build();
registration.registerOperationHandler(opDef, handler);
}
}
@SuppressWarnings("deprecation")
protected void registerRemoveOperation(final ManagementResourceRegistration registration, final AbstractRemoveStepHandler handler,
OperationEntry.Flag... flags) {
registerRemoveOperation(registration, (OperationStepHandler) handler, flags);
}
private static OperationEntry.Flag validateRestartLevel(String paramName, OperationEntry.Flag flag) {
if (flag != null && !RESTART_FLAGS.contains(flag)) {
throw ControllerLogger.ROOT_LOGGER.invalidParameterValue(flag, paramName, RESTART_FLAGS);
}
return flag;
}
protected static EnumSet<OperationEntry.Flag> getFlagsSet(OperationEntry.Flag... vararg) {
return SimpleOperationDefinitionBuilder.getFlagsSet(vararg);
}
/**
* {@inheritDoc}
*
* @return this default implementation simply returns an empty list.
*/
@Override
public List<AccessConstraintDefinition> getAccessConstraints() {
return this.accessConstraints;
}
protected void setDeprecated(ModelVersion since) {
this.deprecationData = new DeprecationData(since);
}
protected DeprecationData getDeprecationData(){
return this.deprecationData;
}
@Override
public boolean isRuntime() {
return runtime;
}
/**
* {@inheritDoc}
*/
@Override
public int getMinOccurs() {
if (minOccurs == 0) {
return ResourceDefinition.super.getMinOccurs();
}
return minOccurs;
}
/**
* {@inheritDoc}
*/
@Override
public int getMaxOccurs() {
if (maxOccurs == Integer.MAX_VALUE) {
return ResourceDefinition.super.getMaxOccurs();
}
return maxOccurs;
}
/**
* Whether this resource registration is ordered in the parent. The automatically generated 'add' operation will
* get the {@code add-index} parameter added. Also, it will get registered as an ordered child in the parent's
* management resource registration.
*
* @return whether this is an ordered child resource
*/
@SuppressWarnings("deprecation")
public boolean isOrderedChild() {
return orderedChild;
}
/**
* Parameters object for the SimpleResourceDefinition constructor
*/
public static class Parameters{
private final PathElement pathElement;
private ResourceDescriptionResolver descriptionResolver;
private OperationStepHandler addHandler;
private OperationStepHandler removeHandler;
private OperationEntry.Flag addRestartLevel = OperationEntry.Flag.RESTART_NONE;
private OperationEntry.Flag removeRestartLevel = OperationEntry.Flag.RESTART_ALL_SERVICES;
private boolean runtime;
private DeprecationData deprecationData;
private boolean orderedChildResource;
private RuntimeCapability[] capabilities;
private Set<RuntimeCapability> incorporatingCapabilities;
private AccessConstraintDefinition[] accessConstraints;
private int minOccurs = 0;
private int maxOccurs = Integer.MAX_VALUE;
/**
* Creates a Parameters object
* @param pathElement the path element of the created ResourceDefinition. Cannot be {@code null}
* @param descriptionResolver the description provider. Cannot be {@code null}
*/
public Parameters(PathElement pathElement, ResourceDescriptionResolver descriptionResolver) {
Assert.checkNotNullParam("descriptionResolver", descriptionResolver);
this.pathElement = pathElement;
this.descriptionResolver = descriptionResolver;
}
/**
* Sets the description resolver to use
*
* @param descriptionResolver
* @return this Parameters object
*/
public Parameters setDescriptionResolver(ResourceDescriptionResolver descriptionResolver) {
this.descriptionResolver = descriptionResolver;
return this;
}
/**
* Sets the add handler. This can also be added by overriding
* {@link SimpleResourceDefinition#registerOperations(ManagementResourceRegistration)}
*
* @param addHandler the add handler to use.
* @return this Parameters object
*/
public Parameters setAddHandler(OperationStepHandler addHandler) {
this.addHandler = addHandler;
return this;
}
/**
* Sets the remove handler. This can also be added by overriding
* {@link SimpleResourceDefinition#registerOperations(ManagementResourceRegistration)}
*
* @param removeHandler the add handler to use.
* @return this Parameters object
*/
public Parameters setRemoveHandler(OperationStepHandler removeHandler) {
this.removeHandler = removeHandler;
return this;
}
/**
* Sets the add restart level. The default is {@link OperationEntry.Flag#RESTART_NONE}
*
* @param addRestartLevel the restart level
* @return this Parameters object
* @throws IllegalStateException if a null {@code addRestartLevel} is used
*/
public Parameters setAddRestartLevel(OperationEntry.Flag addRestartLevel) {
Assert.checkNotNullParam("addRestartLevel", addRestartLevel);
this.addRestartLevel = addRestartLevel;
return this;
}
/**
* Sets the remove restart level. The default is {@link OperationEntry.Flag#RESTART_ALL_SERVICES}
* @param removeRestartLevel the restart level
* @return this Parameters object
* @throws IllegalStateException if a null {@code addRestartLevel} is used
*/
public Parameters setRemoveRestartLevel(OperationEntry.Flag removeRestartLevel) {
Assert.checkNotNullParam("removeRestartLevel", removeRestartLevel);
this.removeRestartLevel = removeRestartLevel;
return this;
}
/**
* Call to indicate that a resource is runtime-only. If not called, the default is {@code false}
*
* @return this Parameters object
*/
public Parameters setRuntime() {
this.runtime = true;
return this;
}
/**
* Call to indicate that a resource is runtime-only. If not called, the default is {@code false}
*
* @return this Parameters object
*/
public Parameters setRuntime(boolean isRuntime) {
this.runtime = isRuntime;
return this;
}
/**
* Call to deprecate the resource
*
* @param deprecationData Information describing deprecation of this resource.
* @return this Parameters object
* @throws IllegalStateException if the {@code deprecationData} is null
*/
public Parameters setDeprecationData(DeprecationData deprecationData) {
this.deprecationData = deprecationData;
return this;
}
/**
* Call to deprecate the resource
*
* @param deprecatedSince version in which model was deprecated
* @return this Parameters object
* @throws IllegalStateException if the {@code deprecationData} is null
*/
public Parameters setDeprecatedSince(ModelVersion deprecatedSince) {
Assert.checkNotNullParam("deprecatedSince", deprecatedSince);
this.deprecationData = new DeprecationData(deprecatedSince);
return this;
}
/**
* Call to indicate that a resource is of a type where ordering matters amongst the siblings of the same type.
* If not called, the default is {@code false}.
*
* @return this Parameters object
*/
public Parameters setOrderedChild() {
this.orderedChildResource = true;
return this;
}
/**
* set possible capabilities that this resource exposes
* @param capabilities capabilities to register
* @return Parameters object
*/
public Parameters setCapabilities(RuntimeCapability ... capabilities){
this.capabilities = capabilities;
return this;
}
/**
* Add possible capabilities for this resource to any that are already set.
* @param capabilities capabilities to register
* @return Parameters object
*/
public Parameters addCapabilities(RuntimeCapability ... capabilities) {
if (this.capabilities == null) {
setCapabilities(capabilities);
} else if (capabilities != null && capabilities.length > 0) {
RuntimeCapability[] combo = Arrays.copyOf(this.capabilities, this.capabilities.length + capabilities.length);
System.arraycopy(capabilities, 0, combo, this.capabilities.length, capabilities.length);
setCapabilities(combo);
}
return this;
}
/**
* Set access constraint definitions for this resource
* @param accessConstraints access constraint definitions for this resource
* @return Parameters object
*/
public Parameters setAccessConstraints(AccessConstraintDefinition ... accessConstraints){
this.accessConstraints = accessConstraints;
return this;
}
/**
* Add access constraint definitions for this resource to any that are already set.
* @param accessConstraints access constraint definitions for this resource
* @return Parameters object
*/
public Parameters addAccessConstraints(AccessConstraintDefinition ... accessConstraints) {
if (this.accessConstraints == null) {
setAccessConstraints(accessConstraints);
} else if (accessConstraints != null && accessConstraints.length > 0) {
AccessConstraintDefinition[] combo = Arrays.copyOf(this.accessConstraints, this.accessConstraints.length + accessConstraints.length);
System.arraycopy(accessConstraints, 0, combo, this.accessConstraints.length, accessConstraints.length);
setAccessConstraints(combo);
}
return this;
}
/**
* set the maximum number of occurrences for this resource
* @param maxOccurs the maximum number of times this resource can occur
* @return Parameters object
*/
public Parameters setMaxOccurs(final int maxOccurs){
this.maxOccurs = maxOccurs;
return this;
}
/**
* set the minimum number of occurrences for this resource
* @param minOccurs the minimum number of times this resource must occur
* @return Parameters object
*/
public Parameters setMinOccurs(final int minOccurs){
this.minOccurs = minOccurs;
return this;
}
/**
* Registers a set of capabilities that this resource does not directly provide but to which it contributes. This
* will only include capabilities for which this resource <strong>does not</strong> control the
* {@link ManagementResourceRegistration#registerCapability(RuntimeCapability) registration of the capability}.
* Any capabilities registered by this resource should instead be declared using {@link #setCapabilities(RuntimeCapability[])}.
* <p>
* Use of this method is only necessary if the caller wishes to specifically record capability incorporation,
* instead of relying on the default resolution mechanism detailed in
* {@link ManagementResourceRegistration#getIncorporatingCapabilities()}, or
* if it wishes disable the default resolution mechanism and specifically declare that this resource does not
* contribute to parent capabilities. It does the latter by passing an empty set as the {@code capabilities}
* parameter. Passing an empty set is not necessary if this resource itself directly
* {@link #setCapabilities(RuntimeCapability[]) provides a capability}, as it is the contract of
* {@link ManagementResourceRegistration#getIncorporatingCapabilities()} that in that case it must return an empty set.
*
* @param incorporatingCapabilities set of capabilities, or {@code null} if default resolution of capabilities to which this
* resource contributes should be used; an empty set can be used to indicate this resource
* does not contribute to capabilities provided by its parent
*
* @return Parameters object
*/
public Parameters setIncorporatingCapabilities(Set<RuntimeCapability> incorporatingCapabilities) {
this.incorporatingCapabilities = incorporatingCapabilities;
return this;
}
/**
* Adds incorporating capabilities to any that have already been set.
* @param incorporatingCapabilities capabilities to add
* @return Parameters object
*/
public Parameters addIncorporatingCapabilities(Set<RuntimeCapability> incorporatingCapabilities) {
if (this.incorporatingCapabilities == null) {
setIncorporatingCapabilities(incorporatingCapabilities);
} else if (incorporatingCapabilities != null && !incorporatingCapabilities.isEmpty()) {
Set<RuntimeCapability> combo = new HashSet<>();
combo.addAll(this.incorporatingCapabilities);
combo.addAll(incorporatingCapabilities);
setIncorporatingCapabilities(combo);
}
return this;
}
}
}