/****************************************************************************
 * Copyright (C) 2012 ecsec GmbH.
 * All rights reserved.
 * Contact: ecsec GmbH (info@ecsec.de)
 *
 * This file is part of the Open eCard App.
 *
 * GNU General Public License Usage
 * This file may be used under the terms of the GNU General Public
 * License version 3.0 as published by the Free Software Foundation
 * and appearing in the file LICENSE.GPL included in the packaging of
 * this file. Please review the following information to ensure the
 * GNU General Public License version 3.0 requirements will be met:
 * http://www.gnu.org/copyleft/gpl.html.
 *
 * Other Usage
 * Alternatively, this file may be used in accordance with the terms
 * and conditions contained in a signed written agreement between
 * you and ecsec GmbH.
 *
 ***************************************************************************/

package org.openecard.ws.soap;

import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


/**
 *
 * @author Tobias Wich <tobias.wich@ecsec.de>
 */
public class SOAPMessage {

    private final Document doc;
    private final String namespace;

    private final SOAPEnvelope env;
    private final SOAPHeader head;
    private final SOAPBody body;

    protected SOAPMessage(DocumentBuilder docBuilder, String namespace) throws SOAPException {
	doc = docBuilder.newDocument();
	this.namespace = namespace;

	// add envelope and that stuff
	Element envElem = doc.createElementNS(namespace, "Envelope");
	env = new SOAPEnvelope(envElem);
	doc.appendChild(envElem);
	Element headElem = env.addChildElement(new QName(namespace, "Header"));
	head = new SOAPHeader(headElem);
	Element bodyElem = env.addChildElement(new QName(namespace, "Body"));
	body = new SOAPBody(bodyElem);
    }

    protected SOAPMessage(Document doc) throws SOAPException {
	this.doc = doc;
	Element envElem = (Element) doc.getFirstChild();
	if (envElem == null) {
	    throw new SOAPException("No Envelope element in SOAP message.");
	}
	env = new SOAPEnvelope(envElem);

	namespace = MessageFactory.verifyNamespace(envElem.getNamespaceURI());

	// extract envelope and stuff from doc
	boolean headProcessed = false;
	Element headElem = null;
	boolean bodyProcessed = false;
	Element bodyElem = null;

	// extract info
	NodeList nodes = envElem.getChildNodes();
	for (int i=0; i < nodes.getLength(); i++) {
	    Node n = nodes.item(i);
	    if (n.getNodeType() == Node.ELEMENT_NODE) {
		Element e = (Element) n;
		if (e.getNamespaceURI().equals(namespace)) {
		    // head is next
		    if (!headProcessed && !bodyProcessed && "Header".equals(e.getLocalName())) {
			headProcessed = true;
			headElem = e;
		    } else if (!bodyProcessed && "Body".equals(e.getLocalName())) {
			bodyProcessed = true;
			bodyElem = e;
		    } else {
			throw new SOAPException("Undefined element (" + e.getLocalName() + ") in SOAP message.");
		    }
		} else {
		    throw new SOAPException("Undefined namespace (" + e.getNamespaceURI() + ") in SOAP message.");
		}
	    } else if (n.getNodeType() == Node.TEXT_NODE || n.getNodeType() == Node.CDATA_SECTION_NODE) {
		throw new SOAPException("Undefined node type in SOAP message.");
	    }
	}

	// check if all info is present, else create it
	if (! bodyProcessed) {
	    throw new SOAPException("No Body element present in SOAP message.");
	}
	if (! headProcessed) {
	    headElem = doc.createElementNS(namespace, "Header");
	    headElem = (Element) envElem.insertBefore(headElem, bodyElem);
	}

	head = new SOAPHeader(headElem);
	body = new SOAPBody(bodyElem);
    }


    public Document getDocument() {
	return doc;
    }

    public SOAPEnvelope getSOAPEnvelope() {
	return env;
    }

    public SOAPHeader getSOAPHeader() {
	return head;
    }

    public SOAPBody getSOAPBody() {
	return body;
    }

}

@@ -3246,16 +3246,18 @@
 DE) %7B%0A%09%09
+//
 throw ne
@@ -3309,24 +3309,163 @@
 message.%22);%0A
+%09%09System.out.println(%22Undefined node type in SOAP message: %22 + n.getNodeType() + n.getNodeName() + n.getNodeValue() + n.getTextContent());%0A
 %09    %7D%0A%09%7D%0A%0A%09

Change SOAP to output a message instead of throwing an error if a text node is found