package com.icard.xml;

import java.io.FileOutputStream;
import java.io.File;

import org.w3c.dom.Document;

import org.apache.fop.apps.Driver;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;

import org.apache.log.*;
import org.apache.log.format.PatternFormatter;
import org.apache.log.output.io.StreamTarget;

/**
 * Just for testing
 */
public class PDFGenerator
{
	public PDFGenerator()
	{
	}

	public void renderPDF()
		throws Exception
	{
		//VoucherXML and VoucherXSL dynamic generation
		XMLGenerator generator = new XMLGenerator();
		Document xsl = generator.getDocument( "./voucher.xsl" );
		Document xml = generator.getDocument("./voucher.xml" );

		//XSL Formatting
		Driver driver = new Driver();
		driver.setRenderer( Driver.RENDER_PDF );

		//Let's set all loggin stuff
		Logger log = null;
		Hierarchy hierarchy = Hierarchy.getDefaultHierarchy();
		PatternFormatter formatter = new PatternFormatter("[%{priority}]: %{message}\n%{throwable}");
		LogTarget target = null;
		target = new StreamTarget(System.out, formatter);
		hierarchy.setDefaultLogTarget(target);
		log = hierarchy.getLoggerFor("fop");
		log.setPriority(Priority.DEBUG);
		driver.setLogger(log);

		System.err.println("Dumping xsl to file");
		TransformerFactory.newInstance().newTransformer().transform(
			new DOMSource(xsl), 
			new StreamResult(new File("./dump.xsl"))
		);
		System.err.println("Dumping xml to file");
		TransformerFactory.newInstance().newTransformer().transform(
			new DOMSource(xml), 
			new StreamResult(new File("./dump.xml"))
		);

		//Let's set the output
		driver.setOutputStream( new FileOutputStream("voucher.pdf") );

		//Let's set the input
		Transformer trans = TransformerFactory.newInstance().newTransformer( new DOMSource( xsl ) );
		trans.transform( new DOMSource( xml ), new SAXResult( driver.getContentHandler() ));
	}

	public static void main(String arf[])
	{
		PDFGenerator generator = new PDFGenerator();
		try
		{
			generator.renderPDF();
		}
		catch( Exception e )
		{
			e.printStackTrace();
		}
	}
}
