package org.apache.cocoon.serialization;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.Certificate;

import org.apache.cocoon.serialization.FOPSerializer;
import org.xml.sax.SAXException;

import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfSignatureAppearance;
import com.lowagie.text.pdf.PdfStamper;

public class PDFSignSerializer extends FOPSerializer 
{
	private OutputStream pdfOut;
	private ByteArrayOutputStream internalOS; 
	
	public void setOutputStream(OutputStream out) 
	{
		this.pdfOut = out;
		this.internalOS = new ByteArrayOutputStream();
		
		super.setOutputStream(this.internalOS);		
	}

	public void endDocument() throws SAXException 
	{
		super.endDocument();
		
		try
		{
			this.internalOS.flush();
			byte[] fopPDF = this.internalOS.toByteArray();
			this.internalOS.close();

			KeyStore ks = KeyStore.getInstance("pkcs12");
			ks.load(new FileInputStream("/a.pfx"), "kk".toCharArray());

			String alias = (String) ks.aliases().nextElement();
			PrivateKey key = (PrivateKey) ks.getKey(alias, "kk".toCharArray());
			Certificate[] chain = ks.getCertificateChain(alias);
			
			PdfReader reader = new PdfReader(fopPDF);
			PdfStamper stp = PdfStamper.createSignature(reader, this.pdfOut, '\0', new File("/tmp"));
			
			PdfSignatureAppearance sap = stp.getSignatureAppearance();
			sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
			sap.setReason("My Reason");
			sap.setLocation("Spain");
			stp.close();
			
			this.pdfOut.flush();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

