/**
   * sets the encoding. neccessary if data should not be retrieved in the default encoding (i.e.
   * binary data in XML respones not raw data responses)
   *
   * @param encoding use base64
   * @param outputName ID of the output
   * @return
   */
  public boolean setEncodingForOutput(String encoding, String outputName) {
    if (!execute.getExecute().isSetResponseForm()) {
      execute.getExecute().addNewResponseForm();
    }
    if (!execute.getExecute().getResponseForm().isSetResponseDocument()) {
      execute.getExecute().getResponseForm().addNewResponseDocument();
    }
    OutputDescriptionType outputDesc = getOutputDescription(outputName);
    DocumentOutputDefinitionType outputDef = getOutputDefinition(outputName);
    if (outputDef == null) {
      outputDef = execute.getExecute().getResponseForm().getResponseDocument().addNewOutput();
      outputDef.setIdentifier(outputDesc.getIdentifier());
    }

    String defaultEncoding = outputDesc.getComplexOutput().getDefault().getFormat().getEncoding();
    if (defaultEncoding == null) {
      defaultEncoding = IOHandler.DEFAULT_ENCODING;
    }
    if (defaultEncoding.equals(encoding)) {
      return true;
    } else {
      ComplexDataDescriptionType[] supportedFormats =
          outputDesc.getComplexOutput().getSupported().getFormatArray();
      for (ComplexDataDescriptionType data : supportedFormats) {
        String e = data.getEncoding();
        if (e != null && e.equals(encoding)) {
          outputDef.setEncoding(encoding);
          return true;
        }
      }
    }

    return false;
  }
  /**
   * Set this if you want the data to a schema offered in the process description
   *
   * @param schema
   * @param outputName
   * @return
   */
  public boolean setSchemaForOutput(String schema, String outputName) {
    if (!execute.getExecute().isSetResponseForm()) {
      execute.getExecute().addNewResponseForm();
    }
    if (!execute.getExecute().getResponseForm().isSetResponseDocument()) {
      execute.getExecute().getResponseForm().addNewResponseDocument();
    }
    OutputDescriptionType outputDesc = getOutputDescription(outputName);
    DocumentOutputDefinitionType outputDef = getOutputDefinition(outputName);
    if (outputDef == null) {
      outputDef = execute.getExecute().getResponseForm().getResponseDocument().addNewOutput();
      outputDef.setIdentifier(outputDesc.getIdentifier());
    }
    String defaultSchema = outputDesc.getComplexOutput().getDefault().getFormat().getSchema();
    if ((defaultSchema != null && defaultSchema.equals(schema))
        || (defaultSchema == null && schema == null)) {
      outputDef.setSchema(schema);
      return true;
    } else {
      for (ComplexDataDescriptionType data :
          outputDesc.getComplexOutput().getSupported().getFormatArray()) {
        if (data.getSchema() != null && data.getSchema().equals(schema)) {
          outputDef.setSchema(schema);
          return true;
        } else if ((data.getSchema() == null && schema == null)) {
          return true;
        }
      }
    }

    return false;
  }
  /**
   * sets the desired mimetype of the output. if not set, the default mimetype will be used as
   * stated in the process description
   *
   * @param mimeType the name of the mimetype as announced in the processdescription
   * @param outputName the Identifier of the output element
   * @return success
   */
  public boolean setMimeTypeForOutput(String mimeType, String outputName) {
    if (!execute.getExecute().isSetResponseForm()) {
      execute.getExecute().addNewResponseForm();
    }
    if (!execute.getExecute().getResponseForm().isSetResponseDocument()) {
      execute.getExecute().getResponseForm().addNewResponseDocument();
    }
    OutputDescriptionType outputDesc = getOutputDescription(outputName);
    DocumentOutputDefinitionType outputDef = getOutputDefinition(outputName);
    if (outputDef == null) {
      outputDef = execute.getExecute().getResponseForm().getResponseDocument().addNewOutput();
      outputDef.setIdentifier(outputDesc.getIdentifier());
    }

    String defaultMimeType = outputDesc.getComplexOutput().getDefault().getFormat().getMimeType();
    if (defaultMimeType == null) {
      defaultMimeType = "text/xml";
    }
    if (defaultMimeType.equals(mimeType)) {
      //			outputDef.setMimeType(mimeType);//TODO: check
      return true;
    } else {
      for (ComplexDataDescriptionType data :
          outputDesc.getComplexOutput().getSupported().getFormatArray()) {
        String m = data.getMimeType();
        if (m != null && m.equals(mimeType)) {
          outputDef.setMimeType(mimeType);
          return true;
        }
      }
    }

    return false;
  }
  private OutputDescriptionType getOutputDescription(String outputName) {
    for (OutputDescriptionType outputDesc : processDesc.getProcessOutputs().getOutputArray()) {
      if (outputDesc.getIdentifier().getStringValue().equals(outputName)) {
        return outputDesc;
      }
    }

    return null;
  }
 /**
  * this sets store for the specific output.
  *
  * @param parentInput
  * @return
  */
 public boolean setStoreSupport(String outputName) {
   DocumentOutputDefinitionType outputDef = null;
   if (!execute.getExecute().isSetResponseForm()) {
     execute.getExecute().addNewResponseForm();
   }
   if (!execute.getExecute().getResponseForm().isSetResponseDocument()) {
     execute.getExecute().getResponseForm().addNewResponseDocument();
   }
   for (DocumentOutputDefinitionType outputDefTemp :
       execute.getExecute().getResponseForm().getResponseDocument().getOutputArray()) {
     if (outputDefTemp.getIdentifier().getStringValue().equals(outputName)) {
       outputDef = outputDefTemp;
       break;
     }
   }
   if (outputDef == null) {
     outputDef = execute.getExecute().getResponseForm().getResponseDocument().addNewOutput();
   }
   for (OutputDescriptionType outputDesc : processDesc.getProcessOutputs().getOutputArray()) {
     if (outputDesc.getIdentifier().getStringValue().equals(outputName)) {
       outputDef.setIdentifier(outputDesc.getIdentifier());
       ComplexDataDescriptionType format = outputDesc.getComplexOutput().getDefault().getFormat();
       if (format.getMimeType() != null) {
         outputDef.setMimeType(format.getMimeType());
       }
       if (format.getEncoding() != null) {
         outputDef.setEncoding(format.getEncoding());
       }
       if (format.getSchema() != null) {
         outputDef.setSchema(format.getSchema());
       }
       outputDef.setAsReference(true);
     }
   }
   return true;
 }