mkwan       2003/04/01 13:28:39

  Modified:    java/src/org/apache/xalan/xsltc/runtime
                        AbstractTranslet.java AttributeList.java
                        BasisLibrary.java Constants.java
                        StringValueHandler.java
  Removed:     java/src/org/apache/xalan/xsltc/runtime
                        DefaultSAXOutputHandler.java SAXAdapter.java
                        TextOutput.java TransletOutputBase.java
  Log:
  Merging XSLTC_DTM and common serializer to the head
  
  Changes in org.apache.xalan.xsltc.runtime.
  
  Revision  Changes    Path
  1.47      +131 -76   
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.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- AbstractTranslet.java     30 Jan 2003 18:46:12 -0000      1.46
  +++ AbstractTranslet.java     1 Apr 2003 21:28:38 -0000       1.47
  @@ -70,18 +70,18 @@
   import java.text.DecimalFormatSymbols;
   import java.util.ArrayList;
   import java.util.Enumeration;
  +import java.util.Vector;
   
   import org.apache.xalan.xsltc.DOM;
   import org.apache.xalan.xsltc.DOMCache;
  -import org.apache.xalan.xsltc.NodeIterator;
   import org.apache.xalan.xsltc.Translet;
   import org.apache.xalan.xsltc.TransletException;
  -import org.apache.xalan.xsltc.TransletOutputHandler;
   import org.apache.xalan.xsltc.dom.DOMAdapter;
  -import org.apache.xalan.xsltc.dom.DOMImpl;
  -import org.apache.xalan.xsltc.dom.DTDMonitor;
   import org.apache.xalan.xsltc.dom.KeyIndex;
  +import org.apache.xalan.xsltc.dom.SAXImpl;
   import org.apache.xalan.xsltc.runtime.output.TransletOutputHandlerFactory;
  +import org.apache.xml.dtm.DTMAxisIterator;
  +import org.apache.xml.serializer.SerializationHandler;
   
   public abstract class AbstractTranslet implements Translet {
   
  @@ -96,11 +96,14 @@
       public String  _doctypeSystem = null;
       public boolean _indent = false;
       public String  _mediaType = null;
  -    public Hashtable _cdata = null;
  +    public Vector _cdata = null;
   
       // DOM/translet handshaking - the arrays are set by the compiled translet
       protected String[] namesArray;
       protected String[] namespaceArray;
  +    
  +    // Boolean flag to indicate whether this translet has id functions.
  +    protected boolean _hasIdCall = false;
   
       // TODO - these should only be instanciated when needed
       protected StringValueHandler stringValueHandler = new 
StringValueHandler();
  @@ -108,6 +111,9 @@
       // Use one empty string instead of constantly instanciating String("");
       private final static String EMPTYSTRING = "";
   
  +    // This is the name of the index used for ID attributes
  +    private final static String ID_INDEX_NAME = "##id";
  +
       
       /************************************************************************
        * Debugging
  @@ -131,10 +137,7 @@
        */
       public final DOMAdapter makeDOMAdapter(DOM dom)
        throws TransletException {
  -     if (dom instanceof DOMImpl)
  -         return new DOMAdapter((DOMImpl)dom, namesArray, namespaceArray);
  -     BasisLibrary.runTimeError(BasisLibrary.DOM_ADAPTER_INIT_ERR);
  -     return null;
  +     return new DOMAdapter(dom, namesArray, namespaceArray);
       }
   
       /************************************************************************
  @@ -296,56 +299,60 @@
        return(null);
       }
   
  -    /************************************************************************
  -     * Unparsed entity URI handling - implements unparsed-entity-uri()
  -     
************************************************************************/
  -
  -    // Keeps all unparsed entity URIs specified in the XML input
  -    public Hashtable _unparsedEntities = null;
  -
  -    /**
  -     * Get the value of an unparsed entity URI.
  -     * This method is used by the compiler/UnparsedEntityUriCall class.
  -     */
  -    public final String getUnparsedEntity(String name) {
  -     final String uri = (String)_unparsedEntities.get(name);
  -     return uri == null ? EMPTYSTRING : uri;
  -    }
  -
  -    /**
  -     * Add an unparsed entity URI. The URI/value pairs are passed from the
  -     * DOM builder to the translet.
  -     */
  -    public final void addUnparsedEntity(String name, String uri) {
  -     if (_unparsedEntities == null)
  -         _unparsedEntities = new Hashtable();
  -     if (_unparsedEntities.containsKey(name) == false)
  -         _unparsedEntities.put(name, uri);
  -    }
  -    
       /**
  -     * Add an unparsed entity URI. The URI/value pairs are passed from the
  -     * DOM builder to the translet.
  -     */
  -    public final void setUnparsedEntityURIs(Hashtable table) {
  -     if (_unparsedEntities == null)
  -         _unparsedEntities = table;
  -     else {
  -         Enumeration keys = table.keys();
  -         while (keys.hasMoreElements()) {
  -             String name = (String)keys.nextElement();
  -             _unparsedEntities.put(name,table.get(name));
  -         }
  -     }
  +     * Give the translet an opportunity to perform a prepass on the document
  +     * to extract any information that it can store in an optimized form.
  +     *
  +     * Currently, it only extracts information about attributes of type ID.
  +     */
  +    public final void prepassDocument(DOM document) {
  +        setIndexSize(document.getSize());
  +        buildIDIndex(document);
       }
   
       /**
  -     * The DTD monitor used by the DOM builder scans the input document DTD
  -     * for unparsed entity URIs. These are passed to the translet using
  -     * this method.
  -     */
  -    public final void setDTDMonitor(DTDMonitor monitor) {
  -     setUnparsedEntityURIs(monitor.getUnparsedEntityURIs());
  +     * Leverages the Key Class to implement the XSLT id() function.
  +     * buildIdIndex creates the index (##id) that Key Class uses.
  +     * The index contains the element node index (int) and Id value (String).
  +     */
  +    private final void buildIDIndex(DOM document) {
  +        
  +        if (document instanceof SAXImpl) {
  +            SAXImpl saxImpl = (SAXImpl)document;
  +            
  +            // If the input source is DOMSource, the KeyIndex table is not
  +            // built at this time. It will be built later by the lookupId()
  +            // and containsId() methods of the KeyIndex class.
  +            if (saxImpl.hasDOMSource()) {
  +                buildKeyIndex(ID_INDEX_NAME, document);
  +                return;
  +            }
  +            else {
  +                final Hashtable elementsByID = saxImpl.getElementsWithIDs();
  +
  +                if (elementsByID == null) {
  +                 return;
  +                }
  +
  +                // Given a Hashtable of DTM nodes indexed by ID attribute 
values,
  +                // loop through the table copying information to a KeyIndex
  +                // for the mapping from ID attribute value to DTM node
  +                final Enumeration idValues = elementsByID.keys();
  +                boolean hasIDValues = false;
  +
  +                while (idValues.hasMoreElements()) {
  +                 final Object idValue = idValues.nextElement();
  +                 final int element = 
((Integer)elementsByID.get(idValue)).intValue();
  +
  +                 buildKeyIndex(ID_INDEX_NAME, element, idValue);
  +                 hasIDValues = true;
  +                }
  +
  +                if (hasIDValues) {
  +                 setKeyIndexDom(ID_INDEX_NAME, document);
  +                }
  +            }
  +        }
       }
   
       /************************************************************************
  @@ -389,6 +396,21 @@
       }
   
       /**
  +     * Create an empty KeyIndex in the DOM case
  +     *   @name is the name of the index (the key or ##id)
  +     *   @node is the DOM
  +     */
  +    public void buildKeyIndex(String name, DOM dom) {
  +     if (_keyIndexes == null) _keyIndexes = new Hashtable();
  +     
  +     KeyIndex index = (KeyIndex)_keyIndexes.get(name);
  +     if (index == null) {
  +         _keyIndexes.put(name, index = new KeyIndex(_indexSize));
  +     }
  +     index.setDom(dom);
  +    }
  +
  +    /**
        * Returns the index for a given key (or id).
        * The index implements our internal iterator interface
        */
  @@ -409,9 +431,19 @@
        * This method builds key indexes - it is overridden in the compiled
        * translet in cases where the <xsl:key> element is used
        */
  -    public void buildKeys(DOM document, NodeIterator iterator,
  -                       TransletOutputHandler handler,
  +    public void buildKeys(DOM document, DTMAxisIterator iterator,
  +                       SerializationHandler handler,
                          int root) throws TransletException {
  +                             
  +    }
  +    
  +    /**
  +     * This method builds key indexes - it is overridden in the compiled
  +     * translet in cases where the <xsl:key> element is used
  +     */
  +    public void setKeyIndexDom(String name, DOM document) {
  +     getKeyIndex(name).setDom(document);
  +                             
       }
   
       /************************************************************************
  @@ -442,7 +474,7 @@
        * See compiler/TransletOutput for actual implementation.
        
************************************************************************/
   
  -    public TransletOutputHandler openOutputHandler(String filename, boolean 
append) 
  +    public SerializationHandler openOutputHandler(String filename, boolean 
append) 
        throws TransletException 
       {
        try {
  @@ -454,8 +486,8 @@
            factory.setWriter(new FileWriter(filename, append));
            factory.setOutputType(TransletOutputHandlerFactory.STREAM);
   
  -         final TransletOutputHandler handler 
  -             = factory.getTransletOutputHandler();
  +         final SerializationHandler handler 
  +             = factory.getSerializationHandler();
   
            transferOutputSettings(handler);
            handler.startDocument();
  @@ -466,13 +498,13 @@
        }
       }
   
  -    public TransletOutputHandler openOutputHandler(String filename) 
  +    public SerializationHandler openOutputHandler(String filename) 
          throws TransletException 
       {
          return openOutputHandler(filename, false);
       }
   
  -    public void closeOutputHandler(TransletOutputHandler handler) {
  +    public void closeOutputHandler(SerializationHandler handler) {
        try {
            handler.endDocument();
            handler.close();
  @@ -489,14 +521,14 @@
       /**
        * Main transform() method - this is overridden by the compiled translet
        */
  -    public abstract void transform(DOM document, NodeIterator iterator,
  -                                TransletOutputHandler handler)
  +    public abstract void transform(DOM document, DTMAxisIterator iterator,
  +                                SerializationHandler handler)
        throws TransletException;
   
       /**
        * Calls transform() with a given output handler
        */
  -    public final void transform(DOM document, TransletOutputHandler handler) 
  +    public final void transform(DOM document, SerializationHandler handler) 
        throws TransletException {
        transform(document, document.getIterator(), handler);
       }
  @@ -506,33 +538,52 @@
        * output handler
        */
       public final void characters(final String string,
  -                              TransletOutputHandler handler) 
  +                              SerializationHandler handler) 
        throws TransletException {
  -     final int length = string.length();
  -     handler.characters(string.toCharArray(), 0, length);
  +        if (string != null) {
  +           //final int length = string.length();
  +           try {
  +               handler.characters(string);
  +           } catch (Exception e) {
  +               throw new TransletException(e);
  +           }
  +        }   
       }
   
       /**
        * Add's a name of an element whose text contents should be output as 
CDATA
        */
       public void addCdataElement(String name) {
  -     if (_cdata == null) _cdata = new Hashtable();
  -     _cdata.put(name, name);
  +     if (_cdata == null) {
  +            _cdata = new Vector();
  +        }
  +
  +        int lastColon = name.lastIndexOf(':');
  +
  +        if (lastColon > 0) {
  +            String uri = name.substring(0, lastColon);
  +            String localName = name.substring(lastColon+1);
  +         _cdata.addElement(uri);
  +         _cdata.addElement(localName);
  +        } else {
  +         _cdata.addElement(null);
  +         _cdata.addElement(name);
  +        }
       }
   
       /**
        * Transfer the output settings to the output post-processor
        */
  -    protected void transferOutputSettings(TransletOutputHandler handler) {
  +    protected void transferOutputSettings(SerializationHandler handler) {
        if (_method != null) {
            if (_method.equals("xml")) {
                if (_standalone != null) {
                    handler.setStandalone(_standalone);
                }
                if (_omitHeader) {
  -                 handler.omitHeader(true);
  +                 handler.setOmitXMLDeclaration(true);
                }
  -             handler.setCdataElements(_cdata);
  +             handler.setCdataSectionElements(_cdata);
                if (_version != null) {
                    handler.setVersion(_version);
                }
  @@ -550,7 +601,7 @@
            }
        }
        else {
  -         handler.setCdataElements(_cdata);
  +         handler.setCdataSectionElements(_cdata);
            if (_version != null) {
                handler.setVersion(_version);
            }
  @@ -558,7 +609,7 @@
                handler.setStandalone(_standalone);
            }
            if (_omitHeader) {
  -             handler.omitHeader(true);
  +             handler.setOmitXMLDeclaration(true);
            }
            handler.setIndent(_indent);
            handler.setDoctype(_doctypeSystem, _doctypePublic);
  @@ -583,5 +634,9 @@
       }
       public String[] getNamespaceArray() {
        return namespaceArray;
  +    }
  +    
  +    public boolean hasIdCall() {
  +     return _hasIdCall;
       }
   }
  
  
  
  1.7       +37 -11    
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/AttributeList.java
  
  Index: AttributeList.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/AttributeList.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- AttributeList.java        30 Jan 2003 18:46:12 -0000      1.6
  +++ AttributeList.java        1 Apr 2003 21:28:38 -0000       1.7
  @@ -80,11 +80,13 @@
        * AttributeList constructor
        */
       public AttributeList() {
  +     /*
        _attributes = new Hashtable();
        _names  = new Vector();
        _values = new Vector();
        _qnames = new Vector();
        _uris   = new Vector();
  +     */
        _length = 0;
       }
   
  @@ -100,6 +102,20 @@
            }
        }
       }
  +    
  +    /**
  +     * Allocate memory for the AttributeList
  +     * %OPT% Use on-demand allocation for the internal vectors. The memory
  +     * is only allocated when there is an attribute. This reduces the cost 
  +     * of creating many small RTFs.
  +     */
  +    private void alloc() {
  +     _attributes = new Hashtable();
  +     _names  = new Vector();
  +     _values = new Vector();
  +     _qnames = new Vector();
  +     _uris   = new Vector();        
  +    }
   
       /**
        * SAX2: Return the number of attributes in the list. 
  @@ -149,14 +165,14 @@
        * SAX2: Look up the index of an attribute by Namespace name.
        */
       public int getIndex(String namespaceURI, String localPart) {
  -     return(0);
  +     return(-1);
       }
   
       /**
        * SAX2: Look up the index of an attribute by XML 1.0 qualified name.
        */
       public int getIndex(String qname) {
  -     return(0);
  +     return(-1);
       }
   
       /**
  @@ -187,9 +203,13 @@
        * SAX2: Look up an attribute's value by qname.
        */
       public String getValue(String qname) {
  -     final Integer obj = (Integer)_attributes.get(qname);
  -     if (obj == null) return null;
  -     return(getValue(obj.intValue()));
  +     if (_attributes != null) {
  +         final Integer obj = (Integer)_attributes.get(qname);
  +         if (obj == null) return null;
  +         return(getValue(obj.intValue()));
  +     }
  +     else
  +         return null;
       }
   
       /**
  @@ -203,6 +223,10 @@
        * Adds an attribute to the list
        */
       public void add(String qname, String value) {
  +     // Initialize the internal vectors at the first usage.
  +     if (_attributes == null)
  +         alloc();
  +     
        // Stuff the QName into the names vector & hashtable
        Integer obj = (Integer)_attributes.get(qname);
        if (obj == null) {
  @@ -230,11 +254,13 @@
        */
       public void clear() {
        _length = 0;
  -     _attributes.clear();
  -     _names.removeAllElements();
  -     _values.removeAllElements();
  -     _qnames.removeAllElements();
  -     _uris.removeAllElements();
  +     if (_attributes != null) {
  +         _attributes.clear();
  +         _names.removeAllElements();
  +         _values.removeAllElements();
  +         _qnames.removeAllElements();
  +         _uris.removeAllElements();
  +     }
       }
       
   }
  
  
  
  1.61      +145 -136  
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/BasisLibrary.java
  
  Index: BasisLibrary.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/BasisLibrary.java,v
  retrieving revision 1.60
  retrieving revision 1.61
  diff -u -r1.60 -r1.61
  --- BasisLibrary.java 19 Mar 2003 22:14:10 -0000      1.60
  +++ BasisLibrary.java 1 Apr 2003 21:28:38 -0000       1.61
  @@ -75,25 +75,26 @@
   
   import javax.xml.parsers.DocumentBuilder;
   import javax.xml.parsers.DocumentBuilderFactory;
  +import javax.xml.transform.dom.DOMSource;
   
   import org.apache.xalan.xsltc.DOM;
  -import org.apache.xalan.xsltc.NodeIterator;
   import org.apache.xalan.xsltc.Translet;
  -import org.apache.xalan.xsltc.TransletException;
  -import org.apache.xalan.xsltc.TransletOutputHandler;
   import org.apache.xalan.xsltc.dom.AbsoluteIterator;
   import org.apache.xalan.xsltc.dom.Axis;
   import org.apache.xalan.xsltc.dom.DOMAdapter;
  -import org.apache.xalan.xsltc.dom.DOMBuilder;
  -import org.apache.xalan.xsltc.dom.DOMImpl;
  +import org.apache.xalan.xsltc.dom.SAXImpl;
   import org.apache.xalan.xsltc.dom.MultiDOM;
   import org.apache.xalan.xsltc.dom.SingletonIterator;
   import org.apache.xalan.xsltc.dom.StepIterator;
  -import org.apache.xalan.xsltc.trax.DOM2SAX;
  +import org.apache.xml.dtm.DTMAxisIterator;
  +import org.apache.xml.dtm.DTMManager;
  +import org.apache.xml.dtm.ref.DTMDefaultBase;
   
   import org.w3c.dom.DOMException;
   import org.w3c.dom.Document;
   import org.w3c.dom.NodeList;
  +import org.xml.sax.SAXException;
  +import org.apache.xml.serializer.SerializationHandler;
   
   /**
    * Standard XSLT functions. All standard functions expect the current node 
  @@ -106,15 +107,15 @@
       /**
        * Standard function count(node-set)
        */
  -    public static int countF(NodeIterator iterator) {
  +    public static int countF(DTMAxisIterator iterator) {
        return(iterator.getLast());
       }
   
       /**
        * Standard function position()
        */
  -    public static int positionF(NodeIterator iterator) {
  -       return iterator.isReverse()
  +    public static int positionF(DTMAxisIterator iterator) {
  +     return iterator.isReverse()
                        ? iterator.getLast() - iterator.getPosition() + 1
                        : iterator.getPosition();
       }
  @@ -123,12 +124,12 @@
        * XSLT Standard function sum(node-set). 
        * stringToDouble is inlined
        */
  -    public static double sumF(NodeIterator iterator, DOM dom) {
  +    public static double sumF(DTMAxisIterator iterator, DOM dom) {
        try {
            double result = 0.0;
            int node;
  -         while ((node = iterator.next()) != NodeIterator.END) {
  -             result += Double.parseDouble(dom.getNodeValue(node));
  +         while ((node = iterator.next()) != DTMAxisIterator.END) {
  +             result += Double.parseDouble(dom.getStringValueX(node));
            }
            return result;
        }
  @@ -141,18 +142,18 @@
        * XSLT Standard function string()
        */
       public static String stringF(int node, DOM dom) {
  -     return dom.getNodeValue(node);
  +     return dom.getStringValueX(node);
       }
   
       /**
        * XSLT Standard function string(value)
        */
       public static String stringF(Object obj, DOM dom) {
  -     if (obj instanceof NodeIterator) {
  -         return dom.getNodeValue(((NodeIterator)obj).reset().next());
  +     if (obj instanceof DTMAxisIterator) {
  +         return dom.getStringValueX(((DTMAxisIterator)obj).reset().next());
        }
        else if (obj instanceof Node) {
  -         return dom.getNodeValue(((Node)obj).node);
  +         return dom.getStringValueX(((Node)obj).node);
        }
        else if (obj instanceof DOM) {
            return ((DOM)obj).getStringValue();
  @@ -166,16 +167,16 @@
        * XSLT Standard function string(value)
        */
       public static String stringF(Object obj, int node, DOM dom) {
  -     if (obj instanceof NodeIterator) {
  -         return dom.getNodeValue(((NodeIterator)obj).reset().next());
  +     if (obj instanceof DTMAxisIterator) {
  +         return dom.getStringValueX(((DTMAxisIterator)obj).reset().next());
        }
        else if (obj instanceof Node) {
  -         return dom.getNodeValue(((Node)obj).node);
  +         return dom.getStringValueX(((Node)obj).node);
        }
        else if (obj instanceof DOM) {
            // When the first argument is a DOM we want the whole fecking
            // DOM and not just a single node - that would not make sense.
  -         //return ((DOM)obj).getNodeValue(node);
  +         //return ((DOM)obj).getStringValueX(node);
            return ((DOM)obj).getStringValue();
        }
        else if (obj instanceof Double) {
  @@ -200,7 +201,7 @@
        * XSLT Standard function number()
        */
       public static double numberF(int node, DOM dom) {
  -     return stringToReal(dom.getNodeValue(node));
  +     return stringToReal(dom.getStringValueX(node));
       }
   
       /**
  @@ -219,12 +220,12 @@
        else if (obj instanceof String) {
            return stringToReal((String) obj);
        }
  -     else if (obj instanceof NodeIterator) {
  -         NodeIterator iter = (NodeIterator) obj;
  -         return stringToReal(dom.getNodeValue(iter.reset().next()));
  +     else if (obj instanceof DTMAxisIterator) {
  +         DTMAxisIterator iter = (DTMAxisIterator) obj;
  +         return stringToReal(dom.getStringValueX(iter.reset().next()));
        }
        else if (obj instanceof Node) {
  -         return stringToReal(dom.getNodeValue(((Node) obj).node));
  +         return stringToReal(dom.getStringValueX(((Node) obj).node));
        }
        else if (obj instanceof DOM) {
            return stringToReal(((DOM) obj).getStringValue());
  @@ -253,9 +254,9 @@
        else if (obj instanceof String) {
            return !((String) obj).equals(EMPTYSTRING);
        }
  -     else if (obj instanceof NodeIterator) {
  -         NodeIterator iter = (NodeIterator) obj;
  -         return iter.reset().next() != NodeIterator.END;
  +     else if (obj instanceof DTMAxisIterator) {
  +         DTMAxisIterator iter = (DTMAxisIterator) obj;
  +         return iter.reset().next() != DTMAxisIterator.END;
        }
        else if (obj instanceof Node) {
            return true;
  @@ -372,7 +373,7 @@
        * XSLT Standard function normalize-space(). 
        */
       public static String normalize_spaceF(int node, DOM dom) {
  -     return normalize_spaceF(dom.getNodeValue(node));
  +     return normalize_spaceF(dom.getStringValueX(node));
       }
   
       /**
  @@ -439,7 +440,7 @@
       /**
        * XSLT Standard function namespace-uri(node-set).
        */
  -    public static String namespace_uriF(NodeIterator iter, DOM dom) {
  +    public static String namespace_uriF(DTMAxisIterator iter, DOM dom) {
        return namespace_uriF(iter.next(), dom);
       }
   
  @@ -483,9 +484,9 @@
           return "boolean";
         else if (obj instanceof Number)
           return "number";
  -      else if (obj instanceof DOMAdapter)
  +      else if (obj instanceof DOM)
           return "RTF";
  -      else if (obj instanceof NodeIterator)
  +      else if (obj instanceof DTMAxisIterator)
           return "node-set";
         else
           return "unknown";
  @@ -494,14 +495,14 @@
       /**
        * Implements the nodeset() extension function. 
        */
  -    public static NodeIterator nodesetF(Object obj) {
  +    public static DTMAxisIterator nodesetF(Object obj) {
        if (obj instanceof DOM) {
  -        final DOMAdapter adapter = (DOMAdapter) obj;
  -        return new SingletonIterator(
  -               DOM.ROOTNODE | adapter.getMultiDOMMask(), true);
  +        //final DOMAdapter adapter = (DOMAdapter) obj;
  +        final DOM dom = (DOM)obj;
  +        return new SingletonIterator(dom.getDocument(), true);
        }
  -        else if (obj instanceof NodeIterator) {
  -        return (NodeIterator) obj;
  +        else if (obj instanceof DTMAxisIterator) {
  +        return (DTMAxisIterator) obj;
           }
           else {
            final String className = obj.getClass().getName();
  @@ -546,19 +547,27 @@
       /**
        * Utility function: node-set/node-set compare. 
        */
  -    public static boolean compare(NodeIterator left, NodeIterator right,
  -                               int op, DOM dom) 
  -    {
  +    public static boolean compare(DTMAxisIterator left, DTMAxisIterator 
right,
  +                               int op, DOM dom) {
        int lnode;
        left.reset();
        
  -     while ((lnode = left.next()) != NodeIterator.END) {
  -         final String lvalue = dom.getNodeValue(lnode);
  +     while ((lnode = left.next()) != DTMAxisIterator.END) {
  +         final String lvalue = dom.getStringValueX(lnode);
            
            int rnode;
            right.reset();
  -         while ((rnode = right.next()) != NodeIterator.END) {
  -             if (compareStrings(lvalue, dom.getNodeValue(rnode), op, dom)) {
  +         while ((rnode = right.next()) != DTMAxisIterator.END) {
  +                // String value must be the same if both nodes are the same
  +                if (lnode == rnode) {
  +                    if (op == EQ) {
  +                        return true;
  +                    } else if (op == NE) {
  +                        continue;
  +                    }
  +                }
  +             if (compareStrings(lvalue, dom.getStringValueX(rnode), op,
  +                                   dom)) {
                    return true;
                }
            }
  @@ -566,10 +575,8 @@
        return false;
       }
   
  -
  -    public static boolean compare(int node, NodeIterator iterator,
  -                               int op, DOM dom) 
  -    {
  +    public static boolean compare(int node, DTMAxisIterator iterator,
  +                               int op, DOM dom) {
        //iterator.reset();
   
        int rnode;
  @@ -577,26 +584,38 @@
   
        switch(op) {
        case EQ:
  -         value = dom.getNodeValue(node);
  -         while ((rnode = iterator.next()) != NodeIterator.END) {
  -             if (value.equals(dom.getNodeValue(rnode))) return true;
  -         }
  +            rnode = iterator.next();
  +            if (rnode != DTMAxisIterator.END) {
  +             value = dom.getStringValueX(node);
  +                do {
  +                 if (node == rnode
  +                          || value.equals(dom.getStringValueX(rnode))) {
  +                       return true;
  +                    }
  +             } while ((rnode = iterator.next()) != DTMAxisIterator.END);
  +            }
            break;
        case NE:
  -         value = dom.getNodeValue(node);
  -         while ((rnode = iterator.next()) != NodeIterator.END) {
  -             if (!value.equals(dom.getNodeValue(rnode))) return true;
  -         }
  +            rnode = iterator.next();
  +            if (rnode != DTMAxisIterator.END) {
  +             value = dom.getStringValueX(node);
  +                do {
  +                 if (node != rnode
  +                          && !value.equals(dom.getStringValueX(rnode))) {
  +                        return true;
  +                    }
  +             } while ((rnode = iterator.next()) != DTMAxisIterator.END);
  +            }
            break;
        case LT:
            // Assume we're comparing document order here
  -         while ((rnode = iterator.next()) != NodeIterator.END) {
  +         while ((rnode = iterator.next()) != DTMAxisIterator.END) {
                if (rnode > node) return true;
            }
            break;
        case GT:
            // Assume we're comparing document order here
  -         while ((rnode = iterator.next()) != NodeIterator.END) {
  +         while ((rnode = iterator.next()) != DTMAxisIterator.END) {
                if (rnode < node) return true;
            }
            break;
  @@ -604,55 +623,53 @@
        return(false);
       }
   
  -
       /**
        * Utility function: node-set/number compare.
        */
  -    public static boolean compare(NodeIterator left, final double rnumber,
  -                               final int op, DOM dom) 
  -    {
  +    public static boolean compare(DTMAxisIterator left, final double rnumber,
  +                               final int op, DOM dom) {
        int node;
        //left.reset();
   
        switch (op) {
        case EQ:
  -         while ((node = left.next()) != NodeIterator.END) {
  -             if (numberF(dom.getNodeValue(node), dom) == rnumber)
  +         while ((node = left.next()) != DTMAxisIterator.END) {
  +             if (numberF(dom.getStringValueX(node), dom) == rnumber)
                    return true;
            }
            break;
   
        case NE:
  -         while ((node = left.next()) != NodeIterator.END) {
  -             if (numberF(dom.getNodeValue(node), dom) != rnumber)
  +         while ((node = left.next()) != DTMAxisIterator.END) {
  +             if (numberF(dom.getStringValueX(node), dom) != rnumber)
                    return true;
            }
            break;
   
        case GT:
  -         while ((node = left.next()) != NodeIterator.END) {
  -             if (numberF(dom.getNodeValue(node), dom) > rnumber)
  +         while ((node = left.next()) != DTMAxisIterator.END) {
  +             if (numberF(dom.getStringValueX(node), dom) > rnumber)
                    return true;
            }
            break;
   
        case LT:
  -         while ((node = left.next()) != NodeIterator.END) {
  -             if (numberF(dom.getNodeValue(node), dom) < rnumber)
  +         while ((node = left.next()) != DTMAxisIterator.END) {
  +             if (numberF(dom.getStringValueX(node), dom) < rnumber)
                    return true;
            }
            break;
   
        case GE:
  -         while ((node = left.next()) != NodeIterator.END) {
  -             if (numberF(dom.getNodeValue(node), dom) >= rnumber)
  +         while ((node = left.next()) != DTMAxisIterator.END) {
  +             if (numberF(dom.getStringValueX(node), dom) >= rnumber)
                    return true;
            }
            break;
   
        case LE:
  -         while ((node = left.next()) != NodeIterator.END) {
  -             if (numberF(dom.getNodeValue(node), dom) <= rnumber)
  +         while ((node = left.next()) != DTMAxisIterator.END) {
  +             if (numberF(dom.getStringValueX(node), dom) <= rnumber)
                    return true;
            }
            break;
  @@ -667,13 +684,12 @@
       /**
        * Utility function: node-set/string comparison. 
        */
  -    public static boolean compare(NodeIterator left, final String rstring,
  -                               int op, DOM dom) 
  -    {
  +    public static boolean compare(DTMAxisIterator left, final String rstring,
  +                               int op, DOM dom) {
        int node;
        //left.reset();
  -     while ((node = left.next()) != NodeIterator.END) {
  -         if (compareStrings(dom.getNodeValue(node), rstring, op, dom)) {
  +     while ((node = left.next()) != DTMAxisIterator.END) {
  +         if (compareStrings(dom.getStringValueX(node), rstring, op, dom)) {
                return true;
            }
        }
  @@ -746,7 +762,7 @@
            }
   
            if (hasSimpleType(left) ||
  -             left instanceof DOM && right instanceof NodeIterator) {
  +             left instanceof DOM && right instanceof DTMAxisIterator) {
                // swap operands
                final Object temp = right; right = left; left = temp;
            }
  @@ -778,10 +794,10 @@
   
            // Next, node-set/t for t in {real, string, node-set, result-tree}
   
  -         NodeIterator iter = ((NodeIterator)left).reset();
  +         DTMAxisIterator iter = ((DTMAxisIterator)left).reset();
   
  -         if (right instanceof NodeIterator) {
  -             result = compare(iter, (NodeIterator)right, op, dom);
  +         if (right instanceof DTMAxisIterator) {
  +             result = compare(iter, (DTMAxisIterator)right, op, dom);
            }
            else if (right instanceof String) {
                result = compare(iter, (String)right, op, dom);
  @@ -792,7 +808,7 @@
            }
            else if (right instanceof Boolean) {
                boolean temp = ((Boolean)right).booleanValue();
  -             result = (iter.reset().next() != NodeIterator.END) == temp;
  +             result = (iter.reset().next() != DTMAxisIterator.END) == temp;
            }
            else if (right instanceof DOM) {
                result = compare(iter, ((DOM)right).getStringValue(),
  @@ -961,14 +977,14 @@
        * Utility function: used to convert references to node-sets. If the
        * obj is an instanceof Node then create a singleton iterator.
        */
  -    public static NodeIterator referenceToNodeSet(Object obj) {
  +    public static DTMAxisIterator referenceToNodeSet(Object obj) {
        // Convert var/param -> node
        if (obj instanceof Node) {
            return(new SingletonIterator(((Node)obj).node));
        }
        // Convert var/param -> node-set
  -     else if (obj instanceof NodeIterator) {
  -         return(((NodeIterator)obj).cloneIterator());
  +     else if (obj instanceof DTMAxisIterator) {
  +         return(((DTMAxisIterator)obj).cloneIterator());
        }
        else {
            final String className = obj.getClass().getName();
  @@ -981,13 +997,13 @@
        * Utility function: used to convert reference to org.w3c.dom.NodeList.
        */
       public static NodeList referenceToNodeList(Object obj, DOM dom) {
  -        if (obj instanceof Node || obj instanceof NodeIterator) {
  -            NodeIterator iter = referenceToNodeSet(obj);
  +        if (obj instanceof Node || obj instanceof DTMAxisIterator) {
  +            DTMAxisIterator iter = referenceToNodeSet(obj);
               return dom.makeNodeList(iter);
           }
           else if (obj instanceof DOM) {
             dom = (DOM)obj;
  -          return dom.makeNodeList(DOM.ROOTNODE);
  +          return dom.makeNodeList(DTMDefaultBase.ROOTNODE);
           }
        else {
            final String className = obj.getClass().getName();
  @@ -1000,13 +1016,13 @@
        * Utility function: used to convert reference to org.w3c.dom.Node.
        */
       public static org.w3c.dom.Node referenceToNode(Object obj, DOM dom) {
  -        if (obj instanceof Node || obj instanceof NodeIterator) {
  -            NodeIterator iter = referenceToNodeSet(obj);
  +        if (obj instanceof Node || obj instanceof DTMAxisIterator) {
  +            DTMAxisIterator iter = referenceToNodeSet(obj);
               return dom.makeNode(iter);
           }
           else if (obj instanceof DOM) {
             dom = (DOM)obj;
  -          NodeIterator iter = dom.getChildren(DOM.ROOTNODE);
  +          DTMAxisIterator iter = dom.getChildren(DTMDefaultBase.ROOTNODE);
             return dom.makeNode(iter);
           }
        else {
  @@ -1019,7 +1035,7 @@
       /**
        * Utility function used to convert a w3c Node into an internal DOM 
iterator. 
        */
  -    public static NodeIterator node2Iterator(org.w3c.dom.Node node,
  +    public static DTMAxisIterator node2Iterator(org.w3c.dom.Node node,
        Translet translet, DOM dom) 
       {
           final org.w3c.dom.Node inNode = node;
  @@ -1047,8 +1063,10 @@
       private static void copyNodes(org.w3c.dom.NodeList nodeList, 
        org.w3c.dom.Document doc, org.w3c.dom.Node parent)
       {
  +        final int size = nodeList.getLength();
  +
             // copy Nodes from NodeList into new w3c DOM
  -        for (int i = 0; i < nodeList.getLength(); i++) 
  +        for (int i = 0; i < size; i++) 
           {
               org.w3c.dom.Node curr = nodeList.item(i);
               int nodeType = curr.getNodeType();
  @@ -1130,11 +1148,10 @@
        * Utility function used to convert a w3c NodeList into a internal
        * DOM iterator. 
        */
  -    public static NodeIterator nodeList2Iterator(org.w3c.dom.NodeList 
nodeList,
  -     Translet translet, DOM dom) 
  +    public static DTMAxisIterator nodeList2Iterator(
  +                                        org.w3c.dom.NodeList nodeList,
  +                                     Translet translet, DOM dom) 
       {
  -     int size = nodeList.getLength();
  -
        // w3c NodeList -> w3c DOM
        DocumentBuilderFactory dfac = DocumentBuilderFactory.newInstance();
        DocumentBuilder docbldr = null;
  @@ -1152,40 +1169,28 @@
   
           // Copy all the nodes in the nodelist to be under the top element
           copyNodes(nodeList, doc, topElementNode);
  -        
  -     // w3c DOM -> DOM2SAX -> DOMBuilder -> DOMImpl
  -     DOMImpl idom = new DOMImpl();
  -     final DOM2SAX dom2sax = new DOM2SAX(doc);
  -     final DOMBuilder domBuilder = idom.getBuilder();
  -     dom2sax.setContentHandler(domBuilder);
  -     try {
  -         dom2sax.parse(); 
  -     } 
  -        catch (java.io.IOException e){
  -         runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
  -            return null;
  -     }
  -        catch (org.xml.sax.SAXException e){
  -         runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
  -            return null;
  -     }
  -     
   
  +        // w3cDOM -> DTM -> DOMImpl
        if (dom instanceof MultiDOM) {
               final MultiDOM multiDOM = (MultiDOM) dom;
   
  +         DTMDefaultBase dtm = 
(DTMDefaultBase)((DOMAdapter)multiDOM.getMain()).getDOMImpl();
  +         DTMManager dtmManager = dtm.getManager();
  +         
  +         SAXImpl idom = (SAXImpl)dtmManager.getDTM(new DOMSource(doc), false,
  +                                                   null, true, false);
            // Create DOMAdapter and register with MultiDOM
            DOMAdapter domAdapter = new DOMAdapter(idom, 
                   translet.getNamesArray(),
                translet.getNamespaceArray());
               multiDOM.addDOMAdapter(domAdapter);
   
  -         NodeIterator iter1 = multiDOM.getAxisIterator(Axis.CHILD);
  -         NodeIterator iter2 = multiDOM.getAxisIterator(Axis.CHILD);
  -            NodeIterator iter = new AbsoluteIterator(
  +         DTMAxisIterator iter1 = idom.getAxisIterator(Axis.CHILD);
  +         DTMAxisIterator iter2 = idom.getAxisIterator(Axis.CHILD);
  +            DTMAxisIterator iter = new AbsoluteIterator(
                   new StepIterator(iter1, iter2));
   
  -         iter.setStartNode(DOM.ROOTNODE | domAdapter.getMultiDOMMask());
  +         iter.setStartNode(DTMDefaultBase.ROOTNODE);
            return iter;
        }
           else {
  @@ -1212,7 +1217,7 @@
        * Utility function: used with nth position filters to convert a sequence
        * of nodes to just one single node (the one at position n).
        */
  -    public static NodeIterator getSingleNode(NodeIterator iterator) {
  +    public static DTMAxisIterator getSingleNode(DTMAxisIterator iterator) {
        int node = iterator.next();
        return(new SingletonIterator(node));
       }
  @@ -1223,19 +1228,22 @@
       private static char[] _characterArray = new char[32];
   
       public static void copy(Object obj,
  -                         TransletOutputHandler handler,
  +                         SerializationHandler handler,
                            int node,
                            DOM dom) {
        try {
  -         if (obj instanceof NodeIterator) {
  -             NodeIterator iter = (NodeIterator) obj;
  +         if (obj instanceof DTMAxisIterator) 
  +      {
  +             DTMAxisIterator iter = (DTMAxisIterator) obj;
                dom.copy(iter.reset(), handler);
            }
            else if (obj instanceof Node) {
                dom.copy(((Node) obj).node, handler);
            }
            else if (obj instanceof DOM) {
  -             ((DOM)obj).copy(1, handler);
  +             
//((DOM)obj).copy(((org.apache.xml.dtm.ref.DTMDefaultBase)((DOMAdapter)obj).getDOMImpl()).getDocument(),
 handler);
  +             DOM newDom = (DOM)obj;
  +             newDom.copy(newDom.getDocument(), handler);
            }
            else {
                String string = obj.toString();         // or call stringF()
  @@ -1246,7 +1254,7 @@
                handler.characters(_characterArray, 0, length);
            }
        }
  -     catch (TransletException e) {
  +     catch (SAXException e) {
            runTimeError(RUN_TIME_COPY_ERR);
        }
       }
  @@ -1255,7 +1263,7 @@
        * Utility function for the implementation of xsl:element.
        */
       public static String startXslElement(String qname, String namespace,
  -     TransletOutputHandler handler, DOM dom, int node)
  +     SerializationHandler handler, DOM dom, int node)
       {
        try {
            // Get prefix from qname
  @@ -1270,23 +1278,24 @@
                    namespace = dom.lookupNamespace(node, prefix);
                }
   
  -             handler.startElement(qname);
  -             handler.namespace(prefix, namespace); 
  +             handler.startElement(namespace, qname.substring(index+1),
  +                                     qname);
  +             handler.namespaceAfterStartElement(prefix, namespace); 
            }
            else {
                // Need to generate a prefix?
                if (namespace != null && namespace.length() > 0) {
                    prefix = generatePrefix();
                    qname = prefix + ':' + qname;   
  -                 handler.startElement(qname);   
  -                 handler.namespace(prefix, namespace);
  +                 handler.startElement(namespace, qname, qname);   
  +                 handler.namespaceAfterStartElement(prefix, namespace);
                }
                else {
  -                 handler.startElement(qname);   
  +                 handler.startElement(null, null, qname);   
                }
            }
        }
  -     catch (TransletException e) {
  +     catch (SAXException e) {
            throw new RuntimeException(e.getMessage());
        }
   
  
  
  
  1.6       +7 -7      
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/Constants.java
  
  Index: Constants.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/Constants.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Constants.java    27 Jan 2003 18:44:50 -0000      1.5
  +++ Constants.java    1 Apr 2003 21:28:38 -0000       1.6
  @@ -63,7 +63,7 @@
   
   package org.apache.xalan.xsltc.runtime;
   
  -import org.apache.xalan.xsltc.DOM;
  +import org.apache.xml.dtm.DTM;
   
   /**
    * This class defines constants used by both the compiler and the 
  @@ -73,11 +73,11 @@
   
       final static int ANY       = -1;
       final static int ATTRIBUTE = -2;
  -    final static int ROOT      = DOM.ROOT;
  -    final static int TEXT      = DOM.TEXT;
  -    final static int ELEMENT   = DOM.ELEMENT;
  -    final static int COMMENT   = DOM.COMMENT;
  -    final static int PROCESSING_INSTRUCTION = DOM.PROCESSING_INSTRUCTION;
  +    final static int ROOT      = DTM.ROOT_NODE;
  +    final static int TEXT      = DTM.TEXT_NODE;
  +    final static int ELEMENT   = DTM.ELEMENT_NODE;
  +    final static int COMMENT   = DTM.COMMENT_NODE;
  +    final static int PROCESSING_INSTRUCTION = 
DTM.PROCESSING_INSTRUCTION_NODE;
   
       public static String XSLT_URI = "http://www.w3.org/1999/XSL/Transform";;
       public static final String NAMESPACE_FEATURE =
  
  
  
  1.8       +49 -17    
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/StringValueHandler.java
  
  Index: StringValueHandler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/StringValueHandler.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- StringValueHandler.java   30 Jan 2003 18:46:12 -0000      1.7
  +++ StringValueHandler.java   1 Apr 2003 21:28:38 -0000       1.8
  @@ -64,33 +64,65 @@
   
   package org.apache.xalan.xsltc.runtime;
   
  -import org.apache.xalan.xsltc.TransletException;
  +import org.xml.sax.SAXException;
   
  -public final class StringValueHandler extends TransletOutputBase {
  +import org.apache.xml.serializer.EmptySerializer;
   
  -    private char[] _buffer = new char[32];
  -    private int _free = 0;
  +public final class StringValueHandler extends EmptySerializer {
  +
  +    private StringBuffer _buffer = new StringBuffer();
  +    private String _str = null;
  +    private static final String EMPTY_STR = "";
  +    private boolean m_escaping = false;
        
       public void characters(char[] ch, int off, int len) 
  -     throws TransletException 
  +     throws SAXException 
       {
  -     if (_free + len >= _buffer.length) {
  -         char[] newBuffer = new char[_free + len + 32];
  -         System.arraycopy(_buffer, 0, newBuffer, 0, _free);
  -         _buffer = newBuffer;
  +     if (_str != null) {
  +         _buffer.append(_str);
  +         _str = null;
        }
  -     System.arraycopy(ch, off, _buffer, _free, len);
  -     _free += len;
  +     _buffer.append(ch, off, len);
       }
   
       public String getValue() {
  -     final int length = _free;
  -     _free = 0;              // getValue resets
  -     return new String(_buffer, 0, length);
  +     if (_buffer.length() != 0) {
  +         String result = _buffer.toString();
  +         _buffer.setLength(0);
  +         return result;
  +     }
  +     else {
  +         String result = _str;
  +         _str = null;
  +         return (result != null) ? result : EMPTY_STR;
  +     }
       }
   
  -    public void characters(String characters) throws TransletException {
  -     characters(characters.toCharArray(), 0, characters.length());
  +    public void characters(String characters) throws SAXException {
  +     if (_str == null && _buffer.length() == 0) {
  +         _str = characters;
  +     }
  +     else {
  +         if (_str != null) {
  +             _buffer.append(_str);
  +             _str = null;
  +         }
  +         
  +         _buffer.append(characters);
  +     }
  +    }
  +    
  +    public void startElement(String qname) throws SAXException {
  +        throw new SAXException(EmptySerializer.ERR);
  +    }
  +
  +    // Override the setEscaping method just to indicate that this class is
  +    // aware that that method might be called.
  +    public boolean setEscaping(boolean bool) {
  +        boolean oldEscaping = m_escaping;
  +        m_escaping = bool;
  +
  +        return bool;
       }
   
       /**
  
  
  

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

Reply via email to