SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

897 lines
27 KiB

package de.superx.bin;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.Writer;
import java.net.URI;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.Transformer;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopConfParser;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.FopFactoryBuilder;
import org.apache.fop.apps.MimeConstants;
import org.jfor.jfor.converter.Converter;
import org.xml.sax.InputSource;
import de.superx.common.TransletCache;
import de.superx.util.SqlStringUtils;
// ACHTUNG - PDF ERZEUGUNG WIEDER AKTIV DQ 27.12.2005!!!
/**
* @author Daniel Quathamer Projektgruppe SuperX SxTransformer.java @ Dieses
* Javaprogramm transformiert ResultSets in text, html oder xml und gibt
* das Ergebnis als Ausgabestrom für stdout oder eine Datei aus.
*
*
*
*/
public class SxTransformer {
/**
*
*/
private String head_delim1 = "";
private String head_delim2 = "\t";
private String header_delim1 = "";
private String header_delim2 = "\n";
private String fld_delim1 = "";
private String fld_delim2 = "\t";
private String row_delim1 = "";
private String row_delim2 = "\n";//we only user unix newline, even under
// DOS
private String rs_delim1 = "";
private String rs_delim2 = "";
private String delim = "\t";
private String header = "false";
private String outHeader = "";
private String outFooter = "";
public String format = "txt";
public String params = "";
public String[] XslPipeline;
public String stylesheet = "";
public PrintWriter myOutwriter;
public OutputStream myOutputStream;
public ResultSet outrs = null;
public ResultSetMetaData outrsmd = null;
public String quellstring = null;
public String outfile = "";
private File fopxconfFile=null;
public void setFopxconfFile(File fopxconfFile) {
this.fopxconfFile = fopxconfFile;
}
public String mandantenID;
Logger myLogger;
String loglevel;
//PrintStream outputstream=null;
//TODO ggfs. auf Saxon umstellen
//TransletUtils.initFactory("net.sf.saxon.TransformerFactoryImpl",
// "org.apache.xalan.xsltc.trax.TransformerFactoryImpl");
//System.out.println("Using xsl processor: "
// + TransletUtils.getUsedProcessor());
public SxTransformer(Logger logger, PrintStream myStream) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer with Stdout-Output.");
myOutwriter = new PrintWriter(myStream);
}
public SxTransformer(Logger logger, String myFile) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer with File-Output.");
outfile = myFile;
myLogger.setLevel(Level.SEVERE);
}
public SxTransformer(Logger logger, FileWriter myFilewriter) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer with File-Output.");
myOutwriter = new PrintWriter(new BufferedWriter(myFilewriter));
}
public SxTransformer(Logger logger) {
super();
myLogger = logger;
myLogger.config("Starting the Transformer without Stream");
}
public void printResult(String outFormat) {
//loglevel=myLogger.getRootLogger().getLevel().toString().trim();
assignDelims(outFormat);
myLogger.config("Resultset wird formatiert");
String f_wert = "";
//ResultSetMetaData rsmd = rs.getMetaData();
String zs = "";
String headZs = "";
int cols = 0;
Object o = null;
String[] lbl = null;
int[] types = new int[255];
// de.memtext.util.MemoryUtils.printfree();
if (outrs != null) {
try {
cols = outrsmd.getColumnCount();
lbl = new String[255];
zs = outHeader + rs_delim1;
headZs = header_delim1;
;
// Print the result column names?
for (int i = 1; i <= cols; i++) {
lbl[i] = outrsmd.getColumnLabel(i);
types[i] = outrsmd.getColumnType(i);
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i] + "'>";
fld_delim2 = "</fld>";
} else {
if (i < cols)
headZs += (head_delim1 + lbl[i] + head_delim2);
else {
headZs += (head_delim1 + lbl[i] + head_delim2);
headZs += (header_delim2);
//out.newLine();
}
}
}
} catch (SQLException e1) {
myLogger.severe("Fehler beim Einlesen der Feldnamen: " + e1.toString());
e1.printStackTrace();
}
if (header.equals("true")) zs += headZs;
// try {
myOutwriter.write(zs);
myOutwriter.flush();
/*
* } catch (IOException e) { myLogger.severe("Fehler beim Ausgeben
* der Feldnamen: " + e.toString());
* }
*/
//now the results
StringBuffer line = new StringBuffer();
try {
int rowCounter = 0;
do {
line.setLength(0);
line.append(row_delim1);
for (int i = 1; i <= cols; i++) {
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i] + "'>";
fld_delim2 = "</fld>";
}
if (types[i] == Types.LONGVARCHAR) {
//Der Informix-Treiber verlangt hier getString
// statt getObject!
o = outrs.getString(i);
} else {
o = outrs.getObject(i);
}
if (outrs.wasNull())
if (i < cols)
line.append(fld_delim1 + "" + fld_delim2);
else {
line.append(fld_delim1 + "" + fld_delim2);
line.append(row_delim2);
//out.newLine();
}
else {
//vergl. de.superx.common.Maske.getCSV
f_wert = SxDBUtils.field_value(o);
if (outFormat.equals("xml") && (f_wert.indexOf("&") > -1 || f_wert.indexOf("<") > -1 || f_wert.indexOf(">") > -1))
f_wert = "<![CDATA[" + f_wert + "]]>";
//wenn der Feldwert zufällig das Trennzeichen enthält, wird es mit "\" maskiert
if (outFormat.equals("txt")) {
f_wert = SxDBUtils.prepareInformixCsv(f_wert);
if (f_wert != null && (f_wert.indexOf(fld_delim2) > -1)) f_wert = de.memtext.util.StringUtils.replace(f_wert, fld_delim2, "\\" + fld_delim2);
}
if (i < cols)
line.append(fld_delim1 + f_wert + fld_delim2);
else {
line.append(fld_delim1 + f_wert + fld_delim2);
line.append(row_delim2);
}
}
}
myOutwriter.write(line.toString());
rowCounter++;
if (rowCounter > 10000) {
de.memtext.util.MemoryUtils.printfree();
myOutwriter.flush();
rowCounter = 0;
}
} while (outrs.next()); //von while
myOutwriter.write(rs_delim2 + outFooter);
myOutwriter.flush();
outrs.close();
myOutwriter.close();
} /*
* catch (IOException e) { myLogger.severe("Fehler beim Ausgeben
* der Feldwerte: " + e.toString()); }
*/
catch (SQLException e) {
myLogger.warning("SQL-Fehler beim Ausgeben der Feldwerte: " + e.toString());
try {
myOutwriter.write(rs_delim2 + outFooter);
myOutwriter.flush();
myOutwriter.close();
outrs.close();
}
/*
* catch (IOException e1) { myLogger.severe("Fehler beim
* Ausgeben der Feldwerte: " + e1.toString()); }
*/
catch (SQLException e1) {
myLogger.warning("SQL-Fehler beim Ausgeben der Feldwerte: " + e1.toString());
}
}
}
else //wenn outrs=null
{
myOutwriter.flush();
myOutwriter.close();
}
myLogger.info("resultset printed");
}
public void transformString(String methode) throws TransformerException {
try {
javax.xml.transform.TransformerFactory tFactory = javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(stylesheet));
StringReader s1 = new StringReader(quellstring);
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, SqlStringUtils.getEncoding());
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, methode);
transformer.setParameter("sx_client", format);
String result = null;
if (!params.endsWith(",")) params += ",";
StringTokenizer st = new StringTokenizer(params, ",");
for (; st.hasMoreTokens();) {
String param = st.nextToken();
if (!param.equals("")) {
String paramname = param.substring(0, param.indexOf("="));
String paramvalue = param.substring(param.indexOf("=") + 1, param.length());
transformer.setParameter(paramname, paramvalue);
}
}
transformer.transform(new javax.xml.transform.stream.StreamSource(s1), new javax.xml.transform.stream.StreamResult(myOutwriter));
} catch (Exception e) {
myLogger.severe("XSL-Transformation fehlgeschlagen: " + e.toString());
}
}
public void transformFile(String methode) throws TransformerException, Exception
{
/*javax.xml.transform.TransformerFactory tFactory = javax.xml.transform.TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
javax.xml.transform.Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(this.stylesheet));*/
Transformer transformer = TransletCache.getTransformer(this.mandantenID, this.stylesheet);
//StringReader s1 = new StringReader(quellstring);
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, SqlStringUtils.getEncoding());
if (methode.equals("pdf") || methode.equals("rtf"))
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "xml");
else
transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, methode);
transformer.setParameter("sx_client", format);
transformer.setParameter("versionParam", "2.0");
// String result = null;
if (!params.endsWith(",")) params += ",";
StringTokenizer st = new StringTokenizer(params, ",");
for (; st.hasMoreTokens();) {
String param = st.nextToken();
if (!param.equals("")) {
String paramname = param.substring(0, param.indexOf("="));
String paramvalue = param.substring(param.indexOf("=") + 1, param.length());
transformer.setParameter(paramname, paramvalue);
}
}
if (methode.equals("pdf")) { //Sichern um zurücksetzen zu können.
Level logLevel = myLogger.getParent().getLevel();
myLogger.getParent().setLevel(Level.SEVERE);
// configure fopFactory as desired
//akt. Pfad muss WEB-INF sein oder vorher als -fopxconf Param übergeben worden sein
FopFactory fopFactory ;
FOUserAgent foUserAgent;
// in fop.xconf fopFactory.setSourceResolution(96); // =96dpi (dots/pixels per Inch)
if (fopxconfFile==null)
fopxconfFile=new File ("conf" + File.separator + "fop.xconf");
if (!fopxconfFile.exists())
{
String msg=fopxconfFile.getAbsolutePath()+" nicht gefunden";
System.out.println(msg);
throw new IllegalStateException(msg);
}
FopConfParser parser = new FopConfParser(fopxconfFile); //parsing configuration
FopFactoryBuilder builder = parser.getFopFactoryBuilder(); //building the factory with the user options
String fa=fopxconfFile.getCanonicalPath();
URI uri=new File(fa).getParentFile().getParentFile().toURI();
// System.out.println(uri);
builder.setBaseURI(uri);
builder.setStrictFOValidation(false);
fopFactory = builder.build();
foUserAgent = fopFactory.newFOUserAgent();
try {
myOutputStream = new java.io.FileOutputStream(outfile);
} catch (FileNotFoundException e) {
myLogger.severe("Ausgabedatei " + outfile + " kann nicht erzeugt werden:" + e.toString());
System.exit(-1);
}
try {
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, myOutputStream);
// Setup input for XSLT transformation
Source src = new StreamSource(quellstring);
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
try {
transformer.transform(src, res);
System.out.println("Success!");
} catch (TransformerException ex) {
throw new Exception(ex);
}
} catch (Exception e) {
e.printStackTrace(System.err);
myLogger.severe("FOP-Transformation Fehler: " + e.toString());
} finally {
myOutputStream.close();
myLogger.getParent().setLevel(logLevel);
}
} else {
if (methode.equals("rtf")) {
String zielstring = "";
myLogger.info("Ausgabedatei " + outfile + " vorbereiten");
Writer myWriter = null;
try {
myWriter = new BufferedWriter(new FileWriter(outfile));
} catch (IOException e) {
e.printStackTrace();
}
try {
myLogger.info("Transformiere nach fo ");
transformer.transform(new javax.xml.transform.stream.StreamSource(quellstring), new StreamResult("tmp.fo"));
myLogger.info("Transformiere nach rtf ");
new Converter(new InputSource("tmp.fo"), myWriter, Converter.createConverterOption());
} catch (Exception e1) {
e1.printStackTrace();
}
} else {
if (methode.equals("xls")) {
} else {
//Normal xml Transformation, not fop or rtf
try {
FileWriter myFile = new FileWriter(outfile);
myOutwriter = new PrintWriter(myFile);
transformer.transform(new javax.xml.transform.stream.StreamSource(quellstring), new javax.xml.transform.stream.StreamResult(myOutwriter));
} catch (IOException e) {
myLogger.severe("Datei " + outfile + " kann nicht erzeugt werden: " + e.toString());
} catch (TransformerException e) {
myLogger.severe("Datei " + outfile + " kann nicht transformiert werden: " + e.toString());
}
//new javax.xml.transform.stream.StreamResult( myOutwriter));
}
}
}
}
public void outputString() {
BufferedWriter out = new BufferedWriter(myOutwriter);
try {
out.write(quellstring);
out.flush();
} catch (IOException e) {
myLogger.severe("Fehler beim Ausgeben des Ergebnisses: " + e.toString());
}
}
public String getResult(String outFormat) throws SQLException {
//loglevel=myLogger.getRootLogger().getLevel().toString().trim();
assignDelims(outFormat);
myLogger.config("Resultset wird formatiert");
String f_wert = "";
//ResultSetMetaData rsmd = rs.getMetaData();
int cols = outrsmd.getColumnCount();
String[] lbl = new String[255];
String zs = rs_delim1;
String headZs = header_delim1;
;
// Print the result column names?
for (int i = 1; i <= cols; i++) {
lbl[i] = outrsmd.getColumnLabel(i);
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i].toLowerCase() + "'>";
fld_delim2 = "</fld>";
} else {
if (i < cols)
headZs += (head_delim1 + lbl[i] + head_delim2);
else {
headZs += (head_delim1 + lbl[i] + head_delim2);
headZs += (header_delim2);
//out.newLine();
}
}
}
if (header.equals("true")) zs += headZs;
//now the results
try {
while (outrs.next())
{
zs += (row_delim1);
for (int i = 1; i <= cols; i++) {
Object o = outrs.getObject(i);
f_wert = SxDBUtils.field_value(o);
if (outFormat.equals("xml")) {
fld_delim1 = "<fld name='" + lbl[i].toLowerCase() + "'>";
fld_delim2 = "</fld>\n";
}
if (outrs.wasNull())
if (i < cols)
zs += (fld_delim1 + "" + fld_delim2);
else {
zs += (fld_delim1 + "" + fld_delim2);
zs += (row_delim2);
//out.newLine();
}
else if (i < cols)
zs += (fld_delim1 + f_wert.trim() + fld_delim2);
else {
zs += (fld_delim1 + f_wert.trim() + fld_delim2);
zs += (row_delim2);
// out.newLine();
}
// }
// catch (IOException e)
// {
// myLogger.severe("Fehler beim Ausgeben der Feldwerte:
// "+e.toString());
//
// }
}
} //von while
zs += (rs_delim2);
} catch (Exception e) {
myLogger.severe("Fehler beim Ausgeben der Feldwerte: " + e.toString());
}
outrs.close();
return zs;
}
private void assignDelims(String outFormat) {
if (outFormat.equals("html")) {
outHeader = "<html><body>";
outFooter = "</body></html>";
rs_delim1 = "<table border='1'>\n";
rs_delim2 = "</table>";
head_delim1 = "<th>";
head_delim2 = "</th>";
header_delim1 = "<tr>";
header_delim2 = "</tr>\n";
row_delim1 = "<tr>";
row_delim2 = "</tr>";
fld_delim1 = "<td>";
fld_delim2 = "</td>";
}
if (outFormat.equals("xml")) {
outHeader = "<?xml version='1.0' encoding='" + SqlStringUtils.getEncoding() + "'?>";
outFooter = "";
rs_delim1 = "<rs>\n";
rs_delim2 = "</rs>";
head_delim1 = "";
head_delim2 = "";
header_delim1 = "";
header_delim2 = "";
row_delim1 = "<row>\n";
row_delim2 = "</row>\n";
fld_delim1 = "";
fld_delim2 = "";
}
}
/**
* @return
*/
public String getDelim() {
return delim;
}
/**
* @return
*/
public String getFld_delim1() {
return fld_delim1;
}
/**
* @return
*/
public String getFld_delim2() {
return fld_delim2;
}
/**
* @return
*/
public String getFormat() {
return format;
}
/**
* @return
*/
public String getHead_delim1() {
return head_delim1;
}
/**
* @return
*/
public String getHead_delim2() {
return head_delim2;
}
/**
* @return
*/
public String getHeader() {
return header;
}
/**
* @return
*/
public String getHeader_delim1() {
return header_delim1;
}
/**
* @return
*/
public String getHeader_delim2() {
return header_delim2;
}
/**
* @return
*/
public ResultSet getOutrs() {
return outrs;
}
/**
* @return
*/
public ResultSetMetaData getOutrsmd() {
return outrsmd;
}
/**
* @return
*/
public String getRow_delim1() {
return row_delim1;
}
/**
* @return
*/
public String getRow_delim2() {
return row_delim2;
}
/**
* @return
*/
public String getRs_delim1() {
return rs_delim1;
}
/**
* @return
*/
public String getRs_delim2() {
return rs_delim2;
}
/**
* @return
*/
public String[] getXslPipeline() {
return XslPipeline;
}
/**
* @param string
*/
public void setDelim(String string) {
delim = string;
fld_delim1 = "";
fld_delim2 = string;
head_delim2 = string;
}
/**
* @param string
*/
public void setFld_delim1(String string) {
fld_delim1 = string;
}
/**
* @param string
*/
public void setFld_delim2(String string) {
fld_delim2 = string;
}
/**
* @param string
*/
public void setFormat(String string) {
format = string;
}
/**
* @param string
*/
public void setHead_delim1(String string) {
head_delim1 = string;
}
/**
* @param string
*/
public void setHead_delim2(String string) {
head_delim2 = string;
}
/**
* @param string
*/
public void setHeader(String string) {
header = string;
}
/**
* @param string
*/
public void setHeader_delim1(String string) {
header_delim1 = string;
}
/**
* @param string
*/
public void setHeader_delim2(String string) {
header_delim2 = string;
}
/**
* @param set
*/
public void setOutrs(ResultSet set) {
outrs = set;
}
/**
* @param data
*/
public void setOutrsmd(ResultSetMetaData data) {
outrsmd = data;
}
/**
* @param string
*/
public void setRow_delim1(String string) {
row_delim1 = string;
}
/**
* @param string
*/
public void setRow_delim2(String string) {
row_delim2 = string;
}
/**
* @param string
*/
public void setRs_delim1(String string) {
rs_delim1 = string;
}
/**
* @param string
*/
public void setRs_delim2(String string) {
rs_delim2 = string;
}
/**
* @param strings
*/
public void setXslPipeline(String[] strings) {
XslPipeline = strings;
}
/**
* @return
*/
public String getOutFooter() {
return outFooter;
}
/**
* @return
*/
public String getOutHeader() {
return outHeader;
}
/**
* @param string
*/
public void setOutFooter(String string) {
outFooter = string;
}
/**
* @param string
*/
public void setOutHeader(String string) {
outHeader = string;
}
/**
* @return
*/
public String getParams() {
return params;
}
/**
* @param string
*/
public void setParams(String string) {
params = string;
}
//-- nur zum Testen --//
public static void main(String[] args) throws Exception {
Logger log = Logger.getLogger(SxTransformer.class.getName());
String rootDir = "/home/superx/tmp/";
String quelle = rootDir + "Buchungsbericht_ids_Test.xml";
String zielFile = rootDir + "testneu.pdf";
String sxlSheet = "/home/superx/dev/edustore/webserver/tomcat/webapps/superx/xml/tabelle_fo_pdf.xsl";
SxTransformer sxTrans = new SxTransformer(log, zielFile);
sxTrans.quellstring = quelle;
sxTrans.outfile = zielFile;
sxTrans.stylesheet = sxlSheet;
sxTrans.transformFile("pdf");
}//Ende der Methode
public class ClasspathUriResolver implements URIResolver {
public Source resolve(String href, String base) throws TransformerException {
Source source = null;
InputStream inputStream = ClassLoader.getSystemResourceAsStream(href);
if (inputStream != null) {
source = new StreamSource(inputStream);
}
return source;
}
}
}//Ende der Klasse