Hi guys,

I had a bit of time and I reviewed the interceptors today. And I had an idea which may be interesting to discuss.

First, here is a table where all the interceptors operation are listed, and for each interceptor, I listed the operation they are processing :

AciAuthorizationInterceptor : ACI
AdministrativePointInterceptor : API
AuthenticationInterceptor : AI
ChangeLogInterceptor : CLI
CollectiveAttributeInterceptor : CAI
DefaultAuthorizationInterceptor : DAI
EventInterceptor : EI
ExceptionInterceptor : EXI
JournalInterceptor : JI
KeyDerivationInterceptor : KDI
NormalizationInterceptor : NI
OperationalAttributeInterceptor : OAI
PasswordHashingInterceptor : PHI
ReferralInterceptor : RI
SchemaInterceptor : SI
SubentryInterceptor : SEI
TriggerInterceptor : TI

ACI API AI CLI CAI DAI EI EXI JI KDI NI OAI PHI RI SI SEI TI add : x x x x x ? x x x x x x x x x x x bind : - - x - - - - - - - x - - - - - - compare : x - x - - - - - - - x - - - x - - delete : x x x x - x x x x - x - - x - x x getRootDSE : - - x - - - - - - - - - - - - - - hasEntry : x - x - - - - - - - x - - - - - - list : x - x - x x - x - - x x - - x x - lookup : x - x - x x - x - - x x - - x - - modify : x x x x x x x x x x x x x x x x x move : x x x x - x x x x - x x - x - x x moveAndRename : x x x x - x x x x - x x - x ? x x rename : x x x x - x x x x - x x - x x x x search : x - x - x x - - - - x x - - x x - unbind : - - x - - - - - - - - - - - - - -

(It's interesting that there are two operations that should be processed by some interceptors, and that are not : it's most certainly a bug. They are marked with a '?' in this table)

Now, we can see that all the operation are only processed by a few interceptors. I was thinking that it could be an option to list the mandatory interceptors for each operation, instead of letting the chain determinate if an interceptor will process this operation.

In the Operation manager, we will then call all the needed interceptors chain for each operation. For instance, for a delete operation, we will proceed this way :

operationManager.delete( DeleteOperationContext deleteContext )
{
// ThedeleteContext.getOperation() is used to get the correct list of interceptors for the operation,
    // as we may have more than one delete operation (see below)
InterceptorChain deleteChain = directoryService.getInterceptors( deleteContext.getOperation() );

    deleteChain.delete( deleteContext );
}
The biggest advantage is that we know have a clear list of interceptors for each operation, and we cna expose this list to the user, who can add its own interceptor. We can even compute this chain by checking which operation an interceptor will handle, using reflection, when the interceptor is added in the chain.

For internal operation, I'm quiet sure we should ask the nexus directly, instead of going through the chain again. However, we can perfectly proceed exactly the same way, by defining some other operation, like lookupInternal, which describes the list of needed interceptors.

One other advantage is that we will not go through N useless interceptor for each operation, speeding up (ok, marginaly but still) the operations.

Lats, not least, I'm quite sure that if we expose the list of interceptors involved by each operation, we make it easier for someone who want to add an interceptor, as all those lists will be available through teh configuration, and not in the code, as it is atm. It also remove the need for interceptors bypasses, if we inject the type of operation we want to execute in the context (xxxContext.getOperation() will return the type of operation).

It may sound a bit crazy, but I think it would work with a little impact on the existing code...

thoughts ?

-- Regards, Cordialement, Emmanuel Lécharny www.iktek.com

Reply via email to