/**
  * Sets explicit schema instance name to use for schema validation.
  *
  * @param schemaName
  * @return
  */
 public AssertSoapFaultDefinition xsd(String schemaName) {
   validationContext.setSchema(schemaName);
   return this;
 }
  public BeanDefinition parse(Element element, ParserContext parserContext) {
    BeanDefinitionBuilder beanDefinition;

    beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(AssertSoapFault.class);

    beanDefinition.addPropertyValue("name", element.getLocalName());
    DescriptionElementParser.doParse(element, beanDefinition);

    BeanDefinitionParserUtils.setPropertyValue(
        beanDefinition, element.getAttribute("fault-code"), "faultCode");
    BeanDefinitionParserUtils.setPropertyValue(
        beanDefinition, element.getAttribute("fault-string"), "faultString");
    BeanDefinitionParserUtils.setPropertyValue(
        beanDefinition, element.getAttribute("fault-actor"), "faultActor");

    Element faultDetailElement = DomUtils.getChildElementByTagName(element, "fault-detail");
    if (faultDetailElement != null) {
      if (faultDetailElement.hasAttribute("file")) {
        if (StringUtils.hasText(DomUtils.getTextValue(faultDetailElement).trim())) {
          throw new BeanCreationException(
              "You tried to set fault-detail by file resource attribute and inline text value at the same time! "
                  + "Please choose one of them.");
        }

        String filePath = faultDetailElement.getAttribute("file");
        beanDefinition.addPropertyValue("faultDetailResourcePath", filePath);
      } else {
        String faultDetailData = DomUtils.getTextValue(faultDetailElement).trim();
        if (StringUtils.hasText(faultDetailData)) {
          beanDefinition.addPropertyValue("faultDetail", faultDetailData);
        } else {
          throw new BeanCreationException(
              "Not content for fault-detail is set! Either use file attribute or inline text value for fault-detail element.");
        }
      }

      XmlMessageValidationContext context = new XmlMessageValidationContext();

      String schemaValidation = faultDetailElement.getAttribute("schema-validation");
      if (StringUtils.hasText(schemaValidation)) {
        context.setSchemaValidation(Boolean.valueOf(schemaValidation));
      }

      String schema = faultDetailElement.getAttribute("schema");
      if (StringUtils.hasText(schema)) {
        context.setSchema(schema);
      }

      String schemaRepository = faultDetailElement.getAttribute("schema-repository");
      if (StringUtils.hasText(schemaRepository)) {
        context.setSchemaRepository(schemaRepository);
      }

      beanDefinition.addPropertyValue("validationContext", context);
    }

    Map<String, BeanDefinitionParser> actionRegistry =
        TestActionRegistry.getRegisteredActionParser();
    Element action;
    if (faultDetailElement == null) {
      action = DOMUtil.getFirstChildElement(element);
    } else {
      action = DOMUtil.getNextSiblingElement(faultDetailElement);
    }

    if (action != null && action.getTagName().equals("description")) {
      action = DOMUtil.getNextSiblingElement(action);
    }

    if (action != null) {
      BeanDefinitionParser parser = actionRegistry.get(action.getTagName());

      if (parser == null) {
        beanDefinition.addPropertyValue(
            "action",
            parserContext
                .getReaderContext()
                .getNamespaceHandlerResolver()
                .resolve(action.getNamespaceURI())
                .parse(action, parserContext));
      } else {
        beanDefinition.addPropertyValue("action", parser.parse(action, parserContext));
      }
    }

    BeanDefinitionParserUtils.setPropertyReference(
        beanDefinition, element.getAttribute("fault-validator"), "validator", "soapFaultValidator");
    BeanDefinitionParserUtils.setPropertyReference(
        beanDefinition,
        element.getAttribute("message-factory"),
        "messageFactory",
        "messageFactory");

    return beanDefinition.getBeanDefinition();
  }