content: /**
   * ﻿Copyright (C) 2007 - 2014 52°North Initiative for Geospatial Open Source
   * Software GmbH
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 as published
   * by the Free Software Foundation.
   *
   * If the program is linked with libraries which are licensed under one of
   * the following licenses, the combination of the program with the linked
   * library is not considered a "derivative work" of the program:
   *
   *       • Apache License, version 2.0
   *       • Apache Software License, version 1.0
   *       • GNU Lesser General Public License, version 3
   *       • Mozilla Public License, versions 1.0, 1.1 and 2.0
   *       • Common Development and Distribution License (CDDL), version 1.0
   *
   * Therefore the distribution of the program linked with libraries licensed
   * under the aforementioned licenses, is permitted by the copyright holders
   * if the distribution is compliant with both the GNU General Public
   * License version 2 and the aforementioned licenses.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
   * Public License for more details.
   */
  package org.n52.wps.transactional.deploymentprofiles;
  
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.HashMap;
  import java.util.Map;
  
  import javax.xml.parsers.DocumentBuilder;
  import javax.xml.parsers.DocumentBuilderFactory;
  import javax.xml.parsers.ParserConfigurationException;
  import javax.xml.transform.Result;
  import javax.xml.transform.Source;
  import javax.xml.transform.Transformer;
  import javax.xml.transform.TransformerConfigurationException;
  import javax.xml.transform.TransformerException;
  import javax.xml.transform.TransformerFactory;
  import javax.xml.transform.TransformerFactoryConfigurationError;
  import javax.xml.transform.dom.DOMSource;
  import javax.xml.transform.stream.StreamResult;
  
  import org.apache.xpath.XPathAPI;
  import org.n52.wps.transactional.algorithm.GenericTransactionalAlgorithm;
  import org.w3c.dom.DOMException;
  import org.w3c.dom.Document;
  import org.w3c.dom.DocumentType;
  import org.w3c.dom.NamedNodeMap;
  import org.w3c.dom.Node;
  import org.w3c.dom.NodeList;
  import org.w3c.dom.traversal.NodeIterator;
  
  
  
  public class BPELDeploymentProfile extends DeploymentProfile{
  	private Node suitCase;
  	private Node bpel;
  	private Node clientWSDL;
  	private Map<Integer, Node> wsdlList;
  	
  	
  	public BPELDeploymentProfile(Node payload, String processID) {
  		super(payload, processID);
  		try {
  		
  			extractInformation(payload);
  		} catch (Exception e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  		
  	}
  
  	public Node getSuitCase() {
  		return suitCase;
  	}
  
  	public Node getBPEL() {
  		return bpel;
  	}
  
  	public Node getClientWSDL() {
  		return clientWSDL;
  	}
  
  	public Map<Integer, Node> getWSDLList() {
  		return wsdlList;
  	}
  	
  	
  	private void extractInformation(Node deployProcessDocument) throws Exception {
  		//parse out
  		//	1. suitcase
  		//	2. clientwsdl
  		//  3. other wsdl
  		//  4. bpel
  		//	5.create describe process
  
                  //System.out.println("deployProcessDocument: ");
                  //printNode(deployProcessDocument, "");
  		//writeXmlFile(deployProcessDocument, "C:\\BPEL\\request.xml");
  		
  		//	1. suitcase
  		//suitCase = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcessRequest/BPELDeploymentProfile/SuitCase/BPELSuitcase");
                  suitCase = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcess/DeploymentProfile/SuitCase/BPELSuitcase/deploy");
  		//select processName
  		//String processName = XPathAPI.selectSingleNode(suitCase, "/DeployProcessRequest/BPELDeploymentProfile/SuitCase/BPELSuitcase/BPELProcess/@id").getTextContent();
                  //System.out.println("suitCase: ");
                  //printNode(suitCase, "");
                  String processName ="";
                  //Node pn;
                  //    pn = XPathAPI.selectSingleNode(suitCase, "//deploy/process");
                  try{
                      //processName = XPathAPI.selectSingleNode(suitCase, "//process/@name").getTextContent();
                      processName = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcess/ProcessDescriptions/ProcessDescription/Identifier/text()").getNodeValue().trim();
                  }catch(DOMException de){
                      de.printStackTrace();
                  }catch(Exception e){
                      e.printStackTrace();
                  }
  		
  		
  		//	2. clientwsdl
  		//clientWSDL = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcessRequest/BPELDeploymentProfile/ProcessWSDL/definitions");
                  clientWSDL = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcess/DeploymentProfile/ProcessWSDL/definitions");
  		//System.out.println("clientWSDL: ");
                  //printNode(clientWSDL, "");
  		
  		//  3. other wsdl
  		//Node tempWSDLList = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcessRequest/BPELDeploymentProfile/WSDL-List");
                  Node tempWSDLList = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcess/DeploymentProfile/WSDL-List");
  		//NodeIterator wsdlIterator = XPathAPI.selectNodeIterator(tempWSDLList, "/DeployProcessRequest/BPELDeploymentProfile/WSDL-List/definitions");
                  NodeIterator wsdlIterator = XPathAPI.selectNodeIterator(tempWSDLList, "/DeployProcess/DeploymentProfile/WSDL-List/definitions");
  		//Note: WSDL files are written in the correct order
  		wsdlList = new HashMap<Integer, Node>();
  		int index = 0;
  		while(true){
  			Node wsdl = wsdlIterator.nextNode();
  			if(wsdl == null){
  				break;
  			}
  			wsdlList.put(index, wsdl);
  			index = index +1;
  		}
  		
  		
  		//  4. bpel
  		//bpel = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcessRequest/BPELDeploymentProfile/BPEL/process");
                  bpel = XPathAPI.selectSingleNode(deployProcessDocument, "/DeployProcess/DeploymentProfile/BPEL/process");
  		//System.out.println("bpel: ");
                  //printNode(bpel, "");
  		
  	
  	
  
  		
  	}
  	
  
  		
  	
  	
  	private void writeXmlFile(Document doc, String filename) {
          try {
          	
              // Prepare the DOM document for writing
              Source source = new DOMSource(doc);
      
              // Prepare the output file
              File file = new File(filename);
              file.createNewFile();
              Result result = new StreamResult(file);
      
              // Write the DOM document to the file
              Transformer xformer = TransformerFactory.newInstance().newTransformer();
              xformer.transform(source, result);
          } catch (TransformerConfigurationException e) {
          	System.out.println("error");
          } catch (TransformerException e) {
          	System.out.println("error");
          } catch (Exception e) {
          	System.out.println("error");
          }
  		
  		
  	}
  
          public void printNode(Node node, String indent) {
  		switch (node.getNodeType()) {
  		case Node.DOCUMENT_NODE:
  			System.out.println(indent + "<?xml version=\"1.0\"?>");
  
  			NodeList nodes = node.getChildNodes();
  
  			if (nodes != null) {
  				for (int i = 0; i < nodes.getLength(); i++) {
  					printNode(nodes.item(i), "");
  				}
  			}
  
  			break;
  
  		case Node.ELEMENT_NODE:
  
  			String name = node.getNodeName();
  			System.out.print(indent + "<" + name);
  
  			NamedNodeMap attributes = node.getAttributes();
  
  			for (int i = 0; i < attributes.getLength(); i++) {
  				Node current = attributes.item(i);
  				System.out.print(" " + current.getNodeName() +
  				        "=\"" + current.getNodeValue() + "\"");
  			}
  
  			System.out.println(">");
  
  			NodeList children = node.getChildNodes();
  
  			if (children != null) {
  				for (int i = 0; i < children.getLength();
  					        i++) {
  					printNode(children.item(i),
  					        indent + "  ");
  				}
  			}
  
  			System.out.println(indent + "</" + name + ">");
  
  			break;
  
  		case Node.TEXT_NODE:
  		case Node.CDATA_SECTION_NODE:
  			System.out.println(indent + node.getNodeValue());
  
  			break;
  
  		case Node.PROCESSING_INSTRUCTION_NODE:
  			System.out.println(indent + "<?" + node.getNodeName() +
  			        " " + node.getNodeValue() + " ?>");
  
  			break;
  
  		case Node.ENTITY_REFERENCE_NODE:
  			System.out.println("&" + node.getNodeName() + ";");
  
  			break;
  
  		case Node.DOCUMENT_TYPE_NODE:
  
  			DocumentType docType = (DocumentType) node;
  			System.out.print("<!DOCTYPE " + docType.getName());
  
  			if (docType.getPublicId() != null) {
  				System.out.print("PUBLIC \"" +
  				        docType.getPublicId() + "\"");
  			} else {
  				System.out.print(" SYSTEM ");
  			}
  
  			System.out.println("\"" + docType.getSystemId() +
  			        "\" >");
  
  			break;
  		}
  	}
  
  
  }
  