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.