/* $Id: ProppatchQueryParser.java,v 1.1 2004/01/09 16:55:43 burkhard Exp $
 * Created on 12.05.2003 by sell
 *
 */
package de.skyrix.zsp.logic.parser;

import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;

import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import de.skyrix.zsp.logic.DAVItem;

/**Parser for the queries from outlook (zidelook) client;
 * 
 * @author sell
 * @version 
 */
public class ProppatchQueryParser extends DefaultParser {
  private Hashtable namespaces = null;

	/**Creates a parser instance.
	 * 
	 * @param xmlString - the complete xml document as String
	 */
	public ProppatchQueryParser(String xmlString) {
		super(xmlString);
	}

	/**Creates a parser instance
	 * 
	 * @param inputStream - a stream to read the xml document from
	 */
	public ProppatchQueryParser(InputStream inputStream) {
		super(inputStream);
	}

	/**Sets the default setings like name space
	 * 
	 */
	protected void setBuilderFactoryPreferences(DocumentBuilderFactory builder) {
		super.setBuilderFactoryPreferences(builder);
		builder.setNamespaceAware(true);
	}

	/**Parse a "&lt:prop&gt:" node and add its 
	 * attribute value to a DAVItem.
	 * 
	 * @param item     - the DAVItem to add the value to
	 * @param propNode - the node
	 */
	private void parseProp(DAVItem item, Node propNode) {
		if (propNode == null)
			return;

		NodeList childNodes = propNode.getChildNodes();
		for (int i = 0; i < childNodes.getLength(); i++) {
			Node childNode = childNodes.item(i);
			try {
				if ("#text".equals(childNode.getNodeName()))
					continue;

				String name = childNode.getNodeName();
				String uri = childNode.getNamespaceURI();
				String value = "";

				//getFirstChild maybe null
				try {
					value = childNode.getFirstChild().getNodeValue();
				}
				catch (Exception e) {
				}

				String prefix = childNode.getPrefix();
				item.setProperty(
					((prefix != null) ? name.substring(prefix.length() + 1) : name),
					((prefix != null) ? prefix + ":" : ":") + uri + "##" + value);
			}
			catch (Exception e) {
				//e.printStackTrace();
			}
		}
	}

	public DAVItem parseDocument() {
		//  load XML document
		try {
			Document doc = load();
			DAVItem item = new DAVItem();

			NodeList nodeList = doc.getChildNodes();
			Node rootNode = nodeList.item(0);

			NodeList setNodes = rootNode.getChildNodes();

			for (int i = 0; i < setNodes.getLength(); i++) {
				Node setNode = setNodes.item(i);
				try {
					if (setNode != null) {
						if ((setNode.getPrefix() + ":set")
							.equals(setNode.getNodeName())) {
							Node propNode = setNode.getChildNodes().item(0);
							parseProp(item, propNode);
						}
					}
				}
				catch (Exception e) {
					e.printStackTrace();
				}
			}

			return item;
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	private static class EH implements ErrorHandler {
		public void error(SAXParseException x) throws SAXException {
			throw x;
		}
		public void fatalError(SAXParseException x) throws SAXException {
			throw x;
		}

		public void warning(SAXParseException x) throws SAXException {
			throw x;
		}
	}

	public static void main(String[] args) throws SAXException, IOException {
		String body =
			"<?xml version=\"1.0\" encoding=\"utf-8\" ?>"
				+ "<D:propertyupdate xmlns:D=\"DAV:\">"
				+ "<D:set><D:prop><x001A001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">IPM.Contact</x001A001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A18001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A18001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A0B001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A0B001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80C2001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">FAX</x80C2001E></D:prop></D:set>"
				+ "<D:set><D:prop><x00410102 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">AAAAAIErH6S+oxAZnW4A3QEPVAIAAAAAVW5rbm93bgBVTktOT1dOAFVua25vd24A</x00410102></D:prop></D:set>"
				+ "<D:set><D:prop><x3A0C001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A0C001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A26001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A26001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80C3001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x80C3001E></D:prop></D:set>"
				+ "<D:set><D:prop><x85520003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">104219</x85520003></D:prop></D:set>"
				+ "<D:set><D:prop><x850E000B xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">0</x850E000B></D:prop></D:set>"
				+ "<D:set><D:prop><x85100003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">16</x85100003></D:prop></D:set>"
				+ "<D:set><D:prop><x0042001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Unknown</x0042001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0FF40003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">7</x0FF40003></D:prop></D:set>"
				+ "<D:set><D:prop><x3A0D001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A0D001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A00001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A00001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A27001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A27001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80C4001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x80C4001E></D:prop></D:set>"
				+ "<D:set><D:prop><x8554001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">10.0</x8554001E></D:prop></D:set>"
				+ "<D:set><D:prop><x00360003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x00360003></D:prop></D:set>"
				+ "<D:set><D:prop><x0E060040 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">2003-08-28T15:24:36Z</x0E060040></D:prop></D:set>"
				+ "<D:set><D:prop><x0002000B xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">1</x0002000B></D:prop></D:set>"
				+ "<D:set><D:prop><x0029000B xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x0029000B></D:prop></D:set>"
				+ "<D:set><D:prop><x0E070003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">3</x0E070003></D:prop></D:set>"
				+ "<D:set><D:prop><x360B0003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x360B0003></D:prop></D:set>"
				+ "<D:set><D:prop><x0037001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Testaccount</x0037001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80060003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">32791</x80060003></D:prop></D:set>"
				+ "<D:set><D:prop><x3A28001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A28001E></D:prop></D:set>"
				+ "<D:set><D:prop><x8506000B xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">0</x8506000B></D:prop></D:set>"
				+ "<D:set><D:prop><x0C190102 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">AAAAAIErH6S+oxAZnW4A3QEPVAIAAAAAVW5rbm93bgBVTktOT1dOAFVua25vd24A</x0C190102></D:prop></D:set>"
				+ "<D:set><D:prop><x0E080003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">2266</x0E080003></D:prop></D:set>"
				+ "<D:set><D:prop><x8062001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x8062001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3001001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Doktor Testaccount</x3001001E></D:prop></D:set>"
				+ "<D:set><D:prop><x85010003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">0</x85010003></D:prop></D:set>"
				+ "<D:set><D:prop><x0C1A001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Unknown</x0C1A001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0FF70003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">1</x0FF70003></D:prop></D:set>"
				+ "<D:set><D:prop><x3A44001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A44001E></D:prop></D:set>"
				+ "<D:set><D:prop><x800E001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x800E001E></D:prop></D:set>"
				+ "<D:set><D:prop><x85180003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">0</x85180003></D:prop></D:set>"
				+ "<D:set><D:prop><x00390040 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">2003-08-28T15:24:36Z</x00390040></D:prop></D:set>"
				+ "<D:set><D:prop><x0E170003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x0E170003></D:prop></D:set>"
				+ "<D:set><D:prop><x3A45001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Doktor</x3A45001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A11001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A11001E></D:prop></D:set>"
				+ "<D:set><D:prop><x8010001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x8010001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80B2001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">FAX</x80B2001E></D:prop></D:set>"
				+ "<D:set><D:prop><x8005001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">Testaccount</x8005001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A05001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A05001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80B3001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x80B3001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80D2001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">FAX</x80D2001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0C1D0102 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">VU5LTk9XTjpVTktOT1dOAA==</x0C1D0102></D:prop></D:set>"
				+ "<D:set><D:prop><x003B0102 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">VU5LTk9XTjpVTktOT1dOAA==</x003B0102></D:prop></D:set>"
				+ "<D:set><D:prop><x30050003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x30050003></D:prop></D:set>"
				+ "<D:set><D:prop><x3A06001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Testaccount</x3A06001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80261003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">32791,32823,14870,32793,32792</x80261003></D:prop></D:set>"
				+ "<D:set><D:prop><x80071003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">2,32896,14856,14857,14884,14876</x80071003></D:prop></D:set>"
				+ "<D:set><D:prop><x80230003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">256</x80230003></D:prop></D:set>"
				+ "<D:set><D:prop><x80B4001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x80B4001E></D:prop></D:set>"
				+ "<D:set><D:prop><x80D3001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x80D3001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0070001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Testaccount</x0070001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0C1E001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">UNKNOWN</x0C1E001E></D:prop></D:set>"
				+ "<D:set><D:prop><x003D001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x003D001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0E1A0014 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x0E1A0014></D:prop></D:set>"
				+ "<D:set><D:prop><x80D4001E xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\"></x80D4001E></D:prop></D:set>"
				+ "<D:set><D:prop><x8503000B xmlns=\"http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-c000-000000000046}/\">0</x8503000B></D:prop></D:set>"
				+ "<D:set><D:prop><x00710102 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">AcNteH1v5JEzjHjHQ1CzDCECEunxzA==</x00710102></D:prop></D:set>"
				+ "<D:set><D:prop><x0C1F001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Unknown</x0C1F001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0064001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">UNKNOWN</x0064001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0023000B xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x0023000B></D:prop></D:set>"
				+ "<D:set><D:prop><x3FDE0003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">28591</x3FDE0003></D:prop></D:set>"
				+ "<D:set><D:prop><x30070040 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">2003-08-28T15:23:56Z</x30070040></D:prop></D:set>"
				+ "<D:set><D:prop><x8025000B xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">0</x8025000B></D:prop></D:set>"
				+ "<D:set><D:prop><x10090102 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">e1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcZGVmZjBcZGVmbGFuZzEwMzF7XGZvbnR0Ymx7XGYwXGZzd2lzc1xmY2hhcnNldDAgQXJpYWw7fX0NCntcKlxnZW5lcmF0b3IgUmljaGVkMjAgNS40MC4xMS4yMjEwO31cdmlld2tpbmQ0XHVjMVxwYXJkXGYwXGZzMjAgRGFzIGlzdCBlaW4gdGVzdGFjY291bnQgOylccGFyDQp9DQoA</x10090102></D:prop></D:set>"
				+ "<D:set><D:prop><x00170003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">1</x00170003></D:prop></D:set>"
				+ "<D:set><D:prop><x0065001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Unknown</x0065001E></D:prop></D:set>"
				+ "<D:set><D:prop><x0E01000B xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x0E01000B></D:prop></D:set>"
				+ "<D:set><D:prop><x30080040 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">2003-08-28T15:24:36Z</x30080040></D:prop></D:set>"
				+ "<D:set><D:prop><x80290003 xmlns=\"http://schemas.microsoft.com/mapi/id/{00062004-0000-0000-c000-000000000046}/\">0</x80290003></D:prop></D:set>"
				+ "<D:set><D:prop><x3A16001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Skyrix</x3A16001E></D:prop></D:set>"
				+ "<D:set><D:prop><x65400003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x65400003></D:prop></D:set>"
				+ "<D:set><D:prop><x10800003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">512</x10800003></D:prop></D:set>"
				+ "<D:set><D:prop><x3A17001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\"></x3A17001E></D:prop></D:set>"
				+ "<D:set><D:prop><x3A0A001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">T.</x3A0A001E></D:prop></D:set>"
				+ "<D:set><D:prop><x00260003 xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">0</x00260003></D:prop></D:set>"
				+ "<D:set><D:prop><x0E1D001E xmlns=\"http://schemas.microsoft.com/mapi/proptag/\">Testaccount</x0E1D001E></D:prop></D:set>"
				+ "</D:propertyupdate>";

		ProppatchQueryParser parser = new ProppatchQueryParser(body);
    DAVItem item = parser.parseDocument();
//    System.out.println(item);    
    
    ElementCreationParser ecParser = new ElementCreationParser();
    System.out.println(ecParser.createPropfindResponse(item, null));
	}
}
