package org.apache.cocoon.transformer;

import java.io.*;
import java.net.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.transform.*;                 // NEW
import javax.xml.transform.dom.*;             // NEW
import javax.xml.transform.stream.*;          // NEW
import org.apache.cocoon.*;
import org.apache.cocoon.parser.*;
import org.apache.cocoon.processor.*;
import org.apache.cocoon.framework.*;
import org.xml.sax.InputSource;
import org.xml.sax.EntityResolver;
import org.xml.sax.SAXException;

/**
 * This class implements the transformer interface for the Apache
 * Xalan XSLT processor.
 *
 * @author <a href="rick_knowles@hotmail.com">Rick Knowles</a>
 * @version $Revision: 1.14 $ $Date: 2000/11/20 22:37:25 $
 */

public class Xalan2Transformer extends AbstractActor implements Transformer, Status {

    Parser parser;

    public void init(Director director) {
        super.init(director);
        this.parser = (Parser) director.getActor("parser");
    }

    public Document transform(Document in, String inBase, Document sheet, String sheetBase, Document out, Dictionary params)
    throws Exception {

        Source s = new DOMSource(sheet); // NEW=20

        s.setSystemId("file:///"+inBase);        // NEW

        TransformerFactory factory = TransformerFactory.newInstance();      // NEW

        //factory.setURIResolver(new myUriResolver(inBase));
        javax.xml.transform.Transformer transformer = factory.newTransformer(s);// NEW


        //XSLTProcessor processor =  XSLTProcessorFactory.getProcessor(new XMLParser(parser)); // REMOVED

        Enumeration enum = params.keys();
        while (enum.hasMoreElements()) {
            String name = (String) enum.nextElement();
            String value = (String)params.get(name);
            transformer.setParameter(name, value);  // NEW
            //processor.setStylesheetParam(name,processor.createXString(value));
            //REMOVED
        }
        //transformer.setURIResolver(new myUriResolver());

        //XSLTInputSource i = new XSLTInputSource(in); // REMOVED
        Source i = new DOMSource(in);                  // NEW
        // inBase needed for document function with 2 args to resolve correctly
        i.setSystemId(inBase);



        //XSLTResultTarget o = new XSLTResultTarget(out); // REMOVED
        Result o = new DOMResult(out);                    // NEW
        //processor.process(i, s, o);                     // REMOVED

        transformer.transform(i, o);
                  // NEW
        return out;
    }

    public String getStatus() {
        return "Xalan2 XSLT Processor";
    }



}


