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 2015/02/07 16:31:48 UTC

svn commit: r1658068 - /directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java

Author: kayyagari
Date: Sat Feb  7 15:31:48 2015
New Revision: 1658068

URL: http://svn.apache.org/r1658068
Log:
use multiple LDIF structure for storing configuration (DIRSERVER-2050)

Modified:
    directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java

Modified: directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java?rev=1658068&r1=1658067&r2=1658068&view=diff
==============================================================================
--- directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java (original)
+++ directory/apacheds/trunk/service/src/main/java/org/apache/directory/server/ApacheDsService.java Sat Feb  7 15:31:48 2015
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.UUID;
 
 import org.apache.directory.api.ldap.model.constants.SchemaConstants;
+import org.apache.directory.api.ldap.model.csn.CsnFactory;
 import org.apache.directory.api.ldap.model.cursor.Cursor;
 import org.apache.directory.api.ldap.model.entry.Attribute;
 import org.apache.directory.api.ldap.model.entry.DefaultAttribute;
@@ -38,6 +39,7 @@ import org.apache.directory.api.ldap.mod
 import org.apache.directory.api.ldap.model.entry.ModificationOperation;
 import org.apache.directory.api.ldap.model.filter.ExprNode;
 import org.apache.directory.api.ldap.model.filter.PresenceNode;
+import org.apache.directory.api.ldap.model.ldif.LdifReader;
 import org.apache.directory.api.ldap.model.message.AliasDerefMode;
 import org.apache.directory.api.ldap.model.message.SearchScope;
 import org.apache.directory.api.ldap.model.name.Dn;
@@ -63,6 +65,7 @@ import org.apache.directory.server.confi
 import org.apache.directory.server.config.beans.NtpServerBean;
 import org.apache.directory.server.config.builder.ServiceBuilder;
 import org.apache.directory.server.config.listener.ConfigChangeListener;
+import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.api.CacheService;
 import org.apache.directory.server.core.api.CoreSession;
 import org.apache.directory.server.core.api.DirectoryService;
@@ -70,11 +73,11 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.api.InstanceLayout;
 import org.apache.directory.server.core.api.event.EventType;
 import org.apache.directory.server.core.api.event.NotificationCriteria;
+import org.apache.directory.server.core.api.interceptor.context.AddOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.ModifyOperationContext;
 import org.apache.directory.server.core.api.partition.Partition;
 import org.apache.directory.server.core.api.schema.SchemaPartition;
 import org.apache.directory.server.core.partition.ldif.LdifPartition;
-import org.apache.directory.server.core.partition.ldif.SingleFileLdifPartition;
 import org.apache.directory.server.core.shared.DefaultDnFactory;
 import org.apache.directory.server.i18n.I18n;
 import org.apache.directory.server.integration.http.HttpServer;
@@ -120,7 +123,7 @@ public class ApacheDsService
     private SchemaManager schemaManager;
 
     /** The configuration partition */
-    private SingleFileLdifPartition configPartition;
+    private LdifPartition configPartition;
 
     /** The configuration reader instance */
     private ConfigPartitionReader cpReader;
@@ -138,8 +141,6 @@ public class ApacheDsService
     private static final Map<String, AttributeTypeOptions> MANDATORY_ENTRY_ATOP_MAP = new HashMap<String, AttributeTypeOptions>();
     private static String[] MANDATORY_ENTRY_ATOP_AT;
 
-    private boolean isConfigPartitionFirstExtraction = false;
-
     private boolean isSchemaPartitionFirstExtraction = false;
 
 
@@ -287,27 +288,117 @@ public class ApacheDsService
     private void initConfigPartition( InstanceLayout instanceLayout, DnFactory dnFactory, CacheService cacheService )
         throws Exception
     {
-        File confFile = new File( instanceLayout.getConfDirectory(), LdifConfigExtractor.LDIF_CONFIG_FILE );
 
-        if ( confFile.exists() )
+        configPartition = new LdifPartition( schemaManager, dnFactory );
+        configPartition.setId( "config" );
+        configPartition.setPartitionPath( instanceLayout.getConfDirectory().toURI() );
+        configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
+        configPartition.setSchemaManager( schemaManager );
+        configPartition.setCacheService( cacheService );
+
+
+        File newConfigDir = new File( instanceLayout.getConfDirectory(), configPartition.getSuffixDn().getName());
+        
+        File oldConfFile = new File( instanceLayout.getConfDirectory(), LdifConfigExtractor.LDIF_CONFIG_FILE );
+
+        boolean migrate = false;
+        
+        File tempConfFile = null;
+        
+        if ( oldConfFile.exists() )
         {
-            LOG.info( "config partition already exists, skipping default config extraction" );
+            if ( newConfigDir.exists() )
+            {
+                // conflict, which one to choose
+                String msg = "Conflict in selecting configuration source, both " + LdifConfigExtractor.LDIF_CONFIG_FILE + " and " + newConfigDir.getName() + " exist"
+                    + " delete either one of them and restart the server";
+                LOG.warn( msg );
+                throw new IllegalStateException( msg );
+            }
+            
+            migrate = true;
         }
-        else
+        else if ( !newConfigDir.exists() )
         {
-            LdifConfigExtractor.extractSingleFileConfig( instanceLayout.getConfDirectory(),
-                LdifConfigExtractor.LDIF_CONFIG_FILE, true );
-            isConfigPartitionFirstExtraction = true;
+            String file = LdifConfigExtractor.extractSingleFileConfig( instanceLayout.getConfDirectory(), LdifConfigExtractor.LDIF_CONFIG_FILE, true );
+            tempConfFile = new File( file );
         }
 
-        configPartition = new SingleFileLdifPartition( schemaManager, dnFactory );
-        configPartition.setId( "config" );
-        configPartition.setPartitionPath( confFile.toURI() );
-        configPartition.setSuffixDn( new Dn( schemaManager, "ou=config" ) );
-        configPartition.setSchemaManager( schemaManager );
-        configPartition.setCacheService( cacheService );
+        LdifReader reader = null;
+        
+        if ( migrate )
+        {
+            LOG.info( "Old config partition detected, converting to multiple LDIF file configuration model" );
+            reader = new LdifReader( oldConfFile, schemaManager );
+        }
+        else if ( tempConfFile != null )
+        {
+            LOG.info( "Creating default configuration" );
+            reader = new LdifReader( tempConfFile, schemaManager );
+        }
+        
+        if ( reader != null )
+        {
+            // sometimes user may have forgotten to delete ou=config.ldif after deleting ou=config folder
+            File residue = new File( instanceLayout.getConfDirectory(), "ou=config.ldif" );
+            if ( residue.exists() )
+            {
+               residue.delete(); 
+            }
 
-        configPartition.initialize();
+            // just for the sake of above check the initialization part is kept here
+            // and in the below else block
+            configPartition.initialize();
+            
+            CsnFactory csnFactory = new CsnFactory( 0 );
+            
+            while ( reader.hasNext() )
+            {
+                Entry entry = reader.next().getEntry();
+                
+                // add the mandatory attributes
+                if ( !entry.containsAttribute( SchemaConstants.ENTRY_UUID_AT ) )
+                {
+                    String uuid = UUID.randomUUID().toString();
+                    entry.add( SchemaConstants.ENTRY_UUID_AT, uuid );
+                }
+                
+                if ( !entry.containsAttribute( SchemaConstants.ENTRY_CSN_AT ) )
+                {
+                    entry.removeAttributes( SchemaConstants.ENTRY_CSN_AT );
+                    entry.add( SchemaConstants.ENTRY_CSN_AT, csnFactory.newInstance().toString() );
+                }
+                
+                if ( !entry.containsAttribute( SchemaConstants.CREATORS_NAME_AT ) )
+                {
+                    entry.add( SchemaConstants.CREATORS_NAME_AT, ServerDNConstants.ADMIN_SYSTEM_DN );
+                }
+                
+                if ( !entry.containsAttribute( SchemaConstants.CREATE_TIMESTAMP_AT ) )
+                {
+                    entry.add( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() );
+                }
+                
+                AddOperationContext addContext = new AddOperationContext( null, entry );
+                configPartition.add( addContext );
+            }
+            
+
+            reader.close();
+            
+            if ( migrate )
+            {
+                oldConfFile.renameTo( new File( oldConfFile.getAbsolutePath() + "_migrated" ) );
+            }
+            else
+            {
+                tempConfFile.delete();
+            }
+        }
+        else
+        {
+            configPartition.initialize();
+        }
     }
 
 
@@ -362,22 +453,6 @@ public class ApacheDsService
             MANDATORY_ENTRY_ATOP_AT[pos++] = attributeTypeOptions.getAttributeType().getName();
         }
 
-        if ( isConfigPartitionFirstExtraction )
-        {
-            LOG.info( "begining to update config partition LDIF files after modifying manadatory attributes" );
-
-            // disable writes to the disk upon every modification to improve performance
-            configPartition.setEnableRewriting( false );
-
-            // perform updates
-            updateMandatoryOpAttributes( configPartition, directoryService );
-
-            // enable writes to disk, this will save the partition data first if found dirty
-            configPartition.setEnableRewriting( true );
-
-            LOG.info( "config partition data was successfully updated" );
-        }
-
         if ( isSchemaPartitionFirstExtraction )
         {
             LOG.info( "begining to update schema partition LDIF files after modifying manadatory attributes" );