001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: Transform.java 468647 2006-10-28 06:59:33Z minchau $ 020 */ 021 022 package org.apache.xalan.xsltc.cmdline; 023 024 import java.io.FileNotFoundException; 025 import java.net.MalformedURLException; 026 import java.net.UnknownHostException; 027 import java.util.Vector; 028 029 import javax.xml.parsers.SAXParser; 030 import javax.xml.parsers.SAXParserFactory; 031 import javax.xml.transform.sax.SAXSource; 032 033 import org.apache.xalan.xsltc.TransletException; 034 import org.apache.xalan.xsltc.compiler.util.ErrorMsg; 035 import org.apache.xalan.xsltc.DOMEnhancedForDTM; 036 import org.apache.xalan.xsltc.dom.XSLTCDTMManager; 037 import org.apache.xalan.xsltc.runtime.AbstractTranslet; 038 import org.apache.xalan.xsltc.runtime.Constants; 039 import org.apache.xalan.xsltc.runtime.Parameter; 040 import org.apache.xalan.xsltc.runtime.output.TransletOutputHandlerFactory; 041 import org.apache.xml.serializer.SerializationHandler; 042 043 import org.xml.sax.InputSource; 044 import org.xml.sax.SAXException; 045 import org.xml.sax.XMLReader; 046 047 import org.apache.xalan.xsltc.StripFilter; 048 import org.apache.xml.dtm.DTMWSFilter; 049 import org.apache.xalan.xsltc.dom.DOMWSFilter; 050 051 /** 052 * @author Jacek Ambroziak 053 * @author Santiago Pericas-Geertsen 054 * @author G. Todd Miller 055 * @author Morten Jorgensen 056 */ 057 final public class Transform { 058 059 private SerializationHandler _handler; 060 061 private String _fileName; 062 private String _className; 063 private String _jarFileSrc; 064 private boolean _isJarFileSpecified = false; 065 private Vector _params = null; 066 private boolean _uri, _debug; 067 private int _iterations; 068 069 public Transform(String className, String fileName, 070 boolean uri, boolean debug, int iterations) { 071 _fileName = fileName; 072 _className = className; 073 _uri = uri; 074 _debug = debug; 075 _iterations = iterations; 076 } 077 078 public String getFileName(){return _fileName;} 079 public String getClassName(){return _className;} 080 081 public void setParameters(Vector params) { 082 _params = params; 083 } 084 085 private void setJarFileInputSrc(boolean flag, String jarFile) { 086 // TODO: at this time we do not do anything with this 087 // information, attempts to add the jarfile to the CLASSPATH 088 // were successful via System.setProperty, but the effects 089 // were not visible to the running JVM. For now we add jarfile 090 // to CLASSPATH in the wrapper script that calls this program. 091 _isJarFileSpecified = flag; 092 // TODO verify jarFile exists... 093 _jarFileSrc = jarFile; 094 } 095 096 private void doTransform() { 097 try { 098 final Class clazz = ObjectFactory.findProviderClass( 099 _className, ObjectFactory.findClassLoader(), true); 100 final AbstractTranslet translet = (AbstractTranslet)clazz.newInstance(); 101 translet.postInitialization(); 102 103 // Create a SAX parser and get the XMLReader object it uses 104 final SAXParserFactory factory = SAXParserFactory.newInstance(); 105 try { 106 factory.setFeature(Constants.NAMESPACE_FEATURE,true); 107 } 108 catch (Exception e) { 109 factory.setNamespaceAware(true); 110 } 111 final SAXParser parser = factory.newSAXParser(); 112 final XMLReader reader = parser.getXMLReader(); 113 114 // Set the DOM's DOM builder as the XMLReader's SAX2 content handler 115 XSLTCDTMManager dtmManager = 116 (XSLTCDTMManager)XSLTCDTMManager.getDTMManagerClass() 117 .newInstance(); 118 119 DTMWSFilter wsfilter; 120 if (translet != null && translet instanceof StripFilter) { 121 wsfilter = new DOMWSFilter(translet); 122 } else { 123 wsfilter = null; 124 } 125 126 final DOMEnhancedForDTM dom = 127 (DOMEnhancedForDTM)dtmManager.getDTM( 128 new SAXSource(reader, new InputSource(_fileName)), 129 false, wsfilter, true, false, translet.hasIdCall()); 130 131 dom.setDocumentURI(_fileName); 132 translet.prepassDocument(dom); 133 134 // Pass global parameters 135 int n = _params.size(); 136 for (int i = 0; i < n; i++) { 137 Parameter param = (Parameter) _params.elementAt(i); 138 translet.addParameter(param._name, param._value); 139 } 140 141 // Transform the document 142 TransletOutputHandlerFactory tohFactory = 143 TransletOutputHandlerFactory.newInstance(); 144 tohFactory.setOutputType(TransletOutputHandlerFactory.STREAM); 145 tohFactory.setEncoding(translet._encoding); 146 tohFactory.setOutputMethod(translet._method); 147 148 if (_iterations == -1) { 149 translet.transform(dom, tohFactory.getSerializationHandler()); 150 } 151 else if (_iterations > 0) { 152 long mm = System.currentTimeMillis(); 153 for (int i = 0; i < _iterations; i++) { 154 translet.transform(dom, 155 tohFactory.getSerializationHandler()); 156 } 157 mm = System.currentTimeMillis() - mm; 158 159 System.err.println("\n<!--"); 160 System.err.println(" transform = " 161 + (((double) mm) / ((double) _iterations)) 162 + " ms"); 163 System.err.println(" throughput = " 164 + (1000.0 / (((double) mm) 165 / ((double) _iterations))) 166 + " tps"); 167 System.err.println("-->"); 168 } 169 } 170 catch (TransletException e) { 171 if (_debug) e.printStackTrace(); 172 System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+ 173 e.getMessage()); 174 } 175 catch (RuntimeException e) { 176 if (_debug) e.printStackTrace(); 177 System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+ 178 e.getMessage()); 179 } 180 catch (FileNotFoundException e) { 181 if (_debug) e.printStackTrace(); 182 ErrorMsg err = new ErrorMsg(ErrorMsg.FILE_NOT_FOUND_ERR, _fileName); 183 System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+ 184 err.toString()); 185 } 186 catch (MalformedURLException e) { 187 if (_debug) e.printStackTrace(); 188 ErrorMsg err = new ErrorMsg(ErrorMsg.INVALID_URI_ERR, _fileName); 189 System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+ 190 err.toString()); 191 } 192 catch (ClassNotFoundException e) { 193 if (_debug) e.printStackTrace(); 194 ErrorMsg err= new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR,_className); 195 System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+ 196 err.toString()); 197 } 198 catch (UnknownHostException e) { 199 if (_debug) e.printStackTrace(); 200 ErrorMsg err = new ErrorMsg(ErrorMsg.INVALID_URI_ERR, _fileName); 201 System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+ 202 err.toString()); 203 } 204 catch (SAXException e) { 205 Exception ex = e.getException(); 206 if (_debug) { 207 if (ex != null) ex.printStackTrace(); 208 e.printStackTrace(); 209 } 210 System.err.print(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)); 211 if (ex != null) 212 System.err.println(ex.getMessage()); 213 else 214 System.err.println(e.getMessage()); 215 } 216 catch (Exception e) { 217 if (_debug) e.printStackTrace(); 218 System.err.println(new ErrorMsg(ErrorMsg.RUNTIME_ERROR_KEY)+ 219 e.getMessage()); 220 } 221 } 222 223 public static void printUsage() { 224 System.err.println(new ErrorMsg(ErrorMsg.TRANSFORM_USAGE_STR)); 225 } 226 227 public static void main(String[] args) { 228 try { 229 if (args.length > 0) { 230 int i; 231 int iterations = -1; 232 boolean uri = false, debug = false; 233 boolean isJarFileSpecified = false; 234 String jarFile = null; 235 236 // Parse options starting with '-' 237 for (i = 0; i < args.length && args[i].charAt(0) == '-'; i++) { 238 if (args[i].equals("-u")) { 239 uri = true; 240 } 241 else if (args[i].equals("-x")) { 242 debug = true; 243 } 244 else if (args[i].equals("-j")) { 245 isJarFileSpecified = true; 246 jarFile = args[++i]; 247 } 248 else if (args[i].equals("-n")) { 249 try { 250 iterations = Integer.parseInt(args[++i]); 251 } 252 catch (NumberFormatException e) { 253 // ignore 254 } 255 } 256 else { 257 printUsage(); 258 } 259 } 260 261 // Enough arguments left ? 262 if (args.length - i < 2) printUsage(); 263 264 // Get document file and class name 265 Transform handler = new Transform(args[i+1], args[i], uri, 266 debug, iterations); 267 handler.setJarFileInputSrc(isJarFileSpecified, jarFile); 268 269 // Parse stylesheet parameters 270 Vector params = new Vector(); 271 for (i += 2; i < args.length; i++) { 272 final int equal = args[i].indexOf('='); 273 if (equal > 0) { 274 final String name = args[i].substring(0, equal); 275 final String value = args[i].substring(equal+1); 276 params.addElement(new Parameter(name, value)); 277 } 278 else { 279 printUsage(); 280 } 281 } 282 283 if (i == args.length) { 284 handler.setParameters(params); 285 handler.doTransform(); 286 } 287 } else { 288 printUsage(); 289 } 290 } 291 catch (Exception e) { 292 e.printStackTrace(); 293 } 294 } 295 }