mkwan       2003/05/20 07:37:13

  Modified:    java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
                        TransformerFactoryImpl.java
  Log:
  Fix a multithread safety issue in the use-classpath option. The old code
  reuses a Translet object for all newTransformer() calls, which is not the
  right thing to do. We should pass in a Class array and let TemplateImpl
  create a new Translet instance for each newTransformer() call.
  
  Revision  Changes    Path
  1.27      +9 -18     
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.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- TemplatesImpl.java        3 Feb 2003 19:31:12 -0000       1.26
  +++ TemplatesImpl.java        20 May 2003 14:37:13 -0000      1.27
  @@ -102,11 +102,6 @@
       private byte[][] _bytecodes = null;
       
       /**
  -     * The Translet instance from which the template is created.
  -     */
  -    private Translet _translet = null;
  -
  -    /**
        * Contains the translet class definition(s). These are created when 
        * this Templates is created or when it is read back from disk.
        */
  @@ -167,14 +162,15 @@
       }
       
       /**
  -     * Create an XSLTC template object from a Translet instance.
  +     * Create an XSLTC template object from the translet class definition(s).
        */
  -    protected TemplatesImpl(Translet translet, String transletName,
  +    protected TemplatesImpl(Class[] transletClasses, String transletName,
        Properties outputProperties, int indentNumber,
        TransformerFactoryImpl tfactory) 
       {
  -     _translet  = translet;
  +     _class     = transletClasses;
        _name      = transletName;
  +     _transletIndex = 0;
        _outputProperties = outputProperties;
        _indentNumber = indentNumber;
        _tfactory = tfactory;
  @@ -331,7 +327,7 @@
            // The translet needs to keep a reference to all its auxiliary 
            // class to prevent the GC from collecting them
            Translet translet = (Translet) _class[_transletIndex].newInstance();
  -         final int classCount = _bytecodes.length;
  +         final int classCount = _class.length;
            for (int i = 0; i < classCount; i++) {
                if (i != _transletIndex) {
                    translet.addAuxiliaryClass(_class[i]);
  @@ -358,14 +354,9 @@
        throws TransformerConfigurationException 
       {
        TransformerImpl transformer;
  -     if (_translet != null) {
  -         transformer = new TransformerImpl(_translet, _outputProperties,
  -                           _indentNumber, _tfactory);
  -     }
  -     else {
  -         transformer = new TransformerImpl(getTransletInstance(), 
_outputProperties,
  -                           _indentNumber, _tfactory);
  -     }
  +
  +     transformer = new TransformerImpl(getTransletInstance(), 
_outputProperties,
  +         _indentNumber, _tfactory);
        
        if (_uriResolver != null) {
            transformer.setURIResolver(_uriResolver);
  
  
  
  1.62      +2 -3      
xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
  
  Index: TransformerFactoryImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- TransformerFactoryImpl.java       2 Apr 2003 18:23:14 -0000       1.61
  +++ TransformerFactoryImpl.java       20 May 2003 14:37:13 -0000      1.62
  @@ -602,10 +602,9 @@
                
            try {
                final Class clazz = loadTranslet(transletName);
  -             final Translet translet = (Translet)clazz.newInstance();        
            
                resetTransientAttributes();
                    
  -             return new TemplatesImpl(translet, transletName, null, 
_indentNumber, this);
  +             return new TemplatesImpl(new Class[]{clazz}, transletName, 
null, _indentNumber, this);
            }
            catch (ClassNotFoundException cnfe) {
                ErrorMsg err = new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR, 
transletName);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to