import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import java.io.*;

public class XMLTransform
{
	private TransformerFactory 	tf;
	private Source			stylesheet;
	private Transformer 		tr;
	private StreamSource		fic_XML;
	private StreamResult		fic_OUT;

	/** Initialise l'ojet de type TransformerFactory
         */
	public XMLTransform()
	{
		tf = TransformerFactory.newInstance();
	}

	private boolean testFic(String fic)
	{
		File file = new File(fic);
		if (! file.exists() )
		{
			System.err.println(fic+" n'existe pas.");
			return false;
		}
		return true;
	}


	/** Définit le fichier de sortie 
	 */
	public boolean setFicOut(String sout)
	{
		FileOutputStream fos = null;	
		try 
		{
			fos = new FileOutputStream(sout);
		}
		catch (FileNotFoundException fnfe)
		{
			System.err.println("erreur à la création du fichier de sortie");
			return false;
		}
 		fic_OUT = new StreamResult(fos);
		return true;
	}

	/** Définit la feuille de style à utiliser
         */	
	public boolean setStyleSheet(String fic_src)
	{
		if (! testFic(fic_src)) return false;
		stylesheet = new StreamSource(fic_src); 
		return true;
	}

 	/** Va rechercher dans les paramètres de la feuille XML la feuille de style à utiliser.
         *  La feuille doit être renseigner selon le format suivant dans la page xml :
	 *  &lt;?xml-stylesheet type="text/xsl" href="feuille.xsl"?&gt;
         */  
	public boolean setStyleSheet()
	{
		try
		{
			stylesheet = tf.getAssociatedStylesheet(fic_XML,null, null, null);
		}
		catch (TransformerConfigurationException tce)
		{
			System.err.println("Erreur lors de la lecture de la feuille de style");
			return false;
		}
		return true;
	}
	
	/** Positionne le nom du fichier de sortie
	 */
	public boolean setSourceXML(String sxml)
	{
		if (!testFic(sxml)) return false;
		fic_XML = new StreamSource(sxml);	
		return false;
	}
	

	/** Initialise l'objet de type Transformer à partir de la feuille de style et du TranformerFactory
	 */
	public boolean setTransformer()
	{
		if (stylesheet == null) return false;
		try
		{
			tr = tf.newTransformer(stylesheet);
		}
		catch (TransformerConfigurationException tce)
		{
			System.err.println("Erreur dans la configuration, vérifier la feuille de style");
			return false;
		}
		return true;
	}

	/** Lance la transformation du fichier XML vers le fichier destination
	 */
	public boolean transforme()
	{
		try
		{	
			tr.transform( fic_XML, fic_OUT );
		}
		catch (TransformerException te)
		{
			System.out.println(te);
			return false;
		}
		return true;
	}

	/** On considère l'exécution suivante :
	 *  java XMLTransform source.xml dest.XXX
         *  ou
         *  java XMLTransform source.xml feuille.xsl dest.XXX
	 */
	public static void main(String [] args)
	{
		XMLTransform xmlt;
		if (args.length<2)
		{
			System.err.println("Indiquez au moins le nom du fichier xml");
			System.exit(1);
		}
		xmlt = new XMLTransform();
		xmlt.setSourceXML(args[0]);
		if (args.length==2)
		{
			if (! xmlt.setFicOut(args[1]) || ! xmlt.setStyleSheet() )
				System.exit(0);
		}
		else
		{
			if (! xmlt.setFicOut(args[2]) || ! xmlt.setStyleSheet(args[1]) )
				System.exit(0);
		}
		if (! xmlt.setTransformer() )
			System.exit(0);
		xmlt.transforme();
	}

}

