
com.sta.cts.ConvRunner Maven / Gradle / Ivy
package com.sta.cts;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.Enumeration;
import java.io.File;
import com.wutka.dtd.DTD;
import com.wutka.dtd.DTDParser;
import com.wutka.dtd.DTDElement;
import com.wutka.dtd.DTDAttribute;
import com.sta.mlogger.MLogEntry;
import com.sta.mlogger.MLogEntry4Text;
import com.sta.mlogger.MLogger;
/**
* Name: ConvRunner
* Description:
* Klasse zum Starten und zur Demonstration der Funktionalit?t des
* Converters. Diese Klasse enth?lt sowohl eine (statische) Main-Methode,
* die zum Start per Kommandozeile eingesetzt werden kann, als auch eine Reihe
* von Methoden, die zum (direkten) Start aus einem anderen Java-Programm
* (einer anderen Java-Klasse) heraus verwendet werden k?nnen. Ziel bei der
* Entwicklung war, das "Methoden-Interface" so einfach wie m?glich zu halten,
* so dass der Aufruf per "Reflection" erfolgen kann.
*
* Historischer Werdegang:
*
* - Der Converter2 wird ab dem 26.09.2003 unabh?ngig vom Converter1 weiterentwickelt.
* - Die letzte Version vom Converter1 ist 1.32, die erste neue Version vom Converter2 ist 2.33.
* - Die Versionsnummer vom Converter2 wurde in dieser Datei weiter gepflegt.
* - Am 23.08.2016 erfolgte die Umstellung auf Converter3 mit FOP 2.1.
* - Die letzte Version von Converter2 ist 2.91, testweise 2.92, die erste Version von Converter3 ist die 3.92.
*
*
* Aufzeichnung der Versionsgeschichte:
*
* - 2.33 - erste neue Version vom Converter2 (Unabh?ngigkeit vom Converter1)
* - 2.50 - Ergebnisse von OptimizeIt eingearbeitet
* - 2.51 - FOP configuration file support (fop/userconfig.xml)
* - ...
* - 2.8x - XMLElement, Transformation mit XSL's aus Ressourcen
* - 2.88 - Umstellung auf Java 1.8
* - 2.89 - neue Methode in ConvTools
* - 2.90 - Umstellung von com.tsn.cts auf com.sta.cts (Januar 2016)
* - 3.92 - Umstellung auf Converter3 mit FOP 2.1
* - 3.101 - Umstellung auf Maven, Patch ToXMLStream wg. Zeilenumbruch nach XML-Header
* - 3.109 - ab hier Verteilung ?ber Maven-Central, erste verwendbare Version 3.110
*
*
* Copyright: Copyright (c) 2001-2023
* Company: >StA-Soft<
* @author StA
* @version 3.119
*/
public final class ConvRunner
{
/**
* Converter-Version.
*/
public static final String VERSION = Converter3VersionHelper.VERSION;
/**
* Converter-Copyright.
*/
public static final String COPYRIGHT = Converter3VersionHelper.COPYRIGHT;
/**
* Converter-Company.
*/
public static final String COMPANY = Converter3VersionHelper.COMPANY;
//===========================================================================
/**
* Name des DTD-Files / der DTD-Datei = Struktur der Quelldatei.
*/
private String myDTDFileName;
/**
* Name der Quelldatei.
*/
private String mySrcFileName;
/**
* Name des XSL-Files bzw. Liste von XSL-File-Namen und Transformations-Codes.
*/
private String myXSLFileNames;
/**
* Tempor?res Verzeichnis incl. Dateiname f?r tempor?re Dateien.
*/
private String myTmpFilePath;
/**
* Pfad incl. Dateiname excl. Extension f?r die Zieldatei(en).
*/
private String myDstFilePath;
/**
* Typ (Extension) der Zieldatei(en).
*/
private String myDstFileType;
//===========================================================================
/**
* Converter-Version ermitteln.
* @return Converter-Version
*/
public static String getVersion()
{
return VERSION;
}
/**
* Copyright ermitteln.
* @return Copyright
*/
public static String getCopyright()
{
return COPYRIGHT;
}
/**
* Company ermitteln.
* @return Company
*/
public static String getCompany()
{
return COMPANY;
}
//===========================================================================
/**
* Standard-Constructor. Es wird reset() aufgerufen.
*/
private ConvRunner()
{
reset();
}
//---------------------------------------------------------------------------
/**
* ConvRunner zur?cksetzen. Diese Methode kann anstelle einer
* Neu-Instantiirung der Klasse verwendet werden, um den Ausgangszustand
* wieder herzustellen, falls der ConvRunner mehrfach verwendet werden soll.
*/
public void reset()
{
myDTDFileName = ".";
mySrcFileName = null;
myTmpFilePath = null;
}
/**
* Name des DTD-Files / der DTD-Datei = Struktur der Quelldatei vorgeben.
* @param aDTDFileName DTD-Dateiname
*/
public void setDTDFileName(String aDTDFileName)
{
myDTDFileName = aDTDFileName;
}
/**
* Name der Quelldatei vorgeben.
* @param aSrcFileName Name der Quelldatei
*/
public void setSrcFileName(String aSrcFileName)
{
mySrcFileName = aSrcFileName;
}
/**
* Name des XSL-Files bzw. Liste von XSL-File-Namen und Transformations-Codes
* vorgeben.
* @param aXSLFileNames Name des XSL-Files bzw. Liste von XSL-File-Namen
* und Transformations-Codes
*/
public void setXSLFileNames(String aXSLFileNames)
{
myXSLFileNames = aXSLFileNames;
}
/**
* Tempor?res Verzeichnis incl. Dateiname f?r tempor?re Dateien vorgeben.
* @param aTmpFilePath Tempor?res Verzeichnis incl. Dateiname f?r tempor?re
* Dateien
*/
public void setTmpFilePath(String aTmpFilePath)
{
myTmpFilePath = aTmpFilePath;
}
/**
* Pfad incl. Dateiname excl. Extension f?r die Zieldatei(en) vorgeben.
* Die Vorgabe f?r tempor?re Dateien wird automatisch gesetzt, falls noch
* nicht erfolgt.
* @param aDstFilePath Pfad incl. Dateiname excl. Extension f?r die
* Zieldatei(en)
*/
public void setDstFilePath(String aDstFilePath)
{
myDstFilePath = aDstFilePath;
if (myTmpFilePath == null)
{
myTmpFilePath = aDstFilePath;
}
}
/**
* Typ (Extension) der Zieldatei(en) vorgeben.
* @param aDstFileType Typ (Extension) der Zieldatei(en)
*/
public void setDstFileType(String aDstFileType)
{
myDstFileType = aDstFileType;
}
/**
* Pfad incl. Dateiname und incl. Extension f?r die Zieldatei(en) vorgeben.
* Es werden die Methoden setDstFilePath und setDstFileType aufgerufen.
* @param aDstFileName Pfad incl. Dateiname und incl. Extension f?r die
* Zieldatei(en)
*/
public void setDstFileName(String aDstFileName)
{
int i = aDstFileName.lastIndexOf(".");
String locDstFilePath = aDstFileName.substring(0, i);
String locDstFileType = aDstFileName.substring(i + 1);
setDstFilePath(locDstFilePath);
setDstFileType(locDstFileType);
}
//---------------------------------------------------------------------------
/**
* Die eigentliche zentrale Converter-Routine. In dieser Routine wird der
* Gesamtvorgang von Konvertierung und Transformation realisiert. Die
* notwendigen Parameter m?ssen vor dem Aufruf dieser Methode mit den
* Set-Methoden vorgegeben werden.
*
* Konvertierung:
*
* Bei der Konvertierung gibt es 2 M?glichkeiten: Entweder wird eine DTD-Datei
* angegeben oder eben nicht. Im 1. Fall (DTD angegeben) erfolgt eine
* Konvertierung der Quelldatei (SrcFileName) nach XML. Im 2. Fall (keine
* DTD-Datei angegeben) wird dieser Schritt ausgelassen und davon ausgegangen,
* da? es sich bei der Quelldatei bereits um eine XML-Datei handelt.
*
* Transformation:
*
* Die Transformation wird nur dann ausgef?hrt, wenn wenigstens eine XSL-Datei
* bzw. ein Transformations-Code vorgegeben wurde.
* @throws Exception falls ein Fehler auftritt
*/
public void runConv() throws Exception
{
if ((myDTDFileName != null) && (myDTDFileName.length() != 0) && (!myDTDFileName.equals(".")))
{
// Initialisierung eines DTD-Parsers, Parsen der DTD und
// Ablage im Speicher.
DTDParser dtdparser = new DTDParser(new File(myDTDFileName), false);
DTD dtd = dtdparser.parse(true);
// Element "Scanner" in der DTD suchen
// Standardwert des Attributs "class" ermitteln (= Scanner-Klassen-Name)
DTDElement e = (DTDElement) dtd.elements.get("Scanner");
DTDAttribute a = (DTDAttribute) e.attributes.get("class");
String aClass = a.defaultValue;
// ermittelte Scanner-Klasse instantiieren und
// mit dem SrcFileName initialisieren
Scanner scanner = (Scanner) Class.forName(aClass).newInstance();
scanner.init(mySrcFileName);
try
{
// Standardwerte der restlichen Attribute des Elements Scanner
// zu einer Hash-Tabelle zusammenfassen und per InitH dem
// Scanner ?bergeben.
Enumeration en = e.attributes.elements();
Hashtable ht = new Hashtable();
while (en.hasMoreElements())
{
DTDAttribute a1 = (DTDAttribute) en.nextElement();
if (!a1.defaultValue.equals("class"))
{
ht.put(a1.name, a1.defaultValue);
}
}
scanner.initH(ht);
// optional: Debug-Modus einschalten
// scanner.setXDebug(true);
// Parser f?r EDI/CSV/XML? initialisieren und parsen
Parser parser = new Parser();
if ((myXSLFileNames != null) && (myXSLFileNames.length() != 0) && (!myXSLFileNames.equals(".")))
{
String aTmpFileType;
/*
if (myDstFileType == "tmp")
{
aTmpFileType = "temp";
}
else
{
*/
aTmpFileType = "tmp";
/*
}
*/
int cnt = parser.convert(dtd, "Root", scanner, myDstFilePath, aTmpFileType);
if (cnt == 0)
{
throw new Exception("Error (ConvRunner.runConv::conv+trans): Error while converting.");
}
// Transformer initialisieren und transformieren
// Idee:
// Wenn XSLFileNames ein Vector ist, dann f?r alle Vector-Elemente (j):
// Trenne FileName nach ";"s auf => ein oder mehrere File-Namen (i)
// Transformiere TMP0 ---(FileName[0])---> TMP1
// Transformiere TMP1 ---(FileName[1])---> TMP2
// usw. ---> TMP(i)
// TMP(i) => DestType[j]
// => F?r jede TMP-Datei kann/k?nnen eine/mehrere Transformationsmenge/n
// angewendet werden
XTransformer transformer = new XTransformer();
String aTmpName;
int i;
for (i = 0; i < cnt; i++)
{
if (i == 0)
{
aTmpName = "";
}
else
{
aTmpName = Integer.toString(i);
}
transformer.mtransform(myDstFilePath + aTmpName + "." + aTmpFileType,
myXSLFileNames,
myDstFilePath + aTmpName + "." + myDstFileType,
true);
}
}
else
{
int cnt = parser.convert(dtd, "Root", scanner, myDstFilePath, myDstFileType);
if (cnt == 0)
{
throw new Exception("Error (ConvRunner.runConv::conv-only): Error while converting.");
}
}
}
finally
{
scanner.done();
}
}
else
{
if ((myXSLFileNames != null) && (myXSLFileNames.length() != 0) && (!myXSLFileNames.equals(".")))
{
XTransformer transformer = new XTransformer();
transformer.mtransform(mySrcFileName, myXSLFileNames, myDstFilePath + "." + myDstFileType, false);
}
else
{
throw new Exception("Error (ConvRunner.runConv::trans-only): Missing XSLFileNames.");
}
}
}
//---------------------------------------------------------------------------
/**
* "Abk?rzung" f?r Konvertierung.
* @param aDTDFileName wie in den Set-Methoden
* @param aSrcFileName wie in den Set-Methoden
* @param aXSLFileNames wie in den Set-Methoden
* @param aTmpFilePath wie in den Set-Methoden
* @param aDstFilePath wie in den Set-Methoden
* @param aDstFileType wie in den Set-Methoden
* @throws Exception wie in runConv()
*/
public static void runConv(String aDTDFileName, String aSrcFileName,
String aXSLFileNames,
String aTmpFilePath,
String aDstFilePath, String aDstFileType)
throws Exception
{
ConvRunner cr = new ConvRunner();
cr.setDTDFileName(aDTDFileName);
cr.setSrcFileName(aSrcFileName);
cr.setXSLFileNames(aXSLFileNames);
cr.setTmpFilePath(aTmpFilePath);
cr.setDstFilePath(aDstFilePath);
cr.setDstFileType(aDstFileType);
cr.runConv();
}
/**
* "Abk?rzung" f?r Konvertierung.
* @param aDTDFileName wie in den Set-Methoden
* @param aSrcFileName wie in den Set-Methoden
* @param aXSLFileNames wie in den Set-Methoden
* @param aTmpFilePath wie in den Set-Methoden
* @param aDstFileName wie in den Set-Methoden
* @throws Exception wie in runConv()
*/
public static void runConv(String aDTDFileName, String aSrcFileName,
String aXSLFileNames,
String aTmpFilePath,
String aDstFileName)
throws Exception
{
ConvRunner cr = new ConvRunner();
cr.setDTDFileName(aDTDFileName);
cr.setSrcFileName(aSrcFileName);
cr.setXSLFileNames(aXSLFileNames);
cr.setTmpFilePath(aTmpFilePath);
cr.setDstFileName(aDstFileName);
cr.runConv();
}
//---------------------------------------------------------------------------
/**
* Main-Methode.
* @param args die Kommandozeilenargumente/Parameter
*/
public static void main(String[] args)
{
MLogEntry mle = new MLogEntry4Text();
mle.setMLogFormat("%msg");
mle.setBreakAfterOutput(true);
MLogger.addMLogEntryTS(mle);
try
{
MLogger.inf("");
MLogger.inf("Converter/Transformer System Version " + VERSION);
MLogger.inf("Copyright (c) " + COPYRIGHT + " " + COMPANY + " (StA)");
MLogger.inf("");
if ((args.length >= 1) && "-err".equals(args[0]))
{
mle.setMaxLevel(MLogEntry.ERROR);
args = Arrays.copyOfRange(args, 1, args.length);
}
else if ((args.length >= 1) && "-wrn".equals(args[0]))
{
mle.setMaxLevel(MLogEntry.WARNING);
args = Arrays.copyOfRange(args, 1, args.length);
}
else if ((args.length >= 1) && "-inf".equals(args[0]))
{
mle.setMaxLevel(MLogEntry.INFO);
args = Arrays.copyOfRange(args, 1, args.length);
}
else if ((args.length >= 1) && "-msg".equals(args[0]))
{
mle.setMaxLevel(MLogEntry.MESSAGE);
args = Arrays.copyOfRange(args, 1, args.length);
}
else if ((args.length >= 1) && "-deb".equals(args[0]))
{
mle.setMaxLevel(MLogEntry.DEBUG);
args = Arrays.copyOfRange(args, 1, args.length);
}
else if ((args.length >= 1) && "-all".equals(args[0]))
{
mle.setMaxLevel(MLogEntry.ALL);
args = Arrays.copyOfRange(args, 1, args.length);
}
if (args.length >= 4)
{
try
{
if (args.length == 4)
{
runConv(args[0], args[1], args[2], null, args[3]);
}
else
{
runConv(args[0], args[1], args[2], null, args[3], args[4]);
}
}
catch (Exception e)
{
MLogger.err("Error (ConvRunner): " + e.getMessage());
}
}
else if ((args.length == 1) && (args[0].equals("-infos")))
{
Hashtable ht = ConvRunnerHelper.getEnvironmentHash();
Enumeration e = ht.keys();
while (e.hasMoreElements())
{
String key = (String) e.nextElement();
if ((key != null) && key.startsWith("version."))
{
Object value = ht.get(key);
if (value instanceof String)
{
MLogger.inf(key + "=" + value);
}
}
}
MLogger.inf("");
MLogger.inf("FOP: " + org.apache.fop.Version.getVersion());
MLogger.inf("");
}
else if ((args.length == 1) && (args[0].equals("-info")))
{
MLogger.inf("Xerces-Version: " + ConvRunnerHelper.getXercesVersion());
MLogger.inf("Xalan-Version: " + ConvRunnerHelper.getXalanVersion());
MLogger.inf("Batik-Version: " + ConvRunnerHelper.getBatikVersion());
MLogger.inf("FOP-Version: " + ConvRunnerHelper.getFOPVersion());
}
else if ((args.length == 1) && (args[0].equals("-xalan")))
{
ConvRunnerHelper.checkEnvironment(null);
MLogger.inf("");
}
else if ((args.length == 2) && (args[0].equals("-parse")))
{
XMLElement.run(args[1]);
}
else
{
if ((args.length != 1) || (!args[0].equals("-help")))
{
MLogger.err("Syntax error.");
MLogger.err("");
}
MLogger.err("Usage:");
MLogger.err("");
MLogger.err(" DTDFileName SrcFileName XSLFileNames DstFilePath DstFileType");
MLogger.err("or");
MLogger.err(" DTDFileName SrcFileName XSLFileNames DstFileName");
MLogger.err("or");
MLogger.err(" -help");
MLogger.err("or");
MLogger.err(" -infos");
MLogger.err("or");
MLogger.err(" -info");
MLogger.err("or");
MLogger.err(" -parse FileName");
MLogger.err("");
MLogger.err(" DTDFileName ..... File name for DTD-File, or . if not used.");
MLogger.err(" SrcFileName ..... File name for Source file, needs to be xml if DTD=.");
MLogger.err(" XSLFileNames ..... ';' separated list of XSL-Files, or . if not used.");
MLogger.err(" DstFilePath ..... Path for Destination-File, incl. Name, excl. Extension.");
MLogger.err(" DstFileType ..... Extension for Destination-File.");
MLogger.err(" DstFileName ..... File name for Destination-File, =Path+Type");
MLogger.err("");
MLogger.err("Special \"XSLFileNames\" (transformation codes):");
MLogger.err("");
MLogger.err(" HXML ... special transformation to autom. build hierarchies");
MLogger.err(" L2H(filename) ... special transformation to build hierarchies desc. by file");
MLogger.err(" FOP ... create PDF from XSL-FO source XML file");
MLogger.err(" PS ... create PS (PostScript) from XSL-FO source XML file");
MLogger.err(" HSSF ... process or create MS-Office (Excel) documents (dep. on file ext.)");
MLogger.err(" BATIK ... render SVG to JPG, TIF or PNG (dep. on file ext.)");
MLogger.err("");
MLogger.err("Parameters for Stylesheets:");
MLogger.err("");
MLogger.err(" XSLFileName(Name=Value)");
MLogger.err(" XSLFileName(Name1=Value1)(Name2=Value2)...");
MLogger.err("");
MLogger.err(" A parameter name have to be an identifier, only letters and numbers are allowed.");
MLogger.err(" Values must not contain ')' and ';', spaces are allowed, norm. used for filenames");
MLogger.err(" or (simple string) stylesheet options.");
MLogger.err("");
MLogger.err("Examples:");
MLogger.err("");
MLogger.err(" mappe1.dtd mappe1.csv mappe1.xsl mappe1 out");
MLogger.err(" mappe1.dtd mappe1.csv mappe1.xsl mappe1.out");
MLogger.err(" . mappe1.xml mappe1.xsl mappe1.out");
MLogger.err(" mappe1.dtd mappe1.csv . mappe1.xml");
MLogger.err("");
MLogger.err("More complex examples:");
MLogger.err("");
MLogger.err(" convert.dtd convert.csv \"L2H(hierarchy_convert.xml)\" convert2.xml");
MLogger.err(" . checkstyle_errors.xml \"checkstyle_frm.xsl;report_frm_htm.xsl\" checkstyle.htm");
MLogger.err(" . checkstyle_errors.xml \"checkstyle_frm.xsl;report_frm_fo.xsl;FOP\" checkstyle.pdf");
MLogger.err(" . energy.svg BATIK energy.png");
MLogger.err(" . hssf.xls HSSF hssf1.xml");
MLogger.err(" . hssf1.xml HSSF hssf1.xls");
MLogger.err("");
}
}
finally
{
MLogger.removeMLogEntryTS(mle);
}
System.exit(0);
}
}