/** * $Id: $ * $Date: $ * */ package org.xmlsh.commands.internal; import java.util.ArrayList; import java.util.List; import org.xml.sax.SAXException; import org.xmlsh.core.InvalidArgumentException; import org.xmlsh.core.Options; import org.xmlsh.core.Options.OptionValue; import org.xmlsh.core.XCommand; import org.xmlsh.core.XValue; import org.xmlsh.util.Util; import com.thaiopensource.relaxng.edit.SchemaCollection; import com.thaiopensource.relaxng.input.InputFormat; import com.thaiopensource.relaxng.input.MultiInputFormat; import com.thaiopensource.relaxng.output.LocalOutputDirectory; import com.thaiopensource.relaxng.output.OutputDirectory; import com.thaiopensource.relaxng.output.OutputFormat; import com.thaiopensource.relaxng.translate.Formats; import com.thaiopensource.resolver.Resolver; import com.thaiopensource.resolver.catalog.CatalogResolver; import com.thaiopensource.xml.sax.ErrorHandlerImpl; public class rngconvert extends XCommand { private final ErrorHandlerImpl eh = new ErrorHandlerImpl(); private String inputType; private String outputType; private static final String DEFAULT_OUTPUT_ENCODING = "UTF-8"; private static final int DEFAULT_LINE_LENGTH = 72; private static final int DEFAULT_INDENT = 2; @Override public int run(List<XValue> args) throws Exception { List<String> catalogUris = new ArrayList<String>(); String[] inputParamArray = null; String[] outputParamArray = null; Options opts = new Options("C:,I:,O:,i:,o:"); opts.parse(args); if (opts.hasOpt("C")) catalogUris.add(getEnv().getShell().getURL(opts.getOptStringRequired("C")).toString()); inputType = opts.getOptString("I",null); outputType = opts.getOptString("O",null); if( opts.hasOpt("i")){ OptionValue iv = opts.getOpt("i"); inputParamArray = Util.toStringArray(iv.getValues()); } else inputParamArray = new String[0]; if( opts.hasOpt("o")){ OptionValue iv = opts.getOpt("o"); outputParamArray = Util.toStringArray(iv.getValues()); } else outputParamArray = new String[0]; args = opts.getRemainingArgs(); if (inputType == null) { inputType = extension(args.get(0).toString()); if (inputType.length() > 0) inputType = inputType.substring(1); } final InputFormat inputFormat = Formats.createInputFormat(inputType); if (inputFormat == null) throw new InvalidArgumentException("Unrecognized input type: " + inputType ); String ext = extension(args.get(args.size() - 1).toString()); if (outputType == null) { outputType = ext; if (outputType.length() > 0) outputType = outputType.substring(1); } final OutputFormat outputFormat = Formats.createOutputFormat(outputType); if (outputFormat == null) throw new InvalidArgumentException("Unrecognized output type: " + outputType ); Resolver resolver; if (catalogUris.isEmpty()) resolver = null; else { resolver = new CatalogResolver(catalogUris); } outputType = outputType.toLowerCase(); SchemaCollection sc; if (args.size() > 2 ) { if (!(inputFormat instanceof MultiInputFormat)) { throw new InvalidArgumentException("Too many arguments"); } String[] uris = new String[args.size() - 1]; for (int i = 0; i < uris.length; i++) uris[i] = getAbsoluteURI(args.get(i).toString()); sc = ((MultiInputFormat)inputFormat).load(uris, inputParamArray, outputType, eh, resolver); } else sc = inputFormat.load(getAbsoluteURI(args.get(0).toString()), inputParamArray, outputType, eh, resolver); if (ext.length() == 0) ext = outputType; OutputDirectory od = new LocalOutputDirectory(sc.getMainUri(), getFile(args.get(args.size()- 1)), ext, DEFAULT_OUTPUT_ENCODING, DEFAULT_LINE_LENGTH, DEFAULT_INDENT); outputFormat.output(sc, od, outputParamArray, inputType.toLowerCase(), eh); return 0; } private void error(String message) { eh.printException(new SAXException(message)); } static private String extension(String s) { int dot = s.lastIndexOf("."); if (dot < 0) return ""; return s.substring(dot); } } // // //Copyright (C) 2008-2014 David A. Lee. // //The contents of this file are subject to the "Simplified BSD License" (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.opensource.org/licenses/bsd-license.php // //Software distributed under the License is distributed on an "AS IS" basis, //WITHOUT WARRANTY OF ANY KIND, either express or implied. //See the License for the specific language governing rights and limitations under the License. // //The Original Code is: all this file. // //The Initial Developer of the Original Code is David A. Lee // //Portions created by (your name) are Copyright (C) (your legal entity). All Rights Reserved. // //Contributor(s): none. //