@Override
  public void readElement(final XMLExtendedStreamReader reader, final List<ModelNode> list)
      throws XMLStreamException {

    final ModelNode address = new ModelNode();
    address.add(ModelDescriptionConstants.SUBSYSTEM, RESOURCEADAPTERS_NAME);
    address.protect();

    final ModelNode subsystem = new ModelNode();
    subsystem.get(OP).set(ADD);
    subsystem.get(OP_ADDR).set(address);

    list.add(subsystem);

    try {
      String localName;
      switch (Namespace.forUri(reader.getNamespaceURI())) {
        case RESOURCEADAPTERS_1_0:
        case RESOURCEADAPTERS_1_1:
        case RESOURCEADAPTERS_2_0:
        case RESOURCEADAPTERS_3_0:
          {
            localName = reader.getLocalName();
            final Element element = Element.forName(reader.getLocalName());
            SUBSYSTEM_RA_LOGGER.tracef("%s -> %s", localName, element);
            switch (element) {
              case SUBSYSTEM:
                {
                  ResourceAdapterParser parser = new ResourceAdapterParser();
                  parser.parse(reader, list, address);
                  ParseUtils.requireNoContent(reader);
                  break;
                }
            }
            break;
          }
      }
    } catch (Exception e) {
      throw new XMLStreamException(e);
    }
  }
  @Override
  public void initialize(final ExtensionContext context) {
    SUBSYSTEM_RA_LOGGER.debugf("Initializing ResourceAdapters Extension");
    // Register the remoting subsystem
    final SubsystemRegistration registration = context.registerSubsystem(SUBSYSTEM_NAME);

    ReloadRequiredWriteAttributeHandler reloadRequiredWriteAttributeHandler =
        new ReloadRequiredWriteAttributeHandler();

    registration.registerXMLElementWriter(ResourceAdapterSubsystemParser.INSTANCE);

    // Remoting subsystem description and operation handlers
    final ManagementResourceRegistration subsystem = registration.registerSubsystemModel(SUBSYSTEM);
    subsystem.registerOperationHandler(
        ADD, ResourceAdaptersSubSystemAdd.INSTANCE, SUBSYSTEM_ADD_DESC, false);
    subsystem.registerOperationHandler(
        DESCRIBE,
        GenericSubsystemDescribeHandler.INSTANCE,
        GenericSubsystemDescribeHandler.INSTANCE,
        false,
        OperationEntry.EntryType.PRIVATE);

    final ManagementResourceRegistration resourceadapter =
        subsystem.registerSubModel(
            PathElement.pathElement(RESOURCEADAPTER_NAME), RESOURCEADAPTER_DESC);
    resourceadapter.registerOperationHandler(ADD, RaAdd.INSTANCE, ADD_RESOURCEADAPTER_DESC, false);
    resourceadapter.registerOperationHandler(
        REMOVE, RaRemove.INSTANCE, REMOVE_RESOURCEADAPTER_DESC, false);
    for (final String attribute : ResourceAdaptersSubsystemProviders.RESOURCEADAPTER_ATTRIBUTE) {
      resourceadapter.registerReadWriteAttribute(
          attribute, null, reloadRequiredWriteAttributeHandler, Storage.CONFIGURATION);
    }

    final ManagementResourceRegistration configAdapter =
        resourceadapter.registerSubModel(
            PathElement.pathElement(CONFIG_PROPERTIES.getName()), CONFIG_PROPERTIES_DESC);
    configAdapter.registerOperationHandler(
        ADD, ConfigPropertyAdd.INSTANCE, ADD_CONFIG_PROPERTIES_DESC, false);
    configAdapter.registerOperationHandler(
        REMOVE, ReloadRequiredRemoveStepHandler.INSTANCE, REMOVE_CONFIG_PROPERTIES_DESC, false);

    final ManagementResourceRegistration connectionDefinition =
        resourceadapter.registerSubModel(
            PathElement.pathElement(CONNECTIONDEFINITIONS_NAME), CONNECTION_DEFINITION_DESC);
    connectionDefinition.registerOperationHandler(
        ADD, ConnectionDefinitionAdd.INSTANCE, ADD_CONNECTION_DEFINITION_DESC, false);
    connectionDefinition.registerOperationHandler(
        REMOVE, ReloadRequiredRemoveStepHandler.INSTANCE, REMOVE_CONNECTION_DEFINITION_DESC, false);

    final ManagementResourceRegistration configCF =
        connectionDefinition.registerSubModel(
            PathElement.pathElement(CONFIG_PROPERTIES.getName()), CONFIG_PROPERTIES_DESC);
    configCF.registerOperationHandler(
        ADD, CDConfigPropertyAdd.INSTANCE, ADD_CONFIG_PROPERTIES_DESC, false);
    configCF.registerOperationHandler(
        REMOVE, ReloadRequiredRemoveStepHandler.INSTANCE, REMOVE_CONFIG_PROPERTIES_DESC, false);
    for (final SimpleAttributeDefinition attribute :
        ResourceAdaptersSubsystemProviders.CONNECTIONDEFINITIONS_NODEATTRIBUTE) {
      connectionDefinition.registerReadWriteAttribute(
          attribute.getName(), null, reloadRequiredWriteAttributeHandler, Storage.CONFIGURATION);
    }

    final ManagementResourceRegistration adminObject =
        resourceadapter.registerSubModel(
            PathElement.pathElement(ADMIN_OBJECTS_NAME), ADMIN_OBJECT_DESC);
    adminObject.registerOperationHandler(
        ADD, AdminObjectAdd.INSTANCE, ADD_ADMIN_OBJECT_DESC, false);
    adminObject.registerOperationHandler(
        REMOVE, ReloadRequiredRemoveStepHandler.INSTANCE, REMOVE_ADMIN_OBJECT_DESC, false);

    final ManagementResourceRegistration configAO =
        adminObject.registerSubModel(
            PathElement.pathElement(CONFIG_PROPERTIES.getName()), CONFIG_PROPERTIES_DESC);
    configAO.registerOperationHandler(
        ADD, AOConfigPropertyAdd.INSTANCE, ADD_CONFIG_PROPERTIES_DESC, false);
    configAO.registerOperationHandler(
        REMOVE, ReloadRequiredRemoveStepHandler.INSTANCE, REMOVE_CONFIG_PROPERTIES_DESC, false);
    for (final SimpleAttributeDefinition attribute :
        ResourceAdaptersSubsystemProviders.ADMIN_OBJECTS_NODEATTRIBUTE) {
      adminObject.registerReadWriteAttribute(
          attribute.getName(), null, reloadRequiredWriteAttributeHandler, Storage.CONFIGURATION);
    }

    resourceadapter.registerOperationHandler(
        "flush-idle-connection-in-pool",
        PoolOperations.FlushIdleConnectionInPool.RA_INSTANCE,
        FLUSH_IDLE_CONNECTION_DESC,
        false);
    resourceadapter.registerOperationHandler(
        "flush-all-connection-in-pool",
        PoolOperations.FlushAllConnectionInPool.RA_INSTANCE,
        FLUSH_ALL_CONNECTION_DESC,
        false);
    resourceadapter.registerOperationHandler(
        "test-connection-in-pool",
        PoolOperations.TestConnectionInPool.RA_INSTANCE,
        TEST_CONNECTION_DESC,
        false);

    for (final String attributeName : PoolMetrics.ATTRIBUTES) {
      resourceadapter.registerMetric(attributeName, PoolMetrics.RaPoolMetricsHandler.INSTANCE);
    }
  }