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/05/11 23:24:13 UTC

svn commit: r943298 - in /directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl: SyncReplConsumer.java SyncreplConfiguration.java

Author: kayyagari
Date: Tue May 11 21:24:13 2010
New Revision: 943298

URL: http://svn.apache.org/viewvc?rev=943298&view=rev
Log:
o refactored the configuration parameter names and methods
o added support for ApacheDS specific MODDN operation control

Modified:
    directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncReplConsumer.java
    directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncreplConfiguration.java

Modified: directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncReplConsumer.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncReplConsumer.java?rev=943298&r1=943297&r2=943298&view=diff
==============================================================================
--- directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncReplConsumer.java (original)
+++ directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncReplConsumer.java Tue May 11 21:24:13 2010
@@ -51,13 +51,15 @@ import org.apache.directory.shared.ldap.
 import org.apache.directory.shared.ldap.codec.controls.replication.syncRequestValue.SyncRequestValueControl;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncStateValue.SyncStateValueControl;
 import org.apache.directory.shared.ldap.codec.controls.replication.syncStateValue.SyncStateValueControlDecoder;
+import org.apache.directory.shared.ldap.codec.controls.replication.syncmodifydn.SyncModifyDnControl;
+import org.apache.directory.shared.ldap.codec.controls.replication.syncmodifydn.SyncModifyDnControlDecoder;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
-import org.apache.directory.shared.ldap.entry.DefaultServerEntry;
+import org.apache.directory.shared.ldap.entry.DefaultEntry;
+import org.apache.directory.shared.ldap.entry.DefaultModification;
 import org.apache.directory.shared.ldap.entry.Entry;
 import org.apache.directory.shared.ldap.entry.EntryAttribute;
 import org.apache.directory.shared.ldap.entry.Modification;
 import org.apache.directory.shared.ldap.entry.ModificationOperation;
-import org.apache.directory.shared.ldap.entry.ServerModification;
 import org.apache.directory.shared.ldap.filter.EqualityNode;
 import org.apache.directory.shared.ldap.filter.ExprNode;
 import org.apache.directory.shared.ldap.filter.OrNode;
@@ -65,9 +67,11 @@ import org.apache.directory.shared.ldap.
 import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.message.control.Control;
+import org.apache.directory.shared.ldap.message.control.replication.SyncModifyDnType;
 import org.apache.directory.shared.ldap.message.control.replication.SyncStateTypeEnum;
 import org.apache.directory.shared.ldap.message.control.replication.SynchronizationModeEnum;
 import org.apache.directory.shared.ldap.name.DN;
+import org.apache.directory.shared.ldap.name.RDN;
 import org.apache.directory.shared.ldap.schema.SchemaManager;
 import org.apache.directory.shared.ldap.util.StringTools;
 import org.slf4j.Logger;
@@ -122,10 +126,12 @@ public class SyncReplConsumer
     private SyncDoneValueControlDecoder syncDoneControlDecoder = new SyncDoneValueControlDecoder();
 
     private SyncStateValueControlDecoder syncStateControlDecoder = new SyncStateValueControlDecoder();
+    
+    private SyncModifyDnControlDecoder syncModifyDnControlDecoder = new SyncModifyDnControlDecoder();
 
     /** attributes on which modification should be ignored */
     private static final String[] MOD_IGNORE_AT = new String[]
-        { SchemaConstants.ENTRY_UUID_AT, SchemaConstants.ENTRY_CSN_AT }; //{ "1.3.6.1.1.16.4", "1.3.6.1.4.1.4203.666.1.7" };
+        { SchemaConstants.ENTRY_UUID_AT, SchemaConstants.ENTRY_CSN_AT, SchemaConstants.MODIFIERS_NAME_AT, SchemaConstants.MODIFY_TIMESTAMP_AT, SchemaConstants.CREATE_TIMESTAMP_AT, SchemaConstants.CREATORS_NAME_AT };
 
     /** flag to indicate whether the current phase is for deleting entries */
     private boolean refreshDeletes;
@@ -183,7 +189,7 @@ public class SyncReplConsumer
             }
 
             // Do a bind
-            BindResponse bindResponse = connection.bind( config.getBindDn(), config.getCredentials() );
+            BindResponse bindResponse = connection.bind( config.getReplUserDn(), config.getReplUserPassword() );
 
             // Check that it' not null and valid
             if ( bindResponse == null )
@@ -231,7 +237,7 @@ public class SyncReplConsumer
 
         // the only valid values are NEVER_DEREF_ALIASES and DEREF_FINDING_BASE_OBJ
         searchRequest.setDerefAliases( AliasDerefMode.NEVER_DEREF_ALIASES );
-        searchRequest.setScope( SearchScope.getSearchScope( config.getSearchScope() ) );
+        searchRequest.setScope( config.getSearchScope() );
         searchRequest.setTypesOnly( false );
 
         searchRequest.addAttributes( config.getAttributes() );
@@ -292,7 +298,7 @@ public class SyncReplConsumer
 
     public void handleSearchReference( SearchResultReference searchRef )
     {
-        // this method won't be called cause the provider will server the referrals as
+        // this method won't be called cause the provider will serve the referrals as
         // normal entry objects due to the usage of ManageDsaITControl in the search request
     }
 
@@ -311,8 +317,7 @@ public class SyncReplConsumer
 
             try
             {
-                syncStateCtrl = ( SyncStateValueControl ) syncStateControlDecoder.decode( ctrl.getValue(),
-                    syncStateCtrl );
+                syncStateCtrl = ( SyncStateValueControl ) syncStateControlDecoder.decode( ctrl.getValue(), syncStateCtrl );
             }
             catch ( Exception e )
             {
@@ -343,7 +348,7 @@ public class SyncReplConsumer
                     {
                         LOG.debug( "adding entry with dn {}", remoteEntry.getDn().getName() );
                         LOG.debug( remoteEntry.toString() );
-                        session.add( new DefaultServerEntry( schemaManager, remoteEntry ) );
+                        session.add( new DefaultEntry( schemaManager, remoteEntry ) );
                     }
                     // in refreshOnly mode the modified entry will be sent with state ADD
                     else if ( !config.isRefreshPersist() )
@@ -358,6 +363,25 @@ public class SyncReplConsumer
                     LOG.debug( "modifying entry with dn {}", remoteEntry.getDn().getName() );
                     modify( remoteEntry );
                     break;
+                    
+                case MODDN:
+                    Control adsModDnControl = syncResult.getControl( SyncModifyDnControl.CONTROL_OID );
+                    //Apache Directory Server's special control
+                    SyncModifyDnControl syncModDnControl = new SyncModifyDnControl();
+                    
+                    try
+                    {
+                        LOG.debug( "decoding the SyncModifyDnControl.." );
+                        syncModDnControl = ( SyncModifyDnControl ) syncModifyDnControlDecoder.decode( adsModDnControl.getValue(), syncModDnControl );
+                    }
+                    catch( Exception e )
+                    {
+                        syncModDnControl = null;
+                        LOG.error( "Failed to decode the SyncModifyDnControl", e );
+                    }
+                    
+                    applyModDnOperation( syncModDnControl );
+                    break;
 
                 case DELETE:
                     LOG.debug( "deleting entry with dn {}", remoteEntry.getDn().getName() );
@@ -381,12 +405,13 @@ public class SyncReplConsumer
     /**
      * {@inheritDoc}
      */
-    public void handleSyncInfo( byte[] syncinfo )
+    public void handleSyncInfo( SearchIntermediateResponse syncInfoResp )
     {
         try
         {
             LOG.debug( "............... inside handleSyncInfo ..............." );
 
+            byte[] syncinfo = syncInfoResp.getResponseValue();
             SyncInfoValueControl syncInfoValue = ( SyncInfoValueControl ) decoder.decode( syncinfo, null );
 
             byte[] cookie = syncInfoValue.getCookie();
@@ -438,7 +463,7 @@ public class SyncReplConsumer
         {
             try
             {
-                Thread.sleep( config.getConsumerInterval() );
+                Thread.sleep( config.getRefreshInterval() );
             }
             catch ( InterruptedException e )
             {
@@ -516,7 +541,7 @@ public class SyncReplConsumer
             }
             else if ( resp instanceof SearchIntermediateResponse )
             {
-                handleSyncInfo( ( ( SearchIntermediateResponse ) resp ).getResponseValue() );
+                handleSyncInfo( ( SearchIntermediateResponse ) resp );
             }
             
             resp = sf.get();
@@ -639,7 +664,44 @@ public class SyncReplConsumer
         }
     }
 
+    
+    private void applyModDnOperation( SyncModifyDnControl modDnControl ) throws Exception
+    {
+        SyncModifyDnType modDnType = modDnControl.getModDnType();
+        
+        DN entryDn = new DN( modDnControl.getEntryDn() );
+        switch( modDnType )
+        {
+            case MOVE:
+                LOG.debug( "moving {} to the new parent {}", entryDn, modDnControl.getNewSuperiorDn() );
+                
+                session.move( entryDn, new DN( modDnControl.getNewSuperiorDn() ) );
+                break;
+            
+            case RENAME:
+                
+                RDN newRdn = new RDN( modDnControl.getNewRdn() );
+                boolean deleteOldRdn =  modDnControl.isDeleteOldRdn();
+                LOG.debug( "renaming the DN {} with new RDN {} and deleteOldRdn flag set to {}", 
+                    new String[]{ entryDn.getName(), newRdn.getName(), String.valueOf( deleteOldRdn ) } );
+                
+                session.rename( entryDn, newRdn, deleteOldRdn );
+                break;
+            
+            case MOVEANDRENAME:
+                
+                DN newParentDn = new DN( modDnControl.getNewSuperiorDn() );
+                newRdn = new RDN( modDnControl.getNewRdn() );
+                deleteOldRdn =  modDnControl.isDeleteOldRdn();
+                
+                LOG.debug( "moveAndRename on the DN {} with new newParent DN {}, new RDN {} and deleteOldRdn flag set to {}", 
+                    new String[]{ entryDn.getName(), newParentDn.getName(), newRdn.getName(), String.valueOf( deleteOldRdn ) } );
+                
+                session.moveAndRename( entryDn, newParentDn, newRdn, deleteOldRdn );
+        }
+    }
 
+    
     private void modify( Entry remoteEntry ) throws Exception
     {
         Entry localEntry = session.lookup( remoteEntry.getDn() );
@@ -658,12 +720,12 @@ public class SyncReplConsumer
 
             if ( remoteAttr != null ) // would be better if we compare the values also? or will it consume more time?
             {
-                mod = new ServerModification( ModificationOperation.REPLACE_ATTRIBUTE, remoteAttr );
+                mod = new DefaultModification( ModificationOperation.REPLACE_ATTRIBUTE, remoteAttr );
                 remoteEntry.remove( remoteAttr );
             }
             else
             {
-                mod = new ServerModification( ModificationOperation.REMOVE_ATTRIBUTE, localAttr );
+                mod = new DefaultModification( ModificationOperation.REMOVE_ATTRIBUTE, localAttr );
             }
 
             mods.add( mod );
@@ -674,7 +736,7 @@ public class SyncReplConsumer
             itr = remoteEntry.iterator();
             while ( itr.hasNext() )
             {
-                mods.add( new ServerModification( ModificationOperation.ADD_ATTRIBUTE, itr.next() ) );
+                mods.add( new DefaultModification( ModificationOperation.ADD_ATTRIBUTE, itr.next() ) );
             }
         }
 
@@ -792,7 +854,7 @@ public class SyncReplConsumer
                     doSyncSearch( SynchronizationModeEnum.REFRESH_ONLY );
 
                     LOG.info( "--------------------- Sleep for a little while ------------------" );
-                    Thread.sleep( config.getConsumerInterval() );
+                    Thread.sleep( config.getRefreshInterval() );
                     LOG.debug( "--------------------- syncing again ------------------" );
 
                 }

Modified: directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncreplConfiguration.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncreplConfiguration.java?rev=943298&r1=943297&r2=943298&view=diff
==============================================================================
--- directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncreplConfiguration.java (original)
+++ directory/apacheds/trunk/syncrepl/src/main/java/org/apache/directory/server/syncrepl/SyncreplConfiguration.java Tue May 11 21:24:13 2010
@@ -19,10 +19,13 @@
  */
 package org.apache.directory.server.syncrepl;
 
+
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.filter.SearchScope;
+import org.apache.directory.shared.ldap.message.AliasDerefMode;
 import org.apache.directory.shared.ldap.util.StringTools;
 
+
 /**
  * 
  * A class for holding the syncrepl consumer's configuration.
@@ -35,36 +38,34 @@ import org.apache.directory.shared.ldap.
  */
 public class SyncreplConfiguration
 {
-    /** host name of the syncrepl provider server */
-    private String providerHost;
+    /** host name of the syncrepl provider server, default value is localhost */
+    private String providerHost = "localhost";
 
-    /** port number of the syncrepl provider server */
-    private int port;
+    /** port number of the syncrepl provider server, default is 389 */
+    private int port = 389;
 
-    /** bind dn */
-    private String bindDn;
+    /** replication user's DN */
+    private String replUserDn;
 
-    /** password for binding with bind dn */
-    private String credentials;
+    /** password for binding with replication user dn */
+    private byte[] replUserPassword;
 
-    /** flag to represent refresh and persist or refreh only mode */
+    /** flag to represent refresh and persist or refresh only mode, defaults to true */
     private boolean refreshPersist = true;
 
-    /** time interval for successive sync requests */
-    private long consumerInterval = 5 * 1000;
+    /** time interval for successive sync requests, default is 5 seconds */
+    private long refreshInterval = 5 * 1000;
 
-    /** the base DN whose content will be searched for syncing */
+    /** the base DN whose content will be searched for replicating */
     private String baseDn;
 
-    /** the ldap filter for fetching the entries */
-    private String filter;
+    /** the ldap filter for fetching the entries, default value is (objectClass=*) */
+    private String filter = "(objectClass=*)";
 
-    /** a comma separated string of attribute names */
-    private String attributesString;
+    /** names of attributes to be replicated, default value is all user attributes */
+    private String[] attributes = new String[]{ SchemaConstants.ALL_USER_ATTRIBUTES };
 
-    private String[] attrs;
-    
-    /** the numer for setting the limit on numer of search results to be fteched
+    /** the numer for setting the limit on number of search results to be fetched
      * default value is 0 (i.e no limit) */
     private int searchSizeLimit = 0;
 
@@ -72,12 +73,19 @@ public class SyncreplConfiguration
      * default value is 0 (i.e no limit)*/
     private int searchTimeout = 0;
 
-    /** the search scope */
-    private int searchScope = SearchScope.ONELEVEL.getScope();
+    /** the search scope, default is sub tree level */
+    private SearchScope searchScope = SearchScope.SUBTREE;
+    
+    /** alias dereferencing mode, default is set to 'never deref aliases' */
+    private AliasDerefMode aliasDerefMode = AliasDerefMode.NEVER_DEREF_ALIASES;
 
+    /** the cookie received from server */
+    private byte[] cookie;
+    
     /** the replica's id */
     private int replicaId;
-    
+
+
     /**
      * @return the providerHost
      */
@@ -86,6 +94,7 @@ public class SyncreplConfiguration
         return providerHost;
     }
 
+
     /**
      * @param providerHost the providerHost to set
      */
@@ -94,6 +103,7 @@ public class SyncreplConfiguration
         this.providerHost = providerHost;
     }
 
+
     /**
      * @return the port
      */
@@ -102,6 +112,7 @@ public class SyncreplConfiguration
         return port;
     }
 
+
     /**
      * @param port the port to set
      */
@@ -110,38 +121,52 @@ public class SyncreplConfiguration
         this.port = port;
     }
 
+
     /**
-     * @return the bindDn
+     * @return the replication user's DN
      */
-    public String getBindDn()
+    public String getReplUserDn()
     {
-        return bindDn;
+        return replUserDn;
     }
 
+
     /**
-     * @param bindDn the bindDn to set
+     * @param replUserdDn the DN of the replication user
      */
-    public void setBindDn( String bindDn )
+    public void setReplUserDn( String replUserdDn )
     {
-        this.bindDn = bindDn;
+        this.replUserDn = replUserdDn;
     }
 
+
     /**
-     * @return the credentials
+     * @return the replication user's password
      */
-    public String getCredentials()
+    public String getReplUserPassword()
     {
-        return credentials;
+        return StringTools.utf8ToString( replUserPassword );
     }
 
+
     /**
-     * @param credentials the credentials to set
+     * @param replUserPassword the replication user's password
      */
-    public void setCredentials( String credentials )
+    public void setReplUserPassword( String replUserPassword )
     {
-        this.credentials = credentials;
+        setReplUserPassword( replUserPassword.getBytes() );
     }
 
+
+    /**
+     * @param replUserPassword the replication user's password
+     */
+    public void setReplUserPassword( byte[] replUserPassword )
+    {
+        this.replUserPassword = replUserPassword;
+    }
+
+    
     /**
      * @return the refreshPersist
      */
@@ -150,6 +175,7 @@ public class SyncreplConfiguration
         return refreshPersist;
     }
 
+
     /**
      * @param refreshPersist the refreshPersist to set
      */
@@ -158,22 +184,25 @@ public class SyncreplConfiguration
         this.refreshPersist = refreshPersist;
     }
 
+
     /**
-     * @return the consumerInterval
+     * @return the refresh interval
      */
-    public long getConsumerInterval()
+    public long getRefreshInterval()
     {
-        return consumerInterval;
+        return refreshInterval;
     }
 
+
     /**
-     * @param consumerInterval the consumerInterval to set
+     * @param refreshInterval the consumerInterval to set
      */
-    public void setConsumerInterval( long consumerInterval )
+    public void setRefreshInterval( long refreshInterval )
     {
-        this.consumerInterval = consumerInterval;
+        this.refreshInterval = refreshInterval;
     }
 
+
     /**
      * @return the baseDn
      */
@@ -182,6 +211,7 @@ public class SyncreplConfiguration
         return baseDn;
     }
 
+
     /**
      * @param baseDn the baseDn to set
      */
@@ -190,6 +220,7 @@ public class SyncreplConfiguration
         this.baseDn = baseDn;
     }
 
+
     /**
      * @return the filter
      */
@@ -198,6 +229,7 @@ public class SyncreplConfiguration
         return filter;
     }
 
+
     /**
      * @param filter the filter to set
      */
@@ -206,32 +238,25 @@ public class SyncreplConfiguration
         this.filter = filter;
     }
 
+
     /**
      * @return the attributes
      */
     public String[] getAttributes()
     {
-        if( attrs == null )
-        {
-            if ( StringTools.isEmpty( attributesString ) )
-            {
-                attributesString = SchemaConstants.ALL_USER_ATTRIBUTES;
-            }
-
-            attrs = attributesString.trim().split( "," );
-        }
-
-        return attrs;
+        return attributes;
     }
 
+
     /**
      * @param attributes the attributes to set
      */
-    public void setAttributes( String attributes )
+    public void setAttributes( String[] attributes )
     {
-        this.attributesString = attributes;
+        this.attributes = attributes;
     }
 
+
     /**
      * @return the searchSizeLimit
      */
@@ -240,6 +265,7 @@ public class SyncreplConfiguration
         return searchSizeLimit;
     }
 
+
     /**
      * @param searchSizeLimit the searchSizeLimit to set
      */
@@ -248,6 +274,7 @@ public class SyncreplConfiguration
         this.searchSizeLimit = searchSizeLimit;
     }
 
+
     /**
      * @return the searchTimeout
      */
@@ -256,6 +283,7 @@ public class SyncreplConfiguration
         return searchTimeout;
     }
 
+
     /**
      * @param searchTimeout the searchTimeout to set
      */
@@ -264,22 +292,25 @@ public class SyncreplConfiguration
         this.searchTimeout = searchTimeout;
     }
 
+
     /**
      * @return the searchScope
      */
-    public int getSearchScope()
+    public SearchScope getSearchScope()
     {
         return searchScope;
     }
 
+
     /**
      * @param searchScope the searchScope to set
      */
-    public void setSearchScope( int searchScope )
+    public void setSearchScope( SearchScope searchScope )
     {
         this.searchScope = searchScope;
     }
 
+
     /**
      * @return the replicaId
      */
@@ -288,6 +319,7 @@ public class SyncreplConfiguration
         return replicaId;
     }
 
+
     /**
      * @param replicaId the replicaId to set
      */
@@ -296,6 +328,33 @@ public class SyncreplConfiguration
         this.replicaId = replicaId;
     }
 
-    
+
+    public AliasDerefMode getAliasDerefMode()
+    {
+        return aliasDerefMode;
+    }
+
+
+    public void setAliasDerefMode( AliasDerefMode aliasDerefMode )
+    {
+        if( aliasDerefMode != AliasDerefMode.NEVER_DEREF_ALIASES || aliasDerefMode != AliasDerefMode.DEREF_FINDING_BASE_OBJ )
+        {
+            throw new IllegalArgumentException( "alias deref mode should only be set to either 'NEVER_DEREF_ALIASES' or 'DEREF_FINDING_BASE_OBJ'" );
+        }
+        
+        this.aliasDerefMode = aliasDerefMode;
+    }
+
+
+    public byte[] getCookie()
+    {
+        return cookie;
+    }
+
+
+    public void setCookie( byte[] cookie )
+    {
+        this.cookie = cookie;
+    }
     
 }