You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mo...@apache.org on 2001/09/28 16:39:14 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java TransformerImpl.java

morten      01/09/28 07:39:14

  Modified:    java/src/org/apache/xalan/xsltc Translet.java
               java/src/org/apache/xalan/xsltc/cmdline Transform.java
               java/src/org/apache/xalan/xsltc/dom
                        NodeSortRecordFactory.java
               java/src/org/apache/xalan/xsltc/runtime
                        AbstractTranslet.java
               java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
                        TransformerImpl.java
  Log:
  A fix for the problem with loading auxiliary classes for sorting when
  called from TrAX API.
  PR:		n/a
  Obtained from:	n/a
  Submitted by:	morten@xml.apache.org
  Reviewed by:	morten@xml.apache.org
  
  Revision  Changes    Path
  1.3       +3 -1      xml-xalan/java/src/org/apache/xalan/xsltc/Translet.java
  
  Index: Translet.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/Translet.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Translet.java	2001/07/19 13:16:17	1.2
  +++ Translet.java	2001/09/28 14:39:14	1.3
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Translet.java,v 1.2 2001/07/19 13:16:17 morten Exp $
  + * @(#)$Id: Translet.java,v 1.3 2001/09/28 14:39:14 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -78,4 +78,6 @@
       public void buildKeys(DOM document, NodeIterator iterator,
   			  TransletOutputHandler handler, int root)
   	throws TransletException;
  +    public void addAuxiliaryClass(Class auxClass);
  +    public Class getAuxiliaryClass(String className);
   }
  
  
  
  1.9       +5 -3      xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java
  
  Index: Transform.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- Transform.java	2001/09/20 16:49:10	1.8
  +++ Transform.java	2001/09/28 14:39:14	1.9
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Transform.java,v 1.8 2001/09/20 16:49:10 morten Exp $
  + * @(#)$Id: Transform.java,v 1.9 2001/09/28 14:39:14 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -145,7 +145,7 @@
   
   	    // Set the DOM's DOM builder as the XMLReader's SAX2 content handler
   	    final DOMImpl dom = new DOMImpl();
  -	    final DOMBuilder builder = dom.getBuilder();
  +	    DOMBuilder builder = dom.getBuilder();
   	    reader.setContentHandler(builder);
   
   	    try {
  @@ -166,7 +166,9 @@
   		reader.parse(_fileName);
   	    else
   		reader.parse("file:"+(new File(_fileName).getAbsolutePath()));
  -	    
  +
  +	    builder = null;
  +
   	    // Set size of key/id indices
   	    _translet.setIndexSize(dom.getSize());
   	    // If there are any elements with ID attributes, build an index
  
  
  
  1.4       +4 -3      xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecordFactory.java
  
  Index: NodeSortRecordFactory.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecordFactory.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- NodeSortRecordFactory.java	2001/08/17 13:17:45	1.3
  +++ NodeSortRecordFactory.java	2001/09/28 14:39:14	1.4
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: NodeSortRecordFactory.java,v 1.3 2001/08/17 13:17:45 morten Exp $
  + * @(#)$Id: NodeSortRecordFactory.java,v 1.4 2001/09/28 14:39:14 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -71,8 +71,8 @@
   
   public class NodeSortRecordFactory {
       private final DOM      _dom;
  -    private final Class    _class;
       private final String   _className;
  +    private Class _class;
   
       private final AbstractTranslet _translet;
   
  @@ -88,7 +88,8 @@
   	try {
   	    _dom = dom;
   	    _className = className;
  -	    _class = Class.forName(className);
  +	    _class = translet.getAuxiliaryClass(className);
  +	    if (_class == null)	_class = Class.forName(className);
   	    _translet = (AbstractTranslet)translet;
   	}
   	catch (ClassNotFoundException e) {
  
  
  
  1.25      +12 -1     xml-xalan/java/src/org/apache/xalan/xsltc/runtime/AbstractTranslet.java
  
  Index: AbstractTranslet.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/AbstractTranslet.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- AbstractTranslet.java	2001/09/25 20:06:33	1.24
  +++ AbstractTranslet.java	2001/09/28 14:39:14	1.25
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: AbstractTranslet.java,v 1.24 2001/09/25 20:06:33 morten Exp $
  + * @(#)$Id: AbstractTranslet.java,v 1.25 2001/09/28 14:39:14 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -600,4 +600,15 @@
   	}
       }
   
  +    private Hashtable _auxClasses = null;
  +
  +    public void addAuxiliaryClass(Class auxClass) {
  +	if (_auxClasses == null) _auxClasses = new Hashtable();
  +	_auxClasses.put(auxClass.getName(), auxClass);
  +    }
  +
  +    public Class getAuxiliaryClass(String className) {
  +	if (_auxClasses == null) return null;
  +	return((Class)_auxClasses.get(className));
  +    }
   }
  
  
  
  1.6       +61 -28    xml-xalan/java/src/org/apache/xalan/xsltc/trax/TemplatesImpl.java
  
  Index: TemplatesImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TemplatesImpl.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TemplatesImpl.java	2001/08/21 09:04:28	1.5
  +++ TemplatesImpl.java	2001/09/28 14:39:14	1.6
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TemplatesImpl.java,v 1.5 2001/08/21 09:04:28 morten Exp $
  + * @(#)$Id: TemplatesImpl.java,v 1.6 2001/09/28 14:39:14 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -64,6 +64,9 @@
   package org.apache.xalan.xsltc.trax;
   
   import java.io.Serializable;
  +import java.util.Properties;
  +import java.security.AccessController;
  +import java.security.PrivilegedAction;
   
   import javax.xml.transform.*;
   
  @@ -71,10 +74,9 @@
   import org.apache.xalan.xsltc.compiler.*;
   import org.apache.xalan.xsltc.runtime.*;
   
  -import java.util.Properties;
   
   public final class TemplatesImpl implements Templates, Serializable {
  -    
  +
       // Contains the name of the main translet class
       private String   _transletName = null;
   
  @@ -84,8 +86,14 @@
   
       // This error could occur when a compilation inside the TransformerFactory
       // failed and when a template has been loaded from stable storage.
  -    private final static String TRANSLET_ERR_MSG =
  +    private final static String NO_TRANSLET_CODE =
   	"This template does not contain a valid translet class definition.";
  +    private final static String NO_MAIN_TRANSLET =
  +	"This template does not contain a class with the name ";
  +    private final static String TRANSLET_CLASS_ERR =
  +	"Could not load the translet class ";
  +    private final static String TRANSLET_OBJECT_ERR =
  +	"Translet class loaded, but unable to create translet instance.";
       
       // Our own private class loader - builds Class definitions from bytecodes
       private class TransletClassLoader extends ClassLoader {
  @@ -137,23 +145,58 @@
        * Defines the translet class and auxiliary classes.
        * Returns a reference to the Class object that defines the main class
        */
  -    private Class defineTransletClasses() {
  -	if (_bytecodes == null) return null;
  +    private Translet defineTransletClasses()
  +	throws TransformerConfigurationException {
   
  -	TransletClassLoader loader = new TransletClassLoader();
  +	if (_bytecodes == null)
  +	    throw new TransformerConfigurationException(NO_TRANSLET_CODE);
   
  +	TransletClassLoader loader = 
  +	    (TransletClassLoader) AccessController.doPrivileged(
  +		new PrivilegedAction() {
  +			public Object run() {
  +			    return new TransletClassLoader();
  +			}
  +		    }
  +		);
  +
   	try {
  -	    Class transletClass = null;
  +	    int transletIndex = -1;
   	    final int classCount = _bytecodes.length;
  +	    Class[] clazz = new Class[classCount];
  +
   	    for (int i = 0; i < classCount; i++) {
  -		Class clazz = loader.defineClass(_bytecodes[i]);
  -		if (clazz.getName().equals(_transletName))
  -		    transletClass = clazz;
  +		clazz[i] = loader.defineClass(_bytecodes[i]);
  +		if (clazz[i].getName().equals(_transletName)) transletIndex = i;
   	    }
  -	    return transletClass; // Could still be 'null'
  +
  +	    if (transletIndex < 0)
  +		throw new TransformerConfigurationException(NO_MAIN_TRANSLET+
  +							    _transletName);
  +
  +	    Translet translet = (Translet)clazz[transletIndex].newInstance();
  +	    for (int i = 0; i < classCount; i++) {
  +		if (i != transletIndex)
  +		    translet.addAuxiliaryClass(clazz[i]);
  +	    }
  +	    return translet;
  +	}
  +
  +	catch (ClassFormatError e)       {
  +	    throw new TransformerConfigurationException(TRANSLET_CLASS_ERR+
  +							_transletName);
  +	}
  +	catch (LinkageError e)           {
  +	    throw new TransformerConfigurationException(TRANSLET_OBJECT_ERR+
  +							_transletName);
  +	}
  +	catch (InstantiationException e) {
  +	    throw new TransformerConfigurationException(TRANSLET_OBJECT_ERR+
  +							_transletName);
   	}
  -	catch (ClassFormatError e) {
  -	    return null;
  +	catch (IllegalAccessException e) {
  +	    throw new TransformerConfigurationException(TRANSLET_OBJECT_ERR+
  +							_transletName);
   	}
       }
   
  @@ -162,7 +205,8 @@
        * wrapped inside this Template. The translet instance will later
        * be wrapped inside a Transformer object.
        */
  -    private Translet getTransletInstance() {
  +    private Translet getTransletInstance()
  +	throws TransformerConfigurationException {
   	if (_transletName == null) return null;
   
   	// First assume that the JVM already had the class definition
  @@ -177,14 +221,7 @@
   	catch (IllegalAccessException e) { }
   
   	// Create the class definition from the bytecodes if failed
  -	try {
  -	    Class transletClass = defineTransletClasses();
  -	    if (transletClass == null) return null;
  -	    return((Translet)transletClass.newInstance());
  -	}
  -	catch (LinkageError e) { return(null); }
  -	catch (InstantiationException e) { return(null); }
  -	catch (IllegalAccessException e) { return(null); }
  +	return((Translet)defineTransletClasses());
       }
   
       /**
  @@ -194,11 +231,7 @@
        */
       public Transformer newTransformer()
   	throws TransformerConfigurationException {
  -	Translet translet = getTransletInstance();
  -	if (translet == null)
  -	    throw new TransformerConfigurationException(TRANSLET_ERR_MSG);
  -	TransformerImpl transformer = new TransformerImpl(translet);
  -        return(transformer);
  +        return(new TransformerImpl(getTransletInstance()));
       }
   
       /**
  
  
  
  1.15      +21 -6     xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java
  
  Index: TransformerImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- TransformerImpl.java	2001/08/21 09:04:28	1.14
  +++ TransformerImpl.java	2001/09/28 14:39:14	1.15
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: TransformerImpl.java,v 1.14 2001/08/21 09:04:28 morten Exp $
  + * @(#)$Id: TransformerImpl.java,v 1.15 2001/09/28 14:39:14 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -82,6 +82,7 @@
   import java.util.Enumeration;
   import java.util.StringTokenizer;
   
  +import org.xml.sax.SAXException;
   import org.xml.sax.XMLReader;
   import org.xml.sax.ContentHandler;
   import org.xml.sax.InputSource;
  @@ -276,7 +277,8 @@
   
   	    // Create an internal DOM (not W3C) and get SAX2 input handler
   	    final DOMImpl dom = new DOMImpl();
  -	    final ContentHandler inputHandler = dom.getBuilder();
  +	    DOMBuilder builder = dom.getBuilder();
  +	    String prop = "http://xml.org/sax/properties/lexical-handler";
   
   	    // Create a DTDMonitor that will trace all unparsed entity URIs
   	    final DTDMonitor dtdMonitor = new DTDMonitor();
  @@ -289,7 +291,13 @@
   		final InputSource input  = sax.getInputSource();
   		final String      systemId = sax.getSystemId();
   		dtdMonitor.handleDTD(reader);
  -		reader.setContentHandler(inputHandler);
  +		reader.setContentHandler(builder);
  +		try {
  +		    reader.setProperty(prop, builder);
  +		}
  +		catch (SAXException e) {
  +		    // quitely ignored
  +		}
   		reader.parse(input);
   		dom.setDocumentURI(systemId);
   	    }
  @@ -301,7 +309,7 @@
   		final InputSource input = null; 
   		final String      systemId = domsrc.getSystemId(); 
   		dtdMonitor.handleDTD(dom2sax);
  -		dom2sax.setContentHandler(inputHandler);
  +		dom2sax.setContentHandler(builder);
   		dom2sax.parse(input); // need this parameter?
   		dom.setDocumentURI(systemId);
   	    }
  @@ -319,8 +327,13 @@
   		final Reader streamReader = stream.getReader();
   		final String systemId = stream.getSystemId();
   
  -		reader.setContentHandler(inputHandler);
  -		
  +		reader.setContentHandler(builder);
  +		try {
  +		    reader.setProperty(prop, builder);
  +		}
  +		catch (SAXException e) {
  +		    // quitely ignored
  +		}
   		InputSource input;
   		if (streamInput != null)
   		    input = new InputSource(streamInput);
  @@ -336,6 +349,7 @@
   	    else {
   		return null;
   	    }
  +            builder = null;
   
   	    // Set size of key/id indices
   	    _translet.setIndexSize(dom.getSize());
  @@ -390,6 +404,7 @@
   	    _translet.transform(dom, handler);
   	}
   	catch (TransletException e) {
  +	    e.printStackTrace();
   	    if (_errorListener != null)
   		postErrorToListener(e.getMessage());
   	    throw new TransformerException(e);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org