public RecordFilterAppender assemble(ConfigurationContext context) {

    if (restrictions.length == 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ELEMENT_REQUIRED,
                  context.getElement().getTagName(),
                  "sx:regexCriteria, sx:restriction");
      throw new ServingXmlException(message);
    }

    BooleanOperatorEnum operatorEnum;
    try {
      operatorEnum = BooleanOperatorEnum.parse(operator);
    } catch (ServingXmlException e) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_VALUE_INVALID,
                  context.getElement().getTagName(),
                  "operator");
      e = e.supplementMessage(message);
      throw e;
    }

    RecordFilterAppender recordFilterAppender =
        new RestrictRecordFilterAppender(restrictions, operatorEnum, unmatchedRecord);
    if (parameterDescriptors.length > 0) {
      recordFilterAppender =
          new RecordFilterAppenderPrefilter(recordFilterAppender, parameterDescriptors);
    }
    return recordFilterAppender;
  }
  public FlatRecordFieldFactory assemble(ConfigurationContext context) {

    if (fieldName.isEmpty()) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "name");
      throw new ServingXmlException(message);
    }

    if (digitCount <= 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "digitCount");
      throw new ServingXmlException(message);
    }

    if (width <= 0) {
      width = PackedDecimal.calculatePackedSize(digitCount);
    }

    FlatFileOptionsFactory flatFileOptionsFactory = assembleFlatFileOptions(context);

    if (label == null) {
      if (fieldLabel != null) {
        SubstitutionExpr subExpr =
            SubstitutionExpr.parseString(context.getQnameContext(), fieldLabel);
        ValueEvaluator valueEvaluator = new SubstitutionExprValueEvaluator(subExpr);
        label = new Label(valueEvaluator);
      } else {
        label = new Label(fieldName.getLocalName());
      }
    }

    FlatRecordFieldFactory fieldTypeFactory =
        new PackedDecimalFieldFactory(
            fieldName,
            label,
            start,
            width,
            digitCount,
            decimalPlaces,
            defaultValue,
            flatFileOptionsFactory);

    return fieldTypeFactory;
  }
  public MapXmlFactory assemble(ConfigurationContext context) {

    if (elementQname == null || elementQname.length() == 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "element");
      throw new ServingXmlException(message);
    }

    try {
      if (xsltConfiguration == null) {
        xsltConfiguration = XsltConfiguration.getDefault();
      }

      NameSubstitutionExpr nameResolver =
          NameSubstitutionExpr.parse(context.getQnameContext(), elementQname);

      StringFactory stringFactory =
          StringFactoryCompiler.fromStringables(context, context.getElement());
      StringFactory[] stringFactories = new StringFactory[] {stringFactory};

      MapXmlFactory rmf =
          new MultipleMapXmlFactory(context.getQnameContext(), xsltConfiguration, childFactories);

      if (sorts.length > 0) {
        Comparator comparator = new SortComparator(sorts);
        rmf = new SortGroupFactory(rmf, comparator);
      }
      Environment env = new Environment(parameterDescriptors, context.getQnameContext());
      MapXmlFactory recordMapFactory =
          new ElementMapFactory(env, nameResolver, stringFactories, rmf);
      return recordMapFactory;
    } catch (ServingXmlException e) {
      throw e.contextualizeMessage(context.getElement().getTagName());
    } catch (Exception e) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ERROR,
                  context.getElement().getTagName(),
                  e.getMessage());
      throw new ServingXmlException(message, e);
    }
  }
  public FtpClient assemble(ConfigurationContext context) {

    if (host == null || host.length() == 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "host");
      throw new ServingXmlException(message);
    }

    if (user == null || user.length() == 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "user");
      throw new ServingXmlException(message);
    }

    try {
      return new FtpClient(host, port, user, password, remoteSiteCommand);
    } catch (ServingXmlException e) {
      throw e.contextualizeMessage(context.getElement().getTagName());
    } catch (Exception e) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ERROR,
                  context.getElement().getTagName(),
                  e.getMessage());
      throw new ServingXmlException(message, e);
    }
  }
  public Content assemble(ConfigurationContext context) {

    if (xsltConfiguration == null) {
      xsltConfiguration = XsltConfiguration.getDefault();
    }

    if (queryFactory == null && stringQueryFactory == null) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ELEMENT_REQUIRED,
                  context.getElement().getTagName(),
                  "sx:stringable or sx:streamSource");
      throw new ServingXmlException(message);
    }

    if (queryFactory == null) {
      ValueEvaluator valueEvaluator = new StringValueEvaluator(stringQueryFactory);
      queryFactory = new StringStreamSourceFactory(valueEvaluator);
    }
    if (contextDocument == null) {
      contextDocument = new DefaultDocument(xsltConfiguration.getOutputPropertyFactories());
    }
    if (baseUri == null) {
      baseUri = context.getQnameContext().getBase();
    }

    PrefixMap prefixMap = DomHelper.createPrefixMap(context.getElement());

    Content contentFactory =
        new XQueryContent(
            baseUri,
            prefixMap,
            queryFactory,
            contextDocument,
            xsltConfiguration.getOutputPropertyFactories());
    if (parameterDescriptors.length > 0) {
      contentFactory = new ContentPrefilter(contentFactory, parameterDescriptors);
    }
    return contentFactory;
  }
  public RecordCombinationFactory assemble(ConfigurationContext context) {
    Environment env = new Environment(parameterDescriptors, context.getQnameContext());

    if (recordTypeName.length() == 0) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "recordType");
      throw new ServingXmlException(message);
    }

    NameSubstitutionExpr recordTypeNameExpr =
        NameSubstitutionExpr.parse(context.getQnameContext(), recordTypeName);

    if (dataRecordTypeFactory == null) {
      String message =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ELEMENT_REQUIRED,
                  context.getElement().getTagName(),
                  "sx:flatRecordType");
      throw new ServingXmlException(message);
    }

    if (repeatingGroupFieldName.isEmpty()) {
      String msg =
          MessageFormatter.getInstance()
              .getMessage(
                  ServingXmlMessages.COMPONENT_ATTRIBUTE_REQUIRED,
                  context.getElement().getTagName(),
                  "repeatingGroup");
      throw new ServingXmlException(msg);
    }

    String baseUri = context.getQnameContext().getBase();
    XPathBooleanExpressionFactory startTestFactory;
    if (startTest.length() > 0) {
      startTestFactory =
          new XPathBooleanExpressionFactoryImpl(
              context.getQnameContext(),
              startTest,
              xsltConfiguration.getVersion(),
              baseUri,
              xsltConfiguration.getTransformerFactory());
    } else {
      startTestFactory =
          new SimpleXPathBooleanExpressionFactory(XPathBooleanExpression.ALWAYS_TRUE);
    }
    XPathBooleanExpressionFactory endTestFactory;
    if (endTest.length() > 0) {
      endTestFactory =
          new XPathBooleanExpressionFactoryImpl(
              context.getQnameContext(),
              endTest,
              xsltConfiguration.getVersion(),
              baseUri,
              xsltConfiguration.getTransformerFactory());
    } else {
      endTestFactory = startTestFactory;
    }

    GroupRecognizer groupRecognizer =
        new GroupRecognizerImpl(
            env.getQnameContext().getPrefixMap(), startTestFactory, endTestFactory);

    FlatFileOptionsFactory flatFileOptionsFactory = assembleFlatFileOptions(context);

    RecordCombinationFactory recordCompositionFactory =
        new CombineFlatRecordsFactory(
            recordTypeNameExpr,
            repeatingGroupFieldName,
            groupRecognizer,
            dataRecordTypeFactory,
            flatFileOptionsFactory);
    // if (parameterDescriptors.length > 0) {
    //  recordCompositionFactory = new FlatRecordTypeFactoryPrefilter(recordCompositionFactory,
    //                                                         parameterDescriptors);
    // }
    return recordCompositionFactory;
  }