minchau 2004/02/17 11:09:38 Modified: java/samples/TransformThread TransformThread.java Log: New Apache 2.0 license update. Revision Changes Path 1.2 +321 -359 xml-xalan/java/samples/TransformThread/TransformThread.java Index: TransformThread.java =================================================================== RCS file: /home/cvs/xml-xalan/java/samples/TransformThread/TransformThread.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- TransformThread.java 4 Dec 2003 00:12:29 -0000 1.1 +++ TransformThread.java 17 Feb 2004 19:09:38 -0000 1.2 @@ -1,359 +1,321 @@ -/* - * The Apache Software License, Version 1.1 - * - * - * Copyright (c) 1999-2003 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, - * if any, must include the following acknowledgment: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, - * if and wherever such third-party acknowledgments normally appear. - * - * 4. The names "Xalan" and "Apache Software Foundation" must - * not be used to endorse or promote products derived from this - * software without prior written permission. For written - * permission, please contact [EMAIL PROTECTED] - * - * 5. Products derived from this software may not be called "Apache", - * nor may "Apache" appear in their name, without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation and was - * originally based on software copyright (c) 1999, Lotus - * Development Corporation., http://www.lotus.com. For more - * information on the Apache Software Foundation, please see - * <http://www.apache.org/>. - */ - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Properties; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.Result; -import javax.xml.transform.Source; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMResult; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.sax.SAXResult; -import javax.xml.transform.sax.SAXSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; - -import org.xml.sax.InputSource; -import org.xml.sax.helpers.DefaultHandler; - -/** - * What it does: this sample creates multiple threads - * and runs them. Each thread will be assigned a particular - * stylesheet. Each thread will run multiple transformations on - * various xml files using its own transformer. - * - * Note: the flavors used by the transformations can be - * configured below by changing SOURCE_FLAVOR and - * RESULT_FLAVOR. XSLTC can also be used by changing - * USE_XSLTC. - * - * Description of files included with the sample: - * - * foo0.xsl and foo1.xsl: foo0.xsl is the stylesheet used - * for transformations by thread #0, foo1.xsl is the stylesheet - * used by thread #1. - * - * foo0.xml and foo1.xml: foo0.xml and foo1.xml are the XML - * files used for the first and second transformations done - * by each thread. - * - * Output will go to *.out files in the TransformThread directory. - * - * @author <a href="mailto:[EMAIL PROTECTED]">Richard Cao</a> - */ -public class TransformThread implements Runnable -{ - // Flavors - public final static int STREAM = 0; - public final static int SAX = 1; - public final static int DOM = 2; - public final static String[] flavorNames = - new String[] { "Stream", "SAX", "DOM" }; - - // Configurable options - private static int SOURCE_FLAVOR = STREAM; - // private static int SOURCE_FLAVOR = SAX; - // private static int SOURCE_FLAVOR = DOM; - - private static int RESULT_FLAVOR = STREAM; - // private static int RESULT_FLAVOR = SAX; - // private static int RESULT_FLAVOR = DOM; - - private static boolean USE_XSLTC = false; - // private static boolean useXSLTC = true; - - - // Threads - private final static int NUM_THREADS = 2; - private static TransformThread INSTANCES[] = null; - protected Thread m_thread = null; - - // Number of transformations per thread - private final static int NUM_TRANSFORMATIONS = 2; - - // Files names and extensions - private final static String XML_IN_BASE = "foo"; - private final static String XML_EXT = ".xml"; - private final static String XSL_IN_BASE = "foo"; - private final static String XSL_EXT = ".xsl"; - private final static String FILE_OUT_BASE = "foo_"; - private final static String FILE_OUT_EXT = ".out"; - - // Thread identifier - private int m_thrdNum = -1; - - private InputStream[] m_inStream = null; - - private Source[] m_inSource = null; - private Result[] m_outResult = null; - - // One Transformer per thread since Transformers - // are _NOT_ thread-safe - private Transformer m_transformer = null; - - /** Constructs the TransformThread object - * @param thrdNum a unique identifier for this object - */ - public TransformThread(int thrdNum) - { - m_thrdNum = thrdNum; - - m_inStream = new InputStream[NUM_TRANSFORMATIONS]; - m_inSource = new Source[NUM_TRANSFORMATIONS]; - m_outResult = new Result[NUM_TRANSFORMATIONS]; - - try - { - initSource(); - initResult(); - - // ensure xslSourceURI is a valid URI - final String xslSourceFileName = XSL_IN_BASE + m_thrdNum + XSL_EXT; - final String xslSourceURI = (new File(xslSourceFileName)).toURL().toString(); - StreamSource xslSource = new StreamSource(xslSourceFileName); - xslSource.setSystemId(xslSourceURI); - - // Initialize the tranformer - m_transformer = - TransformerFactory.newInstance().newTransformer(xslSource); - m_thread = new Thread(this); - } - catch (Throwable e) - { - e.printStackTrace(); - System.exit(1); - } - } - - /** Initialize the results (m_outResult) according - * to RESULT_FLAVOR - */ - private void initResult() - { - try - { - for (int i = 0; i < NUM_TRANSFORMATIONS; i++) - { - switch (RESULT_FLAVOR) - { - case STREAM : - OutputStream outStream = - new FileOutputStream(FILE_OUT_BASE + "thread_" - + m_thrdNum + "_transformation_" + i + FILE_OUT_EXT); - - m_outResult[i] = new StreamResult(outStream); - break; - - case SAX : - DefaultHandler defaultHandler = new DefaultHandler(); - m_outResult[i] = new SAXResult(defaultHandler); - break; - - case DOM : - m_outResult[i] = new DOMResult(); - break; - } - } - } - catch (Exception e) - { - e.printStackTrace(); - System.exit(1); - } - } - - /** Initialize the sources (m_inSource) according - * to SOURCE_FLAVOR - */ - private void initSource() - { - try - { - for (int i = 0; i < NUM_TRANSFORMATIONS; i++) - { - // Ensure we get a valid URI - final String sourceXMLURI = (new File(XML_IN_BASE + i + XML_EXT)).toURL().toString(); - - // Open for input - m_inStream[i] = new FileInputStream(XML_IN_BASE + i + XML_EXT); - - switch (SOURCE_FLAVOR) - { - case STREAM : - m_inSource[i] = new StreamSource(m_inStream[i]); - break; - - case SAX : - m_inSource[i] = new SAXSource(new InputSource(m_inStream[i])); - break; - - case DOM : - try - { - DocumentBuilderFactory dfactory = - DocumentBuilderFactory.newInstance(); - - // Must always setNamespaceAware when - // building xsl stylesheets - dfactory.setNamespaceAware(true); - m_inSource[i] = - new DOMSource(dfactory.newDocumentBuilder().parse(m_inStream[i])); - } - catch (Exception e) - { - e.printStackTrace(); - } - break; - } - - if (m_inSource[i] != null) - { - // If we don't do this, the transformer - // won't know how to resolve relative URLs - // in the stylesheet. - m_inSource[i].setSystemId(sourceXMLURI); - } - } - } - catch (Exception e) - { - e.printStackTrace(); - System.exit(1); - } - } - - /** - * @see java.lang.Runnable#run() - */ - public void run() - { - try - { - // Perform multiple transformations with the same - // transformer - for (int i = 0; i < NUM_TRANSFORMATIONS; i++) - { - m_transformer.transform(m_inSource[i], m_outResult[i]); - } - } - catch (Exception e) - { - e.printStackTrace(); - System.exit(1); - } - } - - /** Creates thread instances - */ - private static void initThreads() - { - INSTANCES = new TransformThread[NUM_THREADS]; - - for (int count = 0; count < NUM_THREADS; count++) - { - INSTANCES[count] = new TransformThread(count); - } - } - - /** Sets the appropriate system properties if XSLTC is - * to be used (according to USE_XSLTC) - */ - private static void initSystemProperties() - { - if (USE_XSLTC) - { - // Set the TransformerFactory system property if XSLTC is required - // Note: To make this sample more flexible, load properties from a properties file. - // The setting for the Xalan Transformer is "org.apache.xalan.processor.TransformerFactoryImpl" - String key = "javax.xml.transform.TransformerFactory"; - String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl"; - Properties props = System.getProperties(); - props.put(key, value); - System.setProperties(props); - } - } - - /** - * Usage: - * java TransformThread - */ - public static void main(String argv[]) - { - try - { - initSystemProperties(); - initThreads(); - - for (int count = 0; count < NUM_THREADS; count++) - { - INSTANCES[count].m_thread.start(); - } - } - catch (Throwable e) - { - e.printStackTrace(); - System.exit(1); - } - } -} +/* + * Copyright 1999-2004 The Apache Software Foundation. + * + * 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 + * + * 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. + */ +/* + * $Id$ + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Properties; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.xml.sax.InputSource; +import org.xml.sax.helpers.DefaultHandler; + +/** + * What it does: this sample creates multiple threads + * and runs them. Each thread will be assigned a particular + * stylesheet. Each thread will run multiple transformations on + * various xml files using its own transformer. + * + * Note: the flavors used by the transformations can be + * configured below by changing SOURCE_FLAVOR and + * RESULT_FLAVOR. XSLTC can also be used by changing + * USE_XSLTC. + * + * Description of files included with the sample: + * + * foo0.xsl and foo1.xsl: foo0.xsl is the stylesheet used + * for transformations by thread #0, foo1.xsl is the stylesheet + * used by thread #1. + * + * foo0.xml and foo1.xml: foo0.xml and foo1.xml are the XML + * files used for the first and second transformations done + * by each thread. + * + * Output will go to *.out files in the TransformThread directory. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Richard Cao</a> + */ +public class TransformThread implements Runnable +{ + // Flavors + public final static int STREAM = 0; + public final static int SAX = 1; + public final static int DOM = 2; + public final static String[] flavorNames = + new String[] { "Stream", "SAX", "DOM" }; + + // Configurable options + private static int SOURCE_FLAVOR = STREAM; + // private static int SOURCE_FLAVOR = SAX; + // private static int SOURCE_FLAVOR = DOM; + + private static int RESULT_FLAVOR = STREAM; + // private static int RESULT_FLAVOR = SAX; + // private static int RESULT_FLAVOR = DOM; + + private static boolean USE_XSLTC = false; + // private static boolean useXSLTC = true; + + + // Threads + private final static int NUM_THREADS = 2; + private static TransformThread INSTANCES[] = null; + protected Thread m_thread = null; + + // Number of transformations per thread + private final static int NUM_TRANSFORMATIONS = 2; + + // Files names and extensions + private final static String XML_IN_BASE = "foo"; + private final static String XML_EXT = ".xml"; + private final static String XSL_IN_BASE = "foo"; + private final static String XSL_EXT = ".xsl"; + private final static String FILE_OUT_BASE = "foo_"; + private final static String FILE_OUT_EXT = ".out"; + + // Thread identifier + private int m_thrdNum = -1; + + private InputStream[] m_inStream = null; + + private Source[] m_inSource = null; + private Result[] m_outResult = null; + + // One Transformer per thread since Transformers + // are _NOT_ thread-safe + private Transformer m_transformer = null; + + /** Constructs the TransformThread object + * @param thrdNum a unique identifier for this object + */ + public TransformThread(int thrdNum) + { + m_thrdNum = thrdNum; + + m_inStream = new InputStream[NUM_TRANSFORMATIONS]; + m_inSource = new Source[NUM_TRANSFORMATIONS]; + m_outResult = new Result[NUM_TRANSFORMATIONS]; + + try + { + initSource(); + initResult(); + + // ensure xslSourceURI is a valid URI + final String xslSourceFileName = XSL_IN_BASE + m_thrdNum + XSL_EXT; + final String xslSourceURI = (new File(xslSourceFileName)).toURL().toString(); + StreamSource xslSource = new StreamSource(xslSourceFileName); + xslSource.setSystemId(xslSourceURI); + + // Initialize the tranformer + m_transformer = + TransformerFactory.newInstance().newTransformer(xslSource); + m_thread = new Thread(this); + } + catch (Throwable e) + { + e.printStackTrace(); + System.exit(1); + } + } + + /** Initialize the results (m_outResult) according + * to RESULT_FLAVOR + */ + private void initResult() + { + try + { + for (int i = 0; i < NUM_TRANSFORMATIONS; i++) + { + switch (RESULT_FLAVOR) + { + case STREAM : + OutputStream outStream = + new FileOutputStream(FILE_OUT_BASE + "thread_" + + m_thrdNum + "_transformation_" + i + FILE_OUT_EXT); + + m_outResult[i] = new StreamResult(outStream); + break; + + case SAX : + DefaultHandler defaultHandler = new DefaultHandler(); + m_outResult[i] = new SAXResult(defaultHandler); + break; + + case DOM : + m_outResult[i] = new DOMResult(); + break; + } + } + } + catch (Exception e) + { + e.printStackTrace(); + System.exit(1); + } + } + + /** Initialize the sources (m_inSource) according + * to SOURCE_FLAVOR + */ + private void initSource() + { + try + { + for (int i = 0; i < NUM_TRANSFORMATIONS; i++) + { + // Ensure we get a valid URI + final String sourceXMLURI = (new File(XML_IN_BASE + i + XML_EXT)).toURL().toString(); + + // Open for input + m_inStream[i] = new FileInputStream(XML_IN_BASE + i + XML_EXT); + + switch (SOURCE_FLAVOR) + { + case STREAM : + m_inSource[i] = new StreamSource(m_inStream[i]); + break; + + case SAX : + m_inSource[i] = new SAXSource(new InputSource(m_inStream[i])); + break; + + case DOM : + try + { + DocumentBuilderFactory dfactory = + DocumentBuilderFactory.newInstance(); + + // Must always setNamespaceAware when + // building xsl stylesheets + dfactory.setNamespaceAware(true); + m_inSource[i] = + new DOMSource(dfactory.newDocumentBuilder().parse(m_inStream[i])); + } + catch (Exception e) + { + e.printStackTrace(); + } + break; + } + + if (m_inSource[i] != null) + { + // If we don't do this, the transformer + // won't know how to resolve relative URLs + // in the stylesheet. + m_inSource[i].setSystemId(sourceXMLURI); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + System.exit(1); + } + } + + /** + * @see java.lang.Runnable#run() + */ + public void run() + { + try + { + // Perform multiple transformations with the same + // transformer + for (int i = 0; i < NUM_TRANSFORMATIONS; i++) + { + m_transformer.transform(m_inSource[i], m_outResult[i]); + } + } + catch (Exception e) + { + e.printStackTrace(); + System.exit(1); + } + } + + /** Creates thread instances + */ + private static void initThreads() + { + INSTANCES = new TransformThread[NUM_THREADS]; + + for (int count = 0; count < NUM_THREADS; count++) + { + INSTANCES[count] = new TransformThread(count); + } + } + + /** Sets the appropriate system properties if XSLTC is + * to be used (according to USE_XSLTC) + */ + private static void initSystemProperties() + { + if (USE_XSLTC) + { + // Set the TransformerFactory system property if XSLTC is required + // Note: To make this sample more flexible, load properties from a properties file. + // The setting for the Xalan Transformer is "org.apache.xalan.processor.TransformerFactoryImpl" + String key = "javax.xml.transform.TransformerFactory"; + String value = "org.apache.xalan.xsltc.trax.TransformerFactoryImpl"; + Properties props = System.getProperties(); + props.put(key, value); + System.setProperties(props); + } + } + + /** + * Usage: + * java TransformThread + */ + public static void main(String argv[]) + { + try + { + initSystemProperties(); + initThreads(); + + for (int count = 0; count < NUM_THREADS; count++) + { + INSTANCES[count].m_thread.start(); + } + } + catch (Throwable e) + { + e.printStackTrace(); + System.exit(1); + } + } +}
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
