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 2011/10/05 22:27:17 UTC
svn commit: r1179420 - in /directory/shared/trunk/ldap:
codec/core/src/main/java/org/apache/directory/shared/ldap/codec/api/
codec/core/src/test/java/org/apache/directory/shared/ldap/codec/
extras/sp/src/main/java/org/apache/directory/shared/ldap/sp/ n...
Author: elecharny
Date: Wed Oct 5 20:27:16 2011
New Revision: 1179420
URL: http://svn.apache.org/viewvc?rev=1179420&view=rev
Log:
o Removed a layer in the LdapDecoder hierarchy
o Some code cleaning
Modified:
directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/shared/ldap/codec/api/LdapDecoder.java
directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java
directory/shared/trunk/ldap/extras/sp/src/main/java/org/apache/directory/shared/ldap/sp/JavaStoredProcUtils.java
directory/shared/trunk/ldap/net/mina/src/main/java/org/apache/directory/shared/ldap/codec/protocol/mina/LdapProtocolDecoder.java
Modified: directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/shared/ldap/codec/api/LdapDecoder.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/shared/ldap/codec/api/LdapDecoder.java?rev=1179420&r1=1179419&r2=1179420&view=diff
==============================================================================
--- directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/shared/ldap/codec/api/LdapDecoder.java (original)
+++ directory/shared/trunk/ldap/codec/core/src/main/java/org/apache/directory/shared/ldap/codec/api/LdapDecoder.java Wed Oct 5 20:27:16 2011
@@ -22,15 +22,12 @@ package org.apache.directory.shared.ldap
import java.io.InputStream;
import java.nio.ByteBuffer;
-import java.util.List;
import org.apache.directory.shared.asn1.DecoderException;
import org.apache.directory.shared.asn1.ber.Asn1Decoder;
import org.apache.directory.shared.asn1.ber.tlv.TLVStateEnum;
import org.apache.directory.shared.i18n.I18n;
-import org.apache.directory.shared.ldap.model.exception.ResponseCarryingMessageException;
import org.apache.directory.shared.ldap.model.message.Message;
-import org.apache.directory.shared.util.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -119,7 +116,7 @@ public class LdapDecoder
* is stored into this container
* @param decodedMessages The list of decoded messages
* @throws Exception If the decoding failed
- */
+ *
public void decode( ByteBuffer buffer, LdapMessageContainer<MessageDecorator<? extends Message>> messageContainer, List<Message> decodedMessages ) throws DecoderException
{
buffer.mark();
@@ -190,5 +187,5 @@ public class LdapDecoder
}
}
}
- }
+ }*/
}
Modified: directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java?rev=1179420&r1=1179419&r2=1179420&view=diff
==============================================================================
--- directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java (original)
+++ directory/shared/trunk/ldap/codec/core/src/test/java/org/apache/directory/shared/ldap/codec/LdapDecoderTest.java Wed Oct 5 20:27:16 2011
@@ -35,13 +35,16 @@ import org.apache.directory.shared.asn1.
import org.apache.directory.shared.ldap.codec.api.LdapDecoder;
import org.apache.directory.shared.ldap.codec.api.LdapMessageContainer;
import org.apache.directory.shared.ldap.codec.api.MessageDecorator;
+import org.apache.directory.shared.ldap.codec.api.ResponseCarryingException;
import org.apache.directory.shared.ldap.codec.decorators.BindRequestDecorator;
import org.apache.directory.shared.ldap.codec.osgi.AbstractCodecServiceTest;
+import org.apache.directory.shared.ldap.model.exception.ResponseCarryingMessageException;
import org.apache.directory.shared.ldap.model.message.BindRequest;
import org.apache.directory.shared.ldap.model.message.Message;
import org.apache.directory.shared.util.Strings;
import org.apache.mina.core.session.DummySession;
import org.apache.mina.core.session.IoSession;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -58,6 +61,70 @@ import com.mycila.junit.concurrent.Concu
@Concurrency()
public class LdapDecoderTest extends AbstractCodecServiceTest
{
+ /** The ASN 1 decoder instance */
+ private static Asn1Decoder asn1Decoder;
+
+
+ @BeforeClass
+ public static void init()
+ {
+ asn1Decoder = new Asn1Decoder();
+ }
+
+
+ /**
+ * Decode an incoming buffer into LDAP messages. The result can be 0, 1 or many
+ * LDAP messages, which will be stored into the array the caller has created.
+ *
+ * @param buffer The incoming byte buffer
+ * @param messageContainer The LdapMessageContainer which will be used to store the
+ * message being decoded. If the message is not fully decoded, the ucrrent state
+ * is stored into this container
+ * @param decodedMessages The list of decoded messages
+ * @throws Exception If the decoding failed
+ */
+ private void decode( ByteBuffer buffer, LdapMessageContainer<MessageDecorator<? extends Message>> messageContainer, List<Message> decodedMessages ) throws DecoderException
+ {
+ buffer.mark();
+
+ while ( buffer.hasRemaining() )
+ {
+ try
+ {
+ asn1Decoder.decode( buffer, messageContainer );
+
+ if ( messageContainer.getState() == TLVStateEnum.PDU_DECODED )
+ {
+ Message message = messageContainer.getMessage();
+
+ decodedMessages.add( message );
+
+ messageContainer.clean();
+ }
+ }
+ catch ( DecoderException de )
+ {
+ buffer.clear();
+ messageContainer.clean();
+
+ if ( de instanceof ResponseCarryingException )
+ {
+ // Transform the DecoderException message to a MessageException
+ ResponseCarryingMessageException rcme = new ResponseCarryingMessageException( de.getMessage() );
+ rcme.setResponse( ( ( ResponseCarryingException ) de ).getResponse() );
+
+ throw rcme;
+ }
+ else
+ {
+ // TODO : This is certainly not the way we should handle such an exception !
+ throw new ResponseCarryingException( de.getMessage() );
+ }
+ }
+ }
+ }
+
+
/**
* Test the decoding of a full PDU
*/
@@ -118,7 +185,6 @@ public class LdapDecoderTest extends Abs
@Test
public void testDecode2Messages() throws Exception
{
- LdapDecoder ldapDecoder = new LdapDecoder();
LdapMessageContainer<MessageDecorator<? extends Message>> container =
new LdapMessageContainer<MessageDecorator<? extends Message>>( codec );
@@ -163,7 +229,7 @@ public class LdapDecoderTest extends Abs
// Decode a BindRequest PDU
try
{
- ldapDecoder.decode( stream, container, result );
+ decode( stream, container, result );
}
catch ( DecoderException de )
{
Modified: directory/shared/trunk/ldap/extras/sp/src/main/java/org/apache/directory/shared/ldap/sp/JavaStoredProcUtils.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/extras/sp/src/main/java/org/apache/directory/shared/ldap/sp/JavaStoredProcUtils.java?rev=1179420&r1=1179419&r2=1179420&view=diff
==============================================================================
--- directory/shared/trunk/ldap/extras/sp/src/main/java/org/apache/directory/shared/ldap/sp/JavaStoredProcUtils.java (original)
+++ directory/shared/trunk/ldap/extras/sp/src/main/java/org/apache/directory/shared/ldap/sp/JavaStoredProcUtils.java Wed Oct 5 20:27:16 2011
@@ -90,7 +90,7 @@ public final class JavaStoredProcUtils
}
finally
{
- IOUtils.closeQuietly( in );
+ IOUtils.closeQuietly( in );
}
return buf;
Modified: directory/shared/trunk/ldap/net/mina/src/main/java/org/apache/directory/shared/ldap/codec/protocol/mina/LdapProtocolDecoder.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/net/mina/src/main/java/org/apache/directory/shared/ldap/codec/protocol/mina/LdapProtocolDecoder.java?rev=1179420&r1=1179419&r2=1179420&view=diff
==============================================================================
--- directory/shared/trunk/ldap/net/mina/src/main/java/org/apache/directory/shared/ldap/codec/protocol/mina/LdapProtocolDecoder.java (original)
+++ directory/shared/trunk/ldap/net/mina/src/main/java/org/apache/directory/shared/ldap/codec/protocol/mina/LdapProtocolDecoder.java Wed Oct 5 20:27:16 2011
@@ -20,18 +20,27 @@
package org.apache.directory.shared.ldap.codec.protocol.mina;
+import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
+import org.apache.directory.shared.asn1.DecoderException;
+import org.apache.directory.shared.asn1.ber.Asn1Decoder;
+import org.apache.directory.shared.asn1.ber.tlv.TLVStateEnum;
import org.apache.directory.shared.ldap.codec.api.LdapDecoder;
import org.apache.directory.shared.ldap.codec.api.LdapMessageContainer;
import org.apache.directory.shared.ldap.codec.api.MessageDecorator;
+import org.apache.directory.shared.ldap.codec.api.ResponseCarryingException;
+import org.apache.directory.shared.ldap.model.exception.ResponseCarryingMessageException;
import org.apache.directory.shared.ldap.model.message.Message;
+import org.apache.directory.shared.util.Strings;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
@@ -41,9 +50,15 @@ import org.apache.mina.filter.codec.Prot
*/
public class LdapProtocolDecoder implements ProtocolDecoder
{
- /** The stateful decoder */
- private LdapDecoder decoder;
-
+ /** The logger */
+ private static Logger LOG = LoggerFactory.getLogger( LdapDecoder.class );
+
+ /** A speedup for logger */
+ private static final boolean IS_DEBUG = LOG.isDebugEnabled();
+
+ /** The ASN 1 decoder instance */
+ private Asn1Decoder asn1Decoder;
+
/**
* Creates a new instance of LdapProtocolEncoder.
@@ -52,7 +67,7 @@ public class LdapProtocolDecoder impleme
*/
public LdapProtocolDecoder()
{
- this.decoder = new LdapDecoder();
+ asn1Decoder = new Asn1Decoder();
}
@@ -76,7 +91,7 @@ public class LdapProtocolDecoder impleme
List<Message> decodedMessages = new ArrayList<Message>();
ByteBuffer buf = in.buf();
- decoder.decode( buf, messageContainer, decodedMessages );
+ decode( buf, messageContainer, decodedMessages );
for ( Message message : decodedMessages )
{
@@ -86,6 +101,90 @@ public class LdapProtocolDecoder impleme
/**
+ * Decode an incoming buffer into LDAP messages. The result can be 0, 1 or many
+ * LDAP messages, which will be stored into the array the caller has created.
+ *
+ * @param buffer The incoming byte buffer
+ * @param messageContainer The LdapMessageContainer which will be used to store the
+ * message being decoded. If the message is not fully decoded, the ucrrent state
+ * is stored into this container
+ * @param decodedMessages The list of decoded messages
+ * @throws Exception If the decoding failed
+ */
+ private void decode( ByteBuffer buffer, LdapMessageContainer<MessageDecorator<? extends Message>> messageContainer, List<Message> decodedMessages ) throws DecoderException
+ {
+ buffer.mark();
+
+ while ( buffer.hasRemaining() )
+ {
+ try
+ {
+ if ( IS_DEBUG )
+ {
+ LOG.debug( "Decoding the PDU : " );
+
+ int size = buffer.limit();
+ int position = buffer.position();
+ int pduLength = size - position;
+
+ byte[] array = new byte[pduLength];
+
+ System.arraycopy(buffer.array(), position, array, 0, pduLength);
+
+ buffer.position( size );
+
+ if ( array.length == 0 )
+ {
+ LOG.debug( "NULL buffer, what the HELL ???" );
+ }
+ else
+ {
+ LOG.debug( Strings.dumpBytes(array) );
+ }
+
+ buffer.reset();
+ }
+
+ asn1Decoder.decode( buffer, messageContainer );
+
+ if ( messageContainer.getState() == TLVStateEnum.PDU_DECODED )
+ {
+ if ( IS_DEBUG )
+ {
+ LOG.debug( "Decoded LdapMessage : " + messageContainer.getMessage() );
+ }
+
+ Message message = messageContainer.getMessage();
+
+ decodedMessages.add( message );
+
+ messageContainer.clean();
+ }
+ }
+ catch ( DecoderException de )
+ {
+ buffer.clear();
+ messageContainer.clean();
+
+ if ( de instanceof ResponseCarryingException )
+ {
+ // Transform the DecoderException message to a MessageException
+ ResponseCarryingMessageException rcme = new ResponseCarryingMessageException( de.getMessage() );
+ rcme.setResponse( ( ( ResponseCarryingException ) de ).getResponse() );
+
+ throw rcme;
+ }
+ else
+ {
+ // TODO : This is certainly not the way we should handle such an exception !
+ throw new ResponseCarryingException( de.getMessage() );
+ }
+ }
+ }
+ }
+
+
+ /**
* {@inheritDoc}
*/
public void finishDecode( IoSession session, ProtocolDecoderOutput out ) throws Exception