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/01/24 07:45:42 UTC

svn commit: r1822082 - in /directory/site/trunk/content/api/internal-design-guide: 14-extended-operations.mdtext images/extended-request-decorator.graphml images/extended-request-decorator.png

Author: elecharny
Date: Wed Jan 24 07:45:42 2018
New Revision: 1822082

URL: http://svn.apache.org/viewvc?rev=1822082&view=rev
Log:
Completeed the extended operation page doco

Modified:
    directory/site/trunk/content/api/internal-design-guide/14-extended-operations.mdtext
    directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.graphml
    directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.png

Modified: directory/site/trunk/content/api/internal-design-guide/14-extended-operations.mdtext
URL: http://svn.apache.org/viewvc/directory/site/trunk/content/api/internal-design-guide/14-extended-operations.mdtext?rev=1822082&r1=1822081&r2=1822082&view=diff
==============================================================================
--- directory/site/trunk/content/api/internal-design-guide/14-extended-operations.mdtext (original)
+++ directory/site/trunk/content/api/internal-design-guide/14-extended-operations.mdtext Wed Jan 24 07:45:42 2018
@@ -60,9 +60,9 @@ Currently, the **LDAP API** support the
 
 When the _requestValue_ part is present, it has to be encoded (when the client sends the request to the srrver) or decoded ( when the client receives the response from the server).
 
-### Decoding a request
+### Decoding a request/response
 
-The payload is decoded on the fly when the request is processed during the _extendedRequest_ is being decoded. The _StoreExtendedRequestValue_ will store the _byte[]_ - if any - and depending on the operation, the specific request will decode the value. Here is the _action_ method for the _StoreExtendedRequestValue_ class :
+The payload is decoded on the fly when the request/response is processed during the _extendedRequest_/_extendedResponse_ is being decoded. The _StoreExtendedRequestValue_/_StoreExtendedResponseValue_ will store the _byte[]_ - if any - and depending on the operation, the specific request/response will decode the value. Here is the _action_ method for the _StoreExtendedRequestValue_ class :
 
 
     :::Java
@@ -85,7 +85,7 @@ The payload is decoded on the fly when t
             extendedRequest.setRequestValue( tlv.getValue().getData() );
         }
 
-Each implementaion may have a _setRequestValue_ methd, overloading the parentclass. In this case, the value is decoded by the method.
+Each implementaion may have a _setRequestValue_/_setResponseValue_ methd, overloading the parentclass. In this case, the value is decoded by the method.
 
 Here is an example of _setRequestValue_ implementation (for the _PasswordModifyRequest_ class) :
 
@@ -115,10 +115,793 @@ Here is an example of _setRequestValue_
         }
     }
 
-As we can see, the decoder is invoked if the _requestValye_ bytes is not null. It instanciate a _PasswordModifyRequest_.
+As we can see, the decoder is invoked if the _requestValue_ bytes is not null. It instanciate a _PasswordModifyRequest_.
 
 If there is no payload, the parent's method is invoked (which basically does nothing).
 
-Here is a schema showing which operation as a payload that needs to be decoded :
+Here is a schema showing which request/response operations as a payload that needs to be decoded :
 
 ![Extended Operations Payload](images/extended-request-decorator.png)
+
+
+
+### Encoding a request/response
+
+Encoding is done through a _Decorator_. Each extended operation has a dedicated _Decorator_, which may have a specific encoding function. Again, as we only encode the payload, if this payload is absent, there is nothing to encode. Not all the extended operations have a payload.
+
+If there is a payload to encode, this is done by calling the _getRequestValue()_/_getResponseValue()_ method in the decorator. Here is an example :
+
+    :::Java
+    public byte[] getRequestValue()
+    {
+        if ( requestValue == null )
+        {
+            try
+            {
+                requestValue = encodeInternal().array();
+            }
+            catch ( EncoderException e )
+            {
+                LOG.error( I18n.err( I18n.ERR_04167 ), e );
+                throw new RuntimeException( e );
+            }
+        }
+
+        return requestValue;
+    }
+
+
+The _encodeInternal_ method is in charge of encoding teh paylod.
+
+If the _getRequestValue_/getResponseValue_ method is absent, that leans there is nothing to encode. The inherited method will be executed, which returns null.
+
+Internally, we compute the length of the needed **PDU** accordingly to the data we have to encode, allocate a _ByteBuffer_ to hold the encoded data, and store teh encoded data into it :
+
+    :::Java
+    /**
+     * Encodes the PasswordModifyRequest extended operation.
+     * 
+     * @return A ByteBuffer that contains the encoded PDU
+     * @throws org.apache.directory.api.asn1.EncoderException If anything goes wrong.
+     */
+    /* No qualifier */ByteBuffer encodeInternal() throws EncoderException
+    {
+        ByteBuffer bb = ByteBuffer.allocate( computeLengthInternal() );
+
+        bb.put( UniversalTag.SEQUENCE.getValue() );
+        bb.put( TLV.getBytes( requestLength ) );
+
+        if ( passwordModifyRequest.getUserIdentity() != null )
+        {
+            byte[] userIdentity = passwordModifyRequest.getUserIdentity();
+            bb.put( ( byte ) PasswordModifyRequestConstants.USER_IDENTITY_TAG );
+            bb.put( TLV.getBytes( userIdentity.length ) );
+            bb.put( userIdentity );
+        }
+
+        if ( passwordModifyRequest.getOldPassword() != null )
+        {
+            byte[] oldPassword = passwordModifyRequest.getOldPassword();
+            bb.put( ( byte ) PasswordModifyRequestConstants.OLD_PASSWORD_TAG );
+            bb.put( TLV.getBytes( oldPassword.length ) );
+            bb.put( oldPassword );
+        }
+
+        if ( passwordModifyRequest.getNewPassword() != null )
+        {
+            byte[] newPassword = passwordModifyRequest.getNewPassword();
+            bb.put( ( byte ) PasswordModifyRequestConstants.NEW_PASSWORD_TAG );
+            bb.put( TLV.getBytes( newPassword.length ) );
+            bb.put( newPassword );
+        }
+
+        return bb;
+    }
+
+
+and the _computeLength_ method is :
+
+
+    :::Java
+    /**
+     * Compute the PasswordModifyRequest extended operation length
+     * <pre>
+     * 0x30 L1 
+     *   | 
+     *  [+-- 0x80 L2 userIdentity] 
+     *  [+-- 0x81 L3 oldPassword] 
+     *  [+-- 0x82 L4 newPassword] 
+     * </pre>
+     */
+    /* No qualifier */int computeLengthInternal()
+    {
+        requestLength = 0;
+
+        if ( passwordModifyRequest.getUserIdentity() != null )
+        {
+            int len = passwordModifyRequest.getUserIdentity().length;
+            requestLength = 1 + TLV.getNbBytes( len ) + len;
+        }
+
+        if ( passwordModifyRequest.getOldPassword() != null )
+        {
+            int len = passwordModifyRequest.getOldPassword().length;
+            requestLength += 1 + TLV.getNbBytes( len ) + len;
+        }
+
+        if ( passwordModifyRequest.getNewPassword() != null )
+        {
+            int len = passwordModifyRequest.getNewPassword().length;
+            requestLength += 1 + TLV.getNbBytes( len ) + len;
+        }
+
+        return 1 + TLV.getNbBytes( requestLength ) + requestLength;
+    }
+
+
+## Adding a new Extended operation
+
+We will show how to add a new extended operation in the **LDAP API**. The added operation is the _startTransaction_ operation, described in [RFC 5805](https://tools.ietf.org/html/rfc5805). 
+
+The _startTransactionRequest_ has a _requestName_ containing **1.3.6.1.1.21.1**, and no _requestValue_.
+The _startTransactionResponse_ has no _responseName_ and a _responseValue_ containing an opaque transaction identifier (ie, it does not need to be decoced).
+
+We first need to declare an interface and implementation for each of those two operations. Those four elements are declared in the _<coec-api>_ module (in _/ldap/extras/codec-api_), and in the _org.apache.directory.api.ldap.extras.extended.startTransaction_ package, beside the other extended operations :
+
+    :::Java
+    package org.apache.directory.api.ldap.extras.extended.startTransaction;
+
+
+    import org.apache.directory.api.ldap.model.message.ExtendedRequest;
+
+
+    /**
+     * The TransactionRequest 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 }
+     * </pre>
+     * 
+     * where 'requestName' is 1.3.6.1.1.21.1 and requestValue is absent.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public interface StartTransactionRequest extends ExtendedRequest
+    {
+        /** The OID for the Transaction extended operation request. */
+        String EXTENSION_OID = "1.3.6.1.1.21.1";
+    }
+
+The request interface defines noting but the _OID_, as we don't have any payload.
+
+Here is the implementation :
+
+
+    :::Java
+    package org.apache.directory.api.ldap.extras.extended.startTransaction;
+
+
+    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 }
+     * </pre>
+     * 
+     * where 'requestName' is 1.3.6.1.1.21.1 and requestValue is absent.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public class StartTransactionRequestImpl extends AbstractExtendedRequest implements StartTransactionRequest
+    {
+        /**
+         * Creates a new instance of StartTransactionRequestImpl.
+         *
+         * @param messageId the message id
+         */
+        public StartTransactionRequestImpl( int messageId )
+        {
+            super( messageId );
+            setRequestName( EXTENSION_OID );
+        }
+
+
+        /**
+         * Creates a new instance of StartTransactionRequestImpl.
+         */
+        public StartTransactionRequestImpl()
+        {
+            setRequestName( EXTENSION_OID );
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public StartTransactionResponse getResultResponse()
+        {
+            if ( getResponse() == null )
+            {
+                setResponse( new StartTransactionResponseImpl() );
+            }
+
+            return ( StartTransactionResponse ) getResponse();
+        }
+    }
+
+We just implement the method that returns the associated response.
+
+Now for the response, which has an opaque value, here is the interface :
+
+    :::Java
+    package org.apache.directory.api.ldap.extras.extended.startTransaction;
+
+
+    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 {
+     *            COMPONENTS OF LDAPResult,
+     *            responseName     [10] LDAPOID OPTIONAL,
+     *            responseValue    [11] OCTET STRING OPTIONAL }
+     * </pre>
+     * 
+     * where the responseName is not present, and the responseValue contain
+     * a transaction identifier when the result is SUCCESS.
+     * 
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    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
+         */
+        byte[] getTransactionId();
+    }
+
+As the response value is opaque, we return it as a _byte[]_.
+
+Here is the implementation :
+
+    :::Java
+    package org.apache.directory.api.ldap.extras.extended.startTransaction;
+
+
+    import org.apache.directory.api.i18n.I18n;
+    import org.apache.directory.api.ldap.model.message.ExtendedResponseImpl;
+    import org.apache.directory.api.ldap.model.message.ResultCodeEnum;
+    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 {
+     *            COMPONENTS OF LDAPResult,
+     *            responseName     [10] LDAPOID OPTIONAL,
+     *            responseValue    [11] OCTET STRING OPTIONAL }
+     * </pre>
+     * 
+     * where the responseName is not present, and the responseValue contain
+     * a transaction identifier when the result is SUCCESS.
+     * 
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public class StartTransactionResponseImpl extends ExtendedResponseImpl implements StartTransactionResponse
+    {
+        /** The transaction ID if the request was successful */
+        private byte[] transactionId;
+        
+        /**
+         * Create a new StartTransactionResponseImpl object
+         * 
+         * @param messageId The messageId
+         * @param rcode the result code
+         * @param transactionId The transaction ID 
+         */
+        public StartTransactionResponseImpl( int messageId, ResultCodeEnum resultCode, byte[] transactionId )
+        {
+            super( messageId );
+
+            switch ( resultCode )
+            {
+                case SUCCESS:
+                    this.transactionId = Strings.copy( transactionId );
+                    // pass through ...
+                case CANCELED:
+                case CANNOT_CANCEL:
+                case NO_SUCH_OPERATION:
+                case TOO_LATE:
+                    break;
+
+                default:
+                    throw new IllegalArgumentException( I18n.err( I18n.ERR_04166, ResultCodeEnum.SUCCESS,
+                        ResultCodeEnum.OPERATIONS_ERROR, ResultCodeEnum.INSUFFICIENT_ACCESS_RIGHTS ) );
+            }
+
+            super.getLdapResult().setMatchedDn( null );
+            super.getLdapResult().setResultCode( resultCode );
+        }
+
+
+        /**
+         * Create a new StartTransactionResponseImpl instance
+         * 
+         * @param messageId The request's messageId
+         * @param transactionId The transaction ID 
+         */
+        public StartTransactionResponseImpl( int messageId, byte[] transactionId )
+        {
+            super( messageId );
+            super.getLdapResult().setMatchedDn( null );
+            super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
+            this.transactionId = Strings.copy( transactionId );
+        }
+
+
+        /**
+         * Create a new StartTransactionResponseImpl instance
+         * 
+         * @param transactionId The transaction ID 
+         */
+        public StartTransactionResponseImpl( byte[] transactionId )
+        {
+            super( StartTransactionRequest.EXTENSION_OID );
+            super.getLdapResult().setMatchedDn( null );
+            super.getLdapResult().setResultCode( ResultCodeEnum.SUCCESS );
+            this.transactionId = Strings.copy( transactionId );
+        }
+
+
+        /**
+         * Create a new StartTransactionResponseImpl instance
+         */
+        public StartTransactionResponseImpl()
+        {
+            super( StartTransactionRequest.EXTENSION_OID );
+            super.getLdapResult().setMatchedDn( null );
+            super.getLdapResult().setResultCode( ResultCodeEnum.UNWILLING_TO_PERFORM );
+        }
+
+
+        /**
+         * Gets the OID uniquely identifying this extended response (a.k.a. its
+         * name). It's a null value for the Cancel response
+         * 
+         * @return the OID of the extended response type.
+         */
+        @Override
+        public String getResponseName()
+        {
+            return "";
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public int hashCode()
+        {
+            int hash = 37;
+            
+            if ( transactionId != null )
+            {
+                for ( byte b : transactionId )
+                {
+                    hash += hash * 17 + b;
+                }
+            }
+            
+            hash = hash * 17 + getClass().getName().hashCode();
+
+            return hash;
+        }
+
+
+        /**
+         * @see Object#equals(Object)
+         */
+        @Override
+        public boolean equals( Object obj )
+        {
+            if ( obj == this )
+            {
+                return true;
+            }
+
+            if ( !( obj instanceof StartTransactionResponseImpl ) )
+            {
+                return false;
+            }
+            
+            return Arrays.equals( transactionId, ( ( StartTransactionResponseImpl ) obj ).transactionId );
+        }
+        
+        
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public byte[] getTransactionId()
+        {
+            return Strings.copy( transactionId );
+        }
+        
+        
+        /**
+         * {@inheritDoc}
+         */
+        public void setTransactionId( byte[] transactionId )
+        {
+            this.transactionId = Strings.copy( transactionId );
+        }
+    }
+
+There is nothing special in this implementation, we just make it so the _transactionId_ bytes are copied to be sure they can't be altered from the outside. Basically, the payload is transfered pristine into the instance.
+
+Now that we have the interfaces and implementations, we need to add the decorators and the factory. The factory is used to initialize the **API** with the list of available extended operaiton at startup, as a mean to make the **API** extensible. It creates request and response, and the associated decorator.
+
+Here is the factory code, declared in the _<extra-codec>_ module :
+
+    :::Java
+    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.extras.extended.cancel.CancelRequest;
+    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;
+    import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionResponseImpl;
+    import org.apache.directory.api.ldap.model.message.ExtendedRequest;
+    import org.apache.directory.api.ldap.model.message.ExtendedResponse;
+
+
+    /**
+     * An {@link ExtendedOperationFactory} for creating cancel extended request response 
+     * pairs.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public class StartTransactionFactory implements ExtendedOperationFactory
+    {
+        private LdapApiService codec;
+
+
+        /**
+         * Creates a new instance of CancelFactory.
+         *
+         * @param codec The codec for this factory.
+         */
+        public StartTransactionFactory( LdapApiService codec )
+        {
+            this.codec = codec;
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public String getOid()
+        {
+            return CancelRequest.EXTENSION_OID;
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public StartTransactionResponse newResponse( byte[] encodedValue ) throws DecoderException
+        {
+            StartTransactionResponseDecorator response = new StartTransactionResponseDecorator( codec, new StartTransactionResponseImpl() );
+            response.setResponseValue( encodedValue );
+
+            return response;
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public StartTransactionRequest newRequest( byte[] value )
+        {
+            return new StartTransactionRequestDecorator( codec, new StartTransactionRequestImpl() );
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public StartTransactionRequestDecorator decorate( ExtendedRequest modelRequest )
+        {
+            if ( modelRequest instanceof StartTransactionRequestDecorator )
+            {
+                return ( StartTransactionRequestDecorator ) modelRequest;
+            }
+
+            return new StartTransactionRequestDecorator( codec, null );
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public StartTransactionResponseDecorator decorate( ExtendedResponse decoratedMessage )
+        {
+            if ( decoratedMessage instanceof StartTransactionResponseDecorator )
+            {
+                return ( StartTransactionResponseDecorator ) decoratedMessage;
+            }
+
+            return new StartTransactionResponseDecorator( codec, null );
+        }
+    }
+
+
+The decorator are very simple : they just encapsulate the requets or response instance. It's because encoding or decoding is non existant for this operation. Decorators are declared in the _<extra-codec>_ module.
+
+Here is teh code for both those decorators :
+
+    :::Java
+    package org.apache.directory.api.ldap.extras.extended.ads_impl.startTransaction;
+
+
+    import org.apache.directory.api.ldap.codec.api.ExtendedRequestDecorator;
+    import org.apache.directory.api.ldap.codec.api.LdapApiService;
+    import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionRequest;
+    import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionResponse;
+
+
+    /**
+     * A Decorator for startTransaction request.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public class StartTransactionRequestDecorator extends ExtendedRequestDecorator<StartTransactionRequest> implements
+        StartTransactionRequest
+    {
+        /** The internal startTransaction request */
+        private StartTransactionRequest startTransactionRequest;
+
+
+        /**
+         * Creates a new instance of StartTransactionRequestDecorator.
+         * 
+         * @param codec The LDAP Service to use
+         * @param decoratedMessage The canceled request
+         */
+        public StartTransactionRequestDecorator( LdapApiService codec, StartTransactionRequest decoratedMessage )
+        {
+            super( codec, decoratedMessage );
+            startTransactionRequest = decoratedMessage;
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public StartTransactionResponse getResultResponse()
+        {
+            return ( StartTransactionResponse ) startTransactionRequest.getResultResponse();
+        }
+    }
+
+
+and for the response :
+
+    :::Java
+    package org.apache.directory.api.ldap.extras.extended.ads_impl.startTransaction;
+
+
+    import org.apache.directory.api.ldap.codec.api.ExtendedResponseDecorator;
+    import org.apache.directory.api.ldap.codec.api.LdapApiService;
+    import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionResponse;
+    import org.apache.directory.api.util.Strings;
+
+
+    /**
+     * A Decorator for CancelResponses.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public class StartTransactionResponseDecorator extends ExtendedResponseDecorator<StartTransactionResponse> implements StartTransactionResponse
+    {
+        /** The startTransaction response */
+        private StartTransactionResponse startTransactionResponse;
+
+        /**
+         * Creates a new instance of CancelResponseDecorator.
+         *
+         * @param codec The LDAP service instance
+         * @param decoratedMessage The decorated message
+         */
+        public StartTransactionResponseDecorator( LdapApiService codec, StartTransactionResponse decoratedMessage )
+        {
+            super( codec, decoratedMessage );
+            startTransactionResponse = decoratedMessage;
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void setResponseValue( byte[] responseValue )
+        {
+            this.responseValue = Strings.copy( responseValue );
+        }
+
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public byte[] getTransactionId()
+        {
+            return startTransactionResponse.getTransactionId();
+        }
+    }
+
+
+The last step is to declare the extended operation in the **LDAP API** initialization and **OSGi**. There are two places we have to declare the factory :
+
+* _CodecFactoryUtil_ class, in the _<ldap/codec/standalone>_ module
+* _ExtrasBundleActivator_ class, in the _<ldap/extras/codec>_ module
+
+
+Here is the added code in the _CodecFactoryUtil_ class :
+
+    :::Java
+    ...
+    import org.apache.directory.api.ldap.extras.extended.ads_impl.startTls.StartTlsFactory;
+    import org.apache.directory.api.ldap.extras.extended.ads_impl.startTransaction.StartTransactionFactory;
+    ...
+
+    /**
+     * A utility class for adding Codec and extended operation factories.
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public final class CodecFactoryUtil
+    {
+        ...
+        public static void loadStockExtendedOperations(
+            Map<String, ExtendedOperationFactory> extendendOperationsFactories, LdapApiService apiService )
+        {
+            ...
+
+            StartTlsFactory startTlsFactory = new StartTlsFactory( apiService );
+            extendendOperationsFactories.put( startTlsFactory.getOid(), startTlsFactory );
+            LOG.info( "Registered pre-bundled extended operation factory: {}", startTlsFactory.getOid() );
+
+            StartTransactionFactory startTransactionFactory = new StartTransactionFactory( apiService );
+            extendendOperationsFactories.put( startTransactionFactory.getOid(), startTransactionFactory );
+            LOG.info( "Registered pre-bundled extended operation factory: {}", startTransactionFactory.getOid() );
+            ...
+        }
+    }
+
+We just need to instanciate the factory, and to add it to the map of supported extended operations.
+
+
+And the added code for the _ExtrasBundleActivator_ class :
+
+    :::Java
+    ...
+    import org.apache.directory.api.ldap.extras.extended.ads_impl.startTls.StartTlsFactory;
+    import org.apache.directory.api.ldap.extras.extended.ads_impl.startTransaction.StartTransactionFactory;
+    ...
+    import org.apache.directory.api.ldap.extras.extended.startTls.StartTlsRequest;
+    import org.apache.directory.api.ldap.extras.extended.startTransaction.StartTransactionRequest;
+    ...
+
+    /**
+     * A BundleActivator for the ldap codec extras extension: extra ApacheDS and 
+     * Apache Directory Studio specific controls and extended operations. 
+     *
+     * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+     */
+    public class ExtrasBundleActivator implements BundleActivator
+    {
+        ...
+        /**
+         * Registers all the extras extended operations present in this control pack.
+         *
+         * @param codec The codec service.
+         */
+        private void registerExtrasExtendedOps( LdapApiService codec )
+        {
+            // --------------------------------------------------------------------
+            // Register Extended Request Factories
+            // --------------------------------------------------------------------
+            ...
+
+            StartTlsFactory startTlsFactory = new StartTlsFactory( codec );
+            codec.registerExtendedRequest( startTlsFactory );
+
+            StartTransactionFactory startTransactionFactory = new StartTransactionFactory( codec );
+            codec.registerExtendedRequest( startTransactionFactory );
+            ...
+        }
+
+
+        private void unregisterExtrasExtendedOps( LdapApiService codec )
+        {
+            ...
+            codec.unregisterExtendedRequest( StartTlsRequest.EXTENSION_OID );
+            codec.unregisterExtendedRequest( StartTransactionRequest.EXTENSION_OID );
+            ...
+        }
+    }
+
+We also have to export the package for it to be visible when using **OSGi**. This is done by modifying some _pom.xml_ files.
+
+
+_<ldap/extras/codec>_ module _pom.xml_ file :
+
+    :::XML
+    ...
+    <configuration>
+      <manifestLocation>META-INF</manifestLocation>
+      <instructions>
+        <Bundle-SymbolicName>${project.groupId}.ldap.extras.codec</Bundle-SymbolicName>
+        <Export-Package>
+            {local-packages};version=${project.version};-noimport:=true
+        </Export-Package>
+        <Export-Package>
+          ...
+          org.apache.directory.api.ldap.extras.extended.ads_impl.startTls;version=${project.version};-noimport:=true,
+          org.apache.directory.api.ldap.extras.extended.ads_impl.startTransaction;version=${project.version};-noimport:=true,
+          ...
+        </Export-Package>
+        <Import-Package>
+          ...
+          org.apache.directory.api.ldap.extras.extended.startTls;version=${project.version},
+          org.apache.directory.api.ldap.extras.extended.startTransaction;version=${project.version},
+          ...
+        </Import-Package>
+
+
+_<ldap/extras/codec-api>_ module _pom.xml_ file :
+
+    :::XML
+    ...
+    <configuration>
+      <manifestLocation>META-INF</manifestLocation>
+      <instructions>
+        <Bundle-SymbolicName>${project.groupId}.ldap.extras.codec.api</Bundle-SymbolicName>
+        <Export-Package>
+          ...
+          org.apache.directory.api.ldap.extras.extended.startTls;version=${project.version};-noimport:=true,
+          org.apache.directory.api.ldap.extras.extended.startTransaction;version=${project.version};-noimport:=true,
+          ...
+        </Export-Package>

Modified: directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.graphml
URL: http://svn.apache.org/viewvc/directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.graphml?rev=1822082&r1=1822081&r2=1822082&view=diff
==============================================================================
--- directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.graphml (original)
+++ directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.graphml Wed Jan 24 07:45:42 2018
@@ -35,10 +35,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="288.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="288.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="146.740234375" x="36.629882812499886" y="5.93359375">CancelRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.716796875" x="42.641601562499886" y="5.93359375">CancelRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -52,10 +52,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="348.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="348.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="196.251953125" x="11.874023437499886" y="5.93359375">CertGenerationRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="208.521484375" x="16.239257812499886" y="5.93359375">CertGenerationRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -69,10 +69,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="408.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="468.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="213.89453125" x="3.0527343749998863" y="5.93359375">GracefulShutdownRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="227.875" x="6.562499999999886" y="5.93359375">GracefulShutdownRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -86,10 +86,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="468.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="528.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="202.046875" x="8.976562499999886" y="5.93359375">PasswordModifyRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="216.701171875" x="12.149414062499886" y="5.93359375">PasswordModifyRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -103,10 +103,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="528.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="588.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="152.212890625" x="33.893554687499886" y="5.93359375">StartTlsRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="152.212890625" x="44.393554687499886" y="5.93359375">StartTlsRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -120,10 +120,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="588.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="648.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="203.27734375" x="8.361328124999886" y="5.93359375">StartTransactionRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="203.27734375" x="18.861328124999886" y="5.93359375">StartTransactionRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -137,10 +137,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="648.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="708.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="203.875" x="8.062499999999886" y="5.93359375">StoredProcedureRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="216.947265625" x="12.026367187499886" y="5.93359375">StoredProcedureRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -154,10 +154,10 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="30.0" width="219.99999999999977" x="297.0841586502993" y="708.0"/>
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="768.0"/>
           <y:Fill color="#CCFFCC" transparent="false"/>
           <y:BorderStyle hasColor="false" type="line" width="1.0"/>
-          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="156.0859375" x="31.957031249999886" y="5.93359375">WhoAmIRequestDecorator<y:LabelModel>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="156.0859375" x="42.457031249999886" y="5.93359375">WhoAmIRequestDecorator<y:LabelModel>
               <y:SmartNodeLabelModel distance="4.0"/>
             </y:LabelModel>
             <y:ModelParameter>
@@ -182,7 +182,7 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="16.0" width="219.99999999999977" x="297.0841586502993" y="318.0"/>
+          <y:Geometry height="16.0" width="240.99999999999977" x="297.0841586502993" y="318.0"/>
           <y:Fill color="#FFFFFF" transparent="false"/>
           <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.7744140625" x="4.0" y="0.111328125">void setRequestValue( byte[] )</y:NodeLabel>
@@ -193,7 +193,7 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="16.0" width="219.99999999999977" x="297.0841586502993" y="378.0"/>
+          <y:Geometry height="16.0" width="240.99999999999977" x="297.0841586502993" y="378.0"/>
           <y:Fill color="#FFFFFF" transparent="false"/>
           <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.7744140625" x="4.0" y="0.111328125">void setRequestValue( byte[] )</y:NodeLabel>
@@ -204,7 +204,7 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="16.0" width="219.99999999999977" x="297.0841586502993" y="438.0"/>
+          <y:Geometry height="16.0" width="240.99999999999977" x="297.0841586502993" y="498.0"/>
           <y:Fill color="#FFFFFF" transparent="false"/>
           <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.7744140625" x="4.0" y="0.111328125">void setRequestValue( byte[] )</y:NodeLabel>
@@ -215,7 +215,7 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="16.0" width="219.99999999999977" x="297.0841586502993" y="498.0"/>
+          <y:Geometry height="16.0" width="240.99999999999977" x="297.0841586502993" y="558.0"/>
           <y:Fill color="#FFFFFF" transparent="false"/>
           <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.7744140625" x="4.0" y="0.111328125">void setRequestValue( byte[] )</y:NodeLabel>
@@ -226,13 +226,266 @@
       <data key="d5"/>
       <data key="d6">
         <y:GenericNode configuration="ShinyPlateNodeWithShadow">
-          <y:Geometry height="16.0" width="219.99999999999977" x="297.0841586502993" y="678.0"/>
+          <y:Geometry height="16.0" width="240.99999999999977" x="297.0841586502993" y="738.0"/>
           <y:Fill color="#FFFFFF" transparent="false"/>
           <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
           <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.7744140625" x="4.0" y="0.111328125">void setRequestValue( byte[] )</y:NodeLabel>
         </y:GenericNode>
       </data>
     </node>
+    <node id="n15">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="181.04207932514942" x="560.0841586502993" y="179.0"/>
+          <y:Fill color="#FFCC99" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="171.337890625" x="4.852094350074708" y="5.93359375">ExtendedResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n16">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="288.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.740234375" x="45.629882812499886" y="5.93359375">CancelResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n17">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="348.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="205.251953125" x="20.874023437499886" y="5.93359375">CertGenerationResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n18">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="468.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="222.89453125" x="12.052734374999886" y="5.93359375">GracefulShutdownResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n19">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="528.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="226.287109375" x="10.356445312499886" y="5.93359375">PasswordModifyResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n20">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="588.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="161.212890625" x="42.893554687499886" y="5.93359375">StartTlsResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n21">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="648.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="226.796875" x="10.101562499999886" y="5.93359375">StartTransactionResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n22">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="708.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="212.875" x="17.062499999999886" y="5.93359375">StoredProcedureResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n23">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="768.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="175.33984375" x="35.830078124999886" y="5.93359375">WhoAmIResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n24">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="16.0" width="181.04207932514942" x="560.0841586502993" y="209.0"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.2744140625" x="4.0" y="0.111328125">void setResponseValue( byte[] )</y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n25">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="16.0" width="246.99999999999977" x="710.1262379754489" y="558.0"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.2744140625" x="4.0" y="0.111328125">void setResponseValue( byte[] )</y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n26">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="240.99999999999977" x="297.0841586502993" y="408.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="234.841796875" x="3.0791015624998863" y="5.93359375">GracefulDisconnectRequestDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n27">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="16.0" width="240.99999999999977" x="297.0841586502993" y="438.0"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="147.7744140625" x="4.0" y="0.111328125">void setRequestValue( byte[] )</y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n28">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="30.0" width="246.99999999999977" x="710.1262379754489" y="408.0"/>
+          <y:Fill color="#CCFFCC" transparent="false"/>
+          <y:BorderStyle hasColor="false" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="244.427734375" x="1.2861328124998863" y="5.93359375">GracefulDisconnectResponseDecorator<y:LabelModel>
+              <y:SmartNodeLabelModel distance="4.0"/>
+            </y:LabelModel>
+            <y:ModelParameter>
+              <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
+            </y:ModelParameter>
+          </y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n29">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="16.0" width="246.99999999999977" x="710.1262379754489" y="438.0"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.2744140625" x="4.0" y="0.111328125">void setResponseValue( byte[] )</y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n30">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="16.0" width="246.99999999999977" x="710.1262379754489" y="678.0"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.2744140625" x="4.0" y="0.111328125">void setResponseValue( byte[] )</y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
+    <node id="n31">
+      <data key="d5"/>
+      <data key="d6">
+        <y:GenericNode configuration="ShinyPlateNodeWithShadow">
+          <y:Geometry height="16.0" width="246.99999999999977" x="710.1262379754489" y="798.0"/>
+          <y:Fill color="#FFFFFF" transparent="false"/>
+          <y:BorderStyle color="#C0C0C0" type="line" width="1.0"/>
+          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="10" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="15.77734375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="l" textColor="#000000" verticalTextPosition="bottom" visible="true" width="155.2744140625" x="4.0" y="0.111328125">void setResponseValue( byte[] )</y:NodeLabel>
+        </y:GenericNode>
+      </data>
+    </node>
     <edge id="e0" source="n1" target="n9">
       <data key="d9"/>
       <data key="d10">
@@ -264,7 +517,7 @@
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="237.56311898772435" y="423.0"/>
+            <y:Point x="237.56311898772435" y="483.0"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="transparent_circle"/>
@@ -277,7 +530,7 @@
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="237.56311898772435" y="483.0"/>
+            <y:Point x="237.56311898772435" y="543.0"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="transparent_circle"/>
@@ -290,7 +543,7 @@
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="237.56311898772435" y="543.0"/>
+            <y:Point x="237.56311898772435" y="603.0"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="transparent_circle"/>
@@ -303,7 +556,7 @@
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="237.56311898772435" y="603.0"/>
+            <y:Point x="237.56311898772435" y="663.0"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="transparent_circle"/>
@@ -316,7 +569,7 @@
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="237.56311898772435" y="663.0"/>
+            <y:Point x="237.56311898772435" y="723.0"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="transparent_circle"/>
@@ -329,7 +582,137 @@
       <data key="d10">
         <y:PolyLineEdge>
           <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
-            <y:Point x="237.56311898772435" y="723.0"/>
+            <y:Point x="237.56311898772435" y="783.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e8" source="n16" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-7.98046875">
+            <y:Point x="650.605198312874" y="303.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e9" source="n17" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="-7.98046875">
+            <y:Point x="650.605198312874" y="363.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e10" source="n18" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="650.605198312874" y="483.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e11" source="n19" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="650.605198312874" y="543.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e12" source="n20" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="650.605198312874" y="603.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e13" source="n21" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="650.605198312874" y="663.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e14" source="n22" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="650.605198312874" y="723.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e15" source="n23" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="650.605198312874" y="783.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e16" source="n26" target="n9">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="237.56311898772435" y="423.0"/>
+          </y:Path>
+          <y:LineStyle color="#000000" type="line" width="1.0"/>
+          <y:Arrows source="none" target="transparent_circle"/>
+          <y:BendStyle smoothed="false"/>
+        </y:PolyLineEdge>
+      </data>
+    </edge>
+    <edge id="e17" source="n28" target="n24">
+      <data key="d9"/>
+      <data key="d10">
+        <y:PolyLineEdge>
+          <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
+            <y:Point x="650.605198312874" y="423.0"/>
           </y:Path>
           <y:LineStyle color="#000000" type="line" width="1.0"/>
           <y:Arrows source="none" target="transparent_circle"/>

Modified: directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.png
URL: http://svn.apache.org/viewvc/directory/site/trunk/content/api/internal-design-guide/images/extended-request-decorator.png?rev=1822082&r1=1822081&r2=1822082&view=diff
==============================================================================
Binary files - no diff available.