/**
   * Sets a reference to input data
   *
   * @param parameterID ID of the input element
   * @param value reference URL
   * @param schema schema if applicable otherwise null
   * @param encoding encoding if applicable (typically not), otherwise null
   * @param mimetype mimetype of the input according to the process description. has to be set
   */
  public void addComplexDataReference(
      String parameterID, String value, String schema, String encoding, String mimetype) {
    InputDescriptionType inputDesc = getParameterDescription(parameterID);
    if (inputDesc == null) {
      throw new IllegalArgumentException("inputDesription is null for: " + parameterID);
    }
    if (inputDesc.getComplexData() == null) {
      throw new IllegalArgumentException(
          "inputDescription is not of type complexData: " + parameterID);
    }

    InputType input = execute.getExecute().getDataInputs().addNewInput();
    input.addNewIdentifier().setStringValue(parameterID);
    input.addNewReference().setHref(value);
    if (schema != null) {
      input.getReference().setSchema(schema);
    }

    if (encoding != null) {
      input.getReference().setEncoding(encoding);
    }
    if (mimetype != null) {
      input.getReference().setMimeType(mimetype);
    }
  }
 /**
  * @param id
  * @return the specified parameterdescription. if not available it returns null.
  */
 private InputDescriptionType getParameterDescription(String id) {
   InputDescriptionType[] inputDescs = processDesc.getDataInputs().getInputArray();
   for (InputDescriptionType inputDesc : inputDescs) {
     if (inputDesc.getIdentifier().getStringValue().equals(id)) {
       return inputDesc;
     }
   }
   return null;
 }
 /**
  * Add literal data to the request
  *
  * @param parameterID the ID of the input paramter according to the describe process
  * @param value the value. other types than strings have to be converted to string. The datatype
  *     is automatically determined and set accordingly to the process description
  */
 public void addLiteralData(String parameterID, String value) {
   InputDescriptionType inputDesc = this.getParameterDescription(parameterID);
   if (inputDesc == null) {
     throw new IllegalArgumentException("inputDesription is null for: " + parameterID);
   }
   if (inputDesc.getLiteralData() == null) {
     throw new IllegalArgumentException(
         "inputDescription is not of type literalData: " + parameterID);
   }
   InputType input = execute.getExecute().getDataInputs().addNewInput();
   input.addNewIdentifier().setStringValue(parameterID);
   input.addNewData().addNewLiteralData().setStringValue(value);
   DomainMetadataType dataType = inputDesc.getLiteralData().getDataType();
   if (dataType != null) {
     input.getData().getLiteralData().setDataType(dataType.getReference());
   }
 }
  /**
   * add an input element. sets the data in the xml request
   *
   * @param parameterID the ID of the input (see process description)
   * @param value the actual value (for xml data xml for binary data is should be base64 encoded
   *     data)
   * @param schema schema if applicable otherwise null
   * @param encoding encoding if not the default encoding (for default encoding set it to null)
   *     (i.e. binary data, use base64)
   * @param mimeType mimetype of the data, has to be set
   * @throws WPSClientException
   */
  public void addComplexData(
      String parameterID, IData value, String schema, String encoding, String mimeType)
      throws WPSClientException {
    GeneratorFactory fac = StaticDataHandlerRepository.getGeneratorFactory();
    InputDescriptionType inputDesc = getParameterDescription(parameterID);
    if (inputDesc == null) {
      throw new IllegalArgumentException("inputDesription is null for: " + parameterID);
    }
    if (inputDesc.getComplexData() == null) {
      throw new IllegalArgumentException(
          "inputDescription is not of type ComplexData: " + parameterID);
    }

    LOGGER.debug(
        "Looking for matching Generator ..."
            + " schema: "
            + schema
            + " mimeType: "
            + mimeType
            + " encoding: "
            + encoding);

    IGenerator generator = fac.getGenerator(schema, mimeType, encoding, value.getClass());

    if (generator == null) {
      // generator is still null
      throw new IllegalArgumentException(
          "Could not find an appropriate generator for parameter: " + parameterID);
    }

    InputStream stream = null;

    InputType input = execute.getExecute().getDataInputs().addNewInput();
    input.addNewIdentifier().setStringValue(inputDesc.getIdentifier().getStringValue());
    // encoding is UTF-8 (or nothing and we default to UTF-8)
    // everything that goes to this condition should be inline xml data
    try {

      if (encoding == null
          || encoding.equals("")
          || encoding.equalsIgnoreCase(IOHandler.DEFAULT_ENCODING)) {
        stream = generator.generateStream(value, mimeType, schema);

      } else if (encoding.equalsIgnoreCase("base64")) {
        stream = generator.generateBase64Stream(value, mimeType, schema);
      } else {
        throw new WPSClientException("Encoding not supported");
      }
      ComplexDataType data = input.addNewData().addNewComplexData();
      data.set(XmlObject.Factory.parse(stream));
      if (schema != null) {
        data.setSchema(schema);
      }
      if (mimeType != null) {
        data.setMimeType(mimeType);
      }
      if (encoding != null) {
        data.setEncoding(encoding);
      }
    } catch (XmlException e) {
      throw new IllegalArgumentException("error inserting node into execute request", e);
    } catch (IOException e) {
      throw new IllegalArgumentException("error reading generator output", e);
    }
  }