Beispiel #1
0
/**
 * Attributes used in setting up ModeShape configurations. To mark an attribute as required, mark it
 * as not allowing null.
 */
public class ModelAttributes {

  private static final ParameterValidator ROLE_NAME_VALIDATOR =
      new StringSetValidator(
          false,
          false,
          "",
          ModeShapeRoles.ADMIN,
          ModeShapeRoles.READONLY,
          ModeShapeRoles.READWRITE);
  private static final ParameterValidator WORKSPACE_NAME_VALIDATOR =
      new ModelTypeValidator(ModelType.STRING, false, false, true);
  private static final ParameterValidator NODE_TYPE_VALIDATOR =
      new ModelTypeValidator(ModelType.STRING, false, false, true);
  private static final ParameterValidator INITIAL_CONTENT_VALIDATOR =
      new ModelTypeValidator(ModelType.PROPERTY, false, false, true);
  private static final ParameterValidator DEFAULT_INITIAL_CONTENT_VALIDATOR =
      new ModelTypeValidator(ModelType.STRING, true, false, true);
  private static final ParameterValidator PATH_EXPRESSION_VALIDATOR =
      new PathExpressionValidator(false);

  private static final ParameterValidator PROJECTION_VALIDATOR = new ProjectionValidator(false);

  private static final ParameterValidator COLUMNS_VALIDATOR = new IndexColumnsValidator(false);

  private static final ParameterValidator INDEX_KIND_VALIDATOR =
      new StringSetValidator(
          true,
          true,
          RepositoryConfiguration.FieldValue.KIND_ENUMERATED,
          RepositoryConfiguration.FieldValue.KIND_NODE_TYPE,
          RepositoryConfiguration.FieldValue.KIND_TEXT,
          RepositoryConfiguration.FieldValue.KIND_UNIQUE,
          RepositoryConfiguration.FieldValue.KIND_VALUE);
  private static final ParameterValidator REINDEXING_MODE_VALIDATOR =
      new StringSetValidator(
          true,
          true,
          RepositoryConfiguration.ReindexingMode.IF_MISSING.name(),
          RepositoryConfiguration.ReindexingMode.INCREMENTAL.name());
  private static final ParameterValidator MIME_TYPE_DETECTION_VALIDATOR =
      new StringSetValidator(
          true,
          true,
          RepositoryConfiguration.FieldValue.MIMETYPE_DETECTION_CONTENT,
          RepositoryConfiguration.FieldValue.MIMETYPE_DETECTION_NAME,
          RepositoryConfiguration.FieldValue.MIMETYPE_DETECTION_NONE);

  public static final SimpleAttributeDefinition ALLOW_WORKSPACE_CREATION =
      new MappedAttributeDefinitionBuilder(ModelKeys.ALLOW_WORKSPACE_CREATION, ModelType.BOOLEAN)
          .setXmlName(Attribute.ALLOW_WORKSPACE_CREATION.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(true))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(FieldName.WORKSPACES, FieldName.ALLOW_CREATION)
          .build();

  public static final SimpleAttributeDefinition WORKSPACES_CACHE_SIZE =
      new MappedAttributeDefinitionBuilder(ModelKeys.WORKSPACES_CACHE_SIZE, ModelType.INT)
          .setXmlName(Attribute.CACHE_SIZE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setValidator(new IntRangeValidator(1))
          .build();

  public static final ListAttributeDefinition ANONYMOUS_ROLES =
      MappedListAttributeDefinition.Builder.of(
              ModelKeys.ANONYMOUS_ROLES,
              new MappedAttributeDefinitionBuilder(ModelKeys.ANONYMOUS_ROLE, ModelType.STRING)
                  .setAllowExpression(true)
                  .setAllowNull(true)
                  .setDefaultValue(
                      new ModelNode().add(new ModelNode().set(ModeShapeRoles.READONLY)))
                  .setValidator(ROLE_NAME_VALIDATOR)
                  .setFlags(AttributeAccess.Flag.RESTART_NONE)
                  .setAccessConstraints(
                      SensitiveTargetAccessConstraintDefinition.SECURITY_DOMAIN_REF)
                  .build())
          .setAllowNull(true)
          .setMinSize(0)
          .setMaxSize(100)
          .setFieldPathInRepositoryConfiguration(
              FieldName.SECURITY, FieldName.ANONYMOUS, FieldName.ANONYMOUS_ROLES)
          .setAccessConstraints(SensitiveTargetAccessConstraintDefinition.SECURITY_DOMAIN_REF)
          .build();

  public static final SimpleAttributeDefinition ANONYMOUS_USERNAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.ANONYMOUS_USERNAME, ModelType.STRING)
          .setXmlName(Attribute.ANONYMOUS_USERNAME.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("<anonymous>"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setAccessConstraints(SensitiveTargetAccessConstraintDefinition.SECURITY_DOMAIN_REF)
          .setFieldPathInRepositoryConfiguration(
              FieldName.SECURITY, FieldName.ANONYMOUS, FieldName.ANONYMOUS_USERNAME)
          .build();

  public static final SimpleAttributeDefinition AUTHENTICATOR_CLASSNAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.AUTHENTICATOR_CLASSNAME, ModelType.STRING)
          .setXmlName(Attribute.CLASSNAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.SECURITY, FieldName.PROVIDERS, FieldName.CLASSNAME)
          .build();

  public static final SimpleAttributeDefinition CACHE_NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.CACHE_NAME, ModelType.STRING)
          .setXmlName(Attribute.CACHE_NAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition CACHE_CONFIG =
      new MappedAttributeDefinitionBuilder(ModelKeys.CACHE_CONFIG, ModelType.STRING)
          .setXmlName(Attribute.CACHE_CONFIG.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition CONFIG_RELATIVE_TO =
      new MappedAttributeDefinitionBuilder(ModelKeys.CONFIG_RELATIVE_TO, ModelType.STRING)
          .setXmlName(Attribute.CONFIG_RELATIVE_TO.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(ModeShapeExtension.JBOSS_CONFIG_DIR_VARIABLE))
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition CLASSNAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.CLASSNAME, ModelType.STRING)
          .setXmlName(Attribute.CLASSNAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition DATA_SOURCE_JNDI_NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.DATA_SOURCE_JNDI_NAME, ModelType.STRING)
          .setXmlName(Attribute.DATA_SOURCE_JNDI_NAME.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(false)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition DEFAULT_WORKSPACE =
      new MappedAttributeDefinitionBuilder(ModelKeys.DEFAULT_WORKSPACE, ModelType.STRING)
          .setXmlName(Attribute.DEFAULT_WORKSPACE.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("default"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(FieldName.WORKSPACES, FieldName.DEFAULT)
          .build();

  public static final SimpleAttributeDefinition ENABLE_MONITORING =
      new MappedAttributeDefinitionBuilder(ModelKeys.ENABLE_MONITORING, ModelType.BOOLEAN)
          .setXmlName(Attribute.ENABLE_MONITORING.getLocalName())
          .setAllowNull(true)
          .setAllowExpression(true)
          .setDefaultValue(new ModelNode().set(true))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(FieldName.MONITORING, FieldName.MONITORING_ENABLED)
          .build();

  public static final SimpleAttributeDefinition GARBAGE_COLLECTION_THREAD_POOL =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.GARBAGE_COLLECTION_THREAD_POOL, ModelType.STRING)
          .setXmlName(Attribute.GARBAGE_COLLECTION_THREAD_POOL.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("modeshape-gc"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.GARBAGE_COLLECTION, FieldName.THREAD_POOL)
          .build();
  public static final SimpleAttributeDefinition GARBAGE_COLLECTION_INITIAL_TIME =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.GARBAGE_COLLECTION_INITIAL_TIME, ModelType.STRING)
          .setXmlName(Attribute.GARBAGE_COLLECTION_INITIAL_TIME.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("00:00"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.GARBAGE_COLLECTION, FieldName.INITIAL_TIME)
          .build();
  public static final SimpleAttributeDefinition GARBAGE_COLLECTION_INTERVAL =
      new MappedAttributeDefinitionBuilder(ModelKeys.GARBAGE_COLLECTION_INTERVAL, ModelType.INT)
          .setXmlName(Attribute.GARBAGE_COLLECTION_INTERVAL.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(24))
          .setMeasurementUnit(MeasurementUnit.HOURS)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.GARBAGE_COLLECTION, FieldName.INTERVAL_IN_HOURS)
          .build();
  public static final SimpleAttributeDefinition DOCUMENT_OPTIMIZATION_THREAD_POOL =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.DOCUMENT_OPTIMIZATION_THREAD_POOL, ModelType.STRING)
          .setXmlName(Attribute.DOCUMENT_OPTIMIZATION_THREAD_POOL.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("modeshape-opt"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE, FieldName.DOCUMENT_OPTIMIZATION, FieldName.THREAD_POOL)
          .build();
  public static final SimpleAttributeDefinition DOCUMENT_OPTIMIZATION_INITIAL_TIME =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.DOCUMENT_OPTIMIZATION_INITIAL_TIME, ModelType.STRING)
          .setXmlName(Attribute.DOCUMENT_OPTIMIZATION_INITIAL_TIME.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("00:00"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE, FieldName.DOCUMENT_OPTIMIZATION, FieldName.INITIAL_TIME)
          .build();
  public static final SimpleAttributeDefinition DOCUMENT_OPTIMIZATION_INTERVAL =
      new MappedAttributeDefinitionBuilder(ModelKeys.DOCUMENT_OPTIMIZATION_INTERVAL, ModelType.INT)
          .setXmlName(Attribute.DOCUMENT_OPTIMIZATION_INTERVAL.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(24))
          .setMeasurementUnit(MeasurementUnit.HOURS)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE, FieldName.DOCUMENT_OPTIMIZATION, FieldName.INTERVAL_IN_HOURS)
          .build();
  public static final SimpleAttributeDefinition DOCUMENT_OPTIMIZATION_CHILD_COUNT_TARGET =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.DOCUMENT_OPTIMIZATION_CHILD_COUNT_TARGET, ModelType.INT)
          .setXmlName(Attribute.DOCUMENT_OPTIMIZATION_CHILD_COUNT_TARGET.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.NONE)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE,
              FieldName.DOCUMENT_OPTIMIZATION,
              FieldName.OPTIMIZATION_CHILD_COUNT_TARGET)
          .build();
  public static final SimpleAttributeDefinition DOCUMENT_OPTIMIZATION_CHILD_COUNT_TOLERANCE =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.DOCUMENT_OPTIMIZATION_CHILD_COUNT_TOLERANCE, ModelType.INT)
          .setXmlName(Attribute.DOCUMENT_OPTIMIZATION_CHILD_COUNT_TOLERANCE.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.NONE)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE,
              FieldName.DOCUMENT_OPTIMIZATION,
              FieldName.OPTIMIZATION_CHILD_COUNT_TOLERANCE)
          .build();

  public static final SimpleAttributeDefinition EVENT_BUS_SIZE =
      new MappedAttributeDefinitionBuilder(ModelKeys.EVENT_BUS_SIZE, ModelType.INT)
          .setXmlName(Attribute.EVENT_BUS_SIZE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.NONE)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(FieldName.EVENT_BUS_SIZE)
          .build();

  public static final SimpleAttributeDefinition REINDEXING_ASYNC =
      new MappedAttributeDefinitionBuilder(ModelKeys.REINDEXING_ASYNC, ModelType.BOOLEAN)
          .setXmlName(Attribute.REINDEXING_ASNC.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.NONE)
          .setFieldPathInRepositoryConfiguration(FieldName.REINDEXING, FieldName.REINDEXING_ASYNC)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition REINDEXING_MODE =
      new MappedAttributeDefinitionBuilder(ModelKeys.REINDEXING_MODE, ModelType.STRING)
          .setXmlName(Attribute.REINDEXING_MODE.getLocalName())
          .setAllowExpression(false)
          .setValidator(REINDEXING_MODE_VALIDATOR)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.NONE)
          .setFieldPathInRepositoryConfiguration(FieldName.REINDEXING, FieldName.REINDEXING_MODE)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition INDEX_KIND =
      new MappedAttributeDefinitionBuilder(ModelKeys.INDEX_KIND, ModelType.STRING)
          .setXmlName(Attribute.INDEX_KIND.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(IndexKind.VALUE.toString()))
          .setValidator(INDEX_KIND_VALIDATOR)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition SYNCHRONOUS =
      new MappedAttributeDefinitionBuilder(ModelKeys.SYNCHRONOUS, ModelType.BOOLEAN)
          .setXmlName(Attribute.SYNCHRONOUS.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(Boolean.TRUE))
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition JNDI_NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.JNDI_NAME, ModelType.STRING)
          .setXmlName(Attribute.JNDI_NAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition MINIMUM_BINARY_SIZE =
      new MappedAttributeDefinitionBuilder(ModelKeys.MINIMUM_BINARY_SIZE, ModelType.INT)
          .setXmlName(Attribute.MIN_VALUE_SIZE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.BYTES)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE, FieldName.BINARY_STORAGE, FieldName.MINIMUM_BINARY_SIZE_IN_BYTES)
          .build();

  public static final SimpleAttributeDefinition MINIMUM_STRING_SIZE =
      new MappedAttributeDefinitionBuilder(ModelKeys.MINIMUM_STRING_SIZE, ModelType.INT)
          .setXmlName(Attribute.MIN_STRING_SIZE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.NONE)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE, FieldName.BINARY_STORAGE, FieldName.MINIMUM_STRING_SIZE)
          .build();

  public static final SimpleAttributeDefinition MIME_TYPE_DETECTION =
      new MappedAttributeDefinitionBuilder(ModelKeys.MIME_TYPE_DETECTION, ModelType.STRING)
          .setXmlName(Attribute.MIME_TYPE_DETECTION.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setMeasurementUnit(MeasurementUnit.NONE)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setValidator(MIME_TYPE_DETECTION_VALIDATOR)
          .setFieldPathInRepositoryConfiguration(
              FieldName.STORAGE, FieldName.BINARY_STORAGE, FieldName.MIMETYPE_DETECTION)
          .build();

  public static final SimpleAttributeDefinition MODULE =
      new MappedAttributeDefinitionBuilder(ModelKeys.MODULE, ModelType.STRING)
          .setXmlName(Attribute.MODULE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.NAME, ModelType.STRING)
          .setXmlName(Attribute.NAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(false)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition NODE_TYPE_NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.NODE_TYPE_NAME, ModelType.STRING)
          .setXmlName(Attribute.NODE_TYPE.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(false)
          .setValidator(NODE_TYPE_VALIDATOR)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition INDEX_COLUMNS =
      new MappedAttributeDefinitionBuilder(ModelKeys.INDEX_COLUMNS, ModelType.STRING)
          .setXmlName(Attribute.COLUMNS.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(false)
          .setValidator(COLUMNS_VALIDATOR)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition PROVIDER_NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.PROVIDER_NAME, ModelType.STRING)
          .setXmlName(Attribute.PROVIDER_NAME.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition PATH =
      new MappedAttributeDefinitionBuilder(ModelKeys.PATH, ModelType.STRING)
          .setXmlName(Attribute.PATH.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();
  public static final SimpleAttributeDefinition TRASH =
      new MappedAttributeDefinitionBuilder(ModelKeys.TRASH, ModelType.STRING)
          .setXmlName(Attribute.TRASH.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final ListAttributeDefinition PATH_EXPRESSIONS =
      MappedListAttributeDefinition.Builder.of(
              ModelKeys.PATH_EXPRESSIONS,
              new MappedAttributeDefinitionBuilder(ModelKeys.PATH_EXPRESSION, ModelType.STRING)
                  .setAllowExpression(true)
                  .setAllowNull(false)
                  .setValidator(PATH_EXPRESSION_VALIDATOR)
                  .setFlags(AttributeAccess.Flag.RESTART_NONE)
                  .build())
          .setAllowNull(true)
          .setMinSize(0)
          .setFieldPathInRepositoryConfiguration(
              FieldName.SEQUENCING, FieldName.SEQUENCERS, FieldName.PATH_EXPRESSIONS)
          .build();

  public static final ListAttributeDefinition PROJECTIONS =
      MappedListAttributeDefinition.Builder.of(
              ModelKeys.PROJECTIONS,
              new MappedAttributeDefinitionBuilder(ModelKeys.PROJECTION, ModelType.STRING)
                  .setAllowExpression(true)
                  .setAllowNull(false)
                  .setValidator(PROJECTION_VALIDATOR)
                  .setFlags(AttributeAccess.Flag.RESTART_NONE)
                  .build())
          .setAllowNull(true)
          .setMinSize(1)
          .build();

  public static final SimpleAttributeDefinition CONNECTOR_CLASSNAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.CONNECTOR_CLASSNAME, ModelType.STRING)
          .setXmlName(Attribute.CLASSNAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition CACHEABLE =
      new MappedAttributeDefinitionBuilder(ModelKeys.CACHEABLE, ModelType.BOOLEAN)
          .setXmlName(Attribute.CACHEABLE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition QUERYABLE =
      new MappedAttributeDefinitionBuilder(ModelKeys.QUERYABLE, ModelType.BOOLEAN)
          .setXmlName(Attribute.QUERYABLE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition READONLY =
      new MappedAttributeDefinitionBuilder(ModelKeys.READONLY, ModelType.BOOLEAN)
          .setXmlName(Attribute.READONLY.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setDefaultValue(new ModelNode(false))
          .build();

  public static final SimpleAttributeDefinition EXPOSE_AS_WORKSPACE =
      new MappedAttributeDefinitionBuilder(ModelKeys.EXPOSE_AS_WORKSPACE, ModelType.STRING)
          .setXmlName(Attribute.EXPOSE_AS_WORKSPACE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setDefaultValue(new ModelNode(false))
          .build();

  public static final ListAttributeDefinition PREDEFINED_WORKSPACE_NAMES =
      MappedListAttributeDefinition.Builder.of(
              ModelKeys.PREDEFINED_WORKSPACE_NAMES,
              new MappedAttributeDefinitionBuilder(
                      ModelKeys.PREDEFINED_WORKSPACE_NAME, ModelType.STRING)
                  .setAllowExpression(true)
                  .setAllowNull(false)
                  .setValidator(WORKSPACE_NAME_VALIDATOR)
                  .setFlags(AttributeAccess.Flag.RESTART_NONE)
                  .build())
          .setAllowNull(true)
          .setMinSize(0)
          .setFieldPathInRepositoryConfiguration(FieldName.WORKSPACES, FieldName.PREDEFINED)
          .build();

  public static final SimpleAttributeDefinition DEFAULT_INITIAL_CONTENT =
      new MappedAttributeDefinitionBuilder(ModelKeys.DEFAULT_INITIAL_CONTENT, ModelType.STRING)
          .setAllowExpression(false)
          .setAllowNull(true)
          .setValidator(DEFAULT_INITIAL_CONTENT_VALIDATOR)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final ListAttributeDefinition WORKSPACES_INITIAL_CONTENT =
      MappedListAttributeDefinition.Builder.of(
              ModelKeys.WORKSPACES_INITIAL_CONTENT,
              new MappedAttributeDefinitionBuilder(ModelKeys.INITIAL_CONTENT, ModelType.PROPERTY)
                  .setAllowNull(false)
                  .setFlags(AttributeAccess.Flag.RESTART_NONE)
                  .setValidator(INITIAL_CONTENT_VALIDATOR)
                  .build())
          .setAllowNull(true)
          .setMinSize(0)
          .build();

  public static final ListAttributeDefinition NODE_TYPES =
      MappedListAttributeDefinition.Builder.of(
              ModelKeys.NODE_TYPES,
              new MappedAttributeDefinitionBuilder(ModelKeys.NODE_TYPE, ModelType.STRING)
                  .setAllowExpression(true)
                  .setAllowNull(false)
                  .setValidator(NODE_TYPE_VALIDATOR)
                  .setFlags(AttributeAccess.Flag.RESTART_NONE)
                  .build())
          .setAllowNull(true)
          .setMinSize(0)
          .build();

  public static final SimpleAttributeDefinition PROPERTY =
      new SimpleAttributeDefinition(ModelKeys.PROPERTY, ModelType.PROPERTY, true);
  public static final SimpleListAttributeDefinition PROPERTIES =
      SimpleListAttributeDefinition.Builder.of(ModelKeys.PROPERTIES, PROPERTY)
          .setAllowNull(true)
          .build();

  public static final SimpleAttributeDefinition RELATIVE_TO =
      new MappedAttributeDefinitionBuilder(ModelKeys.RELATIVE_TO, ModelType.STRING)
          .setXmlName(Attribute.RELATIVE_TO.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(JBOSS_DATA_DIR_VARIABLE))
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition SEQUENCER_CLASSNAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.SEQUENCER_CLASSNAME, ModelType.STRING)
          .setXmlName(Attribute.CLASSNAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.SEQUENCING, FieldName.SEQUENCERS, FieldName.CLASSNAME)
          .build();
  public static final SimpleAttributeDefinition SEQUENCER_THREAD_POOL_NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.SEQUENCERS_THREAD_POOL_NAME, ModelType.STRING)
          .setXmlName(Attribute.THREAD_POOL_NAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setDefaultValue(new ModelNode().set(RepositoryConfiguration.Default.SEQUENCING_POOL))
          .setFieldPathInRepositoryConfiguration(
              FieldName.SEQUENCING, FieldName.SEQUENCERS, FieldName.THREAD_POOL)
          .build();

  public static final SimpleAttributeDefinition SEQUENCER_MAX_POOL_SIZE =
      new MappedAttributeDefinitionBuilder(ModelKeys.SEQUENCERS_MAX_POOL_SIZE, ModelType.STRING)
          .setXmlName(Attribute.MAX_POOL_SIZE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setDefaultValue(
              new ModelNode().set(RepositoryConfiguration.Default.SEQUENCING_MAX_POOL_SIZE))
          .setFieldPathInRepositoryConfiguration(
              FieldName.SEQUENCING, FieldName.SEQUENCERS, FieldName.MAX_POOL_SIZE)
          .build();

  public static final SimpleAttributeDefinition STORE_NAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.STORE_NAME, ModelType.STRING)
          .setXmlName(Attribute.STORE_NAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final ListAttributeDefinition NESTED_STORES =
      MappedListAttributeDefinition.Builder.of(
              ModelKeys.NESTED_STORES,
              new MappedAttributeDefinitionBuilder(ModelKeys.STORE_NAME, ModelType.STRING)
                  .setAllowExpression(false)
                  .setAllowNull(false)
                  .setFlags(AttributeAccess.Flag.RESTART_NONE)
                  .build())
          .setAllowNull(false)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition TEXT_EXTRACTOR_CLASSNAME =
      new MappedAttributeDefinitionBuilder(ModelKeys.TEXT_EXTRACTOR_CLASSNAME, ModelType.STRING)
          .setXmlName(Attribute.CLASSNAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setFieldPathInRepositoryConfiguration(
              FieldName.TEXT_EXTRACTION, FieldName.EXTRACTORS, FieldName.CLASSNAME)
          .build();
  public static final SimpleAttributeDefinition TEXT_EXTRACTOR_THREAD_POOL_NAME =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.TEXT_EXTRACTORS_THREAD_POOL_NAME, ModelType.STRING)
          .setXmlName(Attribute.THREAD_POOL_NAME.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setDefaultValue(
              new ModelNode().set(RepositoryConfiguration.Default.TEXT_EXTRACTION_POOL))
          .setFieldPathInRepositoryConfiguration(
              FieldName.TEXT_EXTRACTION, FieldName.EXTRACTORS, FieldName.THREAD_POOL)
          .build();

  public static final SimpleAttributeDefinition TEXT_EXTRACTOR_MAX_POOL_SIZE =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.TEXT_EXTRACTORS_MAX_POOL_SIZE, ModelType.STRING)
          .setXmlName(Attribute.MAX_POOL_SIZE.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setDefaultValue(
              new ModelNode().set(RepositoryConfiguration.Default.TEXT_EXTRACTION_MAX_POOL_SIZE))
          .setFieldPathInRepositoryConfiguration(
              FieldName.TEXT_EXTRACTION, FieldName.EXTRACTORS, FieldName.MAX_POOL_SIZE)
          .build();

  public static final SimpleAttributeDefinition SECURITY_DOMAIN =
      new MappedAttributeDefinitionBuilder(ModelKeys.SECURITY_DOMAIN, ModelType.STRING)
          .setXmlName(Attribute.SECURITY_DOMAIN.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("modeshape-security"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setAccessConstraints(SensitiveTargetAccessConstraintDefinition.SECURITY_DOMAIN_REF)
          .setFieldPathInRepositoryConfiguration(
              FieldName.SECURITY, FieldName.JAAS, FieldName.JAAS_POLICY_NAME)
          .build();

  public static final SimpleAttributeDefinition USE_ANONYMOUS_IF_AUTH_FAILED =
      new MappedAttributeDefinitionBuilder(
              ModelKeys.USE_ANONYMOUS_IF_AUTH_FAILED, ModelType.BOOLEAN)
          .setXmlName(Attribute.USE_ANONYMOUS_IF_AUTH_FAILED.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(false))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .setAccessConstraints(SensitiveTargetAccessConstraintDefinition.SECURITY_DOMAIN_REF)
          .setFieldPathInRepositoryConfiguration(
              FieldName.SECURITY, FieldName.ANONYMOUS, FieldName.USE_ANONYMOUS_ON_FAILED_LOGINS)
          .build();

  public static final SimpleAttributeDefinition EXPLODED =
      new MappedAttributeDefinitionBuilder(ModelKeys.EXPLODED, ModelType.BOOLEAN)
          .setXmlName(Attribute.EXPLODED.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set(false))
          .build();

  public static final SimpleAttributeDefinition JOURNALING =
      new MappedAttributeDefinitionBuilder(ModelKeys.JOURNALING, ModelType.BOOLEAN)
          .setXmlName(Attribute.JOURNALING.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode(false))
          .build();

  public static final SimpleAttributeDefinition JOURNAL_PATH =
      new MappedAttributeDefinitionBuilder(ModelKeys.JOURNAL_PATH, ModelType.STRING)
          .setXmlName(Attribute.JOURNAL_PATH.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition JOURNAL_RELATIVE_TO =
      new MappedAttributeDefinitionBuilder(ModelKeys.JOURNAL_RELATIVE_TO, ModelType.STRING)
          .setXmlName(Attribute.JOURNAL_RELATIVE_TO.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition MAX_DAYS_TO_KEEP_RECORDS =
      new MappedAttributeDefinitionBuilder(ModelKeys.MAX_DAYS_TO_KEEP_RECORDS, ModelType.INT)
          .setXmlName(Attribute.MAX_DAYS_TO_KEEP_RECORDS.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode(-1))
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition ASYNC_WRITES =
      new MappedAttributeDefinitionBuilder(ModelKeys.ASYNC_WRITES, ModelType.BOOLEAN)
          .setXmlName(Attribute.ASYNC_WRITES.getLocalName())
          .setAllowExpression(false)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode(false))
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .build();

  public static final SimpleAttributeDefinition JOURNAL_GC_THREAD_POOL =
      new MappedAttributeDefinitionBuilder(ModelKeys.JOURNAL_GC_THREAD_POOL, ModelType.STRING)
          .setXmlName(Attribute.JOURNAL_GC_THREAD_POOL.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("modeshape-journaling-gc"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final SimpleAttributeDefinition JOURNAL_GC_INITIAL_TIME =
      new MappedAttributeDefinitionBuilder(ModelKeys.JOURNAL_GC_INITIAL_TIME, ModelType.STRING)
          .setXmlName(Attribute.JOURNAL_GC_INITIAL_TIME.getLocalName())
          .setAllowExpression(true)
          .setAllowNull(true)
          .setDefaultValue(new ModelNode().set("00:00"))
          .setFlags(AttributeAccess.Flag.RESTART_NONE)
          .build();

  public static final AttributeDefinition[] SUBSYSTEM_ATTRIBUTES = {};

  public static final AttributeDefinition[] WEBAPP_ATTRIBUTES = {EXPLODED};

  public static final AttributeDefinition[] REPOSITORY_ATTRIBUTES = {
    CACHE_NAME,
    CACHE_CONFIG,
    CONFIG_RELATIVE_TO,
    JNDI_NAME,
    ENABLE_MONITORING,
    SECURITY_DOMAIN,
    ANONYMOUS_ROLES,
    ANONYMOUS_USERNAME,
    USE_ANONYMOUS_IF_AUTH_FAILED,
    NODE_TYPES,
    DEFAULT_WORKSPACE,
    PREDEFINED_WORKSPACE_NAMES,
    ALLOW_WORKSPACE_CREATION,
    WORKSPACES_CACHE_SIZE,
    DEFAULT_INITIAL_CONTENT,
    WORKSPACES_INITIAL_CONTENT,
    GARBAGE_COLLECTION_THREAD_POOL,
    GARBAGE_COLLECTION_INITIAL_TIME,
    GARBAGE_COLLECTION_INTERVAL,
    DOCUMENT_OPTIMIZATION_THREAD_POOL,
    DOCUMENT_OPTIMIZATION_INITIAL_TIME,
    DOCUMENT_OPTIMIZATION_INTERVAL,
    DOCUMENT_OPTIMIZATION_CHILD_COUNT_TARGET,
    DOCUMENT_OPTIMIZATION_CHILD_COUNT_TOLERANCE,
    JOURNAL_PATH,
    JOURNAL_RELATIVE_TO,
    MAX_DAYS_TO_KEEP_RECORDS,
    JOURNAL_GC_INITIAL_TIME,
    JOURNAL_GC_THREAD_POOL,
    ASYNC_WRITES,
    JOURNALING,
    SEQUENCER_THREAD_POOL_NAME,
    SEQUENCER_MAX_POOL_SIZE,
    TEXT_EXTRACTOR_THREAD_POOL_NAME,
    TEXT_EXTRACTOR_MAX_POOL_SIZE,
    EVENT_BUS_SIZE,
    REINDEXING_ASYNC,
    REINDEXING_MODE
  };

  public static final AttributeDefinition[] TRANSIENT_BINARY_STORAGE_ATTRIBUTES = {
    MINIMUM_BINARY_SIZE, MINIMUM_STRING_SIZE, MIME_TYPE_DETECTION
  };

  public static final AttributeDefinition[] FILE_BINARY_STORAGE_ATTRIBUTES = {
    MINIMUM_BINARY_SIZE,
    MINIMUM_STRING_SIZE,
    PATH,
    TRASH,
    RELATIVE_TO,
    STORE_NAME,
    MIME_TYPE_DETECTION
  };

  public static final AttributeDefinition[] DATABASE_BINARY_STORAGE_ATTRIBUTES = {
    MINIMUM_BINARY_SIZE, MINIMUM_STRING_SIZE, DATA_SOURCE_JNDI_NAME, STORE_NAME, MIME_TYPE_DETECTION
  };

  public static final AttributeDefinition[] COMPOSITE_BINARY_STORAGE_ATTRIBUTES = {
    MINIMUM_BINARY_SIZE, MINIMUM_STRING_SIZE, NESTED_STORES, MIME_TYPE_DETECTION
  };

  public static final AttributeDefinition[] CUSTOM_BINARY_STORAGE_ATTRIBUTES = {
    MINIMUM_BINARY_SIZE, MINIMUM_STRING_SIZE, CLASSNAME, MODULE, STORE_NAME, MIME_TYPE_DETECTION
  };

  public static final AttributeDefinition[] INDEX_DEFINITION_ATTRIBUTES = {
    INDEX_KIND, PROVIDER_NAME, NODE_TYPE_NAME, SYNCHRONOUS, INDEX_COLUMNS, PROPERTIES
  };

  public static final AttributeDefinition[] INDEX_PROVIDER_ATTRIBUTES = {
    CLASSNAME, MODULE, RELATIVE_TO, PATH, PROPERTIES
  };

  public static final AttributeDefinition[] SEQUENCER_ATTRIBUTES = {
    PATH_EXPRESSIONS, SEQUENCER_CLASSNAME, MODULE, PROPERTIES
  };
  public static final AttributeDefinition[] SOURCE_ATTRIBUTES = {
    PROJECTIONS, CONNECTOR_CLASSNAME, READONLY, CACHEABLE,
    QUERYABLE, MODULE, PROPERTIES, EXPOSE_AS_WORKSPACE
  };
  public static final AttributeDefinition[] TEXT_EXTRACTOR_ATTRIBUTES = {
    TEXT_EXTRACTOR_CLASSNAME, MODULE, PROPERTIES
  };
  public static final AttributeDefinition[] AUTHENTICATOR_ATTRIBUTES = {
    AUTHENTICATOR_CLASSNAME, MODULE, PROPERTIES
  };
}
/**
 * Resource description for the addressable resource /subsystem=infinispan/cache-container=X
 *
 * @author Richard Achmatowicz (c) 2011 Red Hat Inc.
 */
public class CacheContainerResourceDefinition extends SimpleResourceDefinition {

  public static final PathElement CONTAINER_PATH =
      PathElement.pathElement(ModelKeys.CACHE_CONTAINER);

  // attributes
  static final AttributeDefinition ALIAS =
      new SimpleAttributeDefinitionBuilder(ModelKeys.ALIAS, ModelType.STRING, true)
          .setXmlName(Attribute.NAME.getLocalName())
          .setAllowExpression(false)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .build();
  static final SimpleListAttributeDefinition ALIASES =
      SimpleListAttributeDefinition.Builder.of(ModelKeys.ALIASES, ALIAS)
          .setAllowNull(true)
          .setAttributeMarshaller(AttributeMarshallerFactory.createSimpleListAttributeMarshaller())
          .build();
  static final SimpleAttributeDefinition MODULE =
      new SimpleAttributeDefinitionBuilder(ModelKeys.MODULE, ModelType.STRING, true)
          .setXmlName(Attribute.MODULE.getLocalName())
          .setAllowExpression(true)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .setValidator(new ModuleIdentifierValidator(true))
          .setDefaultValue(new ModelNode().set("org.jboss.as.clustering.infinispan"))
          .build();
  // make default-cache non required (AS7-3488)
  static final SimpleAttributeDefinition DEFAULT_CACHE =
      new SimpleAttributeDefinitionBuilder(ModelKeys.DEFAULT_CACHE, ModelType.STRING, true)
          .setXmlName(Attribute.DEFAULT_CACHE.getLocalName())
          .setAllowExpression(true)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .build();
  static final SimpleAttributeDefinition EVICTION_EXECUTOR =
      new SimpleAttributeDefinitionBuilder(ModelKeys.EVICTION_EXECUTOR, ModelType.STRING, true)
          .setXmlName(Attribute.EVICTION_EXECUTOR.getLocalName())
          .setAllowExpression(false)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .build();
  static final SimpleAttributeDefinition JNDI_NAME =
      new SimpleAttributeDefinitionBuilder(ModelKeys.JNDI_NAME, ModelType.STRING, true)
          .setXmlName(Attribute.JNDI_NAME.getLocalName())
          .setAllowExpression(true)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .build();
  static final SimpleAttributeDefinition LISTENER_EXECUTOR =
      new SimpleAttributeDefinitionBuilder(ModelKeys.LISTENER_EXECUTOR, ModelType.STRING, true)
          .setXmlName(Attribute.LISTENER_EXECUTOR.getLocalName())
          .setAllowExpression(false)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .build();
  static final SimpleAttributeDefinition NAME =
      new SimpleAttributeDefinitionBuilder(ModelKeys.NAME, ModelType.STRING, true)
          .setXmlName(Attribute.NAME.getLocalName())
          .setAllowExpression(false)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .build();
  static final SimpleAttributeDefinition REPLICATION_QUEUE_EXECUTOR =
      new SimpleAttributeDefinitionBuilder(
              ModelKeys.REPLICATION_QUEUE_EXECUTOR, ModelType.STRING, true)
          .setXmlName(Attribute.REPLICATION_QUEUE_EXECUTOR.getLocalName())
          .setAllowExpression(false)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .build();
  static final SimpleAttributeDefinition START =
      new SimpleAttributeDefinitionBuilder(ModelKeys.START, ModelType.STRING, true)
          .setXmlName(Attribute.START.getLocalName())
          .setAllowExpression(true)
          .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
          .setValidator(new EnumValidator<>(StartMode.class, true, false))
          .setDefaultValue(new ModelNode().set(StartMode.LAZY.name()))
          .build();
  static final SimpleAttributeDefinition STATISTICS_ENABLED =
      new SimpleAttributeDefinitionBuilder(ModelKeys.STATISTICS_ENABLED, ModelType.BOOLEAN, true)
          .setXmlName(Attribute.STATISTICS_ENABLED.getLocalName())
          .setAllowExpression(true)
          .setFlags(AttributeAccess.Flag.RESTART_RESOURCE_SERVICES)
          .setDefaultValue(new ModelNode().set(false))
          .build();

  static final AttributeDefinition[] CACHE_CONTAINER_ATTRIBUTES = {
    DEFAULT_CACHE,
    ALIASES,
    JNDI_NAME,
    START,
    LISTENER_EXECUTOR,
    EVICTION_EXECUTOR,
    REPLICATION_QUEUE_EXECUTOR,
    MODULE,
    STATISTICS_ENABLED
  };

  // operations
  static final OperationDefinition ALIAS_ADD =
      new SimpleOperationDefinitionBuilder(
              "add-alias",
              InfinispanExtension.getResourceDescriptionResolver("cache-container.alias"))
          .setParameters(NAME)
          .build();
  static final OperationDefinition ALIAS_REMOVE =
      new SimpleOperationDefinitionBuilder(
              "remove-alias",
              InfinispanExtension.getResourceDescriptionResolver("cache-container.alias"))
          .setParameters(NAME)
          .build();

  // metrics
  static final AttributeDefinition CACHE_MANAGER_STATUS =
      new SimpleAttributeDefinitionBuilder(MetricKeys.CACHE_MANAGER_STATUS, ModelType.STRING, true)
          .setStorageRuntime()
          .build();
  static final AttributeDefinition CLUSTER_NAME =
      new SimpleAttributeDefinitionBuilder(MetricKeys.CLUSTER_NAME, ModelType.STRING, true)
          .setStorageRuntime()
          .build();
  static final AttributeDefinition COORDINATOR_ADDRESS =
      new SimpleAttributeDefinitionBuilder(MetricKeys.COORDINATOR_ADDRESS, ModelType.STRING, true)
          .setStorageRuntime()
          .build();
  static final AttributeDefinition IS_COORDINATOR =
      new SimpleAttributeDefinitionBuilder(MetricKeys.IS_COORDINATOR, ModelType.BOOLEAN, true)
          .setStorageRuntime()
          .build();
  static final AttributeDefinition LOCAL_ADDRESS =
      new SimpleAttributeDefinitionBuilder(MetricKeys.LOCAL_ADDRESS, ModelType.STRING, true)
          .setStorageRuntime()
          .build();

  static final AttributeDefinition[] CACHE_CONTAINER_METRICS = {
    CACHE_MANAGER_STATUS, CLUSTER_NAME, COORDINATOR_ADDRESS, IS_COORDINATOR, LOCAL_ADDRESS
  };

  private final ResolvePathHandler resolvePathHandler;
  private final boolean runtimeRegistration;

  public CacheContainerResourceDefinition(
      final ResolvePathHandler resolvePathHandler, final boolean runtimeRegistration) {
    super(
        CONTAINER_PATH,
        InfinispanExtension.getResourceDescriptionResolver(ModelKeys.CACHE_CONTAINER),
        CacheContainerAdd.INSTANCE,
        CacheContainerRemove.INSTANCE);
    this.resolvePathHandler = resolvePathHandler;
    this.runtimeRegistration = runtimeRegistration;
  }

  @Override
  public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
    // the handlers need to take account of alias
    final OperationStepHandler writeHandler =
        new CacheContainerWriteAttributeHandler(CACHE_CONTAINER_ATTRIBUTES);
    for (AttributeDefinition attr : CACHE_CONTAINER_ATTRIBUTES) {
      resourceRegistration.registerReadWriteAttribute(
          attr, CacheContainerReadAttributeHandler.INSTANCE, writeHandler);
    }

    for (AttributeDefinition attr : CACHE_CONTAINER_METRICS) {
      resourceRegistration.registerMetric(attr, CacheContainerMetricsHandler.INSTANCE);
    }
  }

  @Override
  public void registerOperations(ManagementResourceRegistration resourceRegistration) {
    super.registerOperations(resourceRegistration);
    // register add-alias and remove-alias
    resourceRegistration.registerOperationHandler(
        CacheContainerResourceDefinition.ALIAS_ADD, AddAliasCommand.INSTANCE);
    resourceRegistration.registerOperationHandler(
        CacheContainerResourceDefinition.ALIAS_REMOVE, RemoveAliasCommand.INSTANCE);
  }

  @Override
  public void registerChildren(ManagementResourceRegistration resourceRegistration) {
    // child resources
    resourceRegistration.registerSubModel(new TransportResourceDefinition());
    resourceRegistration.registerSubModel(
        new LocalCacheResourceDefinition(this.resolvePathHandler, this.runtimeRegistration));
    resourceRegistration.registerSubModel(
        new InvalidationCacheResourceDefinition(this.resolvePathHandler, this.runtimeRegistration));
    resourceRegistration.registerSubModel(
        new ReplicatedCacheResourceDefinition(this.resolvePathHandler, this.runtimeRegistration));
    resourceRegistration.registerSubModel(
        new DistributedCacheResourceDefinition(this.resolvePathHandler, this.runtimeRegistration));
  }
}