blob: 265015529be9c3d588b8cd1b68613f8093b6d9e8 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* 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.
*
*************************************************************/
/*
* the main Class
*
* Command Line arguments are reviewed
* and a Converter is constructed
*/
package com.sun.star.tooling.converter;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import com.sun.star.tooling.DirtyTags.DirtyTagWrapper;
/**
* The main class of the converter tool
*
* The converter tool is command line based.
* Its classes allow the converting between the
* file formats sdf, gsi and <a href="http://www.oasis-open.org/committees/xliff/documents/cs-xliff-core-1.1-20031031.htm">xliff</a>.
*
* Those file formats are used in localization
* of Star-Office and Open-Office.
*
* Information about the whole localization process can be found in
* <a href="http://ded-1.germany.sun.com/webcontent/guidelines/pdf/L10NSO8.pdf">http://ded-1.germany.sun.com/webcontent/guidelines/pdf/L10NSO8.pdf</a>
*
* @author Christian Schmidt 2005
*
*/
public class Convert {
private static Calendar cal;
private static final String EMPTY = "";
/**
* The name of the file containing the debug information
* that where found while converting (every output goes here too)
*/
private static String dbgName = EMPTY;
/**
* the character that separates the extension from the file name
*/
private static final char extensionSeperator = '.';
/**
* the log File
*/
private static File log;
/**
* the name of the log file
*/
private static String logString = EMPTY;
/**
* indicates whether existing sources should be overwritten
* without asking
*/
private static boolean overwrite = false;
/**
* A second Source File needed for GSI Merging
*/
private static File secondSource;
//private static final char pathSeperator = '\\';
/**
* The language that should be the source language
* that means the language to translate from
*/
private static String sourceLanguage = "en-US";
/**
* the name of the source file
*/
private static String sourceName = EMPTY;
/**
* the type of the source file (sdf,xliff,...)
*/
private static String sourceType = EMPTY;
/**
* The time when converting started
*/
private static String startTime = EMPTY;
/**
* The language that should be the target language
* that means the language to translate to
*/
private static String TargetLanguage = EMPTY;
/**
* the name of the target file
*/
private static String targetName = EMPTY;
/**
* the type of the target file (sdf,xliff,...)
*/
private static String targetType = EMPTY;
/**
* Store the current version ID and number of this tool
*/
final static String version = " Prod.20050710:1255 ";
/**
* The name of the (original) sdf file used as second source for gsi->sdf merging
*/
private static String secondSourceName=EMPTY;
/**
* Indicate whether strings in xliff files should
* be wrapped with ept/bpt or sub tags to enable translation tools
* to synchronize source language string with there translation
*
* @see <a href="http://ded-1.germany.sun.com/webcontent/guidelines/pdf/L10NSO8.pdf">http://ded-1.germany.sun.com/webcontent/guidelines/pdf/L10NSO8.pdf</a>
*/
private static boolean doWrap=true;
public static void main(String[] args) throws IOException, Exception {
try{
//go, parse and check the command line parameters
ParameterChecker.checkClParameters(args);
ParameterChecker.createContentOfClParameters();
//Initialize the tagWrapper
DirtyTagWrapper.setWrapping(doWrap);
//create an instance of converter
Converter conv = new Converter(sourceType, sourceName, sourceLanguage,
targetType, targetName, TargetLanguage,secondSourceName, overwrite);
// get aktual time
cal = Calendar.getInstance();
startTime = cal.getTime().toString();
//show infos
printPreamble();
//do the job
conv.convert();
showStatistic();
//close log, debug...
OutputHandler.closeAll();
} catch(Exception e){
System.out.print("An EXCEPTION occured, please check your commad line settings \n"+e.getMessage());
System.exit(-1);
}catch(Throwable t){
System.out.print("A FATAL ERROR occured, please check your commad line settings \n"+t.getMessage());
System.exit(-1);
}
}
/**
* show the command line help
*/
private static void printHelp() {
final String ls = System.getProperty("line.separator");
System.out
.println(
"File Converting Tool 'converter' Version "
+ Convert.version
+ ls
+ "Converts SDF files to wellformed XLIFF or GSI files and vice versa" + ls
+ ls
+ "Use: " + ls
+ "convert [-h]|[SourcePath [TargetPath] [-T Type] [[-S Type [secondSourcePath]] " + ls
+ " [-s LanguageID] [-t LanguageID] [-l [LogPath]] [-o]]" + ls
+ ls
+ "-h show this help." + ls
+ "SourcePath path of the file to convert." + ls
+ "secondSourcePath path of the SDF file to merge to (GSI -> SDF only!)." + ls
+ "TargetPath path where to store the result." + ls
+ "LogPath path of the log file" + ls
+ "-T Type the type of the target file (xliff,sdf,gsi)" + ls
+ "-S Type the type of the source file (xliff,sdf,gsi)" + ls
+ "-s LanguageID the ISO language code of the source language (de, fr...)." + ls
+ " Default is 'en-US' " + ls
+ "-t LanguageID the language code of the target language (de, fr...)." + ls
+ " Default is first found Language other than source language." + ls
+ "-l [LogPath] write a log file, you can name the file." + ls
+ "-o overwrite existing files without asking." + ls
+ "-nw disable the wrapping with ept/bpt tags." + ls
+ ls
+ "The created files were stored in the SourceFile Path if nothing else is given. " + ls
+ "The extension is '.xliff','.sdf' depending on the source file and '.log' " + ls
+ "for the logfile." + ls);
}
/**
* show the parameters the converter starts with
*
* @throws IOException
*/
final private static void printPreamble() throws IOException {
OutputHandler.out(EMPTY);
OutputHandler.out("Source File is: " + sourceName);
OutputHandler.out("Target File is: " + targetName);
if (OutputHandler.doLog) {
OutputHandler.out("Log File is: " + logString);
} else {
OutputHandler.out("Log File is: disabled");
}
OutputHandler.out(EMPTY);
}
/**
* show some statistic data
*
* @throws IOException
*/
final private static void showStatistic() throws IOException {
OutputHandler.dbg(EMPTY);
OutputHandler
.out((targetType.equalsIgnoreCase("xliff") ? "TransUnits written: "
: "Lines written : ")
+ Converter.getLineCounter());
OutputHandler.dbg(EMPTY);
OutputHandler.out("Started at : " + Convert.startTime);
Convert.cal = Calendar.getInstance();
OutputHandler.out("Finished at : " + Convert.cal.getTime());
OutputHandler.dbg(EMPTY);
}
/**
* Get the extensiion of a file name
* (sdf,xliff,gsi)
*
* @param sourceString the file name
* @return the extension
*/
static protected String extractExtension(String sourceString) {
String ext = sourceString.substring(sourceString
.lastIndexOf(Convert.extensionSeperator) + 1);
return ext;
}
// static protected String extractFileName(String sourceString) {
// String sName = EMPTY;
// sName = (sourceString.substring(sourceString
// .lastIndexOf(File.separator) + 1, sourceString
// .lastIndexOf(Convert.extensionSeperator)));
//
// return sName;
// }
//
// static protected String extractPath(String sourceString) {
// String sPath = sourceString.substring(0, sourceString
// .lastIndexOf(File.separator) + 1);
// return sPath;
// }
/**
*
*/
public Convert() {
}
/**
*
* Verify a parameter array and create content useable by the programm
* from the switches and attributes set at command line
*
* @author Christian Schmidt 2005
*/
private static class ParameterChecker {
/**
* Holds the path of the source file
*/
private static String filePath;
/**
* Holds the name of the source file
*/
private static String fileName;
/**
* Create a new Instance of ParameterChecker
*
*
*/
public ParameterChecker(){};
/**
* Checks the command line parameters
*
* @param args the parameters to check and to parse
* @throws IOException
*/
private static void checkClParameters(String[] args) throws IOException {
try {
//show help if no attrributes...
if (args.length == 0) {
printHelp();
System.exit(-1);
}
//...or attribute is -h
if (args[0].equals("-h")) {
printHelp();
System.exit(0);
}
if (args[0].equals("-ver")) {
System.out.println("File Converting Tool Version "+version);
System.exit(0);
}
//source file Location and path is always first attribute
sourceName = new String(args[0]);
File source = new File(sourceName);
//break if there is no source to convert
if (!source.exists())
throw new IOException("ERROR:Can not find Source File '"
+ sourceName + "'. Aborting...");
// String name=source.getName();
// String parent=source.getParent();
// String path=source.getPath();
filePath = (source.getParent()==null)?"":source.getParent()+File.separator; //extractPath(sourceName);
fileName = source.getName().substring(0,source.getName().lastIndexOf(extensionSeperator));
for (int i = 1; i < args.length; i++) {
if ("-s".equals(args[i])) {
if (args.length > i + 1) {
sourceLanguage = args[++i];
} else {
throw new ConverterException(
"missing argument for -s source language");
}
continue;
}
if ("-S".equals(args[i])) {
if (args.length > i + 1) {
sourceType = args[++i];
if (args.length > i +1 &&!args[i+1].startsWith("-")) {
secondSourceName = args[++i];
}
} else {
throw new ConverterException(
"missing argument for -S source type");
}
continue;
}
if ("-T".equals(args[i])) {
if (args.length > i + 1) {
targetType = args[++i];
} else {
throw new ConverterException(
"missing argument for -T target type");
}
continue;
}
if ("-l".equals(args[i])) {
OutputHandler.doLog = true;
if (args.length > i + 1
&& (!args[i + 1].startsWith("-"))) {
logString = args[++i];
} else {
logString = EMPTY;
}
continue;
}
if ("-o".equals(args[i])) {
overwrite = true;
continue;
}
if ("-nw".equals(args[i])) {
doWrap = false;
continue;
}
if ("-h".equals(args[i])) {
printHelp();
System.exit(0);
}
if ("-dbg".equals(args[i])) {
OutputHandler.doDebug = true;
continue;
}
if ("-t".equals(args[i])) {
if (args.length > i + 1) {
TargetLanguage = args[++i];
} else {
throw new ConverterException(
"missing argument for -t target language");
}
continue;
}
if (i == 1 && !args[i].startsWith("-")) { //target file
// found
targetName = args[i];
continue;
}
//if we come here we
//can not match the Attribute
throw new ConverterException("unknown Attribute: "
+ args[i]);
}//end for
} catch (ConverterException e) {
OutputHandler.out("ERROR: "+e.getMessage());
System.exit(-1);
} catch (Throwable t){
System.out.print("An Error occured while parsing the command line,\n please check your commad line settings.\n "+t.getMessage());
System.exit(-1);
}
}//end checkClParameters
/**
* Creates the appropriate content of what ever data
* we found in the command line
*
* @throws IOException
*/
private static void createContentOfClParameters() throws IOException {
try {
if (OutputHandler.doDebug) {
// if the -dbg switch is set, we
// create
// a file that gets all information
// produced by this tool
OutputHandler.dbgFile = new BufferedWriter(new FileWriter(
new File(new String(filePath + fileName + ".dbg"))));
}
if (OutputHandler.doLog) {// create a logfile?
//given at command line?
if (EMPTY.equals(logString) || logString == null) {
logString = new String(filePath + fileName + ".log");
}
log = FileMaker.newFile(logString, overwrite);
OutputHandler.logFile = (new BufferedWriter(new FileWriter(
log)));
}
if (EMPTY.equals(sourceType) || sourceType == null) {
// not given at command line?
if (!(EMPTY.equals(sourceName) || sourceName == null)) {
sourceType = extractExtension(sourceName);
} else {
throw new ConverterException("Source type is missing");
}
}
if(sourceType.equalsIgnoreCase("gsi")){
if(EMPTY.equals(Convert.secondSourceName)){
Convert.secondSourceName=filePath+fileName+".sdf";
}
//secondSource=new File(Convert.secondSourceName);
}
if (EMPTY.equals(sourceName)) {
sourceName = filePath + fileName + "." + sourceType;
}
//no target type given at command line?
if (EMPTY.equals(targetType) || targetType == null) {
if (!(EMPTY.equals(targetName) || targetName == null)) {
targetType = extractExtension(targetName);
} else {
throw new ConverterException("Target type is missing");
}
}
//no target File specified at command line
if (EMPTY.equals(targetName) || targetName == null) {
targetName = filePath + fileName + "." + targetType;
if (targetName.equals(Convert.secondSourceName)){
OutputHandler.out("ERROR: \nSource '"+Convert.secondSourceName+"' and \nTarget'"+targetName+"' are the same");
System.exit(0);
}else if (targetName.equals(Convert.sourceName)){
OutputHandler.out("ERROR: \nSource '"+Convert.sourceName+"' and \nTarget'"+targetName+"' are the same");
System.exit(0);
}
}else if (targetName.equals(Convert.secondSourceName)){
OutputHandler.out("ERROR: \nSource '"+Convert.secondSourceName+"' and \nTarget'"+targetName+"' are the same");
System.exit(0);
}else if (targetName.equals(Convert.sourceName)){
OutputHandler.out("ERROR: \nSource '"+Convert.sourceName+"' and \nTarget'"+targetName+"' are the same");
System.exit(0);
}
} catch (ConverterException e) {
OutputHandler.out(e.getMessage());
}
}
}
}