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 21:24:11 UTC

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

Author: kayyagari
Date: Tue Jan 12 20:24:11 2010
New Revision: 898494

URL: http://svn.apache.org/viewvc?rev=898494&view=rev
Log:
added support for instantiating JDBM specific partition and indexes

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=898494&r1=898493&r2=898494&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 20:24:11 2010
@@ -21,8 +21,12 @@
 package org.apache.directory.server.core.factory;
 
 
+import java.io.File;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -34,15 +38,20 @@
 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.impl.btree.jdbm.JdbmIndex;
+import org.apache.directory.server.core.partition.impl.btree.jdbm.JdbmPartition;
 import org.apache.directory.server.core.partition.ldif.LdifPartition;
 import org.apache.directory.server.xdbm.ForwardIndexEntry;
+import org.apache.directory.server.xdbm.Index;
 import org.apache.directory.server.xdbm.IndexCursor;
 import org.apache.directory.server.xdbm.search.SearchEngine;
+import org.apache.directory.shared.ldap.NotImplementedException;
 import org.apache.directory.shared.ldap.entry.Entry;
 import org.apache.directory.shared.ldap.entry.EntryAttribute;
 import org.apache.directory.shared.ldap.filter.PresenceNode;
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.SchemaManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,6 +72,10 @@
     /** the search engine of the partition */
     private SearchEngine<ServerEntry> se;
 
+    private SchemaManager schemaManager;
+    
+    private File workDir;
+    
     private static final Logger LOG = LoggerFactory.getLogger( ConfigPartitionReader.class );
 
 
@@ -86,6 +99,8 @@
 
         this.configPartition = configPartition;
         se = configPartition.getSearchEngine();
+        this.schemaManager = configPartition.getSchemaManager();
+        workDir = configPartition.getPartitionDir().getParentFile();        
     }
 
 
@@ -96,7 +111,7 @@
      * @throws Exception
      */
     @SuppressWarnings("unchecked")
-    public void getDirectoryService() throws Exception
+    public DirectoryService getDirectoryService() throws Exception
     {
 
         PresenceNode filter = new PresenceNode( "ads-directoryServiceId" );
@@ -115,7 +130,7 @@
         ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
         cursor.close();
 
-        ClonedServerEntry dsEntry = configPartition.lookup( forwardEntry.getValue() );
+        ClonedServerEntry dsEntry = configPartition.lookup( forwardEntry.getId() );
 
         LOG.debug( "dirServiceEntry {}", dsEntry );
 
@@ -124,9 +139,21 @@
         dirService.setInstanceId( getString( "ads-directoryServiceId", dsEntry ) );
         dirService.setReplicaId( getInt( "ads-dsReplicaId", dsEntry ) );
 
-        List<Interceptor> interceptors = getInterceptors( new LdapDN( dsEntry.get( "ads-dsInterceptors" ).getString() ) );
+        LdapDN interceptorsDN = new LdapDN( dsEntry.get( "ads-dsInterceptors" ).getString() );
+        interceptorsDN.normalize( configPartition.getSchemaManager().getNormalizerMapping() );
+        List<Interceptor> interceptors = getInterceptors( interceptorsDN );
         dirService.setInterceptors( interceptors );
 
+        LdapDN partitionsDN = new LdapDN( dsEntry.get( "ads-dsPartitions" ).getString() );
+        partitionsDN.normalize( configPartition.getSchemaManager().getNormalizerMapping() );
+        
+        Map<String, Partition> partitions = getPartitions( partitionsDN );
+
+        Partition system = partitions.remove( "system" );
+        dirService.setSystemPartition( system );
+        
+        dirService.setPartitions( new HashSet( partitions.values() ) );
+        
         // MAY attributes
         EntryAttribute acEnabledAttr = dsEntry.get( "ads-dsAccessControlEnabled" );
         if ( acEnabledAttr != null )
@@ -189,17 +216,14 @@
             //process the test entries, should this be a FS location?
         }
 
-        EntryAttribute enabledAttr = dsEntry.get( "ads-enabled" );
-        if ( enabledAttr != null )
+        if ( !isEnabled( dsEntry ) )
         {
-            boolean enabled = Boolean.parseBoolean( enabledAttr.getString() );
-            if ( !enabled )
-            {
-                // will only be useful if we ever allow more than one DS to be configured and
-                // switch between them
-                // decide which one to use based on this flag
-            }
+            // will only be useful if we ever allow more than one DS to be configured and
+            // switch between them
+            // decide which one to use based on this flag
         }
+        
+        return dirService;
     }
 
 
@@ -207,7 +231,7 @@
      * 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
+     * @return a list of instantiated Interceptor objects
      * @throws Exception
      */
     private List<Interceptor> getInterceptors( LdapDN interceptorsDN ) throws Exception
@@ -222,7 +246,7 @@
         while ( cursor.next() )
         {
             ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
-            ServerEntry interceptorEntry = configPartition.lookup( forwardEntry.getValue() );
+            ServerEntry interceptorEntry = configPartition.lookup( forwardEntry.getId() );
 
             String id = getString( "ads-interceptorId", interceptorEntry );
             String fqcn = getString( "ads-interceptorClassName", interceptorEntry );
@@ -253,6 +277,127 @@
         return interceptors;
     }
 
+
+    private Map<String,Partition> getPartitions( LdapDN partitionsDN ) throws Exception
+    {
+        PresenceNode filter = new PresenceNode( "ads-partitionId" );
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+        IndexCursor cursor = se.cursor( partitionsDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
+        
+        Map<String,Partition> partitions = new HashMap<String,Partition>();
+        
+        while( cursor.next() )
+        {
+            ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
+            ServerEntry partitionEntry = configPartition.lookup( forwardEntry.getId() );
+
+            System.out.println( partitionsDN );
+            if( !isEnabled( partitionEntry ) )
+            {
+                continue;
+            }
+            EntryAttribute ocAttr = partitionEntry.get( "objectClass" );
+            if( ocAttr.contains( "ads-jdbmPartition" ) )
+            {
+                JdbmPartition partition = getJdbmPartition( partitionEntry );
+                partitions.put( partition.getId(), partition );
+            }
+            else
+            {
+                throw new NotImplementedException( "yet to implement" );
+            }
+        }
+        
+        cursor.close();
+        
+        return partitions;
+    }
+    
+    
+    private JdbmPartition getJdbmPartition( ServerEntry partitionEntry ) throws Exception
+    {
+        JdbmPartition partition = new JdbmPartition();
+        partition.setSchemaManager( schemaManager );
+        
+        partition.setId( getString( "ads-partitionId", partitionEntry ) );
+        partition.setPartitionDir( new File( workDir, partition.getId() ) );
+        
+        partition.setSuffix( getString( "ads-partitionSuffix", partitionEntry ) );
+        
+        EntryAttribute cacheAttr = partitionEntry.get( "ads-partitionCacheSize" );
+        if( cacheAttr != null )
+        {
+            partition.setCacheSize( Integer.parseInt( cacheAttr.getString() ) );
+        }
+        
+        EntryAttribute optimizerAttr = partitionEntry.get( "ads-jdbmPartitionOptimizerEnabled" );
+        if( optimizerAttr != null )
+        {
+            partition.setOptimizerEnabled( Boolean.parseBoolean( optimizerAttr.getString() ) );
+        }
+        
+        EntryAttribute syncAttr = partitionEntry.get( "ads-partitionSyncOnWrite" );
+        if( syncAttr != null )
+        {
+            partition.setSyncOnWrite( Boolean.parseBoolean( syncAttr.getString() ) );
+        }
+
+        String indexesDN = partitionEntry.get( "ads-partitionIndexedAttributes" ).getString();
+        
+        Set<Index<?,ServerEntry>> indexedAttributes = getIndexes( new LdapDN( indexesDN ) );
+        partition.setIndexedAttributes( indexedAttributes );
+
+        return partition;
+    }
+    
+
+    private Set<Index<?,ServerEntry>> getIndexes( LdapDN indexesDN ) throws Exception
+    {
+        PresenceNode filter = new PresenceNode( "ads-indexAttributeId" );
+        SearchControls controls = new SearchControls();
+        controls.setSearchScope( SearchControls.ONELEVEL_SCOPE );
+        IndexCursor cursor = se.cursor( indexesDN, AliasDerefMode.NEVER_DEREF_ALIASES, filter, controls );
+        
+        Set<Index<?,ServerEntry>> indexes = new HashSet<Index<?,ServerEntry>>();
+        
+        while( cursor.next() )
+        {
+            ForwardIndexEntry<Long, Long> forwardEntry = ( ForwardIndexEntry<Long, Long> ) cursor.get();
+            ServerEntry indexEntry = configPartition.lookup( forwardEntry.getId() );
+            if( !isEnabled( indexEntry ) )
+            {
+                continue;
+            }
+            
+            EntryAttribute ocAttr = indexEntry.get( "objectClass" );
+            if( ocAttr.contains( "ads-jdbmIndex" ) )
+            {
+                indexes.add( getJdbmIndex( indexEntry ) );
+            }
+            else
+            {
+                throw new NotImplementedException( "yet to implement" );
+            }
+        }
+        
+        return indexes;
+    }
+    
+    
+    private JdbmIndex<?, ServerEntry> getJdbmIndex( ServerEntry indexEntry ) throws Exception
+    {
+        JdbmIndex<?, ServerEntry> index = new JdbmIndex();
+        index.setAttributeId( getString( "ads-indexAttributeId", indexEntry ) );
+        EntryAttribute cacheAttr = indexEntry.get( "ads-indexCacheSize" );
+        if( cacheAttr != null )
+        {
+            index.setCacheSize( Integer.parseInt( cacheAttr.getString() ) );
+        }
+        
+        return index;
+    }
+    
     
     /**
      * internal class used for holding the Interceptor classname and order configuration
@@ -330,4 +475,18 @@
         return Integer.parseInt( entry.get( attrName ).getString() );
     }
 
+    
+    private boolean isEnabled( Entry entry ) throws Exception
+    {
+        EntryAttribute enabledAttr = entry.get( "ads-enabled" );
+        if( enabledAttr != null )
+        {
+            return Boolean.parseBoolean( enabledAttr.getString() );
+        }
+        else
+        {
+            return true;
+        }
+        
+    }
 }