package dbxml.xtint;

import java.io.*;

import org.xml.sax.*;

import com.jclark.xsl.sax.*;

import dbxml.sax.*;

/**
 * Integration of JDBCSAXParser with XT.
 * 
 * This class is based on com.jclark.xsl.sax.Driver.
 */
public class JDBCXSLProcessor {
    private static XSLProcessor _xslProcessor;

    public static void main(String[] argv) {
	if (argv.length != 3) {
	    System.out.println("Usage: JDBCXSLProcessor dbPropFile xslFile "
			       + "outFile");
	    System.exit(-1);
	}

	String dbPropFile = argv[0];
	String xslFile = argv[1];
	String outFile = argv[2];
	String xmlParserClassName = "dbxml.sax.JDBCSAXParser";
	String xslParserClassName = "com.jclark.xml.sax.CommentDriver";

	_xslProcessor 
	    = createXSLProcessor(xmlParserClassName, xslParserClassName);

	OutputMethodHandlerImpl outputMethodHandler 
	    = new OutputMethodHandlerImpl(_xslProcessor);
	
	_xslProcessor.setOutputMethodHandler(outputMethodHandler);
	outputMethodHandler.setDestination(new FileDestination(outFile));

	try {
	    InputSource dbis 
		= JDBCSAXUtil.setupSourceFromProperties(dbPropFile);
	    transform(_xslProcessor, 
		      Driver.fileInputSource(new File(xslFile)), dbis);
	} catch (IOException ex1) {
	    System.out.println(ex1);
	} catch (ClassNotFoundException ex3) {
	    System.out.println(ex3);
	}
    }

    static private XSLProcessor createXSLProcessor(String xmlParserClassName,
						   String xslParserClassName) {
	XSLProcessor xslProcessor = null;
	try {
	    Parser xmlParser 
		= (Parser)Class.forName(xmlParserClassName).newInstance();
	    Parser xslParser 
		= (Parser)Class.forName(xslParserClassName).newInstance();
	    
	    if ((xmlParser == null) || (xslParser == null)) {
		return null;
	    }
	    
	    xslProcessor = new XSLProcessorImpl();
	    xslProcessor.setParser(xmlParser, xslParser);	
	} catch (ClassNotFoundException ex1) {
	    System.out.println(ex1);
	} catch (InstantiationException ex2) {
	    System.out.println(ex2);
	} catch (IllegalAccessException ex3) {
	    System.out.println(ex3);
	}
	return xslProcessor;
    }

    //=====================================================================
    // Following method copied from com.jclark.xsl.sax.Driver becuase they
    // have package access there.
    static boolean transform(XSLProcessor xsl,
			     InputSource stylesheetSource,
			     InputSource inputSource) {
	try {
	    xsl.loadStylesheet(stylesheetSource);
	    xsl.parse(inputSource);
	    return true;
	}
	catch (SAXParseException e) {
	    printSAXParseException(e);
	}
	catch (SAXException e) {
	    System.err.println(e.getMessage());
	}
	catch (IOException e) {
	    System.err.println(e.toString());
	}
	return false;
    }
    
    static void printSAXParseException(SAXParseException e) {
	String systemId = e.getSystemId();
	int lineNumber = e.getLineNumber();
	if (systemId != null)
	    System.err.print(systemId + ":");
	if (lineNumber >= 0)
	    System.err.print(lineNumber + ":");
	if (systemId != null || lineNumber >= 0)
	    System.err.print(" ");
	System.err.println(e.getMessage());
    }

}