package de.spieleck.pcs.view;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import de.spieleck.pcs.conf.ConfigUser;
import de.spieleck.pcs.conf.ConfigAdmin;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.Templates;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerFactory;
import de.spieleck.pcs.action.ActionResult;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.util.Properties;
import java.util.Enumeration;
import java.util.Hashtable;
import org.w3c.tidy.Tidy;
public class View implements ConfigUser{
private static String file;
private static String rootXslPath = null;
private OutputStream os;
private static boolean useJTidy;
public View(OutputStream os) throws IOException{
this();
setOutputStream(os);
}
public View() throws IOException{
ConfigAdmin.getInstance().addConfigUser(this);
}
public void cleanUp(){
ConfigAdmin.getInstance().removeConfigUser(this);
}
public void setOutputStream(OutputStream os){
this.os = os;
}
public OutputStream getOutputStream(){
return os;
}
public synchronized void output(ActionResult ar, String styleSheetFile)
throws ViewException{
try{
Source source = ar.getSource();
boolean useTidy = isUseJTidy();
StreamSource stylesheet = new StreamSource(new File(styleSheetFile));
OutputStream xslOut = null;
InputStream tidyIn = null;
if(useTidy)
xslOut = new ByteArrayOutputStream();
else
xslOut = getOutputStream();
StreamResult result = new StreamResult(xslOut);
TransformerFactory transFact = TransformerFactory.newInstance();
Templates cachedXSLT = transFact.newTemplates(stylesheet);
Transformer trans = cachedXSLT.newTransformer();
setProperties(trans, ar.getParameters());
trans.transform(source, result);
if(useTidy){
tidyIn = new ByteArrayInputStream(xslOut.toString().getBytes());
Tidy tidy = new Tidy();
tidy.setQuiet(true);
tidy.setXHTML(true);
tidy.setErrfile(null);
tidy.parse(tidyIn, getOutputStream());
}
} catch(Exception e){
e.printStackTrace();
throw new ViewException(e.getMessage());
}
}
protected void setProperties(Transformer trans, Hashtable h){
if(h == null)
return;
Enumeration e = h.keys();
String key = null;
while(e.hasMoreElements()){
key = (String) e.nextElement();
trans.setParameter(key, h.get(key));
}
}
public void resetConfig() {
}
public static boolean isUseJTidy() {
return useJTidy;
}
public static void setUseJTidy(boolean useJTidy) {
View.useJTidy = useJTidy;
}
}