/**
   * Simple method to write a catalog file for the BPEL deployment archive.
   *
   * @return the PDD-file
   * @throws Exception
   */
  public File generateCatalogFile() {
    ProcessModel process = Controller.getInstance().getProcess();
    String processName = process.getProcessName();

    MessagePanel.appendOut("    Generating Catalog File ");
    MessagePanel.appendOutBlue("catalog.xml");
    MessagePanel.appendOut(" ... ");

    String content =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<catalog xmlns='http://schemas.active-endpoints.com/catalog/2006/07/catalog.xsd'>"
            + "  <wsdlEntry location=\"project:/"
            + processName
            + "/"
            + processName
            + ".wsdl\" "
            + "classpath=\"wsdl/"
            + processName
            + "/"
            + processName
            + ".wsdl\" />"
            + "</catalog>";

    try {
      // write file
      File catalogFile = new File("temp/" + processName + "/catalog.xml");
      FileOutputStream out = new FileOutputStream(catalogFile);
      out.write(content.getBytes("UTF-8"));
      out.flush();
      out.close();

      MessagePanel.appendSuccessln("done.");

      return catalogFile;
    } catch (Exception e) {
      MessagePanel.appendErrorln("Error writing Catalog File!");
      Logger.error(e.getMessage());
      e.printStackTrace();

      return null;
    }
  }
  /**
   * Simple method to write a deployment descriptor (.pdd) for the BPEL process.
   *
   * @return the PDD-file
   * @throws Exception
   */
  public File generateDeploymentDescriptor() {
    ProcessModel process = Controller.getInstance().getProcess();
    String processName = process.getProcessName();

    MessagePanel.appendOut("    Generating Deployment Descriptor ");
    MessagePanel.appendOutBlue(processName + ".pdd");
    MessagePanel.appendOut(" ... ");

    String content =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<process xmlns=\"http://schemas.active-endpoints.com/pdd/2006/08/pdd.xsd\" "
            + "xmlns:bpelns=\"urn:"
            + processName
            + "_targetNamespaceURN\" "
            + "xmlns:wsa=\"http://schemas.xmlsoap.org/ws/2003/03/addressing\" "
            + "location=\"bpel/"
            + processName
            + "/"
            + processName
            + ".bpel\" "
            + "name=\"bpelns:"
            + processName
            + "\" persistenceType=\"full\">"
            + "<partnerLinks>"
            + "<partnerLink name=\""
            + processName
            + "_PartnerLink\">"
            + "<myRole allowedRoles=\"\" binding=\"MSG\" "
            + "service=\""
            + processName
            + "_PartnerLinkService\"/>"
            + "</partnerLink>"
            + "</partnerLinks>"
            + "<references>"
            + "<wsdl location=\"project:/"
            + processName
            + "/"
            + processName
            + ".wsdl\" namespace=\"urn:"
            + processName
            + "_extWsdlURN\"/>"
            + "</references>"
            + "</process>";

    try {
      // write file
      File wsdlFile = new File("temp/" + processName + "/" + processName + ".pdd");
      FileOutputStream out = new FileOutputStream(wsdlFile);
      out.write(content.getBytes("UTF-8"));
      out.flush();
      out.close();

      MessagePanel.appendSuccessln("done.");

      return wsdlFile;
    } catch (Exception e) {
      MessagePanel.appendErrorln("Error writing Deployment Descriptor!");
      Logger.error(e.getMessage());
      e.printStackTrace();

      return null;
    }
  }
  /**
   * Simple method to write a WSDL file according to the defined process inputs and outputs.
   *
   * @return the WSDL file
   * @throws Exception
   */
  public File generateWSDL() {
    ProcessModel process = Controller.getInstance().getProcess();
    String processName = process.getProcessName();
    String parameterOrder = " parameterOrder=\"";
    String processTypes = "<wsdl:types><xsd:schema targetNamespace=\"urn:processTypes\">";
    Vector registeredProcessTypes = new Vector();

    MessagePanel.appendOut("    Generating WSDL ");
    MessagePanel.appendOutBlue(processName + ".wsdl");
    MessagePanel.appendOut(" ... ");

    String content =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<wsdl:definitions xmlns:processTypes=\"urn:processTypes\" targetNamespace=\"urn:"
            + processName
            + "_extWsdlURN\" xmlns:impl=\"urn:"
            + processName
            + "_extWsdlURN\" xmlns:wsdlsoap=\"http://schemas.xmlsoap.org/wsdl/soap/\" "
            + "xmlns:apachesoap=\"http://xml.apache.org/xml-soap\" "
            + "xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" "
            + "xmlns:plnk=\"http://schemas.xmlsoap.org/ws/2003/05/partner-link/\" "
            + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
            + "xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\">"
            + "<plnk:partnerLinkType xmlns:plnk=\"http://docs.oasis-open.org/wsbpel/2.0/plnktype\" "
            + "name=\""
            + processName
            + "_PartnerLinkType\">"
            + "   <plnk:role name=\"serviceProvider\" portType=\"impl:"
            + processName
            + "_PortType\"/>"
            + "</plnk:partnerLinkType>"
            + "  <wsdl:message name=\"processInputMessage\">";

    // add inputs
    Iterator inputIter = process.getProcessInputs().iterator();
    while (inputIter.hasNext()) {
      ProcessInput processInput = (ProcessInput) inputIter.next();
      String processInputName = processInput.getName();
      content +=
          "    <wsdl:part name=\""
              + processInputName
              + "\" type=\"processTypes:"
              + processInputName
              + "\"/>";
      parameterOrder += processInputName + " ";
      if (!registeredProcessTypes.contains(processInputName)) {
        processTypes +=
            "<xsd:complexType name=\""
                + processInputName
                + "\">  <xsd:sequence>  <xsd:element name=\""
                + processInputName
                + "Data\" type=\"xsd:string\" nillable=\"false\"/> "
                + " </xsd:sequence>  </xsd:complexType>";
        registeredProcessTypes.add(processInputName);
      }
    }

    content += "  </wsdl:message>";

    if (process.getProcessOutputs().size() > 0) {
      content += "  <wsdl:message name=\"processOutputMessage\">";

      // add outputs
      Iterator outputIter = process.getProcessOutputs().iterator();
      while (outputIter.hasNext()) {
        ProcessOutput processOutput = (ProcessOutput) outputIter.next();
        String processOutputName = processOutput.getName();
        content +=
            "    <wsdl:part name=\""
                + processOutputName
                + "\" type=\"processTypes:"
                + processOutputName
                + "\"/>";
        parameterOrder += processOutputName + " ";
        if (!registeredProcessTypes.contains(processOutputName)) {
          processTypes +=
              "<xsd:complexType name=\""
                  + processOutputName
                  + "\">  <xsd:sequence>  <xsd:element name=\""
                  + processOutputName
                  + "Data\" type=\"xsd:string\" nillable=\"false\"/> "
                  + " </xsd:sequence>  </xsd:complexType>";
          registeredProcessTypes.add(processOutputName);
        }
      }

      content += "  </wsdl:message>";
    }

    parameterOrder += "\"";
    processTypes += "</xsd:schema></wsdl:types>";

    content +=
        "  <wsdl:portType name=\""
            + processName
            + "_PortType\">"
            + "    <wsdl:operation name=\""
            + processName
            + "_processOperation\" "
            + parameterOrder
            + ">"
            + "      <wsdl:input name=\"inputMessage\" message=\"impl:processInputMessage\"/>";

    if (process.getProcessOutputs().size() > 0) {
      content += "    <wsdl:output name=\"outputMessage\" message=\"impl:processOutputMessage\"/>";
    }

    content +=
        "    </wsdl:operation>" + "  </wsdl:portType>" + processTypes + "</wsdl:definitions>";

    try {
      // write file
      File wsdlFile = new File("temp/" + processName + "/" + processName + ".wsdl");
      FileOutputStream out = new FileOutputStream(wsdlFile);
      out.write(content.getBytes("UTF-8"));
      out.flush();
      out.close();

      MessagePanel.appendSuccessln("done.");

      return wsdlFile;
    } catch (Exception e) {
      MessagePanel.appendErrorln("Error writing WSDL file!");
      Logger.error(e.getMessage());
      e.printStackTrace();

      return null;
    }
  }