private void appendDataRow(PrintWriter out, ValidationExternalType validationExternalType) {
   DataRowBuilder row = new DataRowBuilder(out);
   row.begin();
   row.append(validationExternalType.getSearchField());
   row.append(validationExternalType.getDisplayField());
   List formattedResultFields = mapToKeyValues(validationExternalType.getResultFields());
   row.append(formattedResultFields);
   row.end();
 }
  /**
   * Intended to be called by doValidationExternal.
   *
   * @param rSession the rets session
   * @param hSession the hibernate session
   * @exception HibernateException if an error occurs
   */
  private void doValidationExternalType(Session hSession) throws HibernateException {
    MetadataTable tValidationExternalTypes =
        getMetadataTable(MetadataTable.VALIDATION_EXTERNAL_TYPE);

    Iterator i = mValidationExternals.values().iterator();
    while (i.hasNext()) {
      ValidationExternal ve = (ValidationExternal) i.next();
      Set hValdationExternalTypes = new HashSet();
      List validationExternalTypes = tValidationExternalTypes.getDataRows(ve.getPath());
      if (validationExternalTypes != null) {
        Iterator j = validationExternalTypes.iterator();
        while (j.hasNext()) {
          Metadata md = (Metadata) j.next();
          ValidationExternalType vet = new ValidationExternalType();

          vet.setValidationExternal(ve);

          String joinedSearchField = md.getAttribute("SearchField");
          String searchField[] = StringUtils.split(joinedSearchField, ",");
          Set searchFieldSet = new HashSet();
          for (int c = 0; c < searchField.length; c++) {
            searchFieldSet.add(StringUtils.trimToEmpty(searchField[c]));
          }
          vet.setSearchField(searchFieldSet);

          String joinedDisplayField = md.getAttribute("DisplayField");
          String displayFields[] = StringUtils.split(joinedDisplayField, ",");
          Set displayFieldSet = new HashSet();
          for (int c = 0; c < displayFields.length; c++) {
            displayFieldSet.add(StringUtils.trimToEmpty(displayFields[c]));
          }
          vet.setDisplayField(displayFieldSet);

          String joinedResultField = md.getAttribute("ResultFields");
          String resultFields[] = StringUtils.split(joinedResultField, ",");
          Map resultFieldMap = new HashMap();
          for (int c = 0; c < resultFields.length; c++) {
            String split[] = StringUtils.split(resultFields[c], "=", 2);
            resultFieldMap.put(
                StringUtils.trimToEmpty(split[0]), StringUtils.trimToEmpty(split[1]));
          }
          vet.setResultFields(resultFieldMap);

          vet.updateLevel();
          hSession.save(vet);
        }
        ve.setValidationExternalTypes(hValdationExternalTypes);
      }
    }
  }