import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import at.gv.egovernment.moa.spss.api.SPSSFactory;
import at.gv.egovernment.moa.spss.api.SignatureCreationService;
import at.gv.egovernment.moa.spss.api.xmlsign.*;
import at.gv.egovernment.moa.spss.api.common.*;

/**
 * @author Sven Aigner
 *
 * Dies ist ein einfaches Beispielprogramm f�r die Erstellung
 * einer digitalen Signatur mittel der API-Funktionen des
 * MOA-SPSS Servers
 */
public class APIClientExample {

	/**
	 * Hauptfunktion des Beispielprogramms
	 * @param args wird nicht ausgewertet
	 * @throws Exception sollten Fehler auftreten werden die Fehler an die Java-VM weitergeleitet
	 */
	public static void main(String[] args) throws Exception{

		// Serverfunktionshandler instanzieren
		SPSSFactory spf = SPSSFactory.getInstance();
		
		// Signaturedaten in ein Contentobjekt einbinden
		byte []data = "Dies sind Testdaten".getBytes("UTF-8");
		ByteArrayInputStream bis = new ByteArrayInputStream(data);
		Content cont = spf.createContent(bis,"http://uri.data.org");
		
		// Beschreibungselement zu den Daten erstellen
		MetaInfo mi = spf.createMetaInfo("text/plain","Testdaten",null);

		// Transformationen erstellen
		CreateTransformsInfo cti = spf.createCreateTransformsInfo(null,mi);
		CreateTransformsInfoProfile ct = spf.createCreateTransformsInfoProfile(cti,null);
		
		// Datenobjekt aufbauen
		DataObjectInfo doi = spf.createDataObjectInfo(DataObjectInfo.STRUCTURE_DETACHED,false,cont,ct);
		
		List dataobjectinfolist = new ArrayList();
		dataobjectinfolist.add(doi);
		// alles zusammenpacken zu einer SingleSignature
		SingleSignatureInfo ssi = spf.createSingleSignatureInfo(dataobjectinfolist,null,false);
		
		List singlesignatureinfolist = new ArrayList();
		singlesignatureinfolist.add(ssi);
		// die Signatur in einen Request einbetten
		CreateXMLSignatureRequest cxsreq = spf.createCreateXMLSignatureRequest("PKCS12RSAKey1",singlesignatureinfolist);
		
		// Signatureerstellungsservice aufrufen
		SignatureCreationService scs = SignatureCreationService.getInstance();
		
		// Response auswerten
		CreateXMLSignatureResponse cxsres = scs.createXMLSignature(cxsreq);
		
		List elements = cxsres.getResponseElements();
		
		SignatureEnvironmentResponse ser = (SignatureEnvironmentResponse)elements.get(0);
		
		// Responsetyp lesen
		int response_type = ser.getResponseType();
		
		if(response_type == SignatureEnvironmentResponse.ERROR_RESPONSE)
		{
			// Fehlerfall
			System.out.println("Bei der Erstellung der Signatur ist ein Fehler aufgetreten");
		}
		else
		{
			// Signaturerstellung erfolgreich
			Element se = ser.getSignatureEnvironment();
			System.out.println("Signaturerstellung erfolgreich");
			
			displayTree(se);
		}
	}
	
	/**
	 * Einfache Ausgabefunktion f�r einen DOM-Baum
	 * @param input auszugebender Knoten
	 */
	public static void displayTree(Node input)
	{
		// Ausgabe eines Knotens
		System.out.println(input);
		// Alle Kindknoten ausgeben
		NodeList children = input.getChildNodes();
		for(int counter=0;counter<children.getLength();counter++)
			displayTree(children.item(counter));
	}
}