You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by el...@apache.org on 2001/02/01 17:06:48 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/parsers DOMParser.java

elena       01/02/01 08:06:48

  Modified:    java/src/org/apache/xerces/parsers DOMParser.java
  Log:
  Changes to DOM parser to *activate* DOM Level 3 (partial) support
  
  Revision  Changes    Path
  1.35      +82 -31    xml-xerces/java/src/org/apache/xerces/parsers/DOMParser.java
  
  Index: DOMParser.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/DOMParser.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- DOMParser.java	2001/01/29 05:46:55	1.34
  +++ DOMParser.java	2001/02/01 16:06:45	1.35
  @@ -109,7 +109,7 @@
    * DOMParser provides a parser which produces a W3C DOM tree as its output
    *
    * 
  - * @version $Id: DOMParser.java,v 1.34 2001/01/29 05:46:55 andyc Exp $
  + * @version $Id: DOMParser.java,v 1.35 2001/02/01 16:06:45 elena Exp $
    */
   public class DOMParser
       extends XMLParser
  @@ -168,7 +168,12 @@
       protected int                  fDocumentIndex;
       protected int                  fDocumentTypeIndex;
       protected int                  fCurrentNodeIndex;
  -
  +    
  +    //DOM Level 3 WD - experimental
  +    
  +    protected int                  fCurrentEntityName; //name of current entity reference
  +    protected int                  fCurrentEntityNode; //index of entity node corresponding to current entity reference
  +    
       // full expansion data
   
       protected DocumentImpl fDocumentImpl;
  @@ -349,6 +354,10 @@
           fDocumentIndex = -1;
           fDocumentTypeIndex = -1;
           fCurrentNodeIndex = -1;
  +        
  +        //DOM Level 3 WD - experimental
  +        fCurrentEntityNode = -1;  
  +        fCurrentEntityName = -1; 
   
           // init full expansion
           fDocumentImpl = null;
  @@ -957,19 +966,51 @@
   
       /** XML declaration. */
       public void xmlDecl(int versionIndex, int encodingIndex, int standaloneIndex) throws Exception {
  -
  -        // release strings
  -        fStringPool.releaseString(versionIndex);
  -        fStringPool.releaseString(encodingIndex);
  -        fStringPool.releaseString(standaloneIndex);
  +        boolean standalone = (standaloneIndex!=-1)?(fStringPool.toString(standaloneIndex).equals("yes"))?true:false:false;
  +        if (fDocumentImpl != null) { //full node expansion
  +             fDocumentImpl.setVersion(fStringPool.toString(versionIndex));
  +             fDocumentImpl.setEncoding(fStringPool.toString(encodingIndex));
  +             fDocumentImpl.setStandalone(standalone);
  +         }
  +         else {              
  +             fDeferredDocumentImpl.setVersion(fStringPool.toString(versionIndex));
  +             fDeferredDocumentImpl.setEncoding(fStringPool.toString(encodingIndex));
  +             fDeferredDocumentImpl.setStandalone(standalone);
  +         }
       }
   
  -    /** Text declaration. */
  +    /** Text declaration. 
  +     * added DOM Level 3 WD support - experimental
  +    */    
       public void textDecl(int versionIndex, int encodingIndex) throws Exception {
  -
  -        // release strings
  -        fStringPool.releaseString(versionIndex);
  -        fStringPool.releaseString(encodingIndex);
  +        if (fDeferredDocumentImpl != null)   {
  +            String name = fStringPool.toString(fCurrentEntityName);
  +            // we only support one context for entity references (name !=null)
  +            if (fDocumentTypeIndex != -1 && name != null) {
  +                // find Entity decl for fCurrentEntityName.
  +                int entityDecl = fDeferredDocumentImpl.getLastChild(fDocumentTypeIndex, false);
  +                while (entityDecl != -1) {
  +                    if (fDeferredDocumentImpl.getNodeType(entityDecl, false) == Node.ENTITY_NODE
  +                    && fDeferredDocumentImpl.getNodeNameString(entityDecl, false).equals(name)) { 
  +                        break;
  +                    }
  +                    entityDecl = fDeferredDocumentImpl.getPrevSibling(entityDecl, false);
  +                }
  +                fCurrentEntityNode = entityDecl;
  +                fDeferredDocumentImpl.setEntityInfo(entityDecl, versionIndex, encodingIndex);
  +            }    
  +        }
  +       // full node expansion
  +       else { 
  +            NamedNodeMap entities = fDocumentType.getEntities();
  +            if (entities!=null) {
  +                EntityImpl entityNode = (EntityImpl)entities.getNamedItem(fCurrentElementNode.getNodeName());
  +                if (entityNode !=null) {
  +                    entityNode.setVersion(fStringPool.toString(versionIndex));
  +                    entityNode.setEncoding(fStringPool.toString(encodingIndex));
  +                }
  +            }
  +        }
       }
   
       /** Report the start of the scope of a namespace declaration. */
  @@ -1321,11 +1362,13 @@
       /** Start entity reference. */
       public void startEntityReference(int entityName, int entityType,
                                        int entityContext) throws Exception {
  -
  +        
  +        fCurrentEntityName = entityName;
           // are we ignoring entity reference nodes?
           if (!fCreateEntityReferenceNodes) {
               return;
           }
  +        
   
           // ignore built-in entities
           if (entityName == fAmpIndex ||
  @@ -1335,19 +1378,21 @@
               entityName == fQuotIndex) {
               return;
           }
  -
  +         
           // we only support one context for entity references right now...
           if (entityContext != XMLEntityHandler.ENTITYREF_IN_CONTENT) {
               return;
           }
  -
  +        
           // deferred node expansion
  +        
           if (fDeferredDocumentImpl != null) {
  -
  +            
               int entityRefIndex = fDeferredDocumentImpl.createEntityReference(entityName);
               fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, entityRefIndex);
  -
  +            
               fCurrentNodeIndex = entityRefIndex;
  +            
           }
   
           // full node expansion
  @@ -1371,7 +1416,6 @@
       /** End entity reference. */
       public void endEntityReference(int entityName, int entityType,
                                      int entityContext) throws Exception {
  -
           // are we ignoring entity reference nodes?
           if (!fCreateEntityReferenceNodes) {
               return;
  @@ -1403,28 +1447,35 @@
               if (fDeferredDocumentImpl.getNodeType(erChild, false) != Node.ENTITY_REFERENCE_NODE)  return;
   
               erChild = fDeferredDocumentImpl.getLastChild(erChild, false); // first Child of EntityReference
  -
               if (fDocumentTypeIndex != -1) {
  -                // find Entity decl for this EntityReference.
  -                int entityDecl = fDeferredDocumentImpl.getLastChild(fDocumentTypeIndex, false);
  -                while (entityDecl != -1) {
  -                    if (fDeferredDocumentImpl.getNodeType(entityDecl, false) == Node.ENTITY_NODE
  -                    && fDeferredDocumentImpl.getNodeNameString(entityDecl, false).equals(name)) // string compare...
  -                    {
  -                        break;
  +                // if we have seen <?xml..> decl then Entity decl was found and 
  +                // set in textDecl() using fCurrentEntityNode
  +                if (fCurrentEntityNode  == -1) {
  +                    // find Entity decl for this EntityReference.
  +                    int entityDecl = fDeferredDocumentImpl.getLastChild(fDocumentTypeIndex, false);
  +                    while (entityDecl != -1) {
  +                        if (fDeferredDocumentImpl.getNodeType(entityDecl, false) == Node.ENTITY_NODE
  +                            && fDeferredDocumentImpl.getNodeNameString(entityDecl, false).equals(name)) // string compare...
  +                        {
  +                            break;
  +                        }
  +                        entityDecl = fDeferredDocumentImpl.getPrevSibling(entityDecl, false);
                       }
  -                    entityDecl = fDeferredDocumentImpl.getPrevSibling(entityDecl, false);
  +                    fCurrentEntityNode = entityDecl;
                   }
  -
  -                if (entityDecl != -1
  -                    && fDeferredDocumentImpl.getLastChild(entityDecl, false) == -1) {
  +                 if (fCurrentEntityNode != -1
  +                    && fDeferredDocumentImpl.getLastChild(fCurrentEntityNode, false) == -1) {
                       // found entityDecl with same name as this reference
                       // AND it doesn't have any children.
   
                       // we don't need to iterate, because the whole structure
                       // should already be connected to the 1st child.
  -                    fDeferredDocumentImpl.setAsLastChild(entityDecl, erChild);
  +                    fDeferredDocumentImpl.setAsLastChild(fCurrentEntityNode, erChild);
                   }
  +                 // done with current entity reference.
  +                 // reset values
  +                 fCurrentEntityNode  = -1; 
  +                 fCurrentEntityName = -1;
               }
   
           }