You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2004/09/01 07:20:24 UTC
svn commit: rev 37308 - incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap
Author: akarasulu
Date: Tue Aug 31 22:20:23 2004
New Revision: 37308
Modified:
incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/SnickersDecoder.java
Log:
Added code to now make provider decoder's stateful to chunk decode as well
as batch decode.
Modified: incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/SnickersDecoder.java
==============================================================================
--- incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/SnickersDecoder.java (original)
+++ incubator/directory/snickers/trunk/ldap-ber-provider/src/java/org/apache/snickers/ldap/SnickersDecoder.java Tue Aug 31 22:20:23 2004
@@ -17,7 +17,7 @@
package org.apache.snickers.ldap;
-import org.apache.ldap.common.message.spi.DecoderSpi;
+import org.apache.ldap.common.message.spi.ProviderDecoder;
import org.apache.ldap.common.message.spi.ProviderException;
import org.apache.ldap.common.message.spi.Provider;
import org.apache.ldap.common.message.Message;
@@ -25,6 +25,8 @@
import org.apache.snickers.ber.digester.BERDigester;
import org.apache.commons.codec.stateful.DecoderCallback;
import org.apache.commons.codec.stateful.StatefulDecoder;
+import org.apache.commons.codec.stateful.DecoderMonitor;
+import org.apache.commons.codec.DecoderException;
import org.apache.snickers.ldap.decoder.LdapDigesterFactory;
import java.io.InputStream;
@@ -37,11 +39,10 @@
* @author <a href="mailto:directory-dev@incubator.apache.org"> Apache Directory
* Project</a> $Rev$
*/
-public class SnickersDecoder implements DecoderSpi
+public class SnickersDecoder implements ProviderDecoder
{
private final Provider provider;
private final BERDigester digester;
- private final DigesterCallback cb;
// ------------------------------------------------------------------------
@@ -50,7 +51,7 @@
/**
- * Creates an instance of a Snickers DecoderSpi implementation.
+ * Creates an instance of a Snickers Decoder implementation.
*
* @param provider the owning provider.
*/
@@ -59,13 +60,11 @@
this.provider = provider;
LdapDigesterFactory factory = LdapDigesterFactory.getSingleton();
digester = factory.create();
- cb = new DigesterCallback();
- digester.setCallback( cb );
}
/**
- * Gets the Provider that this DecoderSpi implementation is part of.
+ * Gets the Provider that this Decoder implementation is part of.
*
* @return the owning provider.
*/
@@ -76,25 +75,66 @@
// ------------------------------------------------------------------------
- // DecoderSpi Interface Method Implementations
+ // Decoder Interface Method Implementations
// ------------------------------------------------------------------------
+ public void decode( Object encoded ) throws DecoderException
+ {
+ ByteBuffer buf = null;
+
+ if ( encoded instanceof ByteBuffer )
+ {
+ buf = ( ByteBuffer ) encoded;
+ }
+ else if ( encoded instanceof byte[] )
+ {
+ buf = ByteBuffer.wrap( ( byte[] ) encoded );
+ }
+ else
+ {
+ throw new DecoderException( "Expected either a byte[] or " +
+ "ByteBuffer argument but got a " + encoded.getClass() );
+ }
+
+ digester.decode( buf );
+ }
+
+
+ public void setCallback( DecoderCallback cb )
+ {
+ digester.setCallback( cb );
+ }
+
+
+ public void setDecoderMonitor( DecoderMonitor monitor )
+ {
+ digester.setDecoderMonitor( monitor );
+ }
+
+
/**
* Decodes a PDU from an input stream into a Snickers compiler generated
* stub envelope.
*
* @param lock lock object used to exclusively read from the input stream
* @param in the input stream to read and decode PDU bytes from
- * @return org.apache.ldap.common.berlib.snacc.ldap_v3.LDAPMessage snacc stub instance
+ * @return return decoded stub
*/
public Object decode( Object lock, InputStream in )
throws ProviderException
{
+ LdapDigesterFactory factory = LdapDigesterFactory.getSingleton();
+
+ // @todo we should probably pool digesters for performance
+ BERDigester digesterTmp = factory.create();
+ DigesterCallback dcb = new DigesterCallback();
+ digesterTmp.setCallback( dcb );
+
if( lock == null )
{
- digest( in );
- return cb.getMessage() ;
+ digest( digesterTmp, in );
+ return dcb.getMessage() ;
}
try
@@ -102,7 +142,7 @@
// Synchronize on the input lock object to prevent concurrent reads
synchronized ( lock )
{
- digest( in );
+ digest( digesterTmp, in );
// Notify/awaken threads waiting to read from input stream
lock.notifyAll() ;
@@ -117,7 +157,7 @@
throw pe ;
}
- return cb.getMessage() ;
+ return dcb.getMessage() ;
}
@@ -128,7 +168,8 @@
* @param in
* @throws ProviderException
*/
- private void digest( InputStream in ) throws ProviderException
+ private void digest( BERDigester digesterTmp, InputStream in )
+ throws ProviderException
{
byte[] buf = null;
@@ -144,7 +185,7 @@
break;
}
- digester.decode( ByteBuffer.wrap( buf, 0, amount ) );
+ digesterTmp.decode( ByteBuffer.wrap( buf, 0, amount ) );
}
}
catch( Exception e )