import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Map;

import owql.jtp.*;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.transformation.AbstractTransformer;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.SAXOutputter;
import org.w3c.dom.Node;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;



/*
 * Created on 29.07.2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author Halgurt
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class OWQLTransformer extends AbstractTransformer {
	
    private String namespace;
	OWQLServerJTP owql;
	String reqxml;
	boolean readOWQL;
	boolean start;
	Node e;
	
	public OWQLTransformer (){
		
	namespace = "http://maria_sharapova.html";	
	owql = new OWQLServerJTP ();
	readOWQL = false;
	start = false;
	//e = super.builder.getDocument().getFirstChild();
	//reqxml = new StringBuffer ();
	}
	/*public Document transform(Document doc){
		return doc;
		}*/
    public void setup (SourceResolver resolver, Map objectModel, String src, Parameters par) throws ProcessingException, SAXException, IOException {
    //System.out.println("proxy: " +System.getProperty("proxyHost"));
    }
   
    public void startElement (String namespaceURI, String localName, String qName, Attributes attributes) throws SAXException {
        if (namespaceURI.equals (namespace) && localName.equals ("OWLQL")) {
            readOWQL = true;
            start = true;
        }

        else {
        	if (!start){
            super.startElement (namespaceURI, localName, qName, attributes);
        	}
        }
    
    }
    
    public void characters (char[] ch, int start, int length) {
        if (readOWQL && (length != 0)) {
    		//System.out.println(e.getFirstChild().toString());
            System.out.println(new String (ch));    	
            reqxml = new String(ch, start, (ch.length-start));
            reqxml = reqxml.substring(0, reqxml.indexOf("</owql:OWLQL>"));
            System.out.println("query: " +reqxml);
            readOWQL = false;
        }    
    }
    public void endElement (String namespaceURI, String localName, String qName) throws SAXException {
        if (namespaceURI.equals (namespace) && localName.equals ("OWLQL")) {
        	start = false;
        	try {
                //System.getProperties().put("http.proxySet", "true");
                //System.getProperties().put("http.proxyHost", "proxy.hms.swh.mhn.de");
                //System.getProperties().put("http.proxyPort", "8080");
           	    StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                //pw.write("hier ist was drin");
                owql.printAnswersXML(reqxml, pw);
                String ansstr = sw.toString();
                System.out.println("Start answer String: " + ansstr + "length: "+ansstr.length());
                super.startElement("", "result", "result", (Attributes) new AttributesImpl());
                //super.characters(ansstr.toCharArray(), 0, ansstr.length());
               
                StringReader sr = new StringReader(ansstr);
                Document doc = new SAXBuilder().build(sr);
                convertToSAX(doc);
                super.endElement("", "result", "result");
            	}
            	catch (Exception e){
                    System.out.println ("An Error occured during Parameter instantiation ");
                    e.printStackTrace ();
            	}    	
            }
        }
    public void convertToSAX(Document jdomDoc) throws JDOMException {
    	   SAXOutputter outputter = new SAXOutputter(super.contentHandler);

    	   // Set the EntityResolver impl
    	   //outputter.setEntityResolver(new DefaultHandler());

    	   // Set the DTDHandler impl
    	   //outputter.setEntityResolver(new DefaultHandler());

    	   // Set the ErrorHandler impl
    	   //outputter.setEntityResolver(new DefaultHandler());

    	   // Fire the SAX events
    	   outputter.output(jdomDoc);
    	}       
}

