You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by tr...@apache.org on 2005/03/22 12:10:16 UTC

svn commit: r158592 - in directory/apacheds/branches/interceptor_revamp/core/src: main/java/org/apache/ldap/server/jndi/ main/java/org/apache/ldap/server/jndi/invocation/interceptor/ test/org/apache/ldap/server/jndi/invocation/ test/org/apache/ldap/server/jndi/invocation/interceptor/

Author: trustin
Date: Tue Mar 22 03:10:11 2005
New Revision: 158592

URL: http://svn.apache.org/viewcvs?view=rev&rev=158592
Log:
* Added InterceptorConfigBuilder which generates appropriate configuration map for each interceptors.

Added:
    directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorConfigBuilder.java   (with props)
    directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/
    directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/interceptor/
    directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/interceptor/ConfigurationTest.java   (with props)
Modified:
    directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java
    directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorChain.java

Modified: directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java?view=diff&r1=158591&r2=158592
==============================================================================
--- directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java (original)
+++ directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/CoreContextFactory.java Tue Mar 22 03:10:11 2005
@@ -50,6 +50,7 @@
 import org.apache.ldap.server.db.ExpressionEvaluator;
 import org.apache.ldap.server.db.SearchEngine;
 import org.apache.ldap.server.db.jdbm.JdbmDatabase;
+import org.apache.ldap.server.jndi.invocation.interceptor.InterceptorConfigBuilder;
 import org.apache.ldap.server.jndi.invocation.interceptor.Interceptor;
 import org.apache.ldap.server.jndi.invocation.interceptor.InterceptorChain;
 import org.apache.ldap.server.jndi.invocation.interceptor.InterceptorContext;
@@ -495,9 +496,10 @@
             // If custom interceptor is not specified, use defaule one.
             interceptor = InterceptorChain.newDefaultChain();
         }
-        // FIXME interceptor config is passed incorrectly
+
         interceptor.init( new InterceptorContext(
-                initialEnv, system, globalRegistries, nexus, initialEnv ) );
+                initialEnv, system, globalRegistries, nexus,
+                InterceptorConfigBuilder.build( initialEnv, EnvKeys.INTERCEPTOR ) ) );
         provider.setInterceptor( interceptor );
 
         // fire up the app partitions now!

Modified: directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorChain.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorChain.java?view=diff&r1=158591&r2=158592
==============================================================================
--- directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorChain.java (original)
+++ directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorChain.java Tue Mar 22 03:10:11 2005
@@ -18,6 +18,7 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
@@ -55,11 +56,17 @@
      */
     public static final ChainType POSTPROCESS = new ChainType();
     
+    /**
+     * Returns a new chain of default interceptors required to run core.
+     */
     public static InterceptorChain newDefaultChain()
     {
         return newDefaultChain( PREPROCESS );
     }
     
+    /**
+     * Returns a new chain of default interceptors required to run core.
+     */
     public static InterceptorChain newDefaultChain( ChainType type )
     {
         InterceptorChain chain = new InterceptorChain( type );
@@ -100,6 +107,7 @@
     private InterceptorChain parent;
     private final ChainType type;
     private final Map name2entry = new HashMap();
+    private final Map interceptor2entry = new IdentityHashMap();
     private Entry head = new Entry( null, null, "end", FINAL_INTERCEPTOR );
     private final Entry tail = head;
 
@@ -127,7 +135,7 @@
     /**
      * Initializes all interceptors this chain contains.
      */
-    public synchronized void init( InterceptorContext context ) throws NamingException
+    public synchronized void init( InterceptorContext ctx ) throws NamingException
     {
         ListIterator it = getAll().listIterator();
         Interceptor interceptor = null;
@@ -136,7 +144,14 @@
             while( it.hasNext() )
             {
                 interceptor = ( Interceptor ) it.next();
-                interceptor.init( context );
+                String name = getName( interceptor );
+                InterceptorContext newCtx = new InterceptorContext(
+                        ctx.getEnvironment(), ctx.getSystemPartition(),
+                        ctx.getGlobalRegistries(), ctx.getRootNexus(),
+                        InterceptorConfigBuilder.build(
+                                ctx.getConfig(), ( name == null ) ? "" : name ) );
+                
+                interceptor.init( newCtx );
             }
         }
         catch( Throwable t )
@@ -202,7 +217,17 @@
         }
         return e.interceptor;
     }
-
+    
+    private String getName( Interceptor interceptor )
+    {
+        Entry e = ( Entry ) interceptor2entry.get( interceptor );
+        if( e == null )
+        {
+            return null;
+        }
+        return e.name;
+    }
+    
     /**
      * Adds the specified interceptor with the specified name at the beginning
      * of this chain.
@@ -312,6 +337,7 @@
 
         name2entry.remove( name );
         Interceptor interceptor = entry.interceptor;
+        interceptor2entry.remove( interceptor );
         if( interceptor instanceof InterceptorChain )
         {
             ( ( InterceptorChain ) interceptor ).parent = null;
@@ -333,6 +359,7 @@
     private void register(String name, Entry newEntry) {
         Interceptor interceptor = newEntry.interceptor;
         name2entry.put( name, newEntry );
+        interceptor2entry.put( newEntry.interceptor, newEntry );
         if( interceptor instanceof InterceptorChain )
         {
             ( ( InterceptorChain ) interceptor ).parent = this;

Added: directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorConfigBuilder.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorConfigBuilder.java?view=auto&rev=158592
==============================================================================
--- directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorConfigBuilder.java (added)
+++ directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorConfigBuilder.java Tue Mar 22 03:10:11 2005
@@ -0,0 +1,39 @@
+package org.apache.ldap.server.jndi.invocation.interceptor;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+public class InterceptorConfigBuilder {
+
+    public static Map build(Map map, String prefix)
+    {
+        Map newMap = new HashMap();
+        Iterator it = map.entrySet().iterator();
+        while( it.hasNext() )
+        {
+            Map.Entry e = (Map.Entry) it.next();
+            String key = e.getKey().toString();
+            if( key.startsWith( prefix ) && key.length() > prefix.length() )
+            {
+                key = key.substring( prefix.length() );
+                if( key.indexOf( '#' ) < 0 )
+                {
+                    continue;
+                }
+                if( key.charAt(0) == '.' || key.charAt(0) == '#' )
+                {
+                    key = key.substring( 1 );
+                }
+                
+                newMap.put( key, e.getValue() );
+            }
+        }
+        
+        return newMap;
+    }
+    
+    private InterceptorConfigBuilder()
+    {
+    }
+}

Propchange: directory/apacheds/branches/interceptor_revamp/core/src/main/java/org/apache/ldap/server/jndi/invocation/interceptor/InterceptorConfigBuilder.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision

Added: directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/interceptor/ConfigurationTest.java
URL: http://svn.apache.org/viewcvs/directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/interceptor/ConfigurationTest.java?view=auto&rev=158592
==============================================================================
--- directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/interceptor/ConfigurationTest.java (added)
+++ directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/interceptor/ConfigurationTest.java Tue Mar 22 03:10:11 2005
@@ -0,0 +1,105 @@
+package org.apache.ldap.server.jndi.invocation.interceptor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.naming.NamingException;
+
+import junit.framework.Assert;
+
+import org.apache.ldap.server.AbstractServerTest;
+import org.apache.ldap.server.jndi.EnvKeys;
+import org.apache.ldap.server.jndi.invocation.Invocation;
+
+public class ConfigurationTest extends AbstractServerTest {
+    
+    private TestInterceptorChain rootChain = new TestInterceptorChain();
+    private TestInterceptorChain childChain = new TestInterceptorChain();
+    private TestInterceptor interceptorA = new TestInterceptor();
+    private TestInterceptor interceptorB = new TestInterceptor();
+    
+    protected void setUp() throws Exception
+    {
+        rootChain.addLast( "A", interceptorA );
+        rootChain.addLast( "child", childChain );
+        childChain.addLast( "B", interceptorB );
+        rootChain.addLast( "default", InterceptorChain.newDefaultChain() );
+        
+        extras.put( EnvKeys.INTERCEPTOR, rootChain );
+        extras.put( EnvKeys.INTERCEPTOR + "#root", "1" );
+        extras.put( EnvKeys.INTERCEPTOR + ".A", "2" );
+        extras.put( EnvKeys.INTERCEPTOR + ".A#A", "3" );
+        extras.put( EnvKeys.INTERCEPTOR + ".A#A.A", "4" );
+        extras.put( EnvKeys.INTERCEPTOR + ".child#child", "5" );
+        extras.put( EnvKeys.INTERCEPTOR + ".child.B", "6" );
+        extras.put( EnvKeys.INTERCEPTOR + ".child.B#B", "7" );
+        extras.put( EnvKeys.INTERCEPTOR + ".child.B#B.B", "8" );
+        
+        super.setUp();
+    }
+    
+    public void testRootChain() throws Exception
+    {
+        Map expected = new HashMap();
+        expected.put( "root", "1" );
+        expected.put( "A#A", "3" );
+        expected.put( "A#A.A", "4" );
+        expected.put( "child#child", "5" );
+        expected.put( "child.B#B", "7" );
+        expected.put( "child.B#B.B", "8" );
+        Assert.assertEquals( expected, rootChain.config );
+    }
+
+    public void testChildChain() throws Exception
+    {
+        Map expected = new HashMap();
+        expected.put( "child", "5" );
+        expected.put( "B#B", "7" );
+        expected.put( "B#B.B", "8" );
+        Assert.assertEquals( expected, childChain.config );
+    }
+    
+    public void testA() throws Exception
+    {
+        Map expected = new HashMap();
+        expected.put( "A", "3" );
+        expected.put( "A.A", "4" );
+        Assert.assertEquals( expected, interceptorA.config );
+    }
+
+    public void testB() throws Exception
+    {
+        Map expected = new HashMap();
+        expected.put( "B", "7" );
+        expected.put( "B.B", "8" );
+        Assert.assertEquals( expected, interceptorB.config );
+    }
+    
+    private static class TestInterceptorChain extends InterceptorChain
+    {
+        private Map config;
+        
+        public synchronized void init(InterceptorContext ctx) throws NamingException {
+            config = ctx.getConfig();
+            super.init(ctx);
+        }
+        
+    }
+
+    private static class TestInterceptor implements Interceptor
+    {
+        private Map config;
+
+        public void init(InterceptorContext context) throws NamingException {
+            config = context.getConfig();
+        }
+
+        public void destroy() {
+        }
+
+        public void process(NextInterceptor nextInterceptor, Invocation invocation) throws NamingException {
+            nextInterceptor.process( invocation );
+        }
+    }
+    
+}

Propchange: directory/apacheds/branches/interceptor_revamp/core/src/test/org/apache/ldap/server/jndi/invocation/interceptor/ConfigurationTest.java
------------------------------------------------------------------------------
    svn:keywords = HeadURL Id LastChangedBy LastChangedDate LastChangedRevision