You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2010/01/12 17:47:10 UTC

svn commit: r898413 - /directory/apacheds/branches/apacheds-cidit/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java

Author: kayyagari
Date: Tue Jan 12 16:47:09 2010
New Revision: 898413

URL: http://svn.apache.org/viewvc?rev=898413&view=rev
Log:
added support for reading and instantiating the configured interceptors

Modified:
    directory/apacheds/branches/apacheds-cidit/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java

Modified: directory/apacheds/branches/apacheds-cidit/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-cidit/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java?rev=898413&r1=898412&r2=898413&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-cidit/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java (original)
+++ directory/apacheds/branches/apacheds-cidit/core-annotations/src/main/java/org/apache/directory/server/core/factory/ConfigPartitionReader.java Tue Jan 12 16:47:09 2010
@@ -21,12 +21,18 @@
 package org.apache.directory.server.core.factory;
 
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
 import javax.naming.directory.SearchControls;
 
 import org.apache.directory.server.core.DefaultDirectoryService;
 import org.apache.directory.server.core.DirectoryService;
 import org.apache.directory.server.core.entry.ClonedServerEntry;
 import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.interceptor.Interceptor;
 import org.apache.directory.server.core.partition.Partition;
 import org.apache.directory.server.core.partition.ldif.LdifPartition;
 import org.apache.directory.server.xdbm.ForwardIndexEntry;
@@ -117,7 +123,9 @@
         // MUST attributes
         dirService.setInstanceId( getString( "ads-directoryServiceId", dsEntry ) );
         dirService.setReplicaId( getInt( "ads-dsReplicaId", dsEntry ) );
-        // dirService.setInterceptors( interceptors );
+
+        List<Interceptor> interceptors = getInterceptors( new LdapDN( dsEntry.get( "ads-dsInterceptors" ).getString() ) );
+        dirService.setInterceptors( interceptors );
 
         // MAY attributes
         EntryAttribute acEnabledAttr = dsEntry.get( "ads-dsAccessControlEnabled" );
@@ -192,11 +200,116 @@
                 // decide which one to use based on this flag
             }
         }
+    }
+
 
-        LdapDN interceptorsDN = new LdapDN( dsEntry.get( "ads-dsInterceptors" ).getString() );
-        filter = new PresenceNode( "ads-interceptorId" );
+    /**
+     * reads the Interceptor configuration and instantiates them in the order specified
+     *
+     * @param interceptorsDN the DN under which interceptors are configured
+     * @return a list of instatiated Interceptor objects
+     * @throws Exception
+     */
+    private List<Interceptor> getInterceptors( LdapDN interceptorsDN ) throws Exception
+    {
+        PresenceNode filter = new PresenceNode( "ads-interceptorId" );
+        SearchControls controls = new SearchControls();
         controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
-        cursor = se.cursor( interceptorsDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
+        IndexCursor cursor = se.cursor( interceptorsDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
+
+        Set<InterceptorConfig> set = new TreeSet<InterceptorConfig>();
+
+        while ( cursor.next() )
+        {
+            ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
+            ServerEntry interceptorEntry = configPartition.lookup( forwardEntry.getValue() );
+
+            String id = getString( "ads-interceptorId", interceptorEntry );
+            String fqcn = getString( "ads-interceptorClassName", interceptorEntry );
+            int order = getInt( "ads-interceptorOrder", interceptorEntry );
+
+            InterceptorConfig intConfig = new InterceptorConfig( id, fqcn, order );
+            set.add( intConfig );
+        }
+    
+        cursor.close();
+        
+        List<Interceptor> interceptors = new ArrayList<Interceptor>();
+
+        for( InterceptorConfig iconfig : set )
+        {
+            try
+            {
+                LOG.debug( "loading the interceptor class {} and instantiating", iconfig.getFqcn() );
+                Interceptor ic = ( Interceptor ) Class.forName( iconfig.getFqcn() ).newInstance();
+                interceptors.add( ic );
+            }
+            catch( Exception e )
+            {
+                throw e;
+            }
+        }
+        
+        return interceptors;
+    }
+
+    
+    /**
+     * internal class used for holding the Interceptor classname and order configuration
+     */
+    private class InterceptorConfig implements Comparable<InterceptorConfig>
+    {
+
+        private String id;
+        private String fqcn;
+        private int order;
+
+
+        public InterceptorConfig( String id, String fqcn, int order )
+        {
+            if( order < 1 )
+            {
+                throw new IllegalArgumentException( "Invalid interceptor order" );
+            }
+            
+            this.id = id;
+            this.fqcn = fqcn;
+            this.order = order;
+        }
+
+
+        public int compareTo( InterceptorConfig o )
+        {
+            if ( order > o.order )
+            {
+                return 1;
+            }
+            else if ( order < o.order )
+            {
+                return -1;
+            }
+
+            return 0;
+        }
+
+
+        /**
+         * @return the fqcn
+         */
+        public String getFqcn()
+        {
+            return fqcn;
+        }
+
+
+        /**
+         * @return the id
+         */
+        public String getId()
+        {
+            return id;
+        }
+
     }