private void configureFeatures(
      Element configElement, SmooksResourceConfiguration resourceConfig) {
    Element featuresElement = DomUtils.getElement(configElement, "features", 1);

    if (featuresElement != null) {
      NodeList features = featuresElement.getChildNodes();
      for (int i = 0; i < features.getLength(); i++) {
        if (features.item(i).getNodeType() == Node.ELEMENT_NODE) {
          Element feature = (Element) features.item(i);
          String uri = feature.getAttribute("feature");

          if (DomUtils.getName(feature).equals("setOn")) {
            resourceConfig.setParameter("feature-on", uri);
          } else {
            resourceConfig.setParameter("feature-off", uri);
          }
        }
      }
    }
  }
  private void digestParameters(
      Element resourceConfigElement, SmooksResourceConfiguration resourceConfig) {
    NodeList configNodes = resourceConfigElement.getElementsByTagName("param");

    for (int i = 0; i < configNodes.getLength(); i++) {
      Element paramNode = (Element) configNodes.item(i);
      String paramName = DomUtils.getAttributeValue(paramNode, "name");
      String paramType = DomUtils.getAttributeValue(paramNode, "type");
      String paramValue = DomUtils.getAllText(paramNode, true);
      Parameter paramInstance;

      paramInstance = resourceConfig.setParameter(paramName, paramType, paramValue);
      paramInstance.setXML(paramNode);
    }
  }
  private void configureParams(Element configElement, SmooksResourceConfiguration resourceConfig) {
    Element paramsElement = DomUtils.getElement(configElement, "params", 1);

    if (paramsElement != null) {
      NodeList params = paramsElement.getChildNodes();
      for (int i = 0; i < params.getLength(); i++) {
        if (params.item(i).getNodeType() == Node.ELEMENT_NODE) {
          Element param = (Element) params.item(i);
          String name = param.getAttribute("name");
          String value = DomUtils.getAllText(param, true);

          resourceConfig.setParameter(name, value);
        }
      }
    }
  }
  private void configureHandlers(
      Element configElement, SmooksResourceConfiguration resourceConfig) {
    Element handlersElement = DomUtils.getElement(configElement, "handlers", 1);

    if (handlersElement != null) {
      NodeList handlers = handlersElement.getChildNodes();
      for (int i = 0; i < handlers.getLength(); i++) {
        if (handlers.item(i).getNodeType() == Node.ELEMENT_NODE) {
          Element handler = (Element) handlers.item(i);
          String handlerClass = handler.getAttribute("class");

          resourceConfig.setParameter("sax-handler", handlerClass);
        }
      }
    }
  }
  private void digestResourceConfig(
      Element configElement,
      String defaultSelector,
      String defaultNamespace,
      String defaultProfile,
      String defaultConditionRef)
      throws SAXException {
    String selector = DomUtils.getAttributeValue(configElement, "selector");
    String namespace = DomUtils.getAttributeValue(configElement, "selector-namespace");
    String profiles = DomUtils.getAttributeValue(configElement, "target-profile");
    Element resourceElement = getElementByTagName(configElement, "resource");
    Element conditionElement = getElementByTagName(configElement, "condition");
    String resource = null;
    SmooksResourceConfiguration resourceConfig;

    try {
      if (resourceElement != null) {
        resource = DomUtils.getAllText(resourceElement, true);
      }
      resourceConfig =
          new SmooksResourceConfiguration(
              (selector != null ? selector : defaultSelector),
              (namespace != null ? namespace : defaultNamespace),
              (profiles != null ? profiles : defaultProfile),
              resource);
      if (resourceElement != null) {
        resourceConfig.setResourceType(DomUtils.getAttributeValue(resourceElement, "type"));
      }

      // And add the condition, if defined...
      if (conditionElement != null) {
        ExpressionEvaluator evaluator = digestCondition(conditionElement);
        resourceConfig.setConditionEvaluator(evaluator);
      } else if (defaultConditionRef != null) {
        ExpressionEvaluator evaluator = getConditionEvaluator(defaultConditionRef);
        resourceConfig.setConditionEvaluator(evaluator);
      }
    } catch (IllegalArgumentException e) {
      throw new SAXException("Invalid unit definition.", e);
    }

    // Add the parameters...
    digestParameters(configElement, resourceConfig);

    resourcelist.add(resourceConfig);
    if (resource == null) {
      if (resourceConfig.getParameters(SmooksResourceConfiguration.PARAM_RESDATA) != null) {
        logger.debug(
            "Resource 'null' for resource config: "
                + resourceConfig
                + ".  This is probably an error because the configuration contains a 'resdata' param, which suggests it is following the old DTD based configuration model.  The new model requires the resource to be specified in the <resource> element.");
      } else {
        logger.debug(
            "Resource 'null' for resource config: " + resourceConfig + ". This is not invalid!");
      }
    }
    if (logger.isDebugEnabled()) {
      logger.debug(
          "Adding smooks-resource config from [" + resourcelist.getName() + "]: " + resourceConfig);
    }
  }