Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 93255 invoked from network); 24 Jun 2005 03:09:09 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 24 Jun 2005 03:09:09 -0000 Received: (qmail 59660 invoked by uid 500); 24 Jun 2005 03:09:07 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 59528 invoked by uid 500); 24 Jun 2005 03:09:06 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 59387 invoked by uid 99); 24 Jun 2005 03:09:04 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 23 Jun 2005 20:09:04 -0700 X-ASF-Spam-Status: No, hits=0.2 required=10.0 tests=NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Thu, 23 Jun 2005 20:08:59 -0700 Received: (qmail 92818 invoked by uid 65534); 24 Jun 2005 03:08:56 -0000 Message-ID: <20050624030856.92817.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r201550 [3/5] - in /directory/apacheds/trunk/core: ./ src/main/aspects/ src/main/java/org/apache/ldap/server/ src/main/java/org/apache/ldap/server/authn/ src/main/java/org/apache/ldap/server/authz/ src/main/java/org/apache/ldap/server/confi... Date: Fri, 24 Jun 2005 03:08:39 -0000 To: commits@directory.apache.org From: trustin@apache.org X-Mailer: svnmailer-1.0.2 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java Thu Jun 23 20:08:31 2005 @@ -19,22 +19,28 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; +import javax.naming.ConfigurationException; +import javax.naming.Name; +import javax.naming.NamingEnumeration; import javax.naming.NamingException; +import javax.naming.directory.Attributes; +import javax.naming.directory.ModificationItem; +import javax.naming.directory.SearchControls; +import org.apache.ldap.common.filter.ExprNode; import org.apache.ldap.server.configuration.InterceptorConfiguration; -import org.apache.ldap.server.invocation.Invocation; +import org.apache.ldap.server.configuration.MutableInterceptorConfiguration; +import org.apache.ldap.server.jndi.ContextFactoryConfiguration; +import org.apache.ldap.server.partition.ContextPartitionNexus; /** - * Manages the chain of {@link Interceptor}s. InterceptorChain - * is also an {@link Interceptor}, and thus you can create hiararchical - * interceptor structure to break down complex interceptors. + * Manages the chain of {@link Interceptor}s. * * @author Apache Directory Project * @version $Rev$, $Date$ @@ -43,12 +49,11 @@ { private final Interceptor FINAL_INTERCEPTOR = new Interceptor() { - private InterceptorContext ctx; + private ContextPartitionNexus nexus; - - public void init( InterceptorContext context ) + public void init( ContextFactoryConfiguration factoryCfg, InterceptorConfiguration cfg ) { - ctx = context; + this.nexus = factoryCfg.getPartitionNexus(); } @@ -58,258 +63,270 @@ } - public void process( NextInterceptor nextInterceptor, Invocation call ) throws NamingException + public Attributes getRootDSE( NextInterceptor next ) throws NamingException { - if ( parent == null ) - { - // execute the actual backend operation only when this chain is root. + return nexus.getRootDSE(); + } - call.execute( ctx.getRootNexus() ); - } + + public Name getMatchedName( NextInterceptor next, Name dn, boolean normalized ) throws NamingException + { + return ( Name ) nexus.getMatchedName( dn, normalized ).clone(); } - }; - private InterceptorChain parent; - private final Map name2entry = new HashMap(); + public Name getSuffix( NextInterceptor next, Name dn, boolean normalized ) throws NamingException + { + return ( Name ) nexus.getSuffix( dn, normalized ).clone(); + } - private final Map interceptor2entry = new IdentityHashMap(); - private final Entry tail = new Entry( null, null, "end", FINAL_INTERCEPTOR ); + public Iterator listSuffixes( NextInterceptor next, boolean normalized ) throws NamingException + { + return nexus.listSuffixes( normalized ); + } - private Entry head = tail; + public void delete( NextInterceptor next, Name name ) throws NamingException + { + nexus.delete( name ); + } - /** - * Create a new interceptor chain. - */ - public InterceptorChain() - { - this( new ArrayList() ); - } - - /** - * Creates a new interceptor chain - * @param configurations - */ - public InterceptorChain( List configurations ) - { - Iterator it = configurations.iterator(); - while( it.hasNext() ) + + public void add( NextInterceptor next, String upName, Name normName, Attributes entry ) throws NamingException { - InterceptorConfiguration cfg = ( InterceptorConfiguration ) it.next(); - this.addLast( cfg.getName(), cfg.getInterceptor() ); + nexus.add( upName, normName, entry ); } - } - /** - * Initializes all interceptors this chain contains. - */ - public synchronized void init( InterceptorContext ctx ) throws NamingException - { - ListIterator it = getAll().listIterator(); + public void modify( NextInterceptor next, Name name, int modOp, Attributes mods ) throws NamingException + { + nexus.modify( name, modOp, mods ); + } - Interceptor interceptor = null; - try + public void modify( NextInterceptor next, Name name, ModificationItem[] mods ) throws NamingException { - while ( it.hasNext() ) - { - interceptor = ( Interceptor ) it.next(); - interceptor.init( ctx ); - } + nexus.modify( name, mods ); } - catch ( Throwable t ) + + + public NamingEnumeration list( NextInterceptor next, Name base ) throws NamingException { - while ( it.hasPrevious() ) - { - Interceptor i = ( Interceptor ) it.previous(); + return nexus.list( base ); + } - try - { - i.destroy(); - } - catch ( Throwable t2 ) - { - t2.printStackTrace(); - } - } - if ( t instanceof NamingException ) - { - throw ( NamingException ) t; - } - else - { - throw new InterceptorException( interceptor, null, "Failed to initialize interceptor chain.", t ); - } + public NamingEnumeration search( NextInterceptor next, Name base, Map env, ExprNode filter, SearchControls searchCtls ) throws NamingException + { + return nexus.search( base, env, filter, searchCtls ); } - } - /** - * Deinitializes all interceptors this chain contains. - */ - public synchronized void destroy() - { - ListIterator it = getAllReversed().listIterator(); + public Attributes lookup( NextInterceptor next, Name name ) throws NamingException + { + return ( Attributes ) nexus.lookup( name ).clone(); + } - while ( it.hasNext() ) + + public Attributes lookup( NextInterceptor next, Name dn, String[] attrIds ) throws NamingException { - Interceptor interceptor = ( Interceptor ) it.next(); + return ( Attributes ) nexus.lookup( dn, attrIds ).clone(); + } - try - { - interceptor.destroy(); - } - catch ( Throwable t ) - { - t.printStackTrace(); - } + + public boolean hasEntry( NextInterceptor next, Name name ) throws NamingException + { + return nexus.hasEntry( name ); } - } - /** - * Returns the interceptor with the specified name. - * - * @return null if there is no interceptor with the specified name. - */ - public Interceptor get( String name ) - { - Entry e = ( Entry ) name2entry.get( name ); + public boolean isSuffix( NextInterceptor next, Name name ) throws NamingException + { + return nexus.isSuffix( name ); + } - if ( e == null ) + + public void modifyRn( NextInterceptor next, Name name, String newRn, boolean deleteOldRn ) throws NamingException { - return null; + nexus.modifyRn( name, newRn, deleteOldRn ); } - return e.interceptor; - } + public void move( NextInterceptor next, Name oriChildName, Name newParentName ) throws NamingException + { + nexus.move( oriChildName, newParentName ); + } + + + public void move( NextInterceptor next, Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn ) throws NamingException + { + nexus.move( oriChildName, newParentName, newRn, deleteOldRn ); + } + }; + + private final Map name2entry = new HashMap(); + + private final Entry tail; + + private Entry head; + + private ContextFactoryConfiguration factoryCfg; /** - * Adds the specified interceptor with the specified name at the beginning of this chain. + * Create a new interceptor chain. */ - public synchronized void addFirst( String name, - Interceptor interceptor ) + public InterceptorChain() { - checkAddable( name, interceptor ); - register( name, interceptor, head ); + MutableInterceptorConfiguration tailCfg = new MutableInterceptorConfiguration(); + tailCfg.setName( "tail" ); + tailCfg.setInterceptor( FINAL_INTERCEPTOR ); + tail = new Entry( null, null, tailCfg ); + head = tail; } /** - * Adds the specified interceptor with the specified name at the end of this chain. + * Initializes and registers all interceptors according to the specified + * {@link ContextFactoryConfiguration}. */ - public synchronized void addLast( String name, - Interceptor interceptor ) + public synchronized void init( ContextFactoryConfiguration factoryCfg ) throws NamingException { - checkAddable( name, interceptor ); - register( name, interceptor, tail ); + this.factoryCfg = factoryCfg; + + // Initialize tail first. + FINAL_INTERCEPTOR.init( factoryCfg, null ); + + // And register and initialize all interceptors + ListIterator i = factoryCfg.getStartupConfiguration().getInterceptorConfigurations().listIterator(); + Interceptor interceptor = null; + try + { + while( i.hasNext() ) + { + InterceptorConfiguration cfg = ( InterceptorConfiguration ) i.next(); + register( cfg ); + } + } + catch ( Throwable t ) + { + // destroy if failed to initialize all interceptors. + destroy(); + + if ( t instanceof NamingException ) + { + throw ( NamingException ) t; + } + else + { + throw new InterceptorException( interceptor, "Failed to initialize interceptor chain.", t ); + } + } } /** - * Adds the specified interceptor with the specified name just before the interceptor whose name is - * baseName in this chain. + * Deinitializes and deregisters all interceptors this chain contains. */ - public synchronized void addBefore( String baseName, String name, Interceptor interceptor ) + public synchronized void destroy() { - Entry baseEntry = checkOldName( baseName ); - checkAddable( name, interceptor ); - register( name, interceptor, baseEntry ); + List entries = new ArrayList(); + Entry e = tail; + do + { + entries.add( e ); + e = e.prevEntry; + } + while ( e != null ); + + Iterator i = entries.iterator(); + while ( i.hasNext() ) + { + e = ( Entry ) i.next(); + if( e != tail ) + { + try + { + deregister( e.configuration ); + } + catch ( Throwable t ) + { + t.printStackTrace(); + } + } + } } /** - * Adds the specified interceptor with the specified name just after the interceptor whose name is - * baseName in this chain. + * Adds and initializes an interceptor with the specified configuration. */ - public synchronized void addAfter( String baseName, String name, Interceptor interceptor ) + private void register( InterceptorConfiguration cfg ) throws NamingException { - Entry baseEntry = checkOldName( baseName ); - checkAddable( name, interceptor ); - register( name, interceptor, baseEntry ); + checkAddable( cfg ); + register0( cfg, tail ); } /** - * Removes the interceptor with the specified name from this chain. + * Removes and deinitializes the interceptor with the specified configuration. */ - public synchronized void remove( String name ) + private void deregister( InterceptorConfiguration cfg ) throws ConfigurationException { + String name = cfg.getName(); Entry entry = checkOldName( name ); - Entry prevEntry = entry.prevEntry; - Entry nextEntry = entry.nextEntry; + if( nextEntry == null ) + { + // Don't deregister tail + return; + } + if ( prevEntry == null ) { nextEntry.prevEntry = null; - head = entry; } else { prevEntry.nextEntry = nextEntry; - nextEntry.prevEntry = prevEntry; } name2entry.remove( name ); - - Interceptor interceptor = entry.interceptor; - - interceptor2entry.remove( interceptor ); - - if ( interceptor instanceof InterceptorChain ) - { - ( ( InterceptorChain ) interceptor ).parent = null; - } - } - - - /** - * Removes all interceptors added to this chain. - */ - public synchronized void clear() - { - Iterator it = new ArrayList( name2entry.keySet() ).iterator(); - - while ( it.hasNext() ) - { - this.remove( ( String ) it.next() ); - } + entry.configuration.getInterceptor().destroy(); } - private void register( String name, Interceptor interceptor, Entry nextEntry ) + private void register0( InterceptorConfiguration cfg, Entry nextEntry ) throws NamingException { + String name = cfg.getName(); + Interceptor interceptor = cfg.getInterceptor(); + interceptor.init( factoryCfg, cfg ); + Entry newEntry; if( nextEntry == head ) { - newEntry = new Entry( null, head, name, interceptor ); + newEntry = new Entry( null, head, cfg ); head.prevEntry = newEntry; head = newEntry; } else if( head == tail ) { - newEntry = new Entry( null, tail, name, interceptor ); + newEntry = new Entry( null, tail, cfg ); tail.prevEntry = newEntry; head = newEntry; } else { - newEntry = new Entry( nextEntry.prevEntry, nextEntry, name, interceptor ); + newEntry = new Entry( nextEntry.prevEntry, nextEntry, cfg ); nextEntry.prevEntry.nextEntry = newEntry; nextEntry.prevEntry = newEntry; } name2entry.put( name, newEntry ); - interceptor2entry.put( newEntry.interceptor, newEntry ); } @@ -318,13 +335,13 @@ * * @return An interceptor entry with the specified name. */ - private Entry checkOldName( String baseName ) + private Entry checkOldName( String baseName ) throws ConfigurationException { Entry e = ( Entry ) name2entry.get( baseName ); if ( e == null ) { - throw new IllegalArgumentException( "Unknown interceptor name:" + baseName ); + throw new ConfigurationException( "Unknown interceptor name:" + baseName ); } return e; @@ -334,35 +351,42 @@ /** * Checks the specified interceptor name is already taken and throws an exception if already taken. */ - private void checkAddable( String name, Interceptor interceptor ) + private void checkAddable( InterceptorConfiguration cfg ) throws ConfigurationException { - if ( name2entry.containsKey( name ) ) + if ( name2entry.containsKey( cfg.getName() ) ) { - throw new IllegalArgumentException( "Other interceptor is using name '" + name + "'" ); + throw new ConfigurationException( "Other interceptor is using name '" + cfg.getName() + "'" ); } + } + - if ( interceptor instanceof InterceptorChain ) + public Attributes getRootDSE() throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try { - if ( ( ( InterceptorChain ) interceptor ).parent != null ) - { - throw new IllegalArgumentException( "This interceptor chain has its parent already." ); - } + return head.getRootDSE( next ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable } } - /** - * Start invocation chain with the specified invocation. - * - * @throws NamingException if invocation failed - */ - public void process( Invocation invocation ) throws NamingException + public Name getMatchedName( Name name, boolean normalized ) throws NamingException { - Entry head = this.head; - + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; try { - head.interceptor.process( head.nextInterceptor, invocation ); + return head.getMatchedName( next, name, normalized ); } catch ( NamingException ne ) { @@ -370,95 +394,585 @@ } catch ( Throwable e ) { - throw new InterceptorException( head.interceptor, invocation, "Unexpected exception.", e ); + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable } } - /** - * Returns the list of interceptors this chain in the order of evaluation. - */ - public List getAll() + public Name getSuffix( Name name, boolean normalized ) throws NamingException { - List list = new ArrayList(); - - Entry e = head; - - do + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try { - list.add( e.interceptor ); - - e = e.nextEntry; + return head.getSuffix( next, name, normalized ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable } - while ( e != null ); - - return list; } - /** - * Returns the list of interceptors this chain in the reversed order of evaluation. - */ - public List getAllReversed() + public Iterator listSuffixes( boolean normalized ) throws NamingException { - List list = new ArrayList(); + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + return head.listSuffixes( next, normalized ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable + } + } - Entry e = tail; - do + public void delete( Name name ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try { - list.add( e.interceptor ); - - e = e.prevEntry; + head.delete( next, name ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); } + } - while ( e != null ); - return list; + public void add( String upName, Name normName, Attributes entry ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + head.add( next, upName, normName, entry ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + } } - /** - * Represents an internal entry of this chain. - */ - private class Entry + public void modify( Name name, int modOp, Attributes mods ) throws NamingException { - private Entry prevEntry; - - private Entry nextEntry; + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + head.modify( next, name, modOp, mods ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + } + } - private final Interceptor interceptor; - private final NextInterceptor nextInterceptor; + public void modify( Name name, ModificationItem[] mods ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + head.modify( next, name, mods ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + } + } - private Entry( Entry prevEntry, Entry nextEntry, - String name, Interceptor interceptor ) + public NamingEnumeration list( Name base ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try { - if ( interceptor == null ) - { - throw new NullPointerException( "interceptor" ); - } - if ( name == null ) + return head.list( next, base ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable + } + } + + + public NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + return head.search( next, base, env, filter, searchCtls ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable + } + } + + + public Attributes lookup( Name name ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + return head.lookup( next, name ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable + } + } + + + public Attributes lookup( Name dn, String[] attrIds ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + return head.lookup( next, dn, attrIds ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable + } + } + + + public boolean hasEntry( Name name ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + return head.hasEntry( next, name ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable + } + } + + + public boolean isSuffix( Name name ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + return head.isSuffix( next, name ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + throw new InternalError(); // Should be unreachable + } + } + + + public void modifyRn( Name name, String newRn, boolean deleteOldRn ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + head.modifyRn( next, name, newRn, deleteOldRn ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + } + } + + + public void move( Name oriChildName, Name newParentName ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + head.move( next, oriChildName, newParentName ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + } + } + + + public void move( Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn ) throws NamingException + { + Interceptor head = this.head.configuration.getInterceptor(); + NextInterceptor next = this.head.nextInterceptor; + try + { + head.move( next, oriChildName, newParentName, newRn, deleteOldRn ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( head, e ); + } + } + + + /** + * Represents an internal entry of this chain. + */ + private class Entry + { + private Entry prevEntry; + + private Entry nextEntry; + + private final InterceptorConfiguration configuration; + + private final NextInterceptor nextInterceptor; + + + private Entry( Entry prevEntry, Entry nextEntry, + InterceptorConfiguration configuration ) + { + if ( configuration == null ) { - throw new NullPointerException( "name" ); + throw new NullPointerException( "configuration" ); } this.prevEntry = prevEntry; this.nextEntry = nextEntry; - this.interceptor = interceptor; + this.configuration = configuration; this.nextInterceptor = new NextInterceptor() { - public void process( Invocation call ) throws NamingException + public Attributes getRootDSE() throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.getRootDSE( Entry.this.nextEntry.nextInterceptor ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public Name getMatchedName( Name dn, boolean normalized ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.getMatchedName( Entry.this.nextEntry.nextInterceptor, dn, normalized ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public Name getSuffix( Name dn, boolean normalized ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.getSuffix( Entry.this.nextEntry.nextInterceptor, dn, normalized ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public Iterator listSuffixes( boolean normalized ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.listSuffixes( Entry.this.nextEntry.nextInterceptor, normalized ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public void delete( Name name ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + interceptor.delete( Entry.this.nextEntry.nextInterceptor, name ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + } + } + + public void add( String upName, Name normName, Attributes entry ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + interceptor.add( Entry.this.nextEntry.nextInterceptor, upName, normName, entry ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + } + } + + public void modify( Name name, int modOp, Attributes mods ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + interceptor.modify( Entry.this.nextEntry.nextInterceptor, name, modOp, mods ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + } + } + + public void modify( Name name, ModificationItem[] mods ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + interceptor.modify( Entry.this.nextEntry.nextInterceptor, name, mods ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + } + } + + public NamingEnumeration list( Name base ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.list( Entry.this.nextEntry.nextInterceptor, base ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public NamingEnumeration search( Name base, Map env, ExprNode filter, SearchControls searchCtls ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.search( Entry.this.nextEntry.nextInterceptor, base, env, filter, searchCtls ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public Attributes lookup( Name name ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.lookup( Entry.this.nextEntry.nextInterceptor, name ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public Attributes lookup( Name dn, String[] attrIds ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.lookup( Entry.this.nextEntry.nextInterceptor, dn, attrIds ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public boolean hasEntry( Name name ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + return interceptor.hasEntry( Entry.this.nextEntry.nextInterceptor, name ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public boolean isSuffix( Name name ) throws NamingException { - Interceptor interceptor = Entry.this.nextEntry.interceptor; + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); try { - interceptor.process( Entry.this.nextEntry.nextInterceptor, call ); + return interceptor.isSuffix( Entry.this.nextEntry.nextInterceptor, name ); } catch ( NamingException ne ) { @@ -466,10 +980,71 @@ } catch ( Throwable e ) { - throw new InterceptorException( interceptor, call, "Unexpected exception.", e ); + throwInterceptorException( interceptor, e ); + throw new InternalError(); // Should be unreachable + } + } + + public void modifyRn( Name name, String newRn, boolean deleteOldRn ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + interceptor.modifyRn( Entry.this.nextEntry.nextInterceptor, name, newRn, deleteOldRn ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + } + } + + public void move( Name oriChildName, Name newParentName ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + interceptor.move( Entry.this.nextEntry.nextInterceptor, oriChildName, newParentName ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); + } + } + + public void move( Name oriChildName, Name newParentName, String newRn, boolean deleteOldRn ) throws NamingException + { + Interceptor interceptor = Entry.this.nextEntry.configuration.getInterceptor(); + + try + { + interceptor.move( Entry.this.nextEntry.nextInterceptor, oriChildName, newParentName, newRn, deleteOldRn ); + } + catch ( NamingException ne ) + { + throw ne; + } + catch ( Throwable e ) + { + throwInterceptorException( interceptor, e ); } } }; } + } + + + private static void throwInterceptorException( Interceptor interceptor, Throwable e ) throws InterceptorException + { + throw new InterceptorException( interceptor, "Unexpected exception.", e ); } } Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorException.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorException.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorException.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorException.java Thu Jun 23 20:08:31 2005 @@ -17,28 +17,21 @@ package org.apache.ldap.server.interceptor; -import org.apache.ldap.common.exception.LdapException; -import org.apache.ldap.common.exception.LdapNamingException; -import org.apache.ldap.common.message.ResultCodeEnum; -import org.apache.ldap.server.invocation.Invocation; +import javax.naming.NamingException; /** - * A {@link LdapNamingException} that wraps uncaught runtime exceptions thrown from {@link Interceptor}s. + * A {@link NamingException} that wraps uncaught runtime exceptions thrown + * from {@link Interceptor}s. * * @author Apache Directory Project * @version $Rev$, $Date$ */ -public class InterceptorException extends LdapNamingException +public class InterceptorException extends NamingException { private static final long serialVersionUID = 3258690996517746233L; /** - * The Invocation the Interceptor failed on - */ - private final Invocation invocation; - - /** * The Interceptor causing the failure */ private final Interceptor interceptor; @@ -48,14 +41,9 @@ * Creates an InterceptorException without a message. * * @param interceptor the Interceptor causing the failure - * @param invocation the Invocation the Interceptor failed on */ - public InterceptorException( Interceptor interceptor, Invocation invocation ) + public InterceptorException( Interceptor interceptor ) { - super( ResultCodeEnum.OTHER ); - - this.invocation = invocation; - this.interceptor = interceptor; } @@ -64,15 +52,11 @@ * Creates an InterceptorException with a custom message. * * @param interceptor the Interceptor causing the failure - * @param invocation the Invocation the Interceptor failed on * @param explanation String explanation of why the Interceptor failed */ - public InterceptorException( Interceptor interceptor, Invocation invocation, String explanation ) + public InterceptorException( Interceptor interceptor, String explanation ) { - super( explanation, ResultCodeEnum.OTHER ); - - this.invocation = invocation; - + super( explanation ); this.interceptor = interceptor; } @@ -81,13 +65,11 @@ * Creates an InterceptorException without a message. * * @param interceptor the Interceptor causing the failure - * @param invocation the Invocation the Interceptor failed on * @param rootCause the root cause of this exception */ - public InterceptorException( Interceptor interceptor, Invocation invocation, Throwable rootCause ) + public InterceptorException( Interceptor interceptor, Throwable rootCause ) { - this( interceptor, invocation ); - + this( interceptor ); super.setRootCause( rootCause ); } @@ -96,31 +78,18 @@ * Creates an InterceptorException without a message. * * @param interceptor the Interceptor causing the failure - * @param invocation the Invocation the Interceptor failed on * @param explanation String explanation of why the Interceptor failed * @param rootCause the root cause of this exception */ - public InterceptorException( Interceptor interceptor, Invocation invocation, String explanation, + public InterceptorException( Interceptor interceptor, String explanation, Throwable rootCause ) { - this( interceptor, invocation, explanation ); - + this( interceptor, explanation ); super.setRootCause( rootCause ); } /** - * Gets the invovation object this exception is associated with. - * - * @return the invovation object this exception is associated with - */ - public Invocation getInvocation() - { - return invocation; - } - - - /** * Gets the interceptor this exception is associated with. * * @return the interceptor this exception is associated with @@ -128,21 +97,5 @@ public Interceptor getInterceptor() { return interceptor; - } - - - /** - * Will return the resultCode of the root cause if the root cause implements LdapException. - * - * @see org.apache.ldap.common.exception.LdapException#getResultCode() - */ - public ResultCodeEnum getResultCode() - { - if ( getRootCause() != null && ( getRootCause() instanceof LdapException ) ) - { - return ( ( LdapException ) getRootCause() ).getResultCode(); - } - - return super.getResultCode(); } } Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/NextInterceptor.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/NextInterceptor.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/NextInterceptor.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/interceptor/NextInterceptor.java Thu Jun 23 20:08:31 2005 @@ -17,27 +17,97 @@ package org.apache.ldap.server.interceptor; -import org.apache.ldap.server.invocation.Invocation; +import java.util.Iterator; +import java.util.Map; +import javax.naming.Name; +import javax.naming.NamingEnumeration; import javax.naming.NamingException; +import javax.naming.directory.Attributes; +import javax.naming.directory.ModificationItem; +import javax.naming.directory.SearchControls; + +import org.apache.ldap.common.filter.ExprNode; /** - * Represents the next {@link org.apache.ldap.server.interceptor.Interceptor} in the interceptor chain. + * Represents the next {@link Interceptor} in the interceptor chain. * * @author Apache Directory Project * @version $Rev$, $Date$ - * @see org.apache.ldap.server.interceptor.Interceptor - * @see org.apache.ldap.server.interceptor.InterceptorChain + * @see Interceptor + * @see InterceptorChain */ public interface NextInterceptor { /** - * Passes the control of current invocation to the next {@link org.apache.ldap.server.interceptor.Interceptor} in - * the {@link org.apache.ldap.server.interceptor.InterceptorChain}. - * - * @param incovation - * @throws NamingException + * Calls the next interceptor's {@link Interceptor#getRootDSE(NextInterceptor)}. + */ + Attributes getRootDSE() throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#getMatchedName(NextInterceptor, Name, boolean)}. + */ + Name getMatchedName( Name name, boolean normalized ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#getSuffix(NextInterceptor, Name, boolean)}. + */ + Name getSuffix( Name name, boolean normalized ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#listSuffixes(NextInterceptor, boolean)}. + */ + Iterator listSuffixes( boolean normalized ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#delete(NextInterceptor, Name)}. + */ + void delete( Name name ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#add(NextInterceptor, String, Name, Attributes)}. + */ + void add( String userProvidedName, Name normalizedName, Attributes entry ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#modify(NextInterceptor, Name, int, Attributes)}. + */ + void modify( Name name, int modOp, Attributes attributes ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#modify(NextInterceptor, Name, ModificationItem[])}. + */ + void modify( Name name, ModificationItem[] items ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#list(NextInterceptor, Name)}. + */ + NamingEnumeration list( Name baseName ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#search(NextInterceptor, Name, Map, ExprNode, SearchControls)}. + */ + NamingEnumeration search( Name baseName, Map environment, ExprNode filter, + SearchControls searchControls ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#lookup(NextInterceptor, Name)}. + */ + Attributes lookup( Name name ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#lookup(NextInterceptor, Name, String[])}. + */ + Attributes lookup( Name name, String [] attrIds ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#hasEntry(NextInterceptor, Name)}. + */ + boolean hasEntry( Name name ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#isSuffix(NextInterceptor, Name)}. + */ + boolean isSuffix( Name name ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#modifyRn(NextInterceptor, Name, String, boolean)}. + */ + void modifyRn( Name name, String newRn, boolean deleteOldRn ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#move(NextInterceptor, Name, Name)}. + */ + void move( Name oldName, Name newParentName ) throws NamingException; + /** + * Calls the next interceptor's {@link Interceptor#move(NextInterceptor, Name, Name, String, boolean)}. */ - void process( Invocation incovation ) throws NamingException; + void move( Name oldName, Name newParentName, String newRn, + boolean deleteOldRn ) throws NamingException; } Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/invocation/Invocation.java Thu Jun 23 20:08:31 2005 @@ -17,99 +17,94 @@ package org.apache.ldap.server.invocation; -import java.io.Serializable; -import java.util.Stack; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import javax.naming.NamingException; +import javax.naming.Context; -import org.apache.ldap.server.BackingStore; +import org.apache.ldap.server.partition.ContextPartitionNexus; /** - * Represents a method invocation on {@link BackingStore}s. - *

- * This class is abstract, and developers should extend this class to - * represent the actual method invocations. + * Represents a call from JNDI {@link Context} to {@link ContextPartitionNexus}. * * @author Apache Directory Project * @version $Rev$, $Date$ */ -public abstract class Invocation implements Serializable +public class Invocation { - - protected transient Object returnValue; - - protected transient Stack contextStack; - + private final Context caller; + private final String name; + private final List parameters; /** - * Creates a new instance. This constructor does nothing. - */ - protected Invocation() - { - } - - - /** - * Returns the returnValue object for this invocation. - */ - public Object getReturnValue() - { - return returnValue; + * Creates a new instance that represents an invocation without parameters. + * + * @parem caller the JNDI {@link Context} that made this invocation + * @param name the name of the called method + */ + public Invocation( Context caller, String name ) + { + this( caller, name, null ); } - /** - * Sets the returnValue object for this invocation. - */ - public void setReturnValue( Object returnValue ) - { - this.returnValue = returnValue; + * Creates a new instance. + * + * @parem caller the JNDI {@link Context} that made this invocation + * @param name the name of the called method + * @param parameters the array of parameters passed to the called method + */ + public Invocation( Context caller, String name, Object[] parameters ) + { + if( caller == null ) + { + throw new NullPointerException( "caller" ); + } + if( name == null ) + { + throw new NullPointerException( "name" ); + } + + if( parameters == null ) + { + parameters = new Object[ 0 ]; + } + + this.caller = caller; + this.name = name; + + List paramList = new ArrayList(); + for( int i = 0; i < parameters.length; i++ ) + { + paramList.add( parameters[ i ] ); + } + + this.parameters = Collections.unmodifiableList( paramList ); } - - + /** - * Gets the context stack in which this invocation occurs. The - * context stack is a stack of LdapContexts. - * - * @return a stack of LdapContexts in which the invocation occurs + * Returns the JNDI {@link Context} which made this invocation. */ - public Stack getContextStack() + public Context getCaller() { - return contextStack; + return caller; } - - + /** - * Sets the context stack in which this invocation occurs. The context stack - * is a stack of LdapContexts. - * - * @param contextStack a stack of LdapContexts in which the invocation occurs + * Returns the name of the called method. */ - public void setContextStack( Stack contextStack ) + public String getName() { - this.contextStack = contextStack; + return name; } - - + /** - * Executes this invocation on the specified store. The default - * implementation calls an abstract method {@link #doExecute(BackingStore)} - * and sets the returnValue property of this invocation to its return value. - * - * @throws NamingException if the operation failed + * Returns the list of parameters parameters passed to the called method. */ - public void execute( BackingStore store ) throws NamingException + public List getParameters() { - setReturnValue( doExecute( store ) ); + return parameters; } - - - /** - * Implement this method to invoke the appropriate operation on the specified - * store. Returned value will be set as the returnValue proeprty of this invocation. - * - * @throws NamingException if the operation failed - */ - protected abstract Object doExecute( BackingStore store ) throws NamingException; } Propchange: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/invocation/InvocationStack.java ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/AbstractContextFactory.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/AbstractContextFactory.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/AbstractContextFactory.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/AbstractContextFactory.java Thu Jun 23 20:08:31 2005 @@ -19,21 +19,22 @@ import java.util.Hashtable; +import javax.naming.ConfigurationException; import javax.naming.Context; +import javax.naming.InitialContext; import javax.naming.NamingException; import javax.naming.spi.InitialContextFactory; import org.apache.ldap.server.configuration.Configuration; -import org.apache.ldap.server.configuration.ConfigurationException; import org.apache.ldap.server.configuration.ShutdownConfiguration; import org.apache.ldap.server.configuration.StartupConfiguration; import org.apache.ldap.server.configuration.SyncConfiguration; /** - * A server-side provider implementation of a InitialContextFactory. Can be - * utilized via JNDI API in the standard fashion: - * + * A server-side JNDI provider implementation of {@link InitialContextFactory}. + * This class can be utilized via JNDI API in the standard fashion: + *

* * Hashtable env = new Hashtable(); * env.put( Context.PROVIDER_URL, "ou=system" ); @@ -41,25 +42,36 @@ * Context.INITIAL_CONTEXT_FACTORY, "org.apache.ldap.server.jndi.CoreContextFactory" ); * InitialContext initialContext = new InitialContext( env ); * - * + *

+ * Unfortunately, {@link InitialContext} creates a new instance of + * {@link InitialContextFactory} implementation everytime it is instantiated, + * so this factory maintains only a static, singleton instance of + * {@link ContextFactoryService}, which provides actual implementation. + * Please note that you'll also have to maintain any stateful information + * as using singleton pattern if you're going to extend this factory. + *

+ * This class implements {@link ContextFactoryServiceListener}. This means that + * you can listen to the changes occurs to {@link ContextFactoryService}, and + * react to it (e.g. executing additional business logic). + * * @author Apache Directory Project * @version $Rev$, $Date$ * * @see javax.naming.spi.InitialContextFactory */ -public abstract class AbstractContextFactory implements InitialContextFactory +public abstract class AbstractContextFactory implements InitialContextFactory, ContextFactoryServiceListener { // ------------------------------------------------------------------------ // Members // ------------------------------------------------------------------------ - /** The singleton JndiProvider instance */ - private static final ContextFactoryConfiguration provider = new DefaultContextFactoryConfiguration(); + /** The singleton service instance */ + private static final ContextFactoryService service = new DefaultContextFactoryService(); /** - * Default constructor that sets the provider of this ServerContextFactory. + * Creates a new instance. */ - public AbstractContextFactory() + protected AbstractContextFactory() { } @@ -76,22 +88,22 @@ // Execute configuration if( cfg instanceof ShutdownConfiguration ) { - provider.shutdown(); + ( ( DefaultContextFactoryService ) service ).shutdown(); } else if( cfg instanceof SyncConfiguration ) { - provider.sync(); + service.sync(); } else if( cfg instanceof StartupConfiguration ) { - ( ( DefaultContextFactoryConfiguration ) provider ).startup( this, env ); + service.startup( this, env ); } - else if( provider == null ) + else if( service == null ) { throw new NamingException( "Unknown configuration: " + cfg ); } - return provider.getJndiContext( principal, credential, authentication, providerUrl ); + return service.getConfiguration().getJndiContext( principal, credential, authentication, providerUrl ); } private String extractProviderUrl( Hashtable env ) @@ -122,7 +134,7 @@ return authentication; } - private byte[] extractCredential( Hashtable env ) + private byte[] extractCredential( Hashtable env ) throws ConfigurationException { byte[] credential; Object value = env.remove( Context.SECURITY_CREDENTIALS ); @@ -159,11 +171,4 @@ } return principal; } - - protected abstract void beforeStartup( ContextFactoryConfiguration ctx ) throws NamingException; - protected abstract void afterStartup( ContextFactoryConfiguration ctx ) throws NamingException; - protected abstract void beforeShutdown( ContextFactoryConfiguration ctx ) throws NamingException; - protected abstract void afterShutdown( ContextFactoryConfiguration ctx ) throws NamingException; - protected abstract void beforeSync( ContextFactoryConfiguration ctx ) throws NamingException; - protected abstract void afterSync( ContextFactoryConfiguration ctx ) throws NamingException; } Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ContextFactoryConfiguration.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ContextFactoryConfiguration.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ContextFactoryConfiguration.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ContextFactoryConfiguration.java Thu Jun 23 20:08:31 2005 @@ -21,60 +21,71 @@ import javax.naming.Context; import javax.naming.NamingException; -import org.apache.ldap.server.RootNexus; -import org.apache.ldap.server.SystemPartition; import org.apache.ldap.server.configuration.StartupConfiguration; -import org.apache.ldap.server.invocation.Invocation; +import org.apache.ldap.server.interceptor.InterceptorChain; +import org.apache.ldap.server.partition.ContextPartitionNexus; import org.apache.ldap.server.schema.GlobalRegistries; -/** FIXME Rename to ContextFactoryContext */ +/** + * Represents the global configuration of currently running + * {@link ContextFactoryService}. You can access all properties of + * {@link ContextFactoryService} and get JNDI {@link Context}s it provides + * via this interface. + */ public interface ContextFactoryConfiguration { + /** - * Returns the initial context environment of this context factory. + * Returns the listener that listens to service events. */ - Hashtable getEnvironment(); + ContextFactoryServiceListener getServiceListener(); /** - * Returns the startup configuration of this context factory. + * Returns the initial context environment of the {@link ContextFactoryService}. */ - StartupConfiguration getConfiguration(); + Hashtable getEnvironment(); /** - * Returns the system partition used by this context factory. + * Returns the startup configuration of the {@link ContextFactoryService}. */ - SystemPartition getSystemPartition(); - + StartupConfiguration getStartupConfiguration(); + /** - * Returns the registries for system schema objects + * Returns the registries for system schema objects of the {@link ContextFactoryService}. */ GlobalRegistries getGlobalRegistries(); /** - * Returns the root nexus of this context factory. + * Returns the {@link ContextPartitionNexus} of the {@link ContextFactoryService}. */ - RootNexus getRootNexus(); + ContextPartitionNexus getPartitionNexus(); /** - * Returns true if this context is started for the first time - * and bootstrap entries have been created. + * Returns the interceptor chain of the {@link ContextFactoryService}. */ - boolean isFirstStart(); + InterceptorChain getInterceptorChain(); /** - * Returns true if this context is started. + * Returns true if this service is started + * and bootstrap entries have been created for the first time. */ - boolean isStarted(); + boolean isFirstStart(); - Context getJndiContext( String rootDN ) throws NamingException; - Context getJndiContext( String principal, byte[] credential, String authentication, String rootDN ) throws NamingException; - /** - * Invokes {@link Invocation} to this context. + * Returns an anonymous JNDI {@link Context} with the specified baseName + * @throws NamingException if failed to create a context */ - Object invoke( Invocation call ) throws NamingException; - - void sync() throws NamingException; + Context getJndiContext( String baseName ) throws NamingException; - void shutdown() throws NamingException; + /** + * Returns a JNDI {@link Context} with the specified authentication information + * (principal, credential, and authentication) and + * baseName. + * + * @param principal {@link Context#SECURITY_PRINCIPAL} value + * @param credential {@link Context#SECURITY_CREDENTIALS} value + * @param authentication {@link Context#SECURITY_AUTHENTICATION} value + * @throws NamingException if failed to create a context + */ + Context getJndiContext( String principal, byte[] credential, String authentication, String baseName ) throws NamingException; } Propchange: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ContextFactoryService.java ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Propchange: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ContextFactoryServiceListener.java ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Propchange: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ContextPartitionNexusProxy.java ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java Thu Jun 23 20:08:31 2005 @@ -21,20 +21,12 @@ /** - * A server-side provider implementation of a InitialContextFactory. Can be - * utilized via JNDI API in the standard fashion: - * - * - * Hashtable env = new Hashtable(); - * env.put( Context.PROVIDER_URL, "ou=system" ); - * env.put( - * Context.INITIAL_CONTEXT_FACTORY, "org.apache.ldap.server.jndi.CoreContextFactory" ); - * InitialContext initialContext = new InitialContext( env ); - * + * A simplistic implementation of {@link AbstractContextFactory}. + * This class simply extends {@link AbstractContextFactory} and leaves all + * abstract event listener methods as empty. * * @author Apache Directory Project * @version $Rev$ - * @see javax.naming.spi.InitialContextFactory */ public class CoreContextFactory extends AbstractContextFactory implements InitialContextFactory { @@ -45,27 +37,45 @@ { } - protected void beforeStartup( ContextFactoryConfiguration ctx ) throws NamingException + /** + * Does nothing by default. + */ + public void beforeStartup( ContextFactoryService service ) throws NamingException { } - protected void afterStartup( ContextFactoryConfiguration ctx ) throws NamingException + /** + * Does nothing by default. + */ + public void afterStartup( ContextFactoryService service ) throws NamingException { } - protected void beforeShutdown( ContextFactoryConfiguration ctx ) throws NamingException + /** + * Does nothing by default. + */ + public void beforeShutdown( ContextFactoryService service ) throws NamingException { } - protected void afterShutdown( ContextFactoryConfiguration ctx ) throws NamingException + /** + * Does nothing by default. + */ + public void afterShutdown( ContextFactoryService service ) throws NamingException { } - protected void beforeSync( ContextFactoryConfiguration ctx ) throws NamingException + /** + * Does nothing by default. + */ + public void beforeSync( ContextFactoryService service ) throws NamingException { } - protected void afterSync( ContextFactoryConfiguration ctx ) throws NamingException + /** + * Does nothing by default. + */ + public void afterSync( ContextFactoryService service ) throws NamingException { } } Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DeadContext.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DeadContext.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DeadContext.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DeadContext.java Thu Jun 23 20:08:31 2005 @@ -17,10 +17,14 @@ package org.apache.ldap.server.jndi; -import org.apache.ldap.common.exception.LdapServiceUnavailableException; -import org.apache.ldap.common.message.ResultCodeEnum; +import java.util.Hashtable; -import javax.naming.*; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.Name; +import javax.naming.NameParser; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.ModificationItem; @@ -29,19 +33,22 @@ import javax.naming.ldap.ExtendedRequest; import javax.naming.ldap.ExtendedResponse; import javax.naming.ldap.LdapContext; -import java.util.Hashtable; + +import org.apache.ldap.common.exception.LdapServiceUnavailableException; +import org.apache.ldap.common.message.ResultCodeEnum; +import org.apache.ldap.server.configuration.SyncConfiguration; /** * A do nothing placeholder context whose methods throw ConfigurationExceptions. - * The provider returns these context when the shutdown environment property key - * is set. By returning a non-null Context we prevent an unnecessary exception - * being thrown by InitialConext and any one of its subclasses. + * JNDI provider returns this context when your specify {@link SyncConfiguration} + * in JNDI environment. By returning a non-null Context we prevent an unnecessary + * exception being thrown by {@link InitialContext} and any one of its subclasses. * * @author Apache Directory Project - * @version $Rev$ + * @version $Rev$, $Date$ */ -public class DeadContext implements LdapContext +class DeadContext implements LdapContext { private final String EXCEPTION_MSG = "Context operation unavailable when " + "invoked after Eve provider has been shutdown"; Propchange: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/DefaultContextFactoryService.java ------------------------------------------------------------------------------ svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/JavaLdapSupport.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/JavaLdapSupport.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/JavaLdapSupport.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/JavaLdapSupport.java Thu Jun 23 20:08:31 2005 @@ -17,9 +17,14 @@ package org.apache.ldap.server.jndi; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + import javax.naming.NamingException; import javax.naming.directory.Attributes; -import java.io.*; /** @@ -31,7 +36,7 @@ * @author Apache Directory Project * @version $Rev$ */ -public class JavaLdapSupport +class JavaLdapSupport { // ------------------------------------------------------------------------ // Attribute Id Constants Used By The Java LDAP BootstrapSchema Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerContext.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerContext.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerContext.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerContext.java Thu Jun 23 20:08:31 2005 @@ -17,16 +17,19 @@ package org.apache.ldap.server.jndi; -import org.apache.ldap.common.exception.LdapNoPermissionException; -import org.apache.ldap.common.filter.PresenceNode; -import org.apache.ldap.common.message.LockableAttributesImpl; -import org.apache.ldap.common.name.LdapName; -import org.apache.ldap.common.util.NamespaceTools; -import org.apache.ldap.server.PartitionNexus; -import org.apache.ldap.server.authn.AuthenticationService; -import org.apache.ldap.server.authn.LdapPrincipal; +import java.io.Serializable; +import java.util.Hashtable; -import javax.naming.*; +import javax.naming.ConfigurationException; +import javax.naming.Context; +import javax.naming.InvalidNameException; +import javax.naming.Name; +import javax.naming.NameNotFoundException; +import javax.naming.NameParser; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; @@ -34,8 +37,15 @@ import javax.naming.ldap.Control; import javax.naming.spi.DirStateFactory; import javax.naming.spi.DirectoryManager; -import java.io.Serializable; -import java.util.Hashtable; + +import org.apache.ldap.common.exception.LdapNoPermissionException; +import org.apache.ldap.common.filter.PresenceNode; +import org.apache.ldap.common.message.LockableAttributesImpl; +import org.apache.ldap.common.name.LdapName; +import org.apache.ldap.common.util.NamespaceTools; +import org.apache.ldap.server.authn.AuthenticationService; +import org.apache.ldap.server.authn.LdapPrincipal; +import org.apache.ldap.server.partition.ContextPartitionNexus; /** @@ -50,7 +60,7 @@ public static final String DELETE_OLD_RDN_PROP = "java.naming.ldap.deleteRDN"; /** The interceptor proxy to the backend nexus */ - private final PartitionNexus nexusProxy; + private final ContextPartitionNexus nexusProxy; /** The cloned environment used by this Context */ private final Hashtable env; @@ -75,19 +85,20 @@ * referenced name actually exists within the system. This constructor * is used for all InitialContext requests. * - * @param nexusProxy the intercepting proxy to the nexus. + * @param service the parent service that manages this context * @param env the environment properties used by this context. * @throws NamingException if the environment parameters are not set * correctly. */ - protected ServerContext( PartitionNexus nexusProxy, Hashtable env ) throws NamingException + protected ServerContext( ContextFactoryService service, Hashtable env ) throws NamingException { - String url; - // set references to cloned env and the proxy - this.nexusProxy = nexusProxy; - - this.env = ( Hashtable ) env.clone(); + this.nexusProxy = new ContextPartitionNexusProxy( this, service ); + + ContextFactoryConfiguration cfg = service.getConfiguration(); + + this.env = ( Hashtable ) cfg.getEnvironment().clone(); + this.env.putAll( env ); /* -------------------------------------------------------------------- * check for the provider URL property and make sure it exists @@ -96,18 +107,16 @@ if ( ! env.containsKey( Context.PROVIDER_URL ) ) { String msg = "Expected property " + Context.PROVIDER_URL; - msg += " but could not find it in env!"; throw new ConfigurationException( msg ); } - url = ( String ) env.get( Context.PROVIDER_URL ); + String url = ( String ) env.get( Context.PROVIDER_URL ); if ( url == null ) { String msg = "Expected value for property " + Context.PROVIDER_URL; - msg += " but it was set to null in env!"; throw new ConfigurationException( msg ); @@ -132,7 +141,7 @@ * @param env the environment properties used by this context * @param dn the distinguished name of this context */ - protected ServerContext( LdapPrincipal principal, PartitionNexus nexusProxy, Hashtable env, Name dn ) + protected ServerContext( LdapPrincipal principal, ContextPartitionNexus nexusProxy, Hashtable env, Name dn ) { this.dn = ( LdapName ) dn.clone(); @@ -183,7 +192,7 @@ * * @return the proxy to the backend nexus. */ - protected PartitionNexus getNexusProxy() + protected ContextPartitionNexus getNexusProxy() { return nexusProxy ; } Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirContext.java Thu Jun 23 20:08:31 2005 @@ -17,22 +17,37 @@ package org.apache.ldap.server.jndi; -import org.apache.ldap.common.filter.*; -import org.apache.ldap.common.name.LdapName; -import org.apache.ldap.common.util.NamespaceTools; -import org.apache.ldap.server.PartitionNexus; -import org.apache.ldap.server.authn.LdapPrincipal; - -import javax.naming.*; -import javax.naming.directory.*; -import javax.naming.ldap.Control; -import javax.naming.spi.DirStateFactory; -import javax.naming.spi.DirectoryManager; import java.io.IOException; import java.io.Serializable; import java.text.ParseException; import java.util.Hashtable; +import javax.naming.Name; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; +import javax.naming.directory.DirContext; +import javax.naming.directory.InvalidSearchFilterException; +import javax.naming.directory.ModificationItem; +import javax.naming.directory.SearchControls; +import javax.naming.ldap.Control; +import javax.naming.spi.DirStateFactory; +import javax.naming.spi.DirectoryManager; + +import org.apache.ldap.common.filter.BranchNode; +import org.apache.ldap.common.filter.ExprNode; +import org.apache.ldap.common.filter.FilterParser; +import org.apache.ldap.common.filter.FilterParserImpl; +import org.apache.ldap.common.filter.PresenceNode; +import org.apache.ldap.common.filter.SimpleNode; +import org.apache.ldap.common.name.LdapName; +import org.apache.ldap.common.util.NamespaceTools; +import org.apache.ldap.server.authn.LdapPrincipal; +import org.apache.ldap.server.partition.ContextPartitionNexus; + /** * The DirContext implementation for the Server Side JNDI LDAP provider. @@ -52,13 +67,13 @@ * Creates a new ServerDirContext by reading the PROVIDER_URL to resolve the * distinguished name for this context. * - * @param nexusProxy the proxy to the backend nexus + * @param service the parent service that manages this context * @param env the environment used for this context * @throws NamingException if something goes wrong */ - public ServerDirContext( PartitionNexus nexusProxy, Hashtable env ) throws NamingException + public ServerDirContext( ContextFactoryService service, Hashtable env ) throws NamingException { - super( nexusProxy, env ); + super( service, env ); } @@ -71,7 +86,7 @@ * @param env the environment properties used by this context * @param dn the distinguished name of this context */ - protected ServerDirContext( LdapPrincipal principal, PartitionNexus nexusProxy, Hashtable env, Name dn ) + protected ServerDirContext( LdapPrincipal principal, ContextPartitionNexus nexusProxy, Hashtable env, Name dn ) { super( principal, nexusProxy, env, dn ); } Modified: directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirObjectFactory.java URL: http://svn.apache.org/viewcvs/directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirObjectFactory.java?rev=201550&r1=201549&r2=201550&view=diff ============================================================================== --- directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirObjectFactory.java (original) +++ directory/apacheds/trunk/core/src/main/java/org/apache/ldap/server/jndi/ServerDirObjectFactory.java Thu Jun 23 20:08:31 2005 @@ -31,7 +31,7 @@ * looks up the most specific object factory based on this additional * information. This makes a huge difference when the number of ObjectFactory * instances is large. - *
+ *

* Eventually, it is highly feasible for generated schemas, to also include * state and object factories for various objectClasses, or domain objects. * This means the number of factories will increase. By associating object and