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

svn commit: r1225556 - in /directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub: ComponentHub.java InstanceManager.java

Author: gokturk
Date: Thu Dec 29 15:22:36 2011
New Revision: 1225556

URL: http://svn.apache.org/viewvc?rev=1225556&view=rev
Log:
* InstanceManager is implemented to manage instance reconfigurations and creations.

TODO : Implement new apacheds-service-osgi module

Modified:
    directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java
    directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/InstanceManager.java

Modified: directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java?rev=1225556&r1=1225555&r2=1225556&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java (original)
+++ directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/ComponentHub.java Thu Dec 29 15:22:36 2011
@@ -103,7 +103,7 @@ public class ComponentHub
     /*
      * Used to manage instances' DIT hooks.
      */
-    private InstanceManager instanceManager = new InstanceManager();
+    private InstanceManager instanceManager = new InstanceManager( componentRegistry, eventManager );
 
     /*
      * Used to manage components.
@@ -176,7 +176,7 @@ public class ComponentHub
      */
     public void RegisterWithDS( DirectoryService ads )
     {
-        // TODO implement
+        instanceManager.registerWithDirectoryService( ads );
     }
 
 

Modified: directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/InstanceManager.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/InstanceManager.java?rev=1225556&r1=1225555&r2=1225556&view=diff
==============================================================================
--- directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/InstanceManager.java (original)
+++ directory/apacheds/branches/apacheds-osgi/component-hub/src/main/java/org/apache/directory/server/component/hub/InstanceManager.java Thu Dec 29 15:22:36 2011
@@ -20,7 +20,15 @@
 package org.apache.directory.server.component.hub;
 
 
+import java.util.List;
+import java.util.Properties;
+
 import org.apache.directory.server.component.ADSComponent;
+import org.apache.directory.server.component.instance.ADSComponentInstance;
+import org.apache.directory.server.component.instance.CachedComponentInstance;
+import org.apache.directory.server.component.utilities.ADSConstants;
+import org.apache.directory.server.component.utilities.ADSSchemaConstants;
+import org.apache.directory.server.component.utilities.LdifConfigHelper;
 import org.apache.directory.server.core.api.DirectoryService;
 import org.apache.directory.server.core.api.event.DirectoryListener;
 import org.apache.directory.server.core.api.event.NotificationCriteria;
@@ -30,11 +38,16 @@ import org.apache.directory.server.core.
 import org.apache.directory.server.core.api.interceptor.context.MoveAndRenameOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.MoveOperationContext;
 import org.apache.directory.server.core.api.interceptor.context.RenameOperationContext;
+import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
+import org.apache.directory.shared.ldap.model.entry.Attribute;
+import org.apache.directory.shared.ldap.model.entry.Entry;
 import org.apache.directory.shared.ldap.model.exception.LdapException;
 import org.apache.directory.shared.ldap.model.message.SearchRequest;
 import org.apache.directory.shared.ldap.model.message.SearchRequestImpl;
 import org.apache.directory.shared.ldap.model.message.SearchScope;
 import org.apache.directory.shared.ldap.model.name.Dn;
+import org.apache.directory.shared.ldap.model.name.Rdn;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,10 +60,48 @@ public class InstanceManager
      */
     private final Logger LOG = LoggerFactory.getLogger( InstanceManager.class );
 
+    /*
+     * Registry to access ADSComponent references by name.
+     */
+    private ComponentRegistry componentRegistry;
 
+    /*
+     * Event Manager to fire new configuration events.
+     */
+    private ComponentEventManager eventManager;
+
+    /*
+     * List of registered component names to be managed by InstaceManager
+     */
+    private List<String> registeredComponentNames;
+
+
+    public InstanceManager( ComponentRegistry componentRegistry, ComponentEventManager eventManager )
+    {
+        this.componentRegistry = componentRegistry;
+        this.eventManager = eventManager;
+    }
+
+
+    /**
+     * Registeres component under InstanceManager for instance entry management.
+     *
+     * @param component ADSComponent reference to register in InstanceManager
+     */
     public void registerComponent( ADSComponent component )
     {
-        
+        registeredComponentNames.add( component.getComponentName().toLowerCase() );
+    }
+
+
+    /**
+     * Unregisteres component from InstanceManager for instance entry management.
+     *
+     * @param component ADSComponent reference to unregister from InstanceManager
+     */
+    public void unregisterComponent( ADSComponent component )
+    {
+        registeredComponentNames.remove( component.getComponentName().toLowerCase() );
     }
 
 
@@ -85,13 +136,83 @@ public class InstanceManager
 
     }
 
+
+    /**
+     * Gets the component name in lower case from instance entr 
+     * by looking its parent component entry.
+     *
+     * @param instanceEntry Instance entry to look for its parent component's name
+     * @return instance's component name
+     */
+    private String getComponentName( Entry instanceEntry )
+    {
+        try
+        {
+            Rdn parentComponentRdn = instanceEntry.getDn().getParent().getParent().getRdn();
+            String componentName = parentComponentRdn.getNormValue().getString();
+
+            return componentName;
+        }
+        catch ( Exception e )
+        {
+            // Most probably the given Entry is not an instance entry.
+            return null;
+        }
+    }
+
+
+    /**
+     * Check if given Entry is a component entry.
+     *
+     * @param entry Entry to check
+     * @return true if it is a component entry
+     */
+    private boolean ifComponentEntry( Entry entry )
+    {
+        Attribute OCAttrib = entry.get( SchemaConstants.OBJECT_CLASS_AT );
+        if ( OCAttrib.contains( ADSSchemaConstants.ADS_COMPONENT ) )
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+
+    /**
+     * Check if given Entry is a instance entry
+     *
+     * @param entry Entry to check
+     * @return true if it is a instance entry
+     */
+    private boolean ifInstanceEntry( Entry entry )
+    {
+        Dn instancesDn = entry.getDn().getParent();
+        if ( instancesDn == null )
+        {
+            return false;
+        }
+
+        if ( !instancesDn.getRdn().getName().equals( ADSConstants.ADS_COMPONENT_INSTANCES_RDN ) )
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    /*
+     * Internal DirectoryListener implementation to register with EventInterceptor
+     */
     private DirectoryListener listener = new DirectoryListener()
     {
 
         @Override
         public void entryRenamed( RenameOperationContext renameContext )
         {
-            // TODO Auto-generated method stub
+            // TODO Prevent instance entry renamings, thus IPojo instances can't be renamed. Reload the original
 
         }
 
@@ -99,7 +220,7 @@ public class InstanceManager
         @Override
         public void entryMovedAndRenamed( MoveAndRenameOperationContext moveAndRenameContext )
         {
-            // TODO Auto-generated method stub
+            // TODO Prevent moves of entries in any circumstances here. Reload the original.
 
         }
 
@@ -107,7 +228,7 @@ public class InstanceManager
         @Override
         public void entryMoved( MoveOperationContext moveContext )
         {
-            // TODO Auto-generated method stub
+            // TODO Prevent moves of entries in any circumstances here. Reload the original.
 
         }
 
@@ -115,23 +236,80 @@ public class InstanceManager
         @Override
         public void entryModified( ModifyOperationContext modifyContext )
         {
-            // TODO Auto-generated method stub
+            Entry modifiedEntry = modifyContext.getModifiedEntry();
 
+            if ( ifInstanceEntry( modifiedEntry ) )
+            {
+                Properties instanceConfiguration = LdifConfigHelper.instanceEntryToConfiguration( modifiedEntry );
+                String componentName = getComponentName( modifiedEntry );
+
+                if ( registeredComponentNames.contains( componentName ) )
+                {
+                    ADSComponent component = componentRegistry.getComponentByName( componentName );
+
+                    String instanceName = ( String ) instanceConfiguration
+                        .remove( ADSConstants.ADS_COMPONENT_INSTANCE_PROP_NAME );
+
+                    ADSComponentInstance backedInstance = component.getInstance( instanceName );
+                    backedInstance.reconfigure( instanceConfiguration );
+                }
+            }
+            else if ( ifComponentEntry( modifiedEntry ) )
+            {
+                //TODO revert it back
+            }
         }
 
 
         @Override
         public void entryDeleted( DeleteOperationContext deleteContext )
         {
-            // TODO Auto-generated method stub
-
+            Entry deletedEntry = deleteContext.getEntry();
+            if ( ifInstanceEntry( deletedEntry ) )
+            {
+                String componentName = getComponentName( deletedEntry );
+                Properties instanceConfiguration = LdifConfigHelper.instanceEntryToConfiguration( deletedEntry );
+
+                if ( registeredComponentNames.contains( componentName ) )
+                {
+                    ADSComponent component = componentRegistry.getComponentByName( componentName );
+
+                    String instanceName = ( String ) instanceConfiguration
+                        .remove( ADSConstants.ADS_COMPONENT_INSTANCE_PROP_NAME );
+
+                    ADSComponentInstance backedInstance = component.getInstance( instanceName );
+
+                    backedInstance.stop();
+                }
+            }
         }
 
 
         @Override
         public void entryAdded( AddOperationContext addContext )
         {
-            // TODO Auto-generated method stub
+            Entry addedEntry = addContext.getEntry();
+
+            if ( ifInstanceEntry( addedEntry ) )
+            {
+                Properties conf = LdifConfigHelper.instanceEntryToConfiguration( addedEntry );
+                String componentName = getComponentName( addedEntry );
+
+                if ( registeredComponentNames.contains( componentName ) )
+                {
+                    ADSComponent component = componentRegistry.getComponentByName( componentName );
+                    CachedComponentInstance createdConf = new CachedComponentInstance( addedEntry.getDn().getName(),
+                        conf );
+
+                    component.addCachedInstance( createdConf );
+
+                    eventManager.fireConfigurationCreated( component, createdConf );
+                }
+            }
+            else if ( ifComponentEntry( addedEntry ) )
+            {
+                //TODO Revert it back
+            }
 
         }
     };