/**
   * Adds the field values from the service item container to the map.
   *
   * @param service the service.
   * @param container the service item container.
   * @param values the map holding the values.
   * @param locked all locked values for the service.
   */
  private static void addFieldValues(
      CatalogServiceRestRep service,
      Collection<? extends ServiceItemRestRep> items,
      Map<String, String> values,
      Map<String, String> locked) {
    for (ServiceItemRestRep item : items) {
      if (item instanceof ServiceFieldTableRestRep) {
        addColumnValues(service, (ServiceFieldTableRestRep) item, values, locked);
      } else if (item instanceof ServiceFieldGroupRestRep) {
        addFieldValues(service, ((ServiceFieldGroupRestRep) item).getItems(), values, locked);
      } else if (item instanceof ServiceFieldRestRep) {
        ServiceFieldRestRep field = (ServiceFieldRestRep) item;
        String value = getFieldValue(field);
        if (locked.containsKey(field.getName())) {
          value = locked.get(field.getName());
        }
        if (value != null) {
          values.put(field.getName(), value);
        }

        List<String> fieldValues = TextUtils.parseCSV(value);
        if (fieldValues.isEmpty() && field.isRequired()) {
          Validation.required(field.getName(), null);
        }
        for (String fieldValue : fieldValues) {
          ServiceFieldValidator.validateField(service, field, fieldValue);
        }
      }
    }
  }
  /**
   * Adds all column values for the given table.
   *
   * @param service the catalog service.
   * @param table the table of fields.
   * @param values the map holding the values.
   * @param locked all locked values for the service.
   */
  private static void addColumnValues(
      CatalogServiceRestRep service,
      ServiceFieldTableRestRep table,
      Map<String, String> values,
      Map<String, String> locked) {

    List<ServiceFieldRestRep> fields = ServiceDescriptorUtils.getAllFieldList(table.getItems());

    int rowCount = 0;
    for (ServiceFieldRestRep field : fields) {
      if (!locked.containsKey(field.getName())) {
        String[] columns = getColumnValue(table, field);
        rowCount = Math.max(rowCount, columns.length);
      }
    }

    for (ServiceFieldRestRep field : fields) {
      String[] columns = new String[rowCount];
      if (locked.containsKey(field.getName())) {
        String lockedValue = locked.get(field.getName());
        for (int i = 0; i < columns.length; i++) {
          columns[i] = lockedValue;
        }
      } else {
        String[] col = getColumnValue(table, field);
        System.arraycopy(col, 0, columns, 0, col.length);
      }

      for (int i = 0; i < columns.length; i++) {
        String prefix = table.getName() + "[" + i + "]";
        ServiceFieldValidator.validateField(service, prefix, field, columns[i]);
      }

      values.put(field.getName(), TextUtils.formatCSV(columns));
    }
  }