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/04/21 18:34:24 UTC
svn commit: r395939 -
/directory/trunks/shared/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/StoredProcedure.java
Author: elecharny
Date: Fri Apr 21 09:34:22 2006
New Revision: 395939
URL: http://svn.apache.org/viewcvs?rev=395939&view=rev
Log:
Added the encode and computeLength methods
Modified:
directory/trunks/shared/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/StoredProcedure.java
Modified: directory/trunks/shared/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/StoredProcedure.java
URL: http://svn.apache.org/viewcvs/directory/trunks/shared/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/StoredProcedure.java?rev=395939&r1=395938&r2=395939&view=diff
==============================================================================
--- directory/trunks/shared/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/StoredProcedure.java (original)
+++ directory/trunks/shared/ldap/src/main/java/org/apache/directory/shared/ldap/codec/extended/operations/StoredProcedure.java Fri Apr 21 09:34:22 2006
@@ -18,16 +18,27 @@
package org.apache.directory.shared.ldap.codec.extended.operations;
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
+import org.apache.directory.shared.asn1.Asn1Object;
+import org.apache.directory.shared.asn1.ber.tlv.Length;
+import org.apache.directory.shared.asn1.ber.tlv.UniversalTag;
+import org.apache.directory.shared.asn1.ber.tlv.Value;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.ldap.util.StringTools;
+
/**
* Stored Procedure Extended Operation bean
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
-public class StoredProcedure
+public class StoredProcedure extends Asn1Object
{
private String language;
@@ -36,7 +47,21 @@
private ArrayList parameters;
private transient StoredProcedureParameter currentParameter;
+
+ /** The stored procedure length */
+ private transient int storedProcedureLength;
+
+ /** The parameters length */
+ private transient int parametersLength;
+
+ /** The list of all parameter lengths */
+ private transient List parameterLength;
+
+ /** The list of all parameter type lengths */
+ private transient List paramTypeLength;
+ /** The list of all parameter value lengths */
+ private transient List paramValueLength;
public String getLanguage()
{
@@ -124,4 +149,179 @@
}
}
+ /**
+ * Compute the StoredProcedure length
+ *
+ * 0x30 L1
+ * |
+ * +--> 0x04 L2 language
+ * +--> 0x04 L3 procedure
+ * [+--> 0x30 L4 (parameters)
+ * |
+ * +--> 0x30 L5-1 (parameter)
+ * | |
+ * | +--> 0x04 L6-1 type
+ * | +--> 0x04 L7-1 value
+ * |
+ * +--> 0x30 L5-2 (parameter)
+ * | |
+ * | +--> 0x04 L6-2 type
+ * | +--> 0x04 L7-2 value
+ * |
+ * +--> ...
+ * |
+ * +--> 0x30 L5-m (parameter)
+ * |
+ * +--> 0x04 L6-m type
+ * +--> 0x04 L7-m value
+ */
+ public int computeLength()
+ {
+ // The language
+ byte[] languageBytes = StringTools.getBytesUtf8( language );
+
+ int languageLength = 1 + Length.getNbBytes( languageBytes.length )
+ + languageBytes.length;
+
+ // The procedure
+ int procedureLength = 1 + Length.getNbBytes( procedure.length )
+ + procedure.length;
+
+ //int localParametersLength = 0;
+
+ // Compute parameters length value
+ if ( parameters != null )
+ {
+ parameterLength = new LinkedList();
+ paramTypeLength = new LinkedList();
+ paramValueLength = new LinkedList();
+
+ Iterator params = parameters.iterator();
+
+ while ( params.hasNext() )
+ {
+ int localParameterLength = 0;
+ int localParamTypeLength = 0;
+ int localParamValueLength = 0;
+
+ StoredProcedureParameter spParam = (StoredProcedureParameter)params.next();
+
+ localParamTypeLength = 1 + Length.getNbBytes( spParam.type.length ) + spParam.type.length;
+ localParamValueLength = 1 + Length.getNbBytes( spParam.value.length ) + spParam.value.length;
+
+ localParameterLength = localParamTypeLength + localParamValueLength;
+
+ parametersLength += 1 + Length.getNbBytes( localParameterLength ) + localParameterLength;
+
+ parameterLength.add( new Integer( localParameterLength ) );
+ paramTypeLength.add( new Integer( localParamTypeLength ) );
+ paramValueLength.add( new Integer( localParamValueLength ) );
+ }
+ }
+
+ int localParametersLength = 1 + Length.getNbBytes( parametersLength ) + parametersLength;
+ storedProcedureLength = languageLength + procedureLength + localParametersLength;
+
+ return 1 + Length.getNbBytes( storedProcedureLength ) + storedProcedureLength;
+ }
+
+ /**
+ * Encode the StoredProcedure message to a PDU.
+ *
+ * @param buffer The buffer where to put the PDU
+ * @return The PDU.
+ */
+ public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+ {
+ // Allocate the bytes buffer.
+ ByteBuffer bb = ByteBuffer.allocate( computeLength() );
+
+ try
+ {
+ // The StoredProcedure Tag
+ bb.put( UniversalTag.SEQUENCE_TAG );
+ bb.put( Length.getBytes( storedProcedureLength ) );
+
+ // The language
+ Value.encode( bb, language );
+
+ // The procedure
+ Value.encode( bb, procedure );
+
+ // The parameters sequence
+ bb.put( UniversalTag.SEQUENCE_TAG );
+ bb.put( Length.getBytes( parametersLength ) );
+
+ // The parameters list
+ if ( ( parameters != null ) && ( parameters.size() != 0 ) )
+ {
+ int parameterNumber = 0;
+ Iterator params = parameters.iterator();
+
+ while ( params.hasNext() )
+ {
+ StoredProcedureParameter spParam = (StoredProcedureParameter)params.next();
+
+ // The parameter sequence
+ bb.put( UniversalTag.SEQUENCE_TAG );
+ int localParameterLength = ( ( Integer ) parameterLength.get( parameterNumber ) ).intValue();
+ bb.put( Length.getBytes( localParameterLength ) );
+
+ // The parameter type
+ Value.encode( bb, spParam.type );
+
+ // The parameter value
+ Value.encode( bb, spParam.value );
+
+ // Go to the next parameter;
+ parameterNumber++;
+ }
+ }
+ }
+ catch ( BufferOverflowException boe )
+ {
+ throw new EncoderException( "The PDU buffer size is too small !" );
+ }
+
+ return bb;
+ }
+
+
+ /**
+ * Returns the StoredProcedure string
+ *
+ * @return The StoredProcedure string
+ */
+ public String toString()
+ {
+
+ StringBuffer sb = new StringBuffer();
+
+ sb.append( " StoredProcedure\n" );
+ sb.append( " Language : '" ).append( language ).append( "'\n" );
+ sb.append( " Procedure\n" ).append( StringTools.utf8ToString( procedure ) ).append( "'\n" );
+
+ if ( ( parameters == null ) || ( parameters.size() == 0 ) )
+ {
+ sb.append( " No parameters\n" );
+ }
+ else
+ {
+ sb.append( " Parameters\n" );
+
+ Iterator params = parameters.iterator();
+ int i = 1;
+
+ while ( params.hasNext() )
+ {
+ StoredProcedureParameter spParam = (StoredProcedureParameter)params.next();
+
+ sb.append( " type[" ).append( i ) .append( "] : '" ).append( spParam.type ).append( "'\n" );
+ sb.append( " value[" ).append( i ) .append( "] : '" ).
+ append( StringTools.dumpBytes( spParam.value ) ).append( "'\n" );
+ }
+ }
+
+ return sb.toString();
+ }
}