private void writeTextExtraction(XMLExtendedStreamWriter writer, ModelNode repository)
      throws XMLStreamException {
    if (has(repository, ModelKeys.TEXT_EXTRACTOR)) {
      writer.writeStartElement(Element.TEXT_EXTRACTORS.getLocalName());
      if (repository.hasDefined(ModelKeys.TEXT_EXTRACTORS_THREAD_POOL_NAME)) {
        writer.writeAttribute(
            Attribute.THREAD_POOL_NAME.getLocalName(),
            repository.get(ModelKeys.TEXT_EXTRACTORS_THREAD_POOL_NAME).asString());
      }
      if (repository.hasDefined(ModelKeys.TEXT_EXTRACTORS_MAX_POOL_SIZE)) {
        writer.writeAttribute(
            Attribute.MAX_POOL_SIZE.getLocalName(),
            repository.get(ModelKeys.TEXT_EXTRACTORS_MAX_POOL_SIZE).asString());
      }
      for (Property extractor : repository.get(ModelKeys.TEXT_EXTRACTOR).asPropertyList()) {
        writer.writeStartElement(Element.TEXT_EXTRACTOR.getLocalName());
        writer.writeAttribute(Attribute.NAME.getLocalName(), extractor.getName());
        ModelNode prop = extractor.getValue();
        ModelAttributes.TEXT_EXTRACTOR_CLASSNAME.marshallAsAttribute(prop, writer);
        ModelAttributes.MODULE.marshallAsAttribute(prop, writer);

        // Write out the extra properties ...
        if (has(prop, ModelKeys.PROPERTIES)) {
          ModelNode properties = prop.get(ModelKeys.PROPERTIES);
          for (Property property : properties.asPropertyList()) {
            writer.writeAttribute(property.getName(), property.getValue().asString());
          }
        }
        writer.writeEndElement();
      }
      writer.writeEndElement();
    }
  }
  private void writeSequencing(XMLExtendedStreamWriter writer, ModelNode repository)
      throws XMLStreamException {
    if (has(repository, ModelKeys.SEQUENCER)) {
      writer.writeStartElement(Element.SEQUENCERS.getLocalName());
      if (repository.hasDefined(ModelKeys.SEQUENCERS_THREAD_POOL_NAME)) {
        writer.writeAttribute(
            Attribute.THREAD_POOL_NAME.getLocalName(),
            repository.get(ModelKeys.SEQUENCERS_THREAD_POOL_NAME).asString());
      }
      if (repository.hasDefined(ModelKeys.SEQUENCERS_MAX_POOL_SIZE)) {
        writer.writeAttribute(
            Attribute.MAX_POOL_SIZE.getLocalName(),
            repository.get(ModelKeys.SEQUENCERS_MAX_POOL_SIZE).asString());
      }

      ModelNode sequencerNode = repository.get(ModelKeys.SEQUENCER);

      for (Property sequencer : sequencerNode.asPropertyList()) {
        writer.writeStartElement(Element.SEQUENCER.getLocalName());
        writer.writeAttribute(Attribute.NAME.getLocalName(), sequencer.getName());
        ModelNode prop = sequencer.getValue();
        ModelAttributes.SEQUENCER_CLASSNAME.marshallAsAttribute(prop, writer);
        ModelAttributes.MODULE.marshallAsAttribute(prop, writer);

        // Write out the extra properties ...
        if (has(prop, ModelKeys.PROPERTIES)) {
          ModelNode properties = prop.get(ModelKeys.PROPERTIES);
          for (Property property : properties.asPropertyList()) {
            writer.writeAttribute(property.getName(), property.getValue().asString());
          }
        }
        if (has(prop, ModelKeys.PATH_EXPRESSIONS)) {
          List<ModelNode> pathExpressions = prop.get(ModelKeys.PATH_EXPRESSIONS).asList();
          switch (pathExpressions.size()) {
            case 0:
              break;
            case 1:
              ModelNode pathExpression = pathExpressions.iterator().next();
              writer.writeAttribute(
                  Attribute.PATH_EXPRESSION.getLocalName(), pathExpression.asString());
              break;
            default:
              for (ModelNode pathExpr : pathExpressions) {
                writer.writeStartElement(Element.PATH_EXPRESSION.getLocalName());
                writer.writeCharacters(pathExpr.asString());
                writer.writeEndElement();
              }
          }
        }
        writer.writeEndElement();
      }
      writer.writeEndElement();
    }
  }
Esempio n. 3
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
  };
}