blob: a6334f8ebc91908746f15e2153a0db1617c3692e [file] [log] [blame]
/************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* Copyright 2008, 2010 Oracle and/or its affiliates. All rights reserved.
*
* Use is subject to license terms.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0. You can also
* obtain a copy of the License at http://odftoolkit.org/docs/license.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*
************************************************************************/
package org.odftoolkit.odfxsltrunner;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
/**
* This application applies an XSLT style sheet to an ODF file. To run this application from the command line without Ant, try:
* java -jar "[path/]odfxsltrunner.jar".
*/
public class Main {
private static final String VERSION="1.1.0";
/** Creates a new instance of Main */
public Main() {
}
/**
* @param aArgs the command line arguments
*/
public static void main(String[] aArgs) {
String aStyleSheetName = null;
String aInputName = null;
String aOutputName = null;
String aPath = "content.xml";
String aLogFileName = null;
String aTransformerFactoryClass = null;
int aInputMode = ODFXSLTRunner.INPUT_MODE_PACKAGE;
int aOutputMode = ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE;
Vector<XSLTParameter> aParams = null;
Vector<String> aExtractFileNames = null;
int nLogLevel = CommandLineLogger.ERROR;
boolean bCommandLineValid = true;
List<String> aArgList = Arrays.asList(aArgs);
Iterator<String> aArgIter = aArgList.iterator();
while( aArgIter.hasNext() && bCommandLineValid )
{
String aArg = aArgIter.next();
if( aArg.equals("-f") )
{
if( aArgIter.hasNext() )
aTransformerFactoryClass = aArgIter.next();
else
bCommandLineValid = false;
}
else if( aArg.equals("-i") )
{
aInputMode = ODFXSLTRunner.INPUT_MODE_FILE;
}
else if( aArg.equals("-l") )
{
if( aArgIter.hasNext() )
aLogFileName = aArgIter.next();
else
bCommandLineValid = false;
}
else if( aArg.equals("-o") )
{
if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE )
aOutputMode = ODFXSLTRunner.OUTPUT_MODE_FILE;
else
bCommandLineValid = false;
}
else if( aArg.equals("-p") )
{
if( aArgIter.hasNext() )
aPath = aArgIter.next();
else
bCommandLineValid = false;
}
else if( aArg.equals("-r") )
{
if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE )
aOutputMode = ODFXSLTRunner.OUTPUT_MODE_REPLACE_INPUT_PACKAGE;
else
bCommandLineValid = false;
}
else if( aArg.equals("-t") )
{
if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE )
aOutputMode = ODFXSLTRunner.OUTPUT_MODE_TEMPLATE_PACKAGE;
else
bCommandLineValid = false;
}
else if( aArg.equals("-v") )
{
nLogLevel = CommandLineLogger.INFO;
}
else if( aArg.equals("-x") )
{
if( aArgIter.hasNext() )
{
if( aExtractFileNames == null )
aExtractFileNames = new Vector<String>();
aExtractFileNames.add( aArgIter.next() );
}
else
bCommandLineValid = false;
}
else if( aArg.startsWith("-") )
{
System.out.print(aArg);
System.out.println(": unknown option, use '-' for help");
bCommandLineValid = false;
break;
}
else if( aStyleSheetName == null )
{
aStyleSheetName = aArg;
}
else if( aInputName == null )
{
aInputName = aArg;
}
else if( aOutputMode != ODFXSLTRunner.OUTPUT_MODE_REPLACE_INPUT_PACKAGE && aOutputName == null )
{
aOutputName = aArg;
}
else if( aArg.indexOf('=') != -1 )
{
if( aParams == null )
aParams = new Vector<XSLTParameter>();
aParams.add(new XSLTCommandLineParameter(aArg) );
}
else
{
bCommandLineValid = false;
break;
}
}
if( aOutputMode == ODFXSLTRunner.OUTPUT_MODE_COPY_INPUT_PACKAGE &&
aOutputName == null )
aOutputMode = ODFXSLTRunner.OUTPUT_MODE_STDOUT;
// check usage
bCommandLineValid = aInputName != null && aStyleSheetName != null;
bCommandLineValid = bCommandLineValid &&
!(aOutputMode == ODFXSLTRunner.OUTPUT_MODE_REPLACE_INPUT_PACKAGE || aOutputMode == ODFXSLTRunner.OUTPUT_MODE_STDOUT) == (aOutputName != null);
// print help
if( !bCommandLineValid )
{
printUsage();
return;
}
PrintStream aLogStream = null;
if( aLogFileName != null )
{
try
{
aLogStream = new PrintStream( aLogFileName );
}
catch( FileNotFoundException e )
{
System.err.println(e.getMessage());
}
}
boolean bError = false;
try
{
ODFXSLTRunner aRunner = new ODFXSLTRunner();
Logger aLogger = new CommandLineLogger( aLogStream!=null ? aLogStream : System.err, nLogLevel );
bError = aRunner.runXSLT( aStyleSheetName, aParams, aInputName, aInputMode, aOutputName, aOutputMode, aPath, aTransformerFactoryClass, aExtractFileNames, aLogger );
}
catch( Exception e )
{
System.err.println(e.getMessage());
}
// if( bError )
// System.err.println("transformation failed");
if( aLogStream != null )
aLogStream.close();
}
private static void printUsage()
{
System.out.print("odfxsltrunner v");
System.out.println( VERSION );
System.out.println();
System.out.println( "usage: odfxsltrunner <style sheet> [-v] [-f <factory>] [-p <path in package>] [-l log file] [-t] <input package> <output package> {<param>=<value>}");
System.out.println( " odfxsltrunner <style sheet> [-v] [-f <factory>] [-p <path in package>] [-l log file] -r <package> {<param>=<value>}");
System.out.println( " odfxsltrunner <style sheet> [-v] [-f <factory>] {-x <export path>} [-p <path in package>] [-l log file] -o <input package> <output file> {<param>=<value>}");
System.out.println( " odfxsltrunner <style sheet> [-v] [-f <factory>] [-p <path in package>] [-l log file] -i <input file> <output package> {<param>=<value>}");
System.out.println();
System.out.println( "If no option except -p is specified, the transformation <style sheet> is applied to the file <path in package> contained in the ODF package <input package>, <path in package> is replaced with the result of the transformation, and the full package is stored as <output package>." );
System.out.println();
System.out.println( "-t: Store result of transformation in the file <path in package> of existing an existing ODF package <output package>" );
System.out.println( "-r: Don't store result as a new ODF package but replace input ODF package <package>" );
System.out.println( "-i: Input file <input file> is a plain XML file" );
System.out.println( "-o: Store result of tranformation as plain XML file in <output file>" );
System.out.println();
System.out.println( "-l: Write messages into file <log file> instead of stderr" );
System.out.println( "-p: Apply style sheet to <path in package>; default is content.xml" );
System.out.println( "-f: Use XSLT Transformer factory <factory>" );
System.out.println();
System.out.println( "-x: Extract specified file or directory <export path> from ODF package <input package> to the directory of the <output file>; this option may be specified multiple times" );
System.out.println( "-v: Verbose output" );
System.out.println();
System.out.println( "<param>=<value>: Specifies an parameter/value pair that is passed to the XSL transformation; multiple paramater/vlaue pairs may be specified" );
}
}