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.server;
  
  import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  
  import javax.xml.namespace.QName;
  import javax.xml.stream.XMLStreamException;
  
  import org.apache.axiom.om.OMAbstractFactory;
  import org.apache.axiom.om.OMElement;
  import org.apache.axiom.soap.SOAP12Constants;
  import org.apache.axiom.soap.SOAPFactory;
  import org.apache.axiom.soap.SOAPFault;
  import org.apache.axiom.soap.SOAPFaultCode;
  import org.apache.axiom.soap.SOAPFaultDetail;
  import org.apache.axiom.soap.SOAPFaultReason;
  import org.apache.axiom.soap.SOAPFaultText;
  import org.apache.axiom.soap.SOAPFaultValue;
  import org.apache.axis2.AxisFault;
  import org.apache.axis2.context.MessageContext;
  import org.apache.axis2.util.XMLUtils;
  import org.n52.wps.server.handler.SOAPRequestHandler;
  import org.w3c.dom.Element;
  
  /**
   * This class is the outwards interface for SOAP-requests
   * 
   * @author Kristof Lange
   *
   */
  
  public class WebProcessingServiceSoap {
  
  	private MessageContext m_msgCtx;
  
  	public OMElement execute(OMElement input) throws Exception {
  		return internalSOAPHandler(input);
  
  	}
  
  	public OMElement cancelJob(OMElement input) throws Exception {
  		return internalSOAPHandler(input);
  	}
  
  	public OMElement getJobs(OMElement input) throws Exception {
  		return internalSOAPHandler(input);
  	}
  
  	public OMElement pauseJob(OMElement input) throws Exception {
  		return internalSOAPHandler(input);
  	}
  
  	public OMElement resumeJob(OMElement input) throws Exception {
  		return internalSOAPHandler(input);
  	}
  
  	public OMElement getCapabilities(OMElement input) throws Exception{
  		return internalSOAPHandler(input);
  	}
  
  	public OMElement describeProcess(OMElement input) throws Exception {
  		return internalSOAPHandler(input);
  	}
  	
  	
  	
  	private OMElement internalSOAPHandler(OMElement input) throws IOException, XMLStreamException{
  		m_msgCtx = MessageContext.getCurrentMessageContext();
  		
  		Element payload = null;
  		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  		ByteArrayInputStream bais=null;
  		SOAPRequestHandler handler = null;
  		Element inputDoc=null;
  		
  		/*convert OMElement to Element*/
  		
  		try{
  		inputDoc = XMLUtils.toDOM(input);
  		
  	}
  		catch (Exception e) {
  			e.printStackTrace();
  		}
  		
  		try {
  				
  			handler = new SOAPRequestHandler(inputDoc.getOwnerDocument(),outputStream);
  			handler.handle();
  			
  			
  		} catch (ExceptionReport serviceException) {
  			serviceException.getExceptionDocument().save(outputStream);
  			InputStream instream = new ByteArrayInputStream(outputStream
  					.toByteArray());
  			OMElement omException = (OMElement) XMLUtils.toOM(instream);
  			
  			SOAPFactory soapFactory;
  			
  			if (m_msgCtx.isSOAP11()) {
  			soapFactory = OMAbstractFactory.getSOAP11Factory();
  		
  			} else {
  			soapFactory = OMAbstractFactory.getSOAP12Factory();
  			
  			}
  			SOAPFault soapFault = soapFactory.createSOAPFault();
  			
  			SOAPFaultCode soapFaultCode = soapFactory.createSOAPFaultCode();
  			SOAPFaultValue soapFaultValue = soapFactory.createSOAPFaultValue(soapFaultCode);
  			soapFaultValue.setText(new QName("http://52north.org", "WPS Fault", "WPS fault"));
  
  			SOAPFaultReason soapFaultReason = soapFactory.createSOAPFaultReason();
  			SOAPFaultText soapFaultText = soapFactory.createSOAPFaultText(soapFaultReason);
  			soapFaultText.setText(serviceException.getMessage());
  
  			SOAPFaultDetail soapFaultDetail = soapFactory.createSOAPFaultDetail();
  			QName qName = new QName("http://www.opengis.net/ows/1.1", "ExceptionReport");
  			OMElement detail = soapFactory.createOMElement(qName, soapFaultDetail);
  			detail.addChild(omException);
  			
  			soapFault.setDetail(soapFaultDetail);
  			soapFault.setCode(soapFaultCode);
  			soapFault.setReason(soapFaultReason);
  			        
  			m_msgCtx.setProperty(SOAP12Constants.SOAP_FAULT_CODE_LOCAL_NAME, soapFaultCode);
  			m_msgCtx.setProperty(SOAP12Constants.SOAP_FAULT_REASON_LOCAL_NAME, soapFaultReason);
  			m_msgCtx.setProperty(SOAP12Constants.SOAP_FAULT_DETAIL_LOCAL_NAME, soapFaultDetail);
  			
  			throw new AxisFault(soapFault);
  		}
  		InputStream instream = new ByteArrayInputStream(outputStream
  				.toByteArray());
  		OMElement result = (OMElement) XMLUtils.toOM(instream);
  		return result;
  		
  	}
  	
  
  //	 public static 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);
  //	            Result result = new StreamResult(file);
  //	    
  //	            // Write the DOM document to the file
  //	            Transformer xformer = TransformerFactory.newInstance().newTransformer();
  //	            xformer.transform(source, result);
  //	        } catch (TransformerConfigurationException e) {e.printStackTrace();
  //	        } catch (TransformerException e) {e.printStackTrace();
  //	        }
  //	    }
  }
  