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/08/22 01:19:48 UTC

svn commit: r234389 - /directory/shared/ldap/branches/new-codec-integration/apache2-provider/src/java/main/org/apache/asn1new/ldap/TwixDecoder.java

Author: elecharny
Date: Sun Aug 21 16:19:45 2005
New Revision: 234389

URL: http://svn.apache.org/viewcvs?rev=234389&view=rev
Log:
- Created the class
- implemented the decoding of a Stream

Modified:
    directory/shared/ldap/branches/new-codec-integration/apache2-provider/src/java/main/org/apache/asn1new/ldap/TwixDecoder.java

Modified: directory/shared/ldap/branches/new-codec-integration/apache2-provider/src/java/main/org/apache/asn1new/ldap/TwixDecoder.java
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/new-codec-integration/apache2-provider/src/java/main/org/apache/asn1new/ldap/TwixDecoder.java?rev=234389&r1=234388&r2=234389&view=diff
==============================================================================
--- directory/shared/ldap/branches/new-codec-integration/apache2-provider/src/java/main/org/apache/asn1new/ldap/TwixDecoder.java (original)
+++ directory/shared/ldap/branches/new-codec-integration/apache2-provider/src/java/main/org/apache/asn1new/ldap/TwixDecoder.java Sun Aug 21 16:19:45 2005
@@ -3,15 +3,27 @@
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 
+import org.apache.asn1.ber.digester.BERDigester;
 import org.apache.asn1.codec.DecoderException;
 import org.apache.asn1.codec.stateful.DecoderCallback;
 import org.apache.asn1.codec.stateful.DecoderMonitor;
+import org.apache.asn1.codec.stateful.StatefulDecoder;
+import org.apache.asn1new.ber.Asn1Decoder;
+import org.apache.asn1new.ber.containers.IAsn1Container;
+import org.apache.asn1new.ber.tlv.TLVStateEnum;
+import org.apache.asn1new.ldap.codec.LdapDecoder;
+import org.apache.asn1new.ldap.codec.LdapMessageContainer;
+import org.apache.ldap.common.berlib.asn1.decoder.LdapDigesterFactory;
+import org.apache.ldap.common.message.Message;
 import org.apache.ldap.common.message.spi.Provider;
 import org.apache.ldap.common.message.spi.ProviderDecoder;
 import org.apache.ldap.common.message.spi.ProviderException;
 
 public class TwixDecoder implements ProviderDecoder {
     private final Provider provider;
+    
+    private final LdapMessageContainer ldapMessageContainer;
+    private final Asn1Decoder ldapDecoder;
 
     /**
      * Creates an instance of a Twix Decoder implementation.
@@ -21,6 +33,8 @@
     public TwixDecoder( Provider provider )
     {
         this.provider = provider;
+        ldapMessageContainer = new LdapMessageContainer();
+        ldapDecoder = new LdapDecoder();
     }
 
     public void decode( Object encoded ) throws DecoderException
@@ -41,10 +55,53 @@
                     "ByteBuffer argument but got a " + encoded.getClass() );
         }
 
-        LdapDecoder.decode( buf );
+       	ldapDecoder.decode( buf, ldapMessageContainer );
+       	
+       	if ( ldapMessageContainer.getState() == TLVStateEnum.PDU_DECODED )
+       	{
+       		// Send the result to the callback.
+       		// TO BE DONE
+       	}
     }
     
     /**
+     * Feeds the bytes within the input stream to the digester to generate the
+     * resultant decoded Message.
+     *
+     * @param in
+     * @throws ProviderException
+     */
+    private void digest( InputStream in )
+            throws ProviderException
+    {
+        byte[] buf = null;
+
+        try
+        {
+            int amount = -1;
+            
+            while( in.available() > 0 )
+            {
+                buf = new byte[in.available()];
+
+                if ( ( amount = in.read( buf ) ) == -1 )
+                {
+                    break;
+                }
+
+                ldapDecoder.decode( ByteBuffer.wrap( buf, 0, amount ), ldapMessageContainer );
+            }
+        }
+        catch( Exception e )
+        {
+            ProviderException pe =  new ProviderException( provider,
+                "Twix decoder failure!" ) ;
+            pe.addThrowable( e ) ;
+            throw pe ;
+        }
+    }
+
+    /**
      * Decodes a PDU from an input stream into a Snickers compiler generated
      * stub envelope.
      *
@@ -54,7 +111,53 @@
      */
     public Object decode( Object lock, InputStream in ) throws ProviderException
     {
-    	return null;
+        if( lock == null )
+        {
+        	digest( in );
+        	
+           	if ( ldapMessageContainer.getState() == TLVStateEnum.PDU_DECODED )
+           	{
+           		return ldapMessageContainer.getLdapMessage();
+           	}
+           	else
+           	{
+    			ProviderException pe =  new ProviderException( provider, "Twix decoder failure!" ) ;
+    			pe.addThrowable( new DecoderException( "The input stream does not contain a full PDU" ) ) ;
+    			throw pe ;
+           	}
+        }
+        else
+        {
+			try
+	        {
+				// Synchronize on the input lock object to prevent concurrent reads
+				synchronized ( lock )
+	            {
+					digest( in );
+	
+					// Notify/awaken threads waiting to read from input stream
+					lock.notifyAll() ;
+				}
+			}
+	        catch( Exception e )
+	        {
+				ProviderException pe =  new ProviderException( provider,
+	                "Twix decoder failure!" ) ;
+	            pe.addThrowable( e ) ;
+	            throw pe ;
+			}
+	
+           	if ( ldapMessageContainer.getState() == TLVStateEnum.PDU_DECODED )
+           	{
+           		return ldapMessageContainer.getLdapMessage();
+           	}
+           	else
+           	{
+				ProviderException pe =  new ProviderException( provider, "Twix decoder failure!" ) ;
+				pe.addThrowable( new DecoderException( "The input stream does not contain a full PDU" ) ) ;
+				throw pe ;
+           	}
+        }
     }
     
     /**