You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2006/01/25 10:19:19 UTC

svn commit: r372168 - in /directory/trunks/asn1/src/main/java/org/apache/asn1/ber: AbstractContainer.java IAsn1Container.java grammar/AbstractGrammar.java

Author: elecharny
Date: Wed Jan 25 01:19:14 2006
New Revision: 372168

URL: http://svn.apache.org/viewcvs?rev=372168&view=rev
Log:
- Added a stack to allow popIng of sub-grammars. This is necessary
for cases where a sub-grammar met a tag which is not part of the 
state automaton, and we are in a case where the sub-grammmar
could reach a terminaison state.

Modified:
    directory/trunks/asn1/src/main/java/org/apache/asn1/ber/AbstractContainer.java
    directory/trunks/asn1/src/main/java/org/apache/asn1/ber/IAsn1Container.java
    directory/trunks/asn1/src/main/java/org/apache/asn1/ber/grammar/AbstractGrammar.java

Modified: directory/trunks/asn1/src/main/java/org/apache/asn1/ber/AbstractContainer.java
URL: http://svn.apache.org/viewcvs/directory/trunks/asn1/src/main/java/org/apache/asn1/ber/AbstractContainer.java?rev=372168&r1=372167&r2=372168&view=diff
==============================================================================
--- directory/trunks/asn1/src/main/java/org/apache/asn1/ber/AbstractContainer.java (original)
+++ directory/trunks/asn1/src/main/java/org/apache/asn1/ber/AbstractContainer.java Wed Jan 25 01:19:14 2006
@@ -44,6 +44,9 @@
     /** Store a stack of the current states used when switching grammars */
     protected int[] stateStack;
 
+    /** Store a stack of allowed pop */
+    protected boolean[] popAllowedStack;
+
     /** The number of stored grammars */
     protected int nbGrammars;
 
@@ -68,10 +71,13 @@
     /** The grammar end transition flag */
     protected boolean grammarEndAllowed;
 
+    /** The grammar pop transition flag */
+    protected boolean grammarPopAllowed;
+
     //~ Methods ------------------------------------------------------------------------------------
 
     /**
-     * DOCUMENT ME!
+     * Get the current grammar
      *
      * @return Returns the grammar used to decode a LdapMessage.
      */
@@ -93,13 +99,14 @@
     /**
      * Switch to another grammar
      *
-     * @param currentState DOCUMENT ME!
+     * @param currentState The current state in the current grammar
      * @param grammar The grammar to add.
      */
     public void switchGrammar( int currentState, int grammar )
     {
         stateStack[currentGrammar] = currentState;
         currentGrammar++;
+        popAllowedStack[currentGrammar] = false;
         grammarStack[currentGrammar] = grammars[( grammar >> 8 ) - 1];
     }
 
@@ -111,6 +118,7 @@
     public int restoreGrammar()
     {
         grammarStack[currentGrammar] = null;
+        popAllowedStack[currentGrammar] = false;
         currentGrammar--;
 
         if ( currentGrammar >= 0 )
@@ -161,6 +169,25 @@
     public void grammarEndAllowed( boolean grammarEndAllowed )
     {
     	this.grammarEndAllowed = grammarEndAllowed;
+    }
+
+    /**
+     * Check that we can have a pop after this transition
+     * @return true if this can be the last transition before a pop
+     */
+    public boolean isGrammarPopAllowed( )
+    {
+        return popAllowedStack[currentGrammar];
+    }
+    
+    /**
+     * Set the flag to allow a pop transition
+     * @param popAllowed true or false, depending on the next
+     * transition allows a pop or not.
+     */
+    public void grammarPopAllowed( boolean grammarPopAllowed )
+    {
+        popAllowedStack[currentGrammar] = grammarPopAllowed;
     }
 
     /**

Modified: directory/trunks/asn1/src/main/java/org/apache/asn1/ber/IAsn1Container.java
URL: http://svn.apache.org/viewcvs/directory/trunks/asn1/src/main/java/org/apache/asn1/ber/IAsn1Container.java?rev=372168&r1=372167&r2=372168&view=diff
==============================================================================
--- directory/trunks/asn1/src/main/java/org/apache/asn1/ber/IAsn1Container.java (original)
+++ directory/trunks/asn1/src/main/java/org/apache/asn1/ber/IAsn1Container.java Wed Jan 25 01:19:14 2006
@@ -146,4 +146,17 @@
      * transition being an end or not.
      */
     public void grammarEndAllowed( boolean grammarEndAllowed );
+
+    /**
+     * Check that we can have a pop state after this transition
+     * @return true if we can pop the grammar
+     */
+    public boolean isGrammarPopAllowed();
+    
+    /**
+     * Set the flag to allow a pop of the current grammar
+     * @param popAllowed true or false, depending on the next
+     * transition allows a pop or not.
+     */
+    public void grammarPopAllowed( boolean grammarPopAllowed );
 }

Modified: directory/trunks/asn1/src/main/java/org/apache/asn1/ber/grammar/AbstractGrammar.java
URL: http://svn.apache.org/viewcvs/directory/trunks/asn1/src/main/java/org/apache/asn1/ber/grammar/AbstractGrammar.java?rev=372168&r1=372167&r2=372168&view=diff
==============================================================================
--- directory/trunks/asn1/src/main/java/org/apache/asn1/ber/grammar/AbstractGrammar.java (original)
+++ directory/trunks/asn1/src/main/java/org/apache/asn1/ber/grammar/AbstractGrammar.java Wed Jan 25 01:19:14 2006
@@ -174,9 +174,29 @@
                 {
 
                     // We have finished with the current grammar, so we have to continue with the
-                    // previous one.
-                    currentState = container.restoreGrammar();
-                    continue;
+                    // previous one, only if allowed
+                    
+                    if ( container.isGrammarPopAllowed() )
+                    {
+                        if ( log.isDebugEnabled() )
+                        {
+                            log.debug( "Pop grammar {}, state = {}", container.getStates().getGrammarName( currentGrammar ), 
+                                    currentGrammar.getStatesEnum().getState( container.getCurrentGrammarType(), currentState ) );
+                        }
+                        
+                        currentState = container.restoreGrammar();
+                        continue;
+                    }
+                    else
+                    {
+                        String msg = "Cannot pop the grammar " + 
+                                      container.getStates().getGrammarName( currentGrammar ) +
+                                      " for state " + 
+                                      currentGrammar.getStatesEnum().getState( container.getCurrentGrammarType(), currentState );
+                        // We can't pop the grammar
+                        log.error( msg );
+                        throw new DecoderException( msg );
+                    }
                 }
             }
 
@@ -191,6 +211,11 @@
             if ( ( ( nextState & IStates.GRAMMAR_SWITCH_MASK ) != 0 ) &&
                     ( nextState != IStates.END_STATE ) )
             {
+
+                if ( transition.hasAction() )
+                {
+                    transition.getAction().action( container );
+                }
 
                 if ( log.isDebugEnabled() )
                 {