All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.caucho.xsl.Xsl Maven / Gradle / Ivy

There is a newer version: 4.0.66
Show newest version
/*
 * Copyright (c) 1998-2018 Caucho Technology -- all rights reserved
 *
 * This file is part of Resin(R) Open Source
 *
 * Each copy or derived work must preserve the copyright notice and this
 * notice unmodified.
 *
 * Resin Open Source is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * Resin Open Source is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
 * of NON-INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Resin Open Source; if not, write to the
 *
 *   Free Software Foundation, Inc.
 *   59 Temple Place, Suite 330
 *   Boston, MA 02111-1307  USA
 *
 * @author Scott Ferguson
 */

package com.caucho.xsl;

import com.caucho.server.util.CauchoSystem;
import com.caucho.util.ExceptionWrapper;
import com.caucho.vfs.MergePath;
import com.caucho.vfs.Path;
import com.caucho.vfs.ReadStream;
import com.caucho.vfs.Vfs;
import com.caucho.vfs.WriteStream;
import com.caucho.xml.Html;
import com.caucho.xml.Xml;
import com.caucho.xml.XmlParser;
import com.caucho.loader.*;

import org.w3c.dom.Document;

import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import java.util.logging.Logger;

/**
 * Public facade for creating stylesheets.  The Xsl factory
 * creates standard XSL stylesheets.  A Stylesheet object represents
 * a compiled stylesheet.  You'll need to create a Transformer to
 * actually perform any transformations.
 *
 * 
 * import java.io.*;
 * import javax.xml.transform.*;
 * import javax.xml.transform.stream.*;
 * import org.xml.sax.*;
 *
 * import com.caucho.xsl.*;
 *
 * ...
 *
 * TransformerFactory factory = new Xsl();
 * StreamSource xslSource = new StreamSource("mystyle.xsl");
 * Transformer transformer = factory.newTransformer(xslSource);
 *
 * StreamSource xmlSource = new StreamSource("test.xml");
 * StreamResult htmlResult = new StreamResult("test.html");
 *
 * transformer.transform(xmlSource, htmlResult);
 * 
*/ public class Xsl extends AbstractStylesheetFactory { private static final Logger log = Logger.getLogger(Xsl.class.getName()); public Xsl() {} /** * Parses the XSL into a DOM document. * * @param rs the input stream. */ protected Document parseXSL(ReadStream rs) throws TransformerConfigurationException { try { Xml parser = new Xml(); return parser.parseDocument(rs); } catch (Exception e) { throw new XslParseException(e); } } public static void main(String []args) { String xslName = "default.xsl"; String dest = null; String suffix = null; String toc = ""; int i = 0; String conf = CauchoSystem.getResinConfig(); boolean isStrict = true; ArrayList argList = new ArrayList(); ArrayList keyList = new ArrayList(); ArrayList valueList = new ArrayList(); while (i < args.length) { if (args[i].equals("-xsl")) { xslName = args[i + 1]; i += 2; } else if (args[i].equals("-lite") || args[i].equals("-stylescript")) { isStrict = false; i += 1; } else if (args[i].equals("-o")) { dest = args[i + 1]; i += 2; } else if (args[i].equals("-suffix")) { suffix = args[i + 1]; i += 2; } else if (args[i].startsWith("-A")) { argList.add(args[i].substring(2)); i += 1; } else if (args[i].startsWith("-P")) { String v = args[i].substring(2); int p = v.indexOf('='); String key; String value; if (p >= 0) { key = v.substring(0, p); value = v.substring(p + 1); } else { key = v; value = ""; } keyList.add(key); valueList.add(value); i += 1; } else if (args[i].equals("-conf")) { conf = args[i + 1]; i += 2; } else if (args[i].equals("-h") || args[i].equals("-help")) { usage(); return; } else break; } /* Path cfg = CauchoSystem.getResinHome().lookup(conf); if (cfg.exists()) { try { Registry.setRegistry(Registry.parse(cfg)); } catch (IOException e) { } catch (SAXException e) { } } */ Path destDir = null; if (dest != null) destDir = Vfs.lookup(dest); else if (suffix == null) destDir = Vfs.lookup("stdout:"); if (args.length - i > 1 && (dest == null || destDir.isFile()) && suffix == null) { System.err.println("multiple sources require a destination directory"); System.exit(1); } try { MergePath stylePath = new MergePath(); stylePath.addMergePath(Vfs.lookup(xslName).getParent()); stylePath.addMergePath(Vfs.lookup()); stylePath.addMergePath(CauchoSystem.getResinHome().lookup("xsl")); ClassLoader loader = Thread.currentThread().getContextClassLoader(); if (loader instanceof DynamicClassLoader) { DynamicClassLoader dynLoader = (DynamicClassLoader) loader; String resourcePath = dynLoader.getResourcePathSpecificFirst(); stylePath.addClassPath(resourcePath); } // stylePath.addClassPath( /* Path []stylePath = new Path[] { Pwd.lookup(xslName).getParent(), Pwd.lookup(), CauchoSystem.getResinHome().lookup("xsl")}; */ Path []scriptPath = new Path[] { Vfs.lookup(), Vfs.lookup(xslName).getParent(), CauchoSystem.getResinHome().lookup("scripts") }; Path xslPath = stylePath.lookup(xslName); if (xslPath == null) { System.out.println("can't find `" + xslName + "'"); System.exit(1); } AbstractStylesheetFactory xsl; if (isStrict) xsl = new Xsl(); else xsl = new StyleScript(); xsl.setStylePath(stylePath); Templates stylesheet; stylesheet = xsl.newTemplates(xslName); for (; i < args.length; i++) { String name = args[i]; Path xmlPath = Vfs.lookup(name); HashMap argMap = new HashMap(); String []childArgs = new String[argList.size() + 1]; argList.toArray(childArgs); childArgs[childArgs.length - 1] = name; argMap.put("arguments", childArgs); argMap.put("File", Vfs.lookup()); ReadStream is = xmlPath.openRead(); Document doc = null; try { if (isStrict) doc = new Xml().parseDocument(is); else { XmlParser parser = new Html(); parser.setEntitiesAsText(true); doc = parser.parseDocument(is); } } finally { is.close(); } //Document result = xsl.transform(doc, argMap); Document result = null; Path destPath = null; if (dest != null) destPath = Vfs.lookup(dest); else if (suffix != null) destPath = xmlPath.getParent(); else destPath = Vfs.lookup("stdout:"); if (suffix != null) { int p = name.lastIndexOf('.'); if (p == -1) { System.err.println("suffix missing for `" + name + "'"); System.exit(1); } String destName = name.substring(0, p); if (dest == null) { p = destName.lastIndexOf('/'); if (p >= 0) destName = destName.substring(p + 1); } if (! destPath.isFile()) destPath = destPath.lookup(destName + '.' + suffix); else { System.err.println("illegal output combination"); System.exit(1); } } else if (destPath.isDirectory()) destPath = destPath.lookup(name); try { destPath.getParent().mkdirs(); } catch (IOException e) { } WriteStream os = destPath.openWrite(); try { Properties output = stylesheet.getOutputProperties(); String encoding = (String) output.get("encoding"); String mimeType = (String) output.get("mime-type"); String method = (String) output.get("method"); if (encoding == null && (method == null || ! method.equals("html"))) encoding = "UTF-8"; TransformerImpl transformer = (TransformerImpl) stylesheet.newTransformer(); if (encoding != null) os.setEncoding(encoding); transformer.setProperty("caucho.pwd", Vfs.lookup()); for (int j = 0; j < keyList.size(); j++) { String key = (String) keyList.get(j); String value = (String) valueList.get(j); transformer.setParameter(key, value); } transformer.transform(doc, os); } finally { os.close(); } } } catch (Throwable e) { while ((e instanceof ExceptionWrapper) && ((ExceptionWrapper) e).getRootCause() != null) e = ((ExceptionWrapper) e).getRootCause(); e.printStackTrace(); } finally { System.exit(1); } } private static void usage() { System.err.println("xsl [-xsl stylesheet] file1 file2 ..."); System.err.println(" -xsl stylesheet : select a stylesheet"); System.err.println(" -o filename : output filename/directory"); System.err.println(" -suffix suffix : replacement suffix"); System.err.println(" -stylescript : StyleScript"); System.err.println(" -Pkey=value : template parameter"); System.err.println(" -h : this help message"); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy