You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ak...@apache.org on 2005/10/18 05:58:59 UTC
svn commit: r326021 - in
/directory/apacheds/branches/interceptor-bypass/core/src:
main/java/org/apache/ldap/server/interceptor/
test/org/apache/ldap/server/interceptor/
Author: akarasulu
Date: Mon Oct 17 20:58:52 2005
New Revision: 326021
URL: http://svn.apache.org/viewcvs?rev=326021&view=rev
Log:
added test case for the changes made to the InterceptorChain
Added:
directory/apacheds/branches/interceptor-bypass/core/src/test/org/apache/ldap/server/interceptor/
directory/apacheds/branches/interceptor-bypass/core/src/test/org/apache/ldap/server/interceptor/InterceptorChainTest.java (with props)
Modified:
directory/apacheds/branches/interceptor-bypass/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java
Modified: directory/apacheds/branches/interceptor-bypass/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/branches/interceptor-bypass/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java?rev=326021&r1=326020&r2=326021&view=diff
==============================================================================
--- directory/apacheds/branches/interceptor-bypass/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java (original)
+++ directory/apacheds/branches/interceptor-bypass/core/src/main/java/org/apache/ldap/server/interceptor/InterceptorChain.java Mon Oct 17 20:58:52 2005
@@ -217,7 +217,7 @@
// Initialize tail first.
FINAL_INTERCEPTOR.init( factoryCfg, null );
-
+
// And register and initialize all interceptors
ListIterator i = factoryCfg.getStartupConfiguration().getInterceptorConfigurations().listIterator();
Interceptor interceptor = null;
@@ -272,14 +272,14 @@
}
catch ( Throwable t )
{
- log.warn( "Failed to deregister an interceptor: " +
+ log.warn( "Failed to deregister an interceptor: " +
e.configuration.getName(), t );
}
}
}
}
-
-
+
+
/**
* Returns the registered interceptor with the specified name.
* @return <tt>null</tt> if the specified name doesn't exist.
@@ -291,10 +291,10 @@
{
return null;
}
-
+
return e.configuration.getInterceptor();
}
-
+
/**
* Returns the list of all registered interceptors.
*/
@@ -308,20 +308,20 @@
e = e.nextEntry;
}
while ( e != tail );
-
+
return result;
}
-
+
public synchronized void addFirst( InterceptorConfiguration cfg ) throws NamingException
{
register0( cfg, head );
}
-
+
public synchronized void addLast( InterceptorConfiguration cfg ) throws NamingException
{
register0( cfg, tail );
}
-
+
public synchronized void addBefore( String nextInterceptorName, InterceptorConfiguration cfg ) throws NamingException
{
Entry e = (Entry) name2entry.get( nextInterceptorName );
@@ -331,12 +331,12 @@
}
register0( cfg, e );
}
-
+
public synchronized InterceptorConfiguration remove( String interceptorName ) throws NamingException
{
return deregister( interceptorName );
}
-
+
public synchronized void addAfter( String prevInterceptorName, InterceptorConfiguration cfg ) throws NamingException
{
Entry e = (Entry) name2entry.get( prevInterceptorName );
@@ -396,7 +396,7 @@
String name = cfg.getName();
Interceptor interceptor = cfg.getInterceptor();
interceptor.init( factoryCfg, cfg );
-
+
Entry newEntry;
if( nextEntry == head )
{
@@ -416,7 +416,7 @@
nextEntry.prevEntry.nextEntry = newEntry;
nextEntry.prevEntry = newEntry;
}
-
+
name2entry.put( name, newEntry );
}
@@ -469,7 +469,7 @@
return head;
}
- if ( ! invocation.isBypassed( DirectoryPartitionNexusProxy.BYPASS_ALL ) )
+ if ( invocation.isBypassed( DirectoryPartitionNexusProxy.BYPASS_ALL ) )
{
return tail;
}
@@ -941,10 +941,13 @@
return Entry.this.nextEntry;
}
- if ( ! invocation.isBypassed( DirectoryPartitionNexusProxy.BYPASS_ALL ) )
- {
- return tail;
- }
+// I don't think we really need this since this check is performed by the chain when
+// getting the interceptor head to use.
+//
+// if ( invocation.isBypassed( DirectoryPartitionNexusProxy.BYPASS_ALL ) )
+// {
+// return tail;
+// }
Entry next = Entry.this.nextEntry;
while ( next != tail )
Added: directory/apacheds/branches/interceptor-bypass/core/src/test/org/apache/ldap/server/interceptor/InterceptorChainTest.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/branches/interceptor-bypass/core/src/test/org/apache/ldap/server/interceptor/InterceptorChainTest.java?rev=326021&view=auto
==============================================================================
--- directory/apacheds/branches/interceptor-bypass/core/src/test/org/apache/ldap/server/interceptor/InterceptorChainTest.java (added)
+++ directory/apacheds/branches/interceptor-bypass/core/src/test/org/apache/ldap/server/interceptor/InterceptorChainTest.java Mon Oct 17 20:58:52 2005
@@ -0,0 +1,465 @@
+/*
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed 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.ldap.server.interceptor;
+
+
+import junit.framework.TestCase;
+import org.apache.ldap.server.DirectoryServiceConfiguration;
+import org.apache.ldap.server.DirectoryService;
+import org.apache.ldap.server.DirectoryServiceListener;
+import org.apache.ldap.server.partition.DirectoryPartitionNexusProxy;
+import org.apache.ldap.server.jndi.DeadContext;
+import org.apache.ldap.server.invocation.InvocationStack;
+import org.apache.ldap.server.invocation.Invocation;
+import org.apache.ldap.server.configuration.InterceptorConfiguration;
+import org.apache.ldap.server.configuration.DirectoryPartitionConfiguration;
+import org.apache.ldap.server.configuration.MutableInterceptorConfiguration;
+import org.apache.ldap.common.filter.ExprNode;
+import org.apache.ldap.common.name.LdapName;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.naming.NamingException;
+import javax.naming.Name;
+import javax.naming.NamingEnumeration;
+import javax.naming.Context;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.ModificationItem;
+import javax.naming.directory.SearchControls;
+import java.util.*;
+
+
+/**
+ * Unit test cases for InterceptorChain methods.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+public class InterceptorChainTest extends TestCase
+{
+ private final MockInterceptor[] interceptorArray =
+ {
+ new MockInterceptor( "0" ),
+ new MockInterceptor( "1" ),
+ new MockInterceptor( "2" ),
+ new MockInterceptor( "3" ),
+ new MockInterceptor( "4" )
+ };
+ private final static Logger log = LoggerFactory.getLogger( InterceptorChainTest.class );
+ private InterceptorChain chain;
+ private List interceptors = new ArrayList( interceptorArray.length );
+
+
+ protected void setUp() throws Exception
+ {
+ chain = new InterceptorChain();
+
+ for ( int ii = 0; ii < interceptorArray.length; ii++ )
+ {
+ MutableInterceptorConfiguration config = new MutableInterceptorConfiguration();
+ config.setInterceptor( interceptorArray[ii] );
+ config.setName( interceptorArray[ii].getName() );
+ chain.addLast( config );
+ }
+ }
+
+
+ protected void tearDown() throws Exception
+ {
+ chain = null;
+ interceptors.clear();
+ }
+
+
+ public void testNoBypass() throws NamingException
+ {
+ Name dn = new LdapName( "ou=system" );
+ Context ctx = new DeadContext();
+ DirectoryService ds = new MockDirectoryService();
+ DirectoryPartitionNexusProxy proxy = new DirectoryPartitionNexusProxy( ctx, ds );
+ Invocation i = new Invocation( proxy, ctx, "lookup", new Object[]{ dn } );
+ InvocationStack.getInstance().push( i );
+
+ try
+ {
+ chain.lookup( dn );
+ }
+ catch( Exception e )
+ {
+ }
+
+ assertEquals( interceptorArray.length, interceptors.size() );
+ for ( int ii = 0; ii < interceptorArray.length; ii++ )
+ {
+ assertEquals( interceptorArray[ii], interceptors.get( ii ) );
+ }
+ }
+
+
+ public void testSingleBypass() throws NamingException
+ {
+ Name dn = new LdapName( "ou=system" );
+ Context ctx = new DeadContext();
+ DirectoryService ds = new MockDirectoryService();
+ DirectoryPartitionNexusProxy proxy = new DirectoryPartitionNexusProxy( ctx, ds );
+ Invocation i = new Invocation( proxy, ctx, "lookup", new Object[]{ dn }, Collections.singleton( "0" ) );
+ InvocationStack.getInstance().push( i );
+
+ try
+ {
+ chain.lookup( dn );
+ }
+ catch( Exception e )
+ {
+ }
+
+ assertEquals( interceptorArray.length - 1, interceptors.size() );
+ for ( int ii = 0; ii < interceptorArray.length; ii++ )
+ {
+ if ( ii != 0 )
+ {
+ assertEquals( interceptorArray[ii], interceptors.get( ii - 1 ) );
+ }
+ }
+ assertFalse( interceptors.contains( interceptorArray[0] ) );
+ }
+
+
+ public void testAdjacentDoubleBypass() throws NamingException
+ {
+ Name dn = new LdapName( "ou=system" );
+ Context ctx = new DeadContext();
+ DirectoryService ds = new MockDirectoryService();
+ DirectoryPartitionNexusProxy proxy = new DirectoryPartitionNexusProxy( ctx, ds );
+ Collection bypass = new HashSet();
+ bypass.add( "0" );
+ bypass.add( "1" );
+ Invocation i = new Invocation( proxy, ctx, "lookup", new Object[]{ dn }, bypass );
+ InvocationStack.getInstance().push( i );
+
+ try
+ {
+ chain.lookup( dn );
+ }
+ catch( Exception e )
+ {
+ }
+
+ assertEquals( interceptorArray.length - 2, interceptors.size() );
+ for ( int ii = 0; ii < interceptorArray.length; ii++ )
+ {
+ if ( ii != 0 && ii != 1 )
+ {
+ assertEquals( interceptorArray[ii], interceptors.get( ii - 2 ) );
+ }
+ }
+ assertFalse( interceptors.contains( interceptorArray[0] ) );
+ assertFalse( interceptors.contains( interceptorArray[1] ) );
+ }
+
+
+ public void testFrontAndBackDoubleBypass() throws NamingException
+ {
+ Name dn = new LdapName( "ou=system" );
+ Context ctx = new DeadContext();
+ DirectoryService ds = new MockDirectoryService();
+ DirectoryPartitionNexusProxy proxy = new DirectoryPartitionNexusProxy( ctx, ds );
+ Collection bypass = new HashSet();
+ bypass.add( "0" );
+ bypass.add( "4" );
+ Invocation i = new Invocation( proxy, ctx, "lookup", new Object[]{ dn }, bypass );
+ InvocationStack.getInstance().push( i );
+
+ try
+ {
+ chain.lookup( dn );
+ }
+ catch( Exception e )
+ {
+ }
+
+ assertEquals( interceptorArray.length - 2, interceptors.size() );
+ assertEquals( interceptorArray[1], interceptors.get( 0 ) );
+ assertEquals( interceptorArray[2], interceptors.get( 1 ) );
+ assertEquals( interceptorArray[3], interceptors.get( 2 ) );
+ assertFalse( interceptors.contains( interceptorArray[0] ) );
+ assertFalse( interceptors.contains( interceptorArray[4] ) );
+ }
+
+
+ public void testDoubleBypass() throws NamingException
+ {
+ Name dn = new LdapName( "ou=system" );
+ Context ctx = new DeadContext();
+ DirectoryService ds = new MockDirectoryService();
+ DirectoryPartitionNexusProxy proxy = new DirectoryPartitionNexusProxy( ctx, ds );
+ Collection bypass = new HashSet();
+ bypass.add( "1" );
+ bypass.add( "3" );
+ Invocation i = new Invocation( proxy, ctx, "lookup", new Object[]{ dn }, bypass );
+ InvocationStack.getInstance().push( i );
+
+ try
+ {
+ chain.lookup( dn );
+ }
+ catch( Exception e )
+ {
+ }
+
+ assertEquals( interceptorArray.length - 2, interceptors.size() );
+ assertEquals( interceptorArray[0], interceptors.get( 0 ) );
+ assertEquals( interceptorArray[2], interceptors.get( 1 ) );
+ assertEquals( interceptorArray[4], interceptors.get( 2 ) );
+ assertFalse( interceptors.contains( interceptorArray[1] ) );
+ assertFalse( interceptors.contains( interceptorArray[3] ) );
+ }
+
+
+ public void testCompleteBypass() throws NamingException
+ {
+ Name dn = new LdapName( "ou=system" );
+ Context ctx = new DeadContext();
+ DirectoryService ds = new MockDirectoryService();
+ DirectoryPartitionNexusProxy proxy = new DirectoryPartitionNexusProxy( ctx, ds );
+ Invocation i = new Invocation( proxy, ctx, "lookup", new Object[]{ dn },
+ DirectoryPartitionNexusProxy.BYPASS_ALL_COLLECTION );
+ InvocationStack.getInstance().push( i );
+
+ try
+ {
+ chain.lookup( dn );
+ }
+ catch( Exception e )
+ {
+ }
+
+ assertEquals( 0, interceptors.size() );
+ }
+
+
+ class MockInterceptor implements Interceptor
+ {
+ String name;
+
+ public MockInterceptor( String name )
+ {
+ this.name = name;
+ }
+
+
+ public String getName()
+ {
+ return this.name;
+ }
+
+
+ public void init( DirectoryServiceConfiguration factoryCfg, InterceptorConfiguration cfg ) throws NamingException
+ {
+ }
+
+
+ public void destroy()
+ {
+ }
+
+
+ public Attributes getRootDSE( NextInterceptor next ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.getRootDSE();
+ }
+
+
+ public Name getMatchedName( NextInterceptor next, Name name, boolean normalized ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.getMatchedName( name, normalized );
+ }
+
+
+ public Name getSuffix( NextInterceptor next, Name name, boolean normalized ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.getSuffix( name, normalized );
+ }
+
+
+ public Iterator listSuffixes( NextInterceptor next, boolean normalized ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.listSuffixes( normalized );
+ }
+
+
+ public void addContextPartition( NextInterceptor next, DirectoryPartitionConfiguration cfg ) throws NamingException
+ {
+ interceptors.add( this );
+ next.addContextPartition( cfg );
+ }
+
+
+ public void removeContextPartition( NextInterceptor next, Name suffix ) throws NamingException
+ {
+ interceptors.add( this );
+ next.removeContextPartition( suffix );
+ }
+
+
+ public boolean compare( NextInterceptor next, Name name, String oid, Object value ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.compare( name, oid, value );
+ }
+
+
+ public void delete( NextInterceptor next, Name name ) throws NamingException
+ {
+ interceptors.add( this );
+ next.delete( name );
+ }
+
+
+ public void add( NextInterceptor next, String userProvidedName, Name normalizedName, Attributes entry ) throws NamingException
+ {
+ interceptors.add( this );
+ next.add( userProvidedName, normalizedName, entry );
+ }
+
+
+ public void modify( NextInterceptor next, Name name, int modOp, Attributes attributes ) throws NamingException
+ {
+ interceptors.add( this );
+ next.modify( name, modOp, attributes );
+ }
+
+
+ public void modify( NextInterceptor next, Name name, ModificationItem [] items ) throws NamingException
+ {
+ interceptors.add( this );
+ next.modify( name, items );
+ }
+
+
+ public NamingEnumeration list( NextInterceptor next, Name baseName ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.list( baseName );
+ }
+
+
+ public NamingEnumeration search( NextInterceptor next, Name baseName, Map environment, ExprNode filter, SearchControls searchControls ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.search( baseName, environment, filter, searchControls );
+ }
+
+
+ public Attributes lookup( NextInterceptor next, Name name ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.lookup( name );
+ }
+
+
+ public Attributes lookup( NextInterceptor next, Name dn, String [] attrIds ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.lookup( dn, attrIds );
+ }
+
+
+ public boolean hasEntry( NextInterceptor next, Name name ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.hasEntry( name );
+ }
+
+
+ public boolean isSuffix( NextInterceptor next, Name name ) throws NamingException
+ {
+ interceptors.add( this );
+ return next.isSuffix( name );
+ }
+
+
+ public void modifyRn( NextInterceptor next, Name name, String newRn, boolean deleteOldRn ) throws NamingException
+ {
+ interceptors.add( this );
+ next.modifyRn( name, newRn, deleteOldRn );
+ }
+
+
+ public void move( NextInterceptor next, Name oldName, Name newParentName ) throws NamingException
+ {
+ interceptors.add( this );
+ next.move( oldName, newParentName );
+ }
+
+
+ public void move( NextInterceptor next, Name oldName, Name newParentName, String newRn, boolean deleteOldRn ) throws NamingException
+ {
+ interceptors.add( this );
+ next.move( oldName, newParentName, newRn, deleteOldRn );
+ }
+ }
+
+
+ class MockDirectoryService extends DirectoryService
+ {
+ public void startup( DirectoryServiceListener listener, Hashtable environment ) throws NamingException
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public void shutdown() throws NamingException
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public void sync() throws NamingException
+ {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public boolean isStarted()
+ {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public DirectoryServiceConfiguration getConfiguration()
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public Context getJndiContext( String baseName ) throws NamingException
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+
+ public Context getJndiContext( String principal, byte[] credential, String authentication, String baseName ) throws NamingException
+ {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+ }
+}
Propchange: directory/apacheds/branches/interceptor-bypass/core/src/test/org/apache/ldap/server/interceptor/InterceptorChainTest.java
------------------------------------------------------------------------------
svn:eol-style = native