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 2018/09/20 10:20:48 UTC

[directory-ldap-api] branch master updated: Many fixes for the Transaction extended operations

This is an automated email from the ASF dual-hosted git repository.

elecharny pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/directory-ldap-api.git


The following commit(s) were added to refs/heads/master by this push:
     new 03d2e22  Many fixes for the Transaction extended operations
03d2e22 is described below

commit 03d2e22b032bcdfa622fc4d6144cdae631f89144
Author: Emmanuel Lécharny <el...@symas.com>
AuthorDate: Thu Sep 20 12:20:45 2018 +0200

    Many fixes for the Transaction extended operations
---
 .../java/org/apache/directory/api/i18n/I18n.java   |  1 +
 .../apache/directory/api/i18n/errors.properties    |  3 +-
 .../codec/decorators/ExtendedRequestDecorator.java | 17 ++++---
 .../endTransaction/EndTransactionResponseImpl.java |  8 +--
 .../startTransaction/StartTransactionRequest.java  |  9 ++--
 .../StartTransactionRequestImpl.java               | 17 +++++--
 .../startTransaction/StartTransactionResponse.java |  7 +--
 .../StartTransactionResponseImpl.java              | 31 ++++++++++--
 .../endTransaction/EndTransactionFactory.java      | 38 ++++++++++----
 .../EndTransactionRequestDecorator.java            | 23 +++++++++
 .../EndTransactionResponseDecorator.java           | 10 ++++
 .../startTransaction/StartTransactionFactory.java  | 24 ++++++++-
 .../StartTransactionResponseDecorator.java         | 59 +---------------------
 .../api/ldap/model/message/ExtendedResponse.java   |  8 +++
 .../ldap/model/message/ExtendedResponseImpl.java   |  3 ++
 15 files changed, 158 insertions(+), 100 deletions(-)

diff --git a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
index dba64c2..8dd8a3e 100644
--- a/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
+++ b/i18n/src/main/java/org/apache/directory/api/i18n/I18n.java
@@ -365,6 +365,7 @@ public enum I18n
     ERR_08229_UNEXPECTED_SYNC_INFO( "ERR_08229_UNEXPECTED_SYNC_INFO" ),
     ERR_08230_WHOAMI_PAYLOAD_ENCODING_FAILED( "ERR_08230_WHOAMI_PAYLOAD_ENCODING_FAILED" ),
     ERR_08231_START_TRANSACTION_PAYLOAD_ENCODING_FAILED( "ERR_08231_START_TRANSACTION_PAYLOAD_ENCODING_FAILED" ),
+    ERR_08232_END_TRANSACTION_PAYLOAD_ENCODING_FAILED( "ERR_08232_END_TRANSACTION_PAYLOAD_ENCODING_FAILED" ),
 
     //     intermediate                     8300-8399
     ERR_08300_REFRESH_DONE_DECODING_FAILED( "ERR_08300_REFRESH_DONE_DECODING_FAILED" ),
diff --git a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
index 0b72ea4..0aab4ff 100644
--- a/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
+++ b/i18n/src/main/resources/org/apache/directory/api/i18n/errors.properties
@@ -356,7 +356,8 @@ ERR_08227_AUTHZID_MUST_START_WITH_U_OR_DN=authzId Must starts with either u: or
 ERR_08228_DECORATED_SP_NULL=decorated stored procedure request is null
 ERR_08229_UNEXPECTED_SYNC_INFO=Unexpected SynchronizationInfo: {0}
 ERR_08230_WHOAMI_PAYLOAD_ENCODING_FAILED=Failed to encode payload WhoAmIRequest
-ERR_08231_START_TRANSACTION_PAYLOAD_ENCODING_FAILED=Failed to encode payload StartTransactionRequest
+ERR_08231_START_TRANSACTION_PAYLOAD_ENCODING_FAILED=Failed to encode payload for StartTransactionRequest
+ERR_08232_END_TRANSACTION_PAYLOAD_ENCODING_FAILED=Failed to encode payload for EndTransactionRequest
 
 # api-ldap-extras-codec intermediate 8300-8399
 ERR_08300_REFRESH_DONE_DECODING_FAILED=failed to decode the refreshDone flag for SyncInfoValueControl
diff --git a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java
index e02bc28..2c76968 100644
--- a/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java
+++ b/ldap/codec/core/src/main/java/org/apache/directory/api/ldap/codec/decorators/ExtendedRequestDecorator.java
@@ -181,11 +181,12 @@ public ExtendedRequest addControl( Control control )
         requestNameBytes = Strings.getBytesUtf8( getRequestName() );
 
         extendedRequestLength = 1 + TLV.getNbBytes( requestNameBytes.length ) + requestNameBytes.length;
+        requestValue = getRequestValue();
 
-        if ( getRequestValue() != null )
+        if ( requestValue != null )
         {
-            extendedRequestLength += 1 + TLV.getNbBytes( getRequestValue().length )
-                + getRequestValue().length;
+            extendedRequestLength += 1 + TLV.getNbBytes( requestValue.length )
+                + requestValue.length;
         }
 
         return 1 + TLV.getNbBytes( extendedRequestLength ) + extendedRequestLength;
@@ -227,15 +228,17 @@ public ExtendedRequest addControl( Control control )
             }
 
             // The requestValue, if any
-            if ( getRequestValue() != null )
+            requestValue = getRequestValue();
+            
+            if ( requestValue != null )
             {
                 buffer.put( ( byte ) LdapCodecConstants.EXTENDED_REQUEST_VALUE_TAG );
 
-                buffer.put( TLV.getBytes( getRequestValue().length ) );
+                buffer.put( TLV.getBytes( requestValue.length ) );
 
-                if ( getRequestValue().length != 0 )
+                if ( requestValue.length != 0 )
                 {
-                    buffer.put( getRequestValue() );
+                    buffer.put( requestValue );
                 }
             }
         }
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/endTransaction/EndTransactionResponseImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/endTransaction/EndTransactionResponseImpl.java
index 306436c..b037b2f 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/endTransaction/EndTransactionResponseImpl.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/endTransaction/EndTransactionResponseImpl.java
@@ -89,11 +89,11 @@ public class EndTransactionResponseImpl extends ExtendedResponseImpl implements
     /**
      * Create a new EndTransactionResponseImpl instance
      * 
-     * @param failedMessageId The request's messageId
+     * @param messageId The request's messageId
      */
-    public EndTransactionResponseImpl( int failedMessageId )
+    public EndTransactionResponseImpl( int messageId )
     {
-        super( failedMessageId );
+        super( messageId );
         super.getLdapResult().setMatchedDn( null );
         super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
     }
@@ -106,7 +106,7 @@ public class EndTransactionResponseImpl extends ExtendedResponseImpl implements
     {
         super( EndTransactionRequest.EXTENSION_OID );
         super.getLdapResult().setMatchedDn( null );
-        super.getLdapResult().setResultCode( ResultCodeEnum.UNWILLING_TO_PERFORM );
+        super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
     }
 
 
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequest.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequest.java
index bda2dbe..b506545 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequest.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequest.java
@@ -27,12 +27,11 @@ import org.apache.directory.api.ldap.model.message.ExtendedRequest;
  * The StartTransactionRequest interface. This is for the RFC 5805 Start Transaction Request,
  * which grammar is :
  * <pre>
- * ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
- *              requestName      [0] LDAPOID,
- *              requestValue     [1] OCTET STRING OPTIONAL }
+ * StartTransactionRequest ::= [APPLICATION 23] SEQUENCE {
+ *              requestName      [0] LDAPOID
+ * }
  * </pre>
- * 
- * where 'requestName' is 1.3.6.1.1.21.1 and requestValue is absent.
+ * where 'requestName' is 1.3.6.1.1.21.1.
  *
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  */
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequestImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequestImpl.java
index 1b2038c..500fe0b 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequestImpl.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionRequestImpl.java
@@ -27,11 +27,10 @@ import org.apache.directory.api.ldap.model.message.AbstractExtendedRequest;
  * Implement the extended Start Transaction Request as described in RFC 5805.
  * 
  * It's grammar is :
- * 
  * <pre>
- * ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
- *              requestName      [0] LDAPOID,
- *              requestValue     [1] OCTET STRING OPTIONAL }
+ * StartTransactionRequest ::= [APPLICATION 23] SEQUENCE {
+ *              requestName      [0] LDAPOID
+ * }
  * </pre>
  * 
  * where 'requestName' is 1.3.6.1.1.21.1 and requestValue is absent.
@@ -74,4 +73,14 @@ public class StartTransactionRequestImpl extends AbstractExtendedRequest impleme
 
         return ( StartTransactionResponse ) getResponse();
     }
+
+
+    /**
+     * @see Object#toString()
+     */
+    @Override
+    public String toString()
+    {
+        return "StartTransactionRequest";
+    }
 }
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponse.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponse.java
index 0c9fdbe..b4d1623 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponse.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponse.java
@@ -27,9 +27,8 @@ import org.apache.directory.api.ldap.model.message.ExtendedResponse;
  * The interface for Start Transaction Extended Response. It's described in RFC 5805 :
  * 
  * <pre>
- * ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
+ * StartTransactionResponse ::= [APPLICATION 24] SEQUENCE {
  *            COMPONENTS OF LDAPResult,
- *            responseName     [10] LDAPOID OPTIONAL,
  *            responseValue    [11] OCTET STRING OPTIONAL }
  * </pre>
  * 
@@ -40,10 +39,6 @@ import org.apache.directory.api.ldap.model.message.ExtendedResponse;
  */
 public interface StartTransactionResponse extends ExtendedResponse
 {
-    /** The OID for the Start Transaction extended operation response. */
-    String EXTENSION_OID = StartTransactionRequest.EXTENSION_OID;
-    
-    
     /**
      * @return The transaction ID if success
      */
diff --git a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponseImpl.java b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponseImpl.java
index 8e9f8bb..f0d36a9 100644
--- a/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponseImpl.java
+++ b/ldap/extras/codec-api/src/main/java/org/apache/directory/api/ldap/extras/extended/startTransaction/StartTransactionResponseImpl.java
@@ -32,9 +32,8 @@ import org.apache.directory.api.util.Strings;
  * The interface for Start Transaction Extended Response. It's described in RFC 5805 :
  * 
  * <pre>
- * ExtendedResponse ::= [APPLICATION 24] SEQUENCE {
+ * StartTransactionResponse ::= [APPLICATION 24] SEQUENCE {
  *            COMPONENTS OF LDAPResult,
- *            responseName     [10] LDAPOID OPTIONAL,
  *            responseValue    [11] OCTET STRING OPTIONAL }
  * </pre>
  * 
@@ -58,7 +57,7 @@ public class StartTransactionResponseImpl extends ExtendedResponseImpl implement
      */
     public StartTransactionResponseImpl( int messageId, ResultCodeEnum resultCode, byte[] transactionId )
     {
-        super( messageId, EXTENSION_OID );
+        super( messageId );
 
         switch ( resultCode )
         {
@@ -89,7 +88,7 @@ public class StartTransactionResponseImpl extends ExtendedResponseImpl implement
      */
     public StartTransactionResponseImpl( int messageId, byte[] transactionId )
     {
-        super( messageId, EXTENSION_OID );
+        super( messageId );
         super.getLdapResult().setMatchedDn( null );
         super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
         this.transactionId = Strings.copy( transactionId );
@@ -180,4 +179,28 @@ public class StartTransactionResponseImpl extends ExtendedResponseImpl implement
     {
         this.transactionId = Strings.copy( transactionId );
     }
+
+
+    /**
+     * @see Object#toString()
+     */
+    @Override
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append( "StartTransactionResponse :" );
+        sb.append( "\n    transactionID : " );
+
+        if ( transactionId != null )
+        {
+            sb.append( Strings.dumpBytes( transactionId ) );
+        }
+        else
+        {
+            sb.append( "null" );
+        }
+
+        return sb.toString();
+    }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionFactory.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionFactory.java
index 08367eb..c0ae255 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionFactory.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionFactory.java
@@ -23,7 +23,7 @@ package org.apache.directory.api.ldap.extras.extended.ads_impl.endTransaction;
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
-import org.apache.directory.api.ldap.extras.extended.cancel.CancelRequest;
+import org.apache.directory.api.ldap.codec.decorators.ExtendedResponseDecorator;
 import org.apache.directory.api.ldap.extras.extended.endTransaction.EndTransactionRequest;
 import org.apache.directory.api.ldap.extras.extended.endTransaction.EndTransactionRequestImpl;
 import org.apache.directory.api.ldap.extras.extended.endTransaction.EndTransactionResponse;
@@ -60,7 +60,7 @@ public class EndTransactionFactory implements ExtendedOperationFactory
     @Override
     public String getOid()
     {
-        return CancelRequest.EXTENSION_OID;
+        return EndTransactionRequest.EXTENSION_OID;
     }
 
 
@@ -70,7 +70,8 @@ public class EndTransactionFactory implements ExtendedOperationFactory
     @Override
     public EndTransactionResponse newResponse( byte[] encodedValue ) throws DecoderException
     {
-        EndTransactionResponseDecorator response = new EndTransactionResponseDecorator( codec, new EndTransactionResponseImpl() );
+        EndTransactionResponseDecorator response = new EndTransactionResponseDecorator( codec, 
+                new EndTransactionResponseImpl() );
         response.setResponseValue( encodedValue );
 
         return response;
@@ -83,7 +84,15 @@ public class EndTransactionFactory implements ExtendedOperationFactory
     @Override
     public EndTransactionRequest newRequest( byte[] value )
     {
-        return new EndTransactionRequestDecorator( codec, new EndTransactionRequestImpl() );
+        EndTransactionRequestDecorator req = 
+                new EndTransactionRequestDecorator( codec, new EndTransactionRequestImpl() );
+
+        if ( value != null )
+        {
+            req.setRequestValue( value );
+        }
+
+        return req;
     }
 
 
@@ -98,7 +107,7 @@ public class EndTransactionFactory implements ExtendedOperationFactory
             return ( EndTransactionRequestDecorator ) modelRequest;
         }
 
-        return new EndTransactionRequestDecorator( codec, null );
+        return new EndTransactionRequestDecorator( codec, ( EndTransactionRequest ) modelRequest );
     }
 
 
@@ -106,13 +115,24 @@ public class EndTransactionFactory implements ExtendedOperationFactory
      * {@inheritDoc}
      */
     @Override
-    public EndTransactionResponseDecorator decorate( ExtendedResponse decoratedMessage )
+    public EndTransactionResponseDecorator decorate( ExtendedResponse decoratedResponse )
     {
-        if ( decoratedMessage instanceof EndTransactionResponseDecorator )
+        if ( decoratedResponse instanceof EndTransactionResponseDecorator )
         {
-            return ( EndTransactionResponseDecorator ) decoratedMessage;
+            return ( EndTransactionResponseDecorator ) decoratedResponse;
         }
 
-        return new EndTransactionResponseDecorator( codec, null );
+        // It's an opaque extended operation
+        ExtendedResponseDecorator<ExtendedResponse> response = 
+                ( ExtendedResponseDecorator<ExtendedResponse> ) decoratedResponse;
+
+        // Decode the response, as it's an opaque operation
+        EndTransactionResponse endTransactionResponse = new EndTransactionResponseImpl();
+        
+        endTransactionResponse.setMessageId( response.getMessageId() );
+        endTransactionResponse.getLdapResult().setResultCode( response.getLdapResult().getResultCode() );
+        endTransactionResponse.getLdapResult().setDiagnosticMessage( response.getLdapResult().getDiagnosticMessage() );
+
+        return new EndTransactionResponseDecorator( codec, endTransactionResponse );
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java
index d338127..7273e92 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionRequestDecorator.java
@@ -120,6 +120,29 @@ public class EndTransactionRequestDecorator extends ExtendedRequestDecorator<End
      * {@inheritDoc}
      */
     @Override
+    public byte[] getRequestValue()
+    {
+        if ( requestValue == null )
+        {
+            try
+            {
+                requestValue = encodeInternal().array();
+            }
+            catch ( EncoderException e )
+            {
+                LOG.error( I18n.err( I18n.ERR_08232_END_TRANSACTION_PAYLOAD_ENCODING_FAILED ), e );
+                throw new RuntimeException( e );
+            }
+        }
+
+        return requestValue;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public void setRequestValue( byte[] requestValue )
     {
         EndTransactionRequestDecoder decoder = new EndTransactionRequestDecoder();
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java
index 8fa8ecd..ba488db 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/endTransaction/EndTransactionResponseDecorator.java
@@ -87,6 +87,16 @@ public class EndTransactionResponseDecorator extends ExtendedResponseDecorator<E
      * {@inheritDoc}
      */
     @Override
+    public byte[] getResponseValue()
+    {
+        return responseValue;
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public void setResponseValue( byte[] responseValue )
     {
         EndTransactionResponseDecoder decoder = new EndTransactionResponseDecoder();
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionFactory.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionFactory.java
index bd05b8d..1b0e709 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionFactory.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionFactory.java
@@ -23,6 +23,7 @@ package org.apache.directory.api.ldap.extras.extended.ads_impl.startTransaction;
 import org.apache.directory.api.asn1.DecoderException;
 import org.apache.directory.api.ldap.codec.api.ExtendedOperationFactory;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
+import org.apache.directory.api.ldap.codec.decorators.ExtendedResponseDecorator;
 import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionRequest;
 import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionRequestImpl;
 import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionResponse;
@@ -83,7 +84,15 @@ public class StartTransactionFactory implements ExtendedOperationFactory
     @Override
     public StartTransactionRequest newRequest( byte[] value )
     {
-        return new StartTransactionRequestDecorator( codec, new StartTransactionRequestImpl() );
+        StartTransactionRequestDecorator req = 
+                new StartTransactionRequestDecorator( codec, new StartTransactionRequestImpl() );
+
+        if ( value != null )
+        {
+            req.setRequestValue( value );
+        }
+
+        return req;
     }
 
 
@@ -113,6 +122,17 @@ public class StartTransactionFactory implements ExtendedOperationFactory
             return ( StartTransactionResponseDecorator ) decoratedResponse;
         }
 
-        return new StartTransactionResponseDecorator( codec, ( StartTransactionResponse ) decoratedResponse );
+        // It's an opaque extended operation
+        ExtendedResponseDecorator<ExtendedResponse> response = 
+                ( ExtendedResponseDecorator<ExtendedResponse> ) decoratedResponse;
+
+        // Decode the response, as it's an opaque operation
+        StartTransactionResponse startTransactionResponse = new StartTransactionResponseImpl( response.getResponseValue() );
+        
+        startTransactionResponse.setMessageId( response.getMessageId() );
+        startTransactionResponse.getLdapResult().setResultCode( response.getLdapResult().getResultCode() );
+        startTransactionResponse.getLdapResult().setDiagnosticMessage( response.getLdapResult().getDiagnosticMessage() );
+
+        return new StartTransactionResponseDecorator( codec, startTransactionResponse );
     }
 }
diff --git a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionResponseDecorator.java b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionResponseDecorator.java
index 9374f08..b300f06 100644
--- a/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionResponseDecorator.java
+++ b/ldap/extras/codec/src/main/java/org/apache/directory/api/ldap/extras/extended/ads_impl/startTransaction/StartTransactionResponseDecorator.java
@@ -22,18 +22,10 @@ package org.apache.directory.api.ldap.extras.extended.ads_impl.startTransaction;
 
 import org.apache.directory.api.ldap.codec.decorators.ExtendedResponseDecorator;
 
-import java.nio.ByteBuffer;
-
-import org.apache.directory.api.asn1.EncoderException;
-import org.apache.directory.api.asn1.ber.tlv.BerValue;
-import org.apache.directory.api.asn1.ber.tlv.TLV;
-import org.apache.directory.api.i18n.I18n;
 import org.apache.directory.api.ldap.codec.api.LdapApiService;
 import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionResponse;
 import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionResponseImpl;
 import org.apache.directory.api.util.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 
 /**
@@ -43,9 +35,6 @@ import org.slf4j.LoggerFactory;
  */
 public class StartTransactionResponseDecorator extends ExtendedResponseDecorator<StartTransactionResponse> implements StartTransactionResponse
 {
-    /** A logger for this class */
-    private static final Logger LOG = LoggerFactory.getLogger( StartTransactionResponseDecorator.class );
-
     /** The startTransaction response */
     private StartTransactionResponse startTransactionResponse;
 
@@ -70,15 +59,7 @@ public class StartTransactionResponseDecorator extends ExtendedResponseDecorator
     {
         if ( responseValue == null )
         {
-            try
-            {
-                responseValue = encodeInternal().array();
-            }
-            catch ( EncoderException e )
-            {
-                LOG.error( I18n.err( I18n.ERR_08231_START_TRANSACTION_PAYLOAD_ENCODING_FAILED ), e );
-                throw new RuntimeException( e );
-            }
+            responseValue = Strings.copy( startTransactionResponse.getTransactionId() );
         }
 
         return responseValue;
@@ -86,44 +67,6 @@ public class StartTransactionResponseDecorator extends ExtendedResponseDecorator
 
 
     /**
-     * Compute the StartTransactionResponse extended operation length
-     * <pre>
-     * 0x04 L1 transactionId
-     * </pre>
-     * 
-     * @return The extended operation's length
-     */
-    /* no qualifier */int computeLengthInternal()
-    {
-        if ( startTransactionResponse.getTransactionId() != null )
-        {
-            return 1 + TLV.getNbBytes( startTransactionResponse.getTransactionId().length )
-                + startTransactionResponse.getTransactionId().length;
-        }
-        else
-        {
-            return 1 + 1;
-        }
-    }
-
-
-    /**
-     * Encodes the StartTransactionResponse extended operation.
-     * 
-     * @return A ByteBuffer that contains the encoded PDU
-     * @throws EncoderException If anything goes wrong.
-     */
-    /* no qualifier */ByteBuffer encodeInternal() throws EncoderException
-    {
-        ByteBuffer bb = ByteBuffer.allocate( computeLengthInternal() );
-
-        BerValue.encode( bb, startTransactionResponse.getTransactionId() );
-
-        return bb;
-    }
-
-
-    /**
      * {@inheritDoc}
      */
     @Override
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponse.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponse.java
index 49a6983..49c5db2 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponse.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponse.java
@@ -44,4 +44,12 @@ public interface ExtendedResponse extends ResultResponse
      * @param oid the OID of the extended response type.
      */
     void setResponseName( String oid );
+    
+    
+    /**
+     * Gets the response value, if any.
+     * 
+     * @return The byte[] containing the value, or null if we have none. 
+     */
+    //byte[] getResponseValue();
 }
diff --git a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponseImpl.java b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponseImpl.java
index 7c037bd..0ee2278 100644
--- a/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponseImpl.java
+++ b/ldap/model/src/main/java/org/apache/directory/api/ldap/model/message/ExtendedResponseImpl.java
@@ -31,6 +31,9 @@ public class ExtendedResponseImpl extends AbstractResultResponse implements Exte
 
     /** Object identifier for the extended response */
     protected String responseName;
+    
+    /** The ResponseValue part of the extended response */
+    //protected byte[] responseValue;
 
     /** Extended response message type enumeration value */
     private static final MessageTypeEnum TYPE = MessageTypeEnum.EXTENDED_RESPONSE;