sandygao    2003/07/21 13:50:49

  Modified:    java/src/org/apache/xerces/util XMLGrammarPoolImpl.java
  Log:
  Provide a way in the implementation to construct an XSModel that
  corresponds to all the schema grammars in the grammar pool implementation.
  
  Revision  Changes    Path
  1.5       +121 -94   
xml-xerces/java/src/org/apache/xerces/util/XMLGrammarPoolImpl.java
  
  Index: XMLGrammarPoolImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/util/XMLGrammarPoolImpl.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XMLGrammarPoolImpl.java   8 May 2003 20:12:00 -0000       1.4
  +++ XMLGrammarPoolImpl.java   21 Jul 2003 20:50:49 -0000      1.5
  @@ -2,7 +2,7 @@
    * The Apache Software License, Version 1.1
    *
    *
  - * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights 
  + * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -10,7 +10,7 @@
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
  - *    notice, this list of conditions and the following disclaimer. 
  + *    notice, this list of conditions and the following disclaimer.
    *
    * 2. Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in
  @@ -18,7 +18,7 @@
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution,
  - *    if any, must include the following acknowledgment:  
  + *    if any, must include the following acknowledgment:
    *       "This product includes software developed by the
    *        Apache Software Foundation (http://www.apache.org/)."
    *    Alternately, this acknowledgment may appear in the software itself,
  @@ -26,7 +26,7 @@
    *
    * 4. The names "Xerces" and "Apache Software Foundation" must
    *    not be used to endorse or promote products derived from this
  - *    software without prior written permission. For written 
  + *    software without prior written permission. For written
    *    permission, please contact [EMAIL PROTECTED]
    *
    * 5. Products derived from this software may not be called "Apache",
  @@ -57,6 +57,9 @@
   
   package org.apache.xerces.util;
   
  +import org.apache.xerces.impl.xs.psvi.XSModel;
  +import org.apache.xerces.impl.xs.SchemaGrammar;
  +import org.apache.xerces.impl.xs.XSModelImpl;
   import org.apache.xerces.xni.grammars.Grammar;
   import org.apache.xerces.xni.grammars.XMLGrammarDescription;
   import org.apache.xerces.xni.grammars.XMLGrammarPool;
  @@ -66,7 +69,7 @@
    * implementation stores two types of grammars: those keyed by the root element
    * name, and those keyed by the grammar's target namespace.
    *
  - * This is the default implementation of the GrammarPool interface.  
  + * This is the default implementation of the GrammarPool interface.
    * As we move forward, this will become more function-rich and robust.
    *
    * @author Jeffrey Rodriguez, IBM
  @@ -79,20 +82,20 @@
    */
   public class XMLGrammarPoolImpl implements XMLGrammarPool {
   
  -    // 
  +    //
       // Constants
  -    // 
  -    
  +    //
  +
       /** Default size. */
       protected static final int TABLE_SIZE = 11;
   
       //
       // Data
       //
  -    
  +
       /** Grammars. */
       protected Entry[] fGrammars = null;
  -    
  +
       // whether this pool is locked
       protected boolean fPoolIsLocked;
   
  @@ -100,17 +103,17 @@
       protected int fGrammarCount = 0;
   
       private static final boolean DEBUG = false ;
  -     
  +
       //
       // Constructors
       //
   
       /** Constructs a grammar pool with a default number of buckets. */
       public XMLGrammarPoolImpl() {
  -     fGrammars = new Entry[TABLE_SIZE];
  +        fGrammars = new Entry[TABLE_SIZE];
           fPoolIsLocked = false;
       } // <init>()
  -    
  +
       /** Constructs a grammar pool with a specified number of buckets. */
       public XMLGrammarPoolImpl(int initialCapacity) {
           fGrammars = new Entry[initialCapacity];
  @@ -120,14 +123,14 @@
       //
       // XMLGrammarPool methods
       //
  -    
  +
       /* <p> Retrieve the initial known set of grammars. This method is
  -     * called by a validator before the validation starts. The application 
  -     * can provide an initial set of grammars available to the current 
  +     * called by a validator before the validation starts. The application
  +     * can provide an initial set of grammars available to the current
        * validation attempt. </p>
  -     * 
  +     *
        * @param grammarType The type of the grammar, from the
  -     *                 
<code>org.apache.xerces.xni.grammars.XMLGrammarDescription</code> 
  +     *                 
<code>org.apache.xerces.xni.grammars.XMLGrammarDescription</code>
        *                 interface.
        * @return                 The set of grammars the validator may put in its 
"bucket"
        */
  @@ -150,7 +153,7 @@
       } // retrieveInitialGrammarSet (String): Grammar[]
   
       /* <p> Return the final set of grammars that the validator ended up
  -     * with. This method is called after the validation finishes. The 
  +     * with. This method is called after the validation finishes. The
        * application may then choose to cache some of the returned grammars.</p>
        * <p>In this implementation, we make our choice based on whether this object
        * is "locked"--that is, whether the application has instructed
  @@ -162,27 +165,27 @@
        */
       public void cacheGrammars(String grammarType, Grammar[] grammars) {
           if(!fPoolIsLocked) {
  -         for (int i = 0; i < grammars.length; i++) {
  +            for (int i = 0; i < grammars.length; i++) {
                   if(DEBUG) {
  -                 System.out.println("CACHED GRAMMAR " + (i+1) ) ;
  -                 Grammar temp = grammars[i] ;
  -                 //print(temp.getGrammarDescription());
  +                    System.out.println("CACHED GRAMMAR " + (i+1) ) ;
  +                    Grammar temp = grammars[i] ;
  +                    //print(temp.getGrammarDescription());
                   }
  -             putGrammar(grammars[i]);
  +                putGrammar(grammars[i]);
               }
  -     }
  +        }
       } // cacheGrammars(String, Grammar[]);
  -    
  +
       /* <p> This method requests that the application retrieve a grammar
        * corresponding to the given GrammarIdentifier from its cache.
        * If it cannot do so it must return null; the parser will then
        * call the EntityResolver. </p>
  -     * <strong>An application must not call its EntityResolver itself 
  +     * <strong>An application must not call its EntityResolver itself
        * from this method; this may result in infinite recursions.</strong>
  -     * 
  +     *
        * This implementation chooses to use the root element name to identify a DTD 
grammar
        * and the target namespace to identify a Schema grammar.
  -     * 
  +     *
        * @param desc The description of the Grammar being requested.
        * @return     The Grammar corresponding to this description or null if
        *          no such Grammar is known.
  @@ -227,7 +230,7 @@
   
       /**
        * Returns the grammar associated to the specified grammar description.
  -     * Currently, the root element name is used as the key for DTD grammars 
  +     * Currently, the root element name is used as the key for DTD grammars
        * and the target namespace  is used as the key for Schema grammars.
        *
        * @param desc The Grammar Description.
  @@ -235,68 +238,92 @@
       public Grammar getGrammar(XMLGrammarDescription desc) {
           synchronized (fGrammars) {
               int hash = hashCode(desc);
  -         int index = (hash & 0x7FFFFFFF) % fGrammars.length;
  -         for (Entry entry = fGrammars[index] ; entry != null ; entry = entry.next) {
  -             if ((entry.hash == hash) && equals(entry.desc, desc)) {
  -                 return entry.grammar;
  -             }
  -         }
  -         return null;
  -     }
  +        int index = (hash & 0x7FFFFFFF) % fGrammars.length;
  +        for (Entry entry = fGrammars[index] ; entry != null ; entry = entry.next) {
  +            if ((entry.hash == hash) && equals(entry.desc, desc)) {
  +                return entry.grammar;
  +            }
  +        }
  +        return null;
  +    }
       } // getGrammar(XMLGrammarDescription):Grammar
   
       /**
        * Removes the grammar associated to the specified grammar description from the
  -     * grammar pool and returns the removed grammar. Currently, the root element 
name 
  -     * is used as the key for DTD grammars and the target namespace  is used 
  +     * grammar pool and returns the removed grammar. Currently, the root element 
name
  +     * is used as the key for DTD grammars and the target namespace  is used
        * as the key for Schema grammars.
  -     * 
  +     *
        * @param desc The Grammar Description.
        * @return     The removed grammar.
        */
       public Grammar removeGrammar(XMLGrammarDescription desc) {
           synchronized (fGrammars) {
  -         int hash = hashCode(desc);
  -         int index = (hash & 0x7FFFFFFF) % fGrammars.length;
  -         for (Entry entry = fGrammars[index], prev = null ; entry != null ; prev = 
entry, entry = entry.next) {
  -             if ((entry.hash == hash) && equals(entry.desc, desc)) {
  -                 if (prev != null) {
  +            int hash = hashCode(desc);
  +        int index = (hash & 0x7FFFFFFF) % fGrammars.length;
  +        for (Entry entry = fGrammars[index], prev = null ; entry != null ; prev = 
entry, entry = entry.next) {
  +            if ((entry.hash == hash) && equals(entry.desc, desc)) {
  +                if (prev != null) {
                           prev.next = entry.next;
  -                 } 
  -                 else {
  -                     fGrammars[index] = entry.next;
  -                 }
  -                 Grammar tempGrammar = entry.grammar;
  -                 entry.grammar = null;
  +            }
  +            else {
  +                fGrammars[index] = entry.next;
  +            }
  +                Grammar tempGrammar = entry.grammar;
  +                entry.grammar = null;
                   fGrammarCount--;
  -                 return tempGrammar;
  -             }
  -         }
  -         return null;
  +                return tempGrammar;
  +            }
  +        }
  +        return null;
           }
       } // removeGrammar(XMLGrammarDescription):Grammar
   
       /**
        * Returns true if the grammar pool contains a grammar associated
  -     * to the specified grammar description. Currently, the root element name 
  -     * is used as the key for DTD grammars and the target namespace  is used 
  +     * to the specified grammar description. Currently, the root element name
  +     * is used as the key for DTD grammars and the target namespace  is used
        * as the key for Schema grammars.
        *
        * @param desc The Grammar Description.
        */
       public boolean containsGrammar(XMLGrammarDescription desc) {
           synchronized (fGrammars) {
  -         int hash = hashCode(desc);
  -         int index = (hash & 0x7FFFFFFF) % fGrammars.length;
  -         for (Entry entry = fGrammars[index] ; entry != null ; entry = entry.next) {
  -             if ((entry.hash == hash) && equals(entry.desc, desc)) {
  -                 return true;
  -             }
  -         }
  -         return false;
  -     }
  +            int hash = hashCode(desc);
  +        int index = (hash & 0x7FFFFFFF) % fGrammars.length;
  +        for (Entry entry = fGrammars[index] ; entry != null ; entry = entry.next) {
  +            if ((entry.hash == hash) && equals(entry.desc, desc)) {
  +                return true;
  +            }
  +        }
  +        return false;
  +    }
       } // containsGrammar(XMLGrammarDescription):boolean
   
  +    /**
  +     * Return an <code>XSModel</code> that represents components in
  +     * the schema grammars in this pool implementation.
  +     *
  +     * @return  an <code>XSModel</code> representing this schema grammar
  +     */
  +    public XSModel toXSModel() {
  +        java.util.Vector list = new java.util.Vector();
  +        for (int i = 0; i < fGrammars.length; i++) {
  +            for (Entry entry = fGrammars[i] ; entry != null ; entry = entry.next) {
  +                if 
(entry.desc.getGrammarType().equals(XMLGrammarDescription.XML_SCHEMA))
  +                    list.addElement(entry.grammar);
  +            }
  +        }
  +
  +        int size = list.size();
  +        if (size == 0)
  +            return null;
  +        SchemaGrammar[] gs = new SchemaGrammar[size];
  +        for (int i = 0; i < size; i++)
  +            gs[i] = (SchemaGrammar)list.elementAt(i);
  +        return new XSModelImpl(gs);
  +    }
  +
       /* <p> Sets this grammar pool to a "locked" state--i.e.,
        * no new grammars will be added until it is "unlocked".
        */
  @@ -305,14 +332,14 @@
       } // lockPool()
   
       /* <p> Sets this grammar pool to an "unlocked" state--i.e.,
  -     * new grammars will be added when putGrammar or cacheGrammars 
  +     * new grammars will be added when putGrammar or cacheGrammars
        * are called.
        */
       public void unlockPool() {
           fPoolIsLocked = false;
       } // unlockPool()
   
  -    /* 
  +    /*
        * <p>This method clears the pool-i.e., removes references
        * to all the grammars in it.</p>
        */
  @@ -327,7 +354,7 @@
       } // clear()
   
       /**
  -     * This method checks whether two grammars are the same. Currently, we compare 
  +     * This method checks whether two grammars are the same. Currently, we compare
        * the root element names for DTD grammars and the target namespaces for Schema 
grammars.
        * The application can override this behaviour and add its own logic.
        *
  @@ -338,7 +365,7 @@
       public boolean equals(XMLGrammarDescription desc1, XMLGrammarDescription desc2) 
{
           return desc1.equals(desc2);
       }
  -    
  +
       /**
        * Returns the hash code value for the given grammar description.
        *
  @@ -348,7 +375,7 @@
       public int hashCode(XMLGrammarDescription desc) {
           return desc.hashCode();
       }
  -    
  +
       /**
        * This class is a grammar pool entry. Each entry acts as a node
        * in a linked list.
  @@ -358,7 +385,7 @@
           public XMLGrammarDescription desc;
           public Grammar grammar;
           public Entry next;
  -     
  +
           protected Entry(int hash, XMLGrammarDescription desc, Grammar grammar, 
Entry next) {
               this.hash = hash;
               this.desc = desc;
  @@ -377,28 +404,28 @@
               }
           } // clear()
       } // class Entry
  -    
  +
       /* For DTD build we can't import here XSDDescription. Thus, this method is 
commented out.. */
       /* public void print(XMLGrammarDescription description){
  -     if(description.getGrammarType().equals(XMLGrammarDescription.XML_DTD)){
  -     
  -     }
  -     else if(description.getGrammarType().equals(XMLGrammarDescription.XML_SCHEMA)){
  -             XSDDescription schema = (XSDDescription)description ;
  -             System.out.println("Context = " + schema.getContextType());
  -             System.out.println("TargetNamespace = " + schema.getTargetNamespace());
  -             String [] temp = schema.getLocationHints();
  -             
  -             for (int i = 0 ; (temp != null && i < temp.length) ; i++){
  -                     System.out.println("LocationHint " + i + " = "+ temp[i]);
  -             }
  -                             
  -             System.out.println("Triggering Component = " + 
schema.getTriggeringComponent());
  -             System.out.println("EnclosingElementName =" + 
schema.getEnclosingElementName());
  -     
  -     }
  -    
  +        if(description.getGrammarType().equals(XMLGrammarDescription.XML_DTD)){
  +
  +        }
  +        else 
if(description.getGrammarType().equals(XMLGrammarDescription.XML_SCHEMA)){
  +            XSDDescription schema = (XSDDescription)description ;
  +            System.out.println("Context = " + schema.getContextType());
  +            System.out.println("TargetNamespace = " + schema.getTargetNamespace());
  +            String [] temp = schema.getLocationHints();
  +
  +            for (int i = 0 ; (temp != null && i < temp.length) ; i++){
  +                System.out.println("LocationHint " + i + " = "+ temp[i]);
  +            }
  +
  +            System.out.println("Triggering Component = " + 
schema.getTriggeringComponent());
  +            System.out.println("EnclosingElementName =" + 
schema.getEnclosingElementName());
  +
  +        }
  +
       }//print
       */
  -    
  +
   } // class XMLGrammarPoolImpl
  
  
  

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

Reply via email to