tmiller     2002/07/25 04:45:58

  Modified:    java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java
               java/src/org/apache/xalan/xsltc/trax DOM2SAX.java
  Log:
  bug fix 10837, support of ext java functions
  
  Revision  Changes    Path
  1.44      +152 -5    
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.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- BasisLibrary.java 15 Jul 2002 17:21:01 -0000      1.43
  +++ BasisLibrary.java 25 Jul 2002 11:45:57 -0000      1.44
  @@ -85,6 +85,16 @@
   import org.apache.xalan.xsltc.dom.AbsoluteIterator;
   import org.apache.xalan.xsltc.dom.SingletonIterator;
   
  +import org.apache.xalan.xsltc.dom.DOMImpl;
  +import org.apache.xalan.xsltc.dom.DOMBuilder;
  +import org.apache.xalan.xsltc.dom.StepIterator;
  +import org.w3c.dom.NodeList;
  +import org.w3c.dom.DOMException;
  +import org.w3c.dom.Document;
  +import javax.xml.parsers.DocumentBuilderFactory; 
  +import javax.xml.parsers.DocumentBuilder; 
  +import org.apache.xalan.xsltc.trax.DOM2SAX;
  +
   /**
    * Standard XSLT functions. All standard functions expect the current node 
    * and the DOM as their last two arguments.
  @@ -454,10 +464,20 @@
       /**
        * Implements the nodeset() extension function. 
        */
  -    public static NodeIterator nodesetF(DOM rtf) {
  -     final DOMAdapter adapter = (DOMAdapter) rtf;
  -     return new SingletonIterator(
  -         DOM.ROOTNODE | adapter.getMultiDOMMask(), true);
  +    public static NodeIterator nodesetF(Object obj) {
  +     if (obj instanceof DOM) {
  +        final DOMAdapter adapter = (DOMAdapter) obj;
  +        return new SingletonIterator(
  +               DOM.ROOTNODE | adapter.getMultiDOMMask(), true);
  +     }
  +        else if (obj instanceof NodeIterator) {
  +        return (NodeIterator) obj;
  +        }
  +        else {
  +         final String className = obj.getClass().getName();
  +         runTimeError(DATA_CONVERSION_ERR, "node-set", className);
  +         return null;
  +        }
       }
   
       //-- Begin utility functions
  @@ -942,6 +962,133 @@
            runTimeError(DATA_CONVERSION_ERR, "reference", className);
            return null;
        }
  +    }
  +
  +    /**
  +     * 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) 
  +    {
  +     int size = nodeList.getLength();
  +
  +     // w3c NodeList -> w3c DOM
  +     DocumentBuilderFactory dfac = DocumentBuilderFactory.newInstance();
  +     DocumentBuilder docbldr = null;
  +     try {
  +         docbldr = dfac.newDocumentBuilder();
  +     } catch (javax.xml.parsers.ParserConfigurationException e) {
  +         runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
  +            return null;
  +
  +     }
  +     // create new w3c DOM
  +     Document doc = docbldr.newDocument();   
  +        org.w3c.dom.Node topElementNode = 
  +            doc.appendChild(doc.createElementNS("", "__top__"));
  +
  +     // copy Nodes from NodeList into new w3c DOM
  +     for (int i=0; i<size; i++){
  +         org.w3c.dom.Node curr = nodeList.item(i);
  +         int nodeType = curr.getNodeType();
  +         if (nodeType == org.w3c.dom.Node.DOCUMENT_NODE) {
  +             // ignore the root node of node list
  +             continue;
  +         }
  +         String value = null;
  +         try {
  +             value = curr.getNodeValue();
  +         } catch (DOMException ex) {
  +             runTimeError(RUN_TIME_INTERNAL_ERR, ex.getMessage());
  +                return null;
  +         }
  +         String namespaceURI = curr.getNamespaceURI();
  +         String nodeName = curr.getNodeName();
  +         org.w3c.dom.Node newNode = null; 
  +         switch (nodeType){
  +             case org.w3c.dom.Node.ATTRIBUTE_NODE: 
  +                  newNode = doc.createAttributeNS(namespaceURI,
  +                     nodeName);
  +                     break;
  +             case org.w3c.dom.Node.CDATA_SECTION_NODE: 
  +                  newNode = doc.createCDATASection(value);
  +                     break;
  +             case org.w3c.dom.Node.COMMENT_NODE: 
  +                  newNode = doc.createComment(value);
  +                     break;
  +             case org.w3c.dom.Node.DOCUMENT_FRAGMENT_NODE: 
  +                  newNode = doc.createDocumentFragment();
  +                     break;
  +             case org.w3c.dom.Node.DOCUMENT_TYPE_NODE: 
  +                  // nothing ?
  +                     break;
  +             case org.w3c.dom.Node.ELEMENT_NODE: 
  +                  newNode = doc.createElementNS(namespaceURI, nodeName);
  +                  break;
  +             case org.w3c.dom.Node.ENTITY_NODE: 
  +                  // nothing ? 
  +                     break;
  +             case org.w3c.dom.Node.ENTITY_REFERENCE_NODE: 
  +                  newNode = doc.createEntityReference(nodeName);
  +                  break;
  +             case org.w3c.dom.Node.NOTATION_NODE: 
  +                  // nothing ? 
  +                  break;
  +             case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE: 
  +                  newNode = doc.createProcessingInstruction(nodeName,
  +                     value);
  +                  break;
  +             case org.w3c.dom.Node.TEXT_NODE: 
  +                  newNode = doc.createTextNode(value);
  +                  break;
  +         }
  +         try {
  +             topElementNode.appendChild(newNode);
  +         } catch (DOMException e) {
  +             runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
  +             return null;
  +         }
  +     }
  +     // 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;
  +     }
  +     
  +
  +     if (dom instanceof MultiDOM) {
  +            final MultiDOM multiDOM = (MultiDOM) dom;
  +
  +         // 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(
  +                new StepIterator(iter1, iter2));
  +
  +         iter.setStartNode(DOM.ROOTNODE | domAdapter.getMultiDOMMask());
  +         return iter;
  +     }
  +        else {
  +         runTimeError(RUN_TIME_INTERNAL_ERR, "nodeList2Iterator()");
  +         return null;
  +        }
       }
   
       /**
  
  
  
  1.16      +8 -2      
xml-xalan/java/src/org/apache/xalan/xsltc/trax/DOM2SAX.java
  
  Index: DOM2SAX.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/DOM2SAX.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- DOM2SAX.java      20 Jun 2002 19:23:00 -0000      1.15
  +++ DOM2SAX.java      25 Jul 2002 11:45:57 -0000      1.16
  @@ -89,7 +89,7 @@
   import org.w3c.dom.Entity;
   import org.w3c.dom.Notation;
   
  -class DOM2SAX implements XMLReader, Locator {
  +public class DOM2SAX implements XMLReader, Locator {
   
       private final static String EMPTYSTRING = "";
       private static final String XMLNS_PREFIX = "xmlns";
  @@ -184,6 +184,12 @@
   
       public void parse(InputSource unused) throws IOException, SAXException {
           parse(_dom);
  +    }
  +
  +    public void parse() throws IOException, SAXException {
  +     if (_dom != null) {
  +         parse(_dom);
  +     }
       }
   
       /**
  
  
  

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

Reply via email to