Author: elecharny Date: Thu Aug 11 10:07:20 2011 New Revision: 1156561 URL: http://svn.apache.org/viewvc?rev=1156561&view=rev Log: o Extracted the DefaultEventService class from the EventInterceptor o Removed the addListener( DirectoryService ) method o Injected the Criteria in the EventService when adding a listener in ServerConext/ServerDirContext : the criteria was created but never used o Added some javadoc Added: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/DefaultEventService.java Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/event/EventService.java directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/event/EventService.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/event/EventService.java?rev=1156561&r1=1156560&r2=1156561&view=diff ============================================================================== --- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/event/EventService.java (original) +++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/event/EventService.java Thu Aug 11 10:07:20 2011 @@ -34,15 +34,6 @@ import java.util.List; public interface EventService { /** - * Registers a DirectoryListener for notification on any and all change - * events on the DIT. - * - * @param listener the DirectoryListener to deliver notifications to - */ - void addListener( DirectoryListener listener ); - - - /** * Registers a DirectoryListener for notification on change events on the * DIT matching some notification criteria. * Modified: directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java?rev=1156561&r1=1156560&r2=1156561&view=diff ============================================================================== --- directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java (original) +++ directory/apacheds/trunk/core-api/src/main/java/org/apache/directory/server/core/interceptor/BaseInterceptor.java Thu Aug 11 10:07:20 2011 @@ -115,7 +115,6 @@ public abstract class BaseInterceptor im protected static AttributeType UNIQUE_MEMBER_AT; - /** * default interceptor name is its class, preventing accidental duplication of interceptors by naming * instances differently Modified: directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java?rev=1156561&r1=1156560&r2=1156561&view=diff ============================================================================== --- directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java (original) +++ directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java Thu Aug 11 10:07:20 2011 @@ -1640,7 +1640,7 @@ public abstract class ServerContext impl criteria.setAliasDerefMode( AliasDerefMode.getEnum( env ) ); criteria.setBase( buildTarget( JndiUtils.fromName( name ) ) ); - service.getEventService().addListener( listener ); + service.getEventService().addListener( listener, criteria ); listeners.put( namingListener, listener ); } catch ( Exception e ) Modified: directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java?rev=1156561&r1=1156560&r2=1156561&view=diff ============================================================================== --- directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java (original) +++ directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerDirContext.java Thu Aug 11 10:07:20 2011 @@ -981,7 +981,7 @@ public abstract class ServerDirContext e criteria.setAliasDerefMode( AliasDerefMode.getEnum( getEnvironment() ) ); criteria.setBase( buildTarget( JndiUtils.fromName( name ) ) ); - getDirectoryService().getEventService().addListener( listener ); + getDirectoryService().getEventService().addListener( listener, criteria ); getListeners().put( namingListener, listener ); } catch ( Exception e ) Added: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/DefaultEventService.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/DefaultEventService.java?rev=1156561&view=auto ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/DefaultEventService.java (added) +++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/DefaultEventService.java Thu Aug 11 10:07:20 2011 @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.directory.server.core.event; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import org.apache.directory.server.core.DirectoryService; +import org.apache.directory.server.core.normalization.FilterNormalizingVisitor; +import org.apache.directory.shared.ldap.model.filter.ExprNode; +import org.apache.directory.shared.ldap.model.schema.SchemaManager; +import org.apache.directory.shared.ldap.model.schema.normalizers.ConcreteNameComponentNormalizer; +import org.apache.directory.shared.ldap.model.schema.normalizers.NameComponentNormalizer; + +/** + * A class implementing the EventService interface. It stores all the Listener + * associated with a DirectoryService. + * + * @author Apache Directory Project + */ +class DefaultEventService implements EventService +{ + /** The list of RegistrationEntries being registered */ + private List registrations = new CopyOnWriteArrayList(); + + /** The DirectoryService instance */ + private DirectoryService directoryService; + + /** A normalizer used for filters */ + private FilterNormalizingVisitor filterNormalizer; + + /** + * Create an instance of EventService + * @param directoryService The associated DirectoryService + * @param registrations The list of Registrations + */ + public DefaultEventService( DirectoryService directoryService ) + { + this.directoryService= directoryService; + SchemaManager schemaManager = directoryService.getSchemaManager(); + NameComponentNormalizer ncn = new ConcreteNameComponentNormalizer( schemaManager ); + filterNormalizer = new FilterNormalizingVisitor( ncn, schemaManager ); + } + + + /** + * {@inheritDoc} + */ + public void addListener( DirectoryListener listener, NotificationCriteria criteria ) throws Exception + { + criteria.getBase().apply( directoryService.getSchemaManager() ); + ExprNode result = ( ExprNode ) criteria.getFilter().accept( filterNormalizer ); + criteria.setFilter( result ); + registrations.add( new RegistrationEntry( listener, criteria ) ); + } + + + /** + * {@inheritDoc} + */ + public void removeListener( DirectoryListener listener ) + { + for ( RegistrationEntry entry : registrations ) + { + if ( entry.getListener() == listener ) + { + registrations.remove( entry ); + } + } + } + + + /** + * {@inheritDoc} + */ + public List getRegistrationEntries() + { + return Collections.unmodifiableList( registrations ); + } +} Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java?rev=1156561&r1=1156560&r2=1156561&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/event/EventInterceptor.java Thu Aug 11 10:07:20 2011 @@ -24,7 +24,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -40,12 +39,10 @@ import org.apache.directory.server.core. import org.apache.directory.server.core.interceptor.context.MoveOperationContext; import org.apache.directory.server.core.interceptor.context.OperationContext; import org.apache.directory.server.core.interceptor.context.RenameOperationContext; -import org.apache.directory.server.core.normalization.FilterNormalizingVisitor; import org.apache.directory.server.core.partition.ByPassConstants; import org.apache.directory.shared.ldap.model.constants.SchemaConstants; import org.apache.directory.shared.ldap.model.entry.Entry; import org.apache.directory.shared.ldap.model.exception.LdapException; -import org.apache.directory.shared.ldap.model.filter.ExprNode; import org.apache.directory.shared.ldap.model.name.Dn; import org.apache.directory.shared.ldap.model.schema.normalizers.ConcreteNameComponentNormalizer; import org.apache.directory.shared.ldap.model.schema.normalizers.NameComponentNormalizer; @@ -61,30 +58,34 @@ import org.slf4j.LoggerFactory; */ public class EventInterceptor extends BaseInterceptor { + /** A logger for this class */ private final static Logger LOG = LoggerFactory.getLogger( EventInterceptor.class ); - - private List registrations = new CopyOnWriteArrayList(); - private FilterNormalizingVisitor filterNormalizer; + private Evaluator evaluator; private ExecutorService executor; - @Override - public void init( DirectoryService directpryService ) throws LdapException + /** + * Initialize the event interceptor. It creates a pool of executor which will be used + * to call the listeners in separate threads. + */ + public void init( DirectoryService directoryService ) throws LdapException { LOG.info( "Initializing ..." ); - super.init( directpryService ); + super.init( directoryService ); NameComponentNormalizer ncn = new ConcreteNameComponentNormalizer( schemaManager ); - filterNormalizer = new FilterNormalizingVisitor( ncn, schemaManager ); evaluator = new ExpressionEvaluator( schemaManager ); executor = new ThreadPoolExecutor( 1, 10, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue( 100 ) ); - this.directoryService.setEventService( new DefaultEventService() ); + this.directoryService.setEventService( new DefaultEventService( directoryService ) ); LOG.info( "Initialization complete." ); } + /** + * Call the listener passing it the context. + */ private void fire( final OperationContext opContext, EventType type, final DirectoryListener listener ) { switch ( type ) @@ -97,7 +98,9 @@ public class EventInterceptor extends Ba listener.entryAdded( ( AddOperationContext ) opContext ); } } ); + break; + case DELETE: executor.execute( new Runnable() { @@ -106,7 +109,9 @@ public class EventInterceptor extends Ba listener.entryDeleted( ( DeleteOperationContext ) opContext ); } } ); + break; + case MODIFY: executor.execute( new Runnable() { @@ -115,7 +120,9 @@ public class EventInterceptor extends Ba listener.entryModified( ( ModifyOperationContext ) opContext ); } } ); + break; + case MOVE: executor.execute( new Runnable() { @@ -124,7 +131,9 @@ public class EventInterceptor extends Ba listener.entryMoved( ( MoveOperationContext ) opContext ); } } ); + break; + case RENAME: executor.execute( new Runnable() { @@ -133,14 +142,19 @@ public class EventInterceptor extends Ba listener.entryRenamed( ( RenameOperationContext ) opContext ); } } ); + break; } } + /** + * {@inheritDoc} + */ public void add( NextInterceptor next, final AddOperationContext addContext ) throws LdapException { next.add( addContext ); + List selecting = getSelectingRegistrations( addContext.getDn(), addContext.getEntry() ); if ( selecting.isEmpty() ) @@ -158,6 +172,9 @@ public class EventInterceptor extends Ba } + /** + * {@inheritDoc} + */ public void delete( NextInterceptor next, final DeleteOperationContext deleteContext ) throws LdapException { List selecting = getSelectingRegistrations( deleteContext.getDn(), deleteContext.getEntry() ); @@ -178,6 +195,9 @@ public class EventInterceptor extends Ba } + /** + * {@inheritDoc} + */ public void modify( NextInterceptor next, final ModifyOperationContext modifyContext ) throws LdapException { Entry oriEntry = modifyContext.getEntry(); @@ -205,6 +225,9 @@ public class EventInterceptor extends Ba } + /** + * {@inheritDoc} + */ public void rename( NextInterceptor next, RenameOperationContext renameContext ) throws LdapException { Entry oriEntry = ((ClonedServerEntry)renameContext.getEntry()).getOriginalEntry(); @@ -231,6 +254,9 @@ public class EventInterceptor extends Ba } + /** + * {@inheritDoc} + */ public void moveAndRename( NextInterceptor next, final MoveAndRenameOperationContext moveAndRenameContext ) throws LdapException { Entry oriEntry = moveAndRenameContext.getOriginalEntry(); @@ -283,26 +309,25 @@ public class EventInterceptor extends Ba } - List getSelectingRegistrations( Dn name, Entry entry ) throws LdapException + /** + * Find a list of registrationEntries given an entry and a name. We check against + * the criteria for each registrationEntry + */ + private List getSelectingRegistrations( Dn name, Entry entry ) throws LdapException { - if ( registrations.isEmpty() ) + if ( directoryService.getEventService().getRegistrationEntries().isEmpty() ) { return Collections.emptyList(); } List selecting = new ArrayList(); - for ( RegistrationEntry registration : registrations ) + for ( RegistrationEntry registration : directoryService.getEventService().getRegistrationEntries() ) { NotificationCriteria criteria = registration.getCriteria(); Dn base = criteria.getBase(); - if ( !criteria.getFilter().isSchemaAware() ) - { - criteria.getFilter().accept( filterNormalizer ); - } - // fix for DIRSERVER-1502 if ( ( name.equals( base ) || name.isDescendantOf( base ) ) && evaluator.evaluate( criteria.getFilter(), base, entry ) ) @@ -313,49 +338,4 @@ public class EventInterceptor extends Ba return selecting; } - - // ----------------------------------------------------------------------- - // EventService Inner Class - // ----------------------------------------------------------------------- - - class DefaultEventService implements EventService - { - /* - * Does not need normalization since default values in criteria is used. - */ - public void addListener( DirectoryListener listener ) - { - registrations.add( new RegistrationEntry( listener ) ); - } - - - /* - * Normalizes the criteria filter and the base. - */ - public void addListener( DirectoryListener listener, NotificationCriteria criteria ) throws Exception - { - criteria.getBase().apply( directoryService.getSchemaManager() ); - ExprNode result = ( ExprNode ) criteria.getFilter().accept( filterNormalizer ); - criteria.setFilter( result ); - registrations.add( new RegistrationEntry( listener, criteria ) ); - } - - - public void removeListener( DirectoryListener listener ) - { - for ( RegistrationEntry entry : registrations ) - { - if ( entry.getListener() == listener ) - { - registrations.remove( entry ); - } - } - } - - - public List getRegistrationEntries() - { - return Collections.unmodifiableList( registrations ); - } - } }