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 2005/04/15 07:50:02 UTC

svn commit: r161407 - directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/grammar/AbstractGrammar.java

Author: elecharny
Date: Thu Apr 14 22:50:02 2005
New Revision: 161407

URL: http://svn.apache.org/viewcvs?view=rev&rev=161407
Log:
Changed the ExecuteAction to deal with grammar switches.
Corrected the checkLength method

Modified:
    directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/grammar/AbstractGrammar.java

Modified: directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/grammar/AbstractGrammar.java
URL: http://svn.apache.org/viewcvs/directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/grammar/AbstractGrammar.java?view=diff&r1=161406&r2=161407
==============================================================================
--- directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/grammar/AbstractGrammar.java (original)
+++ directory/sandbox/trunk/asn1-new-codec/src/java/org/apache/asn1/ber/grammar/AbstractGrammar.java Thu Apr 14 22:50:02 2005
@@ -17,8 +17,11 @@
 package org.apache.asn1.ber.grammar;
 
 import org.apache.asn1.ber.containers.IAsn1Container;
+import org.apache.asn1.ber.tlv.TLV;
 import org.apache.asn1.ber.tlv.Tag;
 import org.apache.asn1.ldap.codec.DecoderException;
+import org.apache.asn1.ldap.pojo.AbstractPOJO;
+import org.apache.asn1.ldap.pojo.LdapPOJO;
 import org.apache.asn1.util.StringUtils;
 
 import org.apache.log4j.Logger;
@@ -30,7 +33,7 @@
  * 
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
-public class AbstractGrammar
+public abstract class AbstractGrammar implements IGrammar
 {
     //~ Static fields/initializers -----------------------------------------------------------------
 
@@ -68,6 +71,49 @@
     }
     
     /**
+     * Checks the Length. If the current TLV length is above the expected length of the 
+     * PDU, an exception is thrown.
+     * 
+     * The current POJO contains the sum of all included POJOs and element, which is
+     * compared with the PDU's expected length (the Length part of the PDU containing the POJO).
+     * 
+     * @param ldapPOJO The POJO that is being decoded.
+     * @param tlv The current TLV
+     * @throws DecoderException Thrown if the expected length is lower than the sum
+     * of all the included elements.
+     */
+    protected void checkLength(LdapPOJO ldapPOJO, TLV tlv) throws DecoderException
+	{
+	    // Create a new expected Length
+	    int expectedLength = tlv.getLength().getLength();
+
+	    int tlvLength = tlv.getSize();
+	    
+	    if ( DEBUG )
+	    {
+	        log.debug("Expected Length = " + ((AbstractPOJO)ldapPOJO).getExpectedLength() + 
+	                	", current length = " + ((AbstractPOJO)ldapPOJO).getCurrentLength() + 
+	                	", added length = " + expectedLength + 
+	                	", tlv length = " + tlvLength);
+	    }
+
+	    // We already are at the top level.
+	    // An exception will be thrown if the current length exceed the expected length
+		((AbstractPOJO)ldapPOJO).addLength(expectedLength + tlvLength);
+	}
+
+    /**
+     * Get the transition associated with the state and tag
+     * @param state The current state
+     * @param tag The current tag
+     * @return A valid transition if any, or null.
+     */
+    public GrammarTransition getTransition(int state, int tag)
+    {
+        return transitions[state][tag & 0x00FF];
+    }
+    
+    /**
      * The main function. This is where an action is executed. If the 
      * action is null, nothing is done.
      *
@@ -88,31 +134,44 @@
         Tag               tag        = container.getCurrentTLV().getTag();
         byte              tagByte    = tag.getTagByte();
         
-        if ((currentState & StatesEnum.GRAMMAR_SWITCH_MASK) != 0)
-        {
-            container.switchGrammar(currentState & StatesEnum.GRAMMAR_SWITCH_MASK);
-            currentState = StatesEnum.INIT_GRAMMAR_STATE;
-        }
-        
-        GrammarTransition transition = transitions[currentState][tagByte & 0x00FF];
-
-        if ( transition == null )
-        {
-            throw new DecoderException(
-                "Bad transition from state " + StatesEnum.getState( container.getCurrentGrammar(), currentState ) + ", tag " +
-                StringUtils.dumpByte( tag.getTagByte() ) );
-        }
-
-        if ( DEBUG )
-        {
-            log.debug( transition.toString() );
-        }
-
-        container.setTransition( transition.getNextState() );
-
-        if ( transition.hasAction() )
+        while (true)
         {
-            transition.getAction().action( container );
+	        GrammarTransition transition = ((AbstractGrammar)container.getGrammar()).getTransition(currentState, tagByte & 0x00FF);
+	        
+	        if ( transition == null )
+	        {
+	            throw new DecoderException(
+	                "Bad transition from state " + StatesEnum.getState( container.getCurrentGrammarType() , currentState ) + ", tag " +
+	                StringUtils.dumpByte( tag.getTagByte() ) );
+	        }
+	
+	        if ( DEBUG )
+	        {
+	            log.debug( transition.toString(container.getCurrentGrammarType()) );
+	        }
+	
+	        int nextState = transition.getNextState();
+	        
+	        if (((nextState & StatesEnum.GRAMMAR_SWITCH_MASK) != 0) && (nextState != -1) )
+	        {
+	            // We have a grammar switch, so we change the current state to the initial
+	            // state in the new grammar and loop.
+	            container.switchGrammar(nextState & StatesEnum.GRAMMAR_SWITCH_MASK);
+	            currentState = StatesEnum.INIT_GRAMMAR_STATE;
+	        } 
+	        else
+	        {
+	            // This is not a grammar switch, so we execute the 
+	            // action if we have one, and we quit the loop.
+		        container.setTransition( nextState );
+		    	
+    	        if ( transition.hasAction() )
+    	        {
+    	            transition.getAction().action( container );
+    	        }
+    	        
+    	        break;
+	        }
         }
     }
 }