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: [EMAIL PROTECTED]
  Reviewed by:  [EMAIL PROTECTED]
  
  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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to