/**
 * {@link org.jboss.as.controller.ResourceDefinition} for the HTTP management interface resource.
 *
 * @author Brian Stansberry (c) 2011 Red Hat Inc.
 */
public class HttpManagementResourceDefinition extends SimpleResourceDefinition {

  private static final PathElement RESOURCE_PATH =
      PathElement.pathElement(MANAGEMENT_INTERFACE, HTTP_INTERFACE);

  public static final SimpleAttributeDefinition SECURITY_REALM =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.SECURITY_REALM, ModelType.STRING, true)
          .setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, false))
          .addAccessConstraint(
              new SensitiveTargetAccessConstraintDefinition(
                  SensitivityClassification.SECURITY_REALM))
          .build();

  public static final SimpleAttributeDefinition INTERFACE =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.INTERFACE, ModelType.STRING, false)
          .setAllowExpression(true)
          .setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, false, true))
          .setAlternatives(
              ModelDescriptionConstants.SOCKET_BINDING,
              ModelDescriptionConstants.SECURE_SOCKET_BINDING)
          .addAccessConstraint(
              new SensitiveTargetAccessConstraintDefinition(
                  SensitivityClassification.SOCKET_CONFIG))
          .setDeprecated(ModelVersion.create(1, 4))
          .build();

  public static final SimpleAttributeDefinition HTTP_PORT =
      new SimpleAttributeDefinitionBuilder(ModelDescriptionConstants.PORT, ModelType.INT, true)
          .setAllowExpression(true)
          .setValidator(new IntRangeValidator(0, 65535, true, true))
          .setAlternatives(
              ModelDescriptionConstants.SOCKET_BINDING,
              ModelDescriptionConstants.SECURE_SOCKET_BINDING)
          .setRequires(ModelDescriptionConstants.INTERFACE)
          .addAccessConstraint(
              new SensitiveTargetAccessConstraintDefinition(
                  SensitivityClassification.SOCKET_CONFIG))
          .setDeprecated(ModelVersion.create(1, 4))
          .build();

  public static final SimpleAttributeDefinition HTTPS_PORT =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.SECURE_PORT, ModelType.INT, true)
          .setAllowExpression(true)
          .setValidator(new IntRangeValidator(0, 65535, true, true))
          .setAlternatives(
              ModelDescriptionConstants.SOCKET_BINDING,
              ModelDescriptionConstants.SECURE_SOCKET_BINDING)
          .setRequires(ModelDescriptionConstants.INTERFACE)
          .addAccessConstraint(
              new SensitiveTargetAccessConstraintDefinition(
                  SensitivityClassification.SOCKET_CONFIG))
          .setDeprecated(ModelVersion.create(1, 4))
          .build();

  public static final SimpleAttributeDefinition SOCKET_BINDING =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.SOCKET_BINDING, ModelType.STRING, true)
          .setXmlName(Attribute.HTTP.getLocalName())
          .setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, false))
          .setAlternatives(ModelDescriptionConstants.INTERFACE)
          .addAccessConstraint(
              new SensitiveTargetAccessConstraintDefinition(
                  SensitivityClassification.SOCKET_CONFIG))
          .build();

  public static final SimpleAttributeDefinition SECURE_SOCKET_BINDING =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.SECURE_SOCKET_BINDING, ModelType.STRING, true)
          .setXmlName(Attribute.HTTPS.getLocalName())
          .setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, false))
          .setAlternatives(ModelDescriptionConstants.INTERFACE)
          .addAccessConstraint(
              new SensitiveTargetAccessConstraintDefinition(
                  SensitivityClassification.SOCKET_CONFIG))
          .build();

  public static final SimpleAttributeDefinition CONSOLE_ENABLED =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.CONSOLE_ENABLED, ModelType.BOOLEAN, true)
          .setXmlName(Attribute.CONSOLE_ENABLED.getLocalName())
          .setDefaultValue(new ModelNode(true))
          .build();

  public static final SimpleAttributeDefinition HTTP_UPGRADE_ENABLED =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.HTTP_UPGRADE_ENABLED, ModelType.BOOLEAN, true)
          .setXmlName(Attribute.HTTP_UPGRADE_ENABLED.getLocalName())
          .setDefaultValue(new ModelNode(false))
          .build();
  public static final AttributeDefinition[] ATTRIBUTE_DEFINITIONS =
      new AttributeDefinition[] {
        INTERFACE,
        HTTP_PORT,
        HTTPS_PORT,
        SECURITY_REALM,
        SOCKET_BINDING,
        SECURE_SOCKET_BINDING,
        CONSOLE_ENABLED,
        HTTP_UPGRADE_ENABLED
      };

  public static final HttpManagementResourceDefinition INSTANCE =
      new HttpManagementResourceDefinition();

  private HttpManagementResourceDefinition() {
    super(
        RESOURCE_PATH,
        ServerDescriptions.getResourceDescriptionResolver("core.management.http-interface"),
        HttpManagementAddHandler.INSTANCE,
        HttpManagementRemoveHandler.INSTANCE,
        OperationEntry.Flag.RESTART_NONE,
        OperationEntry.Flag.RESTART_NONE);
  }

  @Override
  public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
    for (AttributeDefinition attr : ATTRIBUTE_DEFINITIONS) {
      resourceRegistration.registerReadWriteAttribute(
          attr, null, HttpManagementWriteAttributeHandler.INSTANCE);
    }
  }
}
/**
 * {@link org.jboss.as.controller.ResourceDefinition} for the HTTP management interface resource.
 *
 * @author Brian Stansberry (c) 2011 Red Hat Inc.
 */
public class HttpManagementResourceDefinition extends SimpleResourceDefinition {

  private final LocalHostControllerInfoImpl hostControllerInfo;
  private final HostControllerEnvironment environment;

  private static final PathElement RESOURCE_PATH =
      PathElement.pathElement(MANAGEMENT_INTERFACE, HTTP_INTERFACE);

  public static final SimpleAttributeDefinition SECURITY_REALM =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.SECURITY_REALM, ModelType.STRING, true)
          .setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, true, false))
          .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.SECURITY_REALM_REF)
          .build();

  public static final SimpleAttributeDefinition INTERFACE =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.INTERFACE, ModelType.STRING, false)
          .setAllowExpression(true)
          .setValidator(new StringLengthValidator(1, Integer.MAX_VALUE, false, true))
          .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.SOCKET_CONFIG)
          .build();

  public static final SimpleAttributeDefinition HTTP_PORT =
      new SimpleAttributeDefinitionBuilder(ModelDescriptionConstants.PORT, ModelType.INT, true)
          .setAllowExpression(true)
          .setValidator(new IntRangeValidator(0, 65535, true, true))
          .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.SOCKET_CONFIG)
          .build();

  public static final SimpleAttributeDefinition HTTPS_PORT =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.SECURE_PORT, ModelType.INT, true)
          .setAllowExpression(true)
          .setValidator(new IntRangeValidator(0, 65535, true, true))
          .addAccessConstraint(SensitiveTargetAccessConstraintDefinition.SOCKET_CONFIG)
          .build();
  public static final SimpleAttributeDefinition CONSOLE_ENABLED =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.CONSOLE_ENABLED, ModelType.BOOLEAN, true)
          .setAllowExpression(true)
          .setXmlName(Attribute.CONSOLE_ENABLED.getLocalName())
          .setDefaultValue(new ModelNode(true))
          .build();

  public static final SimpleAttributeDefinition HTTP_UPGRADE_ENABLED =
      new SimpleAttributeDefinitionBuilder(
              ModelDescriptionConstants.HTTP_UPGRADE_ENABLED, ModelType.BOOLEAN, true)
          .setAllowExpression(true)
          .setXmlName(Attribute.HTTP_UPGRADE_ENABLED.getLocalName())
          .setDefaultValue(new ModelNode(false))
          .build();

  public static final AttributeDefinition[] ATTRIBUTE_DEFINITIONS =
      new AttributeDefinition[] {
        INTERFACE, HTTP_PORT, HTTPS_PORT, SECURITY_REALM, CONSOLE_ENABLED, HTTP_UPGRADE_ENABLED
      };

  private final List<AccessConstraintDefinition> accessConstraints;

  public HttpManagementResourceDefinition(
      final LocalHostControllerInfoImpl hostControllerInfo,
      final HostControllerEnvironment environment) {
    super(
        RESOURCE_PATH,
        HostModelUtil.getResourceDescriptionResolver("core", "management", "http-interface"),
        new HttpManagementAddHandler(hostControllerInfo, environment),
        new HttpManagementRemoveHandler(hostControllerInfo, environment),
        OperationEntry.Flag.RESTART_NONE,
        OperationEntry.Flag.RESTART_NONE);
    this.hostControllerInfo = hostControllerInfo;
    this.environment = environment;
    this.accessConstraints =
        SensitiveTargetAccessConstraintDefinition.MANAGEMENT_INTERFACES.wrapAsList();
  }

  @Override
  public void registerAttributes(ManagementResourceRegistration resourceRegistration) {
    final HttpManagementWriteAttributeHandler writeAttributeHandler =
        new HttpManagementWriteAttributeHandler(hostControllerInfo, environment);
    for (AttributeDefinition attr : ATTRIBUTE_DEFINITIONS) {
      resourceRegistration.registerReadWriteAttribute(attr, null, writeAttributeHandler);
    }
  }

  @Override
  public List<AccessConstraintDefinition> getAccessConstraints() {
    return accessConstraints;
  }
}