You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2011/09/01 12:00:22 UTC
svn commit: r1163978 - in /directory/apacheds/trunk:
core-jndi/src/main/java/org/apache/directory/server/core/jndi/
protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/
protocol-ldap/src/main/java/org/apache/directory/server/ldap/r...
Author: elecharny
Date: Thu Sep 1 10:00:21 2011
New Revision: 1163978
URL: http://svn.apache.org/viewvc?rev=1163978&view=rev
Log:
o Removed the MODDN control used in replication
o Renamed the SyncReplConsumer class to ReplicationConsumerImpl
o Ignored the replication reboot test, it's failing atm
o
Added:
directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/ReplicationConsumerImpl.java
- copied, changed from r1163138, directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/SyncReplConsumer.java
Modified:
directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ControlEnum.java
directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java
directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java
directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessageSerializer.java
directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/SyncReplConsumer.java
directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplRequestHandler.java
directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplSearchListener.java
directory/apacheds/trunk/server-annotations/src/main/java/org/apache/directory/server/factory/ServerAnnotationProcessor.java
directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/ClientServerReplicationIT.java
directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/MockSyncReplConsumer.java
directory/apacheds/trunk/service-builder/src/main/java/org/apache/directory/server/config/ServiceBuilder.java
directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkRunner.java
directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkSuite.java
Modified: directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ControlEnum.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ControlEnum.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ControlEnum.java (original)
+++ directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ControlEnum.java Thu Sep 1 10:00:21 2011
@@ -36,7 +36,6 @@ public enum ControlEnum
PERSISTENT_SEARCH_CONTROL,
SUBENTRIES_CONTROL,
SYNC_INFO_VALUE_CONTROL,
- SYNC_MODIFY_DN_CONTROL,
SYNC_REQUEST_VALUE_CONTROL,
SYNC_STATE_VALUE_CONTROL
}
Modified: directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java (original)
+++ directory/apacheds/trunk/core-jndi/src/main/java/org/apache/directory/server/core/jndi/ServerContext.java Thu Sep 1 10:00:21 2011
@@ -81,7 +81,6 @@ import org.apache.directory.shared.ldap.
import org.apache.directory.shared.ldap.codec.controls.search.subentries.SubentriesDecorator;
import org.apache.directory.shared.ldap.extras.controls.SyncDoneValue;
import org.apache.directory.shared.ldap.extras.controls.SyncInfoValue;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDn;
import org.apache.directory.shared.ldap.extras.controls.SyncRequestValue;
import org.apache.directory.shared.ldap.extras.controls.SyncStateValue;
import org.apache.directory.shared.ldap.extras.controls.ppolicy.PasswordPolicy;
@@ -90,7 +89,6 @@ import org.apache.directory.shared.ldap.
import org.apache.directory.shared.ldap.extras.controls.ppolicy.PasswordPolicyResponseImpl;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncDoneValueDecorator;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncInfoValueDecorator;
-import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncModifyDnDecorator;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncRequestValueDecorator;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncStateValueDecorator;
import org.apache.directory.shared.ldap.model.constants.JndiPropertyConstants;
@@ -184,7 +182,6 @@ public abstract class ServerContext impl
ADS_CONTROLS.put( Subentries.OID, ControlEnum.SUBENTRIES_CONTROL );
ADS_CONTROLS.put( SyncDoneValue.OID, ControlEnum.SYNC_DONE_VALUE_CONTROL );
ADS_CONTROLS.put( SyncInfoValue.OID, ControlEnum.SYNC_INFO_VALUE_CONTROL );
- ADS_CONTROLS.put( SyncModifyDn.OID, ControlEnum.SYNC_MODIFY_DN_CONTROL );
ADS_CONTROLS.put( SyncRequestValue.OID, ControlEnum.SYNC_REQUEST_VALUE_CONTROL );
ADS_CONTROLS.put( SyncStateValue.OID, ControlEnum.SYNC_STATE_VALUE_CONTROL );
}
@@ -437,11 +434,6 @@ public abstract class ServerContext impl
break;
- case SYNC_MODIFY_DN_CONTROL:
- control = new SyncModifyDnDecorator( getDirectoryService().getLdapCodecService() );
-
- break;
-
case SYNC_REQUEST_VALUE_CONTROL:
control = new SyncRequestValueDecorator( getDirectoryService().getLdapCodecService() );
Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessage.java Thu Sep 1 10:00:21 2011
@@ -21,7 +21,6 @@
package org.apache.directory.server.ldap.replication;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDn;
import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
import org.apache.directory.shared.ldap.model.entry.Entry;
import org.apache.directory.shared.ldap.model.message.controls.ChangeType;
@@ -40,10 +39,6 @@ public class ReplicaEventMessage
/** The entry */
private Entry entry;
- /** The modifyDN control */
- private SyncModifyDn modDnControl;
-
-
/**
* Create a new ReplicaEvent instance for a Add/Delete+Modify operation
* @param changeType The change type
@@ -57,18 +52,6 @@ public class ReplicaEventMessage
/**
- * Create a new ReplicaEvent instance for a ModDN operation
- * @param modDnControl The modDN control
- * @param entry The entry
- */
- public ReplicaEventMessage( SyncModifyDn modDnControl, Entry entry )
- {
- this.modDnControl = modDnControl;
- this.entry = entry;
- }
-
-
- /**
* @return The changeType
*/
public ChangeType getChangeType()
@@ -87,15 +70,6 @@ public class ReplicaEventMessage
/**
- * @return The ModDN conrol
- */
- public SyncModifyDn getModDnControl()
- {
- return modDnControl;
- }
-
-
- /**
* checks if the event's CSN is older than the given CSN
*
* @param csn the CSN
Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessageSerializer.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessageSerializer.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessageSerializer.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/ReplicaEventMessageSerializer.java Thu Sep 1 10:00:21 2011
@@ -30,10 +30,6 @@ import jdbm.helper.Serializer;
import org.apache.directory.server.core.partition.impl.btree.jdbm.EntrySerializer;
import org.apache.directory.shared.ldap.codec.api.LdapApiService;
import org.apache.directory.shared.ldap.codec.api.LdapApiServiceFactory;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDn;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDnType;
-import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncModifyDnDecorator;
-import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
import org.apache.directory.shared.ldap.model.entry.Entry;
import org.apache.directory.shared.ldap.model.message.controls.ChangeType;
import org.apache.directory.shared.ldap.model.name.Dn;
@@ -84,7 +80,6 @@ public class ReplicaEventMessageSerializ
Entry entry = replicaEventMessage.getEntry();
ChangeType changeType = replicaEventMessage.getChangeType();
- SyncModifyDn modDnControl = replicaEventMessage.getModDnControl();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream( baos );
@@ -104,29 +99,6 @@ public class ReplicaEventMessageSerializ
// The change type
out.writeByte( changeType.getValue() );
- // The moddn control if any (only if it's a MODDN operation)
- if ( changeType == ChangeType.MODDN )
- {
- SyncModifyDnType modDnType = modDnControl.getModDnType();
- out.writeByte( modDnType.getValue() );
-
- switch ( modDnType )
- {
- case MOVE:
- out.writeUTF( modDnControl.getNewSuperiorDn() );
- break;
-
- case MOVE_AND_RENAME:
- out.writeUTF( modDnControl.getNewSuperiorDn() );
- // Fall through
-
- case RENAME:
- out.writeUTF( modDnControl.getNewRdn() );
- out.writeBoolean( modDnControl.isDeleteOldRdn() );
- break;
- }
- }
-
out.flush();
return baos.toByteArray();
@@ -165,39 +137,8 @@ public class ReplicaEventMessageSerializ
byte type = in.readByte();
ChangeType changeType = ChangeType.getChangeType( type );
- if ( changeType == ChangeType.MODDN )
- {
- type = in.readByte();
- SyncModifyDnType modDnType = SyncModifyDnType.getModifyDnType( type );
- SyncModifyDn modDnControl = new SyncModifyDnDecorator( codec );
-
- modDnControl.setModDnType( modDnType );
-
- switch ( modDnType )
- {
- case MOVE :
- modDnControl.setNewSuperiorDn( in.readUTF() );
- break;
-
- case MOVE_AND_RENAME :
- modDnControl.setNewSuperiorDn( in.readUTF() );
- // Fallthrough
-
- case RENAME :
- modDnControl.setNewRdn( in.readUTF() );
- modDnControl.setDeleteOldRdn( in.readBoolean() );
- break;
- }
-
- // And create a ReplicaEventMessage
- replicaEventMessage = new ReplicaEventMessage( modDnControl, entry );
-
- }
- else
- {
- // And create a ReplicaEventMessage
- replicaEventMessage = new ReplicaEventMessage( changeType, entry );
- }
+ // And create a ReplicaEventMessage
+ replicaEventMessage = new ReplicaEventMessage( changeType, entry );
}
catch ( ClassNotFoundException cnfe )
{
Copied: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/ReplicationConsumerImpl.java (from r1163138, directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/SyncReplConsumer.java)
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/ReplicationConsumerImpl.java?p2=directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/ReplicationConsumerImpl.java&p1=directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/SyncReplConsumer.java&r1=1163138&r2=1163978&rev=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/SyncReplConsumer.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/consumer/ReplicationConsumerImpl.java Thu Sep 1 10:00:21 2011
@@ -43,8 +43,8 @@ import org.apache.directory.server.ldap.
import org.apache.directory.shared.ldap.codec.controls.manageDsaIT.ManageDsaITDecorator;
import org.apache.directory.shared.ldap.extras.controls.SyncDoneValue;
import org.apache.directory.shared.ldap.extras.controls.SyncInfoValue;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDn;
import org.apache.directory.shared.ldap.extras.controls.SyncModifyDnType;
+import org.apache.directory.shared.ldap.extras.controls.SyncRequestValue;
import org.apache.directory.shared.ldap.extras.controls.SyncStateTypeEnum;
import org.apache.directory.shared.ldap.extras.controls.SyncStateValue;
import org.apache.directory.shared.ldap.extras.controls.SynchronizationModeEnum;
@@ -90,10 +90,10 @@ import org.slf4j.LoggerFactory;
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
-public class SyncReplConsumer implements ConnectionClosedEventListener, ReplicationConsumer
+public class ReplicationConsumerImpl implements ConnectionClosedEventListener, ReplicationConsumer
{
/** the logger */
- private static final Logger LOG = LoggerFactory.getLogger( SyncReplConsumer.class );
+ private static final Logger LOG = LoggerFactory.getLogger( ReplicationConsumerImpl.class );
/** the syncrepl configuration */
private SyncreplConfiguration config;
@@ -334,18 +334,15 @@ public class SyncReplConsumer implements
{
case ADD:
Dn remoteDn = directoryService.getDnFactory().create( remoteEntry.getDn().getName() );
- //System.out.println( "C: ADDING " + remoteDn );
if ( !session.exists( remoteDn ) )
{
- //System.out.println( "C: " + remoteDn + " does not exist, adding it" );
LOG.debug( "adding entry with dn {}", remoteDn );
LOG.debug( remoteEntry.toString() );
session.add( new DefaultEntry( schemaManager, remoteEntry ) );
}
else
{
- //System.out.println( "C: " + remoteDn + " exists, modifying it" );
LOG.debug( "updating entry in refreshOnly mode {}", remoteDn );
modify( remoteEntry );
}
@@ -354,25 +351,23 @@ public class SyncReplConsumer implements
case MODIFY:
LOG.debug( "modifying entry with dn {}", remoteEntry.getDn().getName() );
- //System.out.println( "C: MODIFY " + remoteEntry.getDn() );
modify( remoteEntry );
+
break;
case MODDN:
- SyncModifyDn adsModDnControl = ( SyncModifyDn ) syncResult.getControls().get( SyncModifyDn.OID );
- //System.out.println( "C: MODDN " + adsModDnControl.getModDnType() + ", " + adsModDnControl.getEntryDn()
- // + ", " + adsModDnControl.getNewSuperiorDn() + ", " + adsModDnControl.getNewRdn() );
- //Apache Directory Server's special control
- applyModDnOperation( adsModDnControl );
+ String entryUuid = Strings.uuidToString( syncStateCtrl.getEntryUUID() ).toString();
+ applyModDnOperation( remoteEntry, entryUuid );
+
break;
case DELETE:
- //System.out.println( "C: DELETING " + remoteEntry.getDn().getNormName() );
LOG.debug( "deleting entry with dn {}", remoteEntry.getDn().getName() );
// incase of a MODDN operation resulting in a branch to be moved out of scope
// ApacheDS replication provider sends a single delete event on the Dn of the moved branch
// so the branch needs to be recursively deleted here
deleteRecursive( remoteEntry.getDn(), null );
+
break;
case PRESENT:
@@ -544,17 +539,26 @@ public class SyncReplConsumer implements
/**
- * performs a search on connection with updated syncRequest control.
+ * Performs a search on connection with updated syncRequest control. The provider
+ * will initiate an UpdateContant or an initContent depending on the current consumer
+ * status, accordingly to the cookie's content.
+ * If the mode is refreshOnly, the server will send a SearchResultDone when all the modified
+ * entries have been sent.
+ * If the mode is refreshAndPersist, the provider never send a SearchResultDone, so we keep
+ * receiving modifications' notifications on the consumer, and never exit the loop, unless
+ * some communication error occurs.
*
* @throws Exception in case of any problems encountered while searching
*/
private void doSyncSearch( SynchronizationModeEnum syncType, boolean reloadHint ) throws Exception
{
- SyncRequestValueDecorator syncReq = new SyncRequestValueDecorator( directoryService.getLdapCodecService() );
+ // Prepare the Syncrepl Request
+ SyncRequestValue syncReq = new SyncRequestValueDecorator( directoryService.getLdapCodecService() );
syncReq.setMode( syncType );
syncReq.setReloadHint( reloadHint );
+ // If we have a persisted cookie, send it.
if ( syncCookie != null )
{
LOG.debug( "searching with searchRequest, cookie '{}'", Strings.utf8ToString(syncCookie) );
@@ -568,6 +572,8 @@ public class SyncReplConsumer implements
Response resp = sf.get();
+ // Now, process the responses. We loop until we have a connection termination or
+ // a SearchResultDone (RefreshOnly mode)
while ( !( resp instanceof SearchResultDone ) && !sf.isCancelled() && !disconnected )
{
if ( resp instanceof SearchResultEntry )
@@ -586,6 +592,7 @@ public class SyncReplConsumer implements
handleSyncInfo( (IntermediateResponse) resp );
}
+ // Next entry
resp = sf.get();
}
@@ -597,6 +604,7 @@ public class SyncReplConsumer implements
{
// log the error and handle it appropriately
LOG.warn( "given replication base Dn {} is not found on provider", config.getBaseDn() );
+
if ( syncType == SynchronizationModeEnum.REFRESH_AND_PERSIST )
{
LOG.warn( "disconnecting the consumer running in refreshAndPersist mode from the provider" );
@@ -619,6 +627,7 @@ public class SyncReplConsumer implements
e );
}
+ // Do a full update.
removeCookie();
doSyncSearch( syncType, true );
}
@@ -730,9 +739,11 @@ public class SyncReplConsumer implements
try
{
Entry entry = session.lookup( config.getConfigEntryDn(), COOKIE_AT_TYPE.getName() );
+
if ( entry != null )
{
Attribute attr = entry.get( COOKIE_AT_TYPE );
+
if ( attr != null )
{
syncCookie = attr.getBytes();
@@ -792,48 +803,90 @@ public class SyncReplConsumer implements
}
- private void applyModDnOperation( SyncModifyDn modDnControl ) throws Exception
+ private void applyModDnOperation( Entry remoteEntry, String entryUuid ) throws Exception
{
- LOG.debug( "{}", modDnControl );
+ LOG.debug( "MODDN for entry {}, new entry : {}", entryUuid, remoteEntry );
- SyncModifyDnType modDnType = modDnControl.getModDnType();
-
- Dn entryDn = directoryService.getDnFactory().create( modDnControl.getEntryDn() );
+ // First, compute the MODDN type
+ SyncModifyDnType modDnType = null;
- switch ( modDnType )
+ try
{
- case MOVE:
+ // Retrieve locally the moved or renamed entry
+ String filter = "(entryUuid=" + entryUuid + ")";
+ SearchRequest searchRequest = new SearchRequestImpl();
+ searchRequest.setBase( Dn.ROOT_DSE );
+ searchRequest.setFilter( filter );
+ searchRequest.setScope( SearchScope.SUBTREE );
+ searchRequest.addAttributes( "entryUuid", "entryCsn", "*" );
+
+ EntryFilteringCursor cursor = session.search( searchRequest );
+ cursor.beforeFirst();
+ cursor.next();
- //System.out.println( " ============> MOVING " + entryDn.getNormName() + " to " + modDnControl.getNewSuperiorDn() );
- LOG.debug( "moving {} to the new parent {}", entryDn, modDnControl.getNewSuperiorDn() );
+ Entry localEntry = cursor.get();
- session.move( entryDn, directoryService.getDnFactory().create( modDnControl.getNewSuperiorDn() ) );
- break;
+ cursor.close();
- case RENAME:
+ // Compute the DN, parentDn and Rdn for both entries
+ Dn localDn = localEntry.getDn();
+ Dn remoteDn = directoryService.getDnFactory().create( remoteEntry.getDn().getName() );
+
+ Dn localParentDn = localDn.getParent();
+ Dn remoteParentDn = directoryService.getDnFactory().create( remoteDn.getParent().getName() );
+
+ Rdn localRdn = localDn.getRdn();
+ Rdn remoteRdn = directoryService.getDnFactory().create( remoteDn.getRdn().getName() ).getRdn();
+
+ if ( localRdn.equals( remoteRdn ) )
+ {
+ // If the RDN are equals, it's a MOVE
+ modDnType = SyncModifyDnType.MOVE;
+ }
+ else if ( localParentDn.equals( remoteParentDn ) )
+ {
+ // If the parentDn are equals, it's a RENAME
+ modDnType = SyncModifyDnType.RENAME;
+ }
+ else
+ {
+ // Otherwise, it's a MOVE and RENAME
+ modDnType = SyncModifyDnType.MOVE_AND_RENAME;
+ }
- //System.out.println( " ============> RENAMING " + entryDn.getNormName() + " to " + modDnControl.getNewRdn() );
- Rdn newRdn = new Rdn( schemaManager, 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 ) } );
+ // Check if the OldRdn has been deleted
+ boolean deleteOldRdn = remoteEntry.contains( localRdn.getNormType(), localRdn.getNormValue() );
- session.rename( entryDn, newRdn, deleteOldRdn );
- break;
+ switch ( modDnType )
+ {
+ case MOVE:
+ LOG.debug( "moving {} to the new parent {}", localDn, remoteParentDn );
+ session.move( localDn, remoteParentDn );
+
+ break;
- case MOVE_AND_RENAME:
+ case RENAME:
+ LOG.debug( "renaming the Dn {} with new Rdn {} and deleteOldRdn flag set to {}", new String[]
+ { localDn.getName(), remoteRdn.getName(), String.valueOf( deleteOldRdn ) } );
- Dn newParentDn = directoryService.getDnFactory().create( modDnControl.getNewSuperiorDn() );
- newRdn = new Rdn( schemaManager, modDnControl.getNewRdn() );
- deleteOldRdn = modDnControl.isDeleteOldRdn();
- //System.out.println( " ============> MOVING and RENAMING " + entryDn.getNormName() + " to " + newRdn + "/" +modDnControl.getNewRdn() );
+ session.rename( localDn, remoteRdn, deleteOldRdn );
+
+ break;
- 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 ) } );
+ case MOVE_AND_RENAME:
+ LOG.debug(
+ "moveAndRename on the Dn {} with new newParent Dn {}, new Rdn {} and deleteOldRdn flag set to {}",
+ new String[]
+ { localDn.getName(), remoteParentDn.getName(), remoteRdn.getName(), String.valueOf( deleteOldRdn ) } );
- session.moveAndRename( entryDn, newParentDn, newRdn, deleteOldRdn );
+ session.moveAndRename( localDn, remoteParentDn, remoteRdn, deleteOldRdn );
+
+ break;
+ }
+ }
+ catch ( Exception e )
+ {
+ throw e;
}
}
Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplRequestHandler.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplRequestHandler.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplRequestHandler.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplRequestHandler.java Thu Sep 1 10:00:21 2011
@@ -45,9 +45,9 @@ import org.apache.directory.server.ldap.
import org.apache.directory.server.ldap.replication.ReplicaEventMessage;
import org.apache.directory.shared.ldap.extras.controls.SyncDoneValue;
import org.apache.directory.shared.ldap.extras.controls.SyncInfoValue;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDn;
import org.apache.directory.shared.ldap.extras.controls.SyncRequestValue;
import org.apache.directory.shared.ldap.extras.controls.SyncStateTypeEnum;
+import org.apache.directory.shared.ldap.extras.controls.SyncStateValue;
import org.apache.directory.shared.ldap.extras.controls.SynchronizationInfoEnum;
import org.apache.directory.shared.ldap.extras.controls.SynchronizationModeEnum;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncDoneValueDecorator;
@@ -235,11 +235,12 @@ public class SyncReplRequestHandler impl
{
PROVIDER_LOG.debug( "Received a replication request {} with no cookie", request );
// No cookie ? We have to get all the entries from the provider
+ // This is an initiate Content Poll action (RFC 4533, 3.3.1)
doInitialRefresh( session, request );
}
else
{
- String cookieString = Strings.utf8ToString(cookieBytes);
+ String cookieString = Strings.utf8ToString( cookieBytes );
PROVIDER_LOG.debug( "Received a replication request {} with a cookie '{}'", request, cookieString );
LOG.debug( "search request received with the cookie {}", cookieString );
@@ -310,7 +311,7 @@ public class SyncReplRequestHandler impl
// if event type is null, then it is a MODDN operation
if ( event == ChangeType.MODDN )
{
- sendSearchResultEntry( session, req, entry, replicaEventMessage.getModDnControl() );
+ sendSearchResultEntry( session, req, entry, SyncStateTypeEnum.MODIFY );
}
else
{
@@ -412,7 +413,7 @@ public class SyncReplRequestHandler impl
boolean refreshNPersist = isRefreshNPersist( request );
- // first register a persistent search handler before starting the initial content refresh
+ // first register a ReplicaEventLog before starting the initial content refresh
// this is to log all the operations happen on DIT during initial content refresh
ReplicaEventLog replicaLog = createRelicaEventLog( hostName, originalFilter );
@@ -455,6 +456,7 @@ public class SyncReplRequestHandler impl
ExprNode initialContentFilter = new AndNode( modifiedFilter, csnNode );
request.setFilter( initialContentFilter );
+ // Now, do a search to get all the entries
SearchResultDone searchDoneResp = doSimpleSearch( session, request );
if ( searchDoneResp.getLdapResult().getResultCode() == ResultCodeEnum.SUCCESS )
@@ -470,10 +472,10 @@ public class SyncReplRequestHandler impl
IntermediateResponse intermResp = new IntermediateResponseImpl( request.getMessageId() );
intermResp.setResponseName( SyncInfoValue.OID );
- SyncInfoValueDecorator syncInfo = new SyncInfoValueDecorator(
+ SyncInfoValue syncInfo = new SyncInfoValueDecorator(
ldapServer.getDirectoryService().getLdapCodecService(), SynchronizationInfoEnum.NEW_COOKIE );
syncInfo.setCookie( cookie );
- intermResp.setResponseValue( syncInfo.getValue() );
+ intermResp.setResponseValue( ((SyncInfoValueDecorator)syncInfo).getValue() );
PROVIDER_LOG.info( "Sending the intermediate response to consumer {}, {}", replicaLog, syncInfo );
@@ -633,7 +635,7 @@ public class SyncReplRequestHandler impl
Attribute uuid = entry.get( SchemaConstants.ENTRY_UUID_AT );
// Create the SyncState control
- SyncStateValueDecorator syncStateControl = new SyncStateValueDecorator(
+ SyncStateValue syncStateControl = new SyncStateValueDecorator(
ldapServer.getDirectoryService().getLdapCodecService() );
syncStateControl.setSyncStateType( syncStateType );
syncStateControl.setEntryUUID( Strings.uuidToBytes( uuid.getString() ) );
@@ -655,30 +657,6 @@ public class SyncReplRequestHandler impl
/**
- * Prepare and send a search result entry response, with the associated
- * SyncState control for a MODDN operation.
- */
- private void sendSearchResultEntry( LdapSession session, SearchRequest req, Entry entry,
- SyncModifyDn modDnControl ) throws Exception
- {
- Attribute uuid = entry.get( SchemaConstants.ENTRY_UUID_AT );
- SyncStateValueDecorator syncStateControl = new SyncStateValueDecorator(
- ldapServer.getDirectoryService().getLdapCodecService() );
- syncStateControl.setSyncStateType( SyncStateTypeEnum.MODDN );
- syncStateControl.setEntryUUID( Strings.uuidToBytes(uuid.getString()) );
-
- Response resp = generateResponse( session, req, entry );
- resp.addControl( syncStateControl );
- resp.addControl( modDnControl );
-
- LOG.debug( "Sending {}", entry.getDn() );
- PROVIDER_LOG.debug( "Sending the MODDN modification:", entry.getDn() );
-
- session.getIoSession().write( resp );
- }
-
-
- /**
* Build the response to be sent to the client
*/
private Response generateResponse( LdapSession session, SearchRequest req, Entry entry ) throws Exception
@@ -829,16 +807,6 @@ public class SyncReplRequestHandler impl
public ExprNode modifyFilter( LdapSession session, SearchRequest req ) throws Exception
{
/*
- * Do not add the OR'd (objectClass=referral) expression if the user
- * searches for the subSchemaSubEntry as the SchemaIntercepter can't
- * handle an OR'd filter.
- */
- // if ( isSubSchemaSubEntrySearch( session, req ) )
- // {
- // return;
- // }
-
- /*
* Most of the time the search filter is just (objectClass=*) and if
* this is the case then there's no reason at all to OR this with an
* (objectClass=referral). If we detect this case then we leave it
Modified: directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplSearchListener.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplSearchListener.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplSearchListener.java (original)
+++ directory/apacheds/trunk/protocol-ldap/src/main/java/org/apache/directory/server/ldap/replication/provider/SyncReplSearchListener.java Thu Sep 1 10:00:21 2011
@@ -33,11 +33,8 @@ import org.apache.directory.server.core.
import org.apache.directory.server.i18n.I18n;
import org.apache.directory.server.ldap.LdapSession;
import org.apache.directory.server.ldap.replication.ReplicaEventMessage;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDn;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDnType;
import org.apache.directory.shared.ldap.extras.controls.SyncStateTypeEnum;
import org.apache.directory.shared.ldap.extras.controls.SyncStateValue;
-import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncModifyDnDecorator;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncStateValueDecorator;
import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
import org.apache.directory.shared.ldap.model.entry.Entry;
@@ -172,8 +169,8 @@ public class SyncReplSearchListener impl
SyncStateValue syncStateValue = new SyncStateValueDecorator( directoryService.getLdapCodecService() );
syncStateValue.setSyncStateType( operation );
- syncStateValue.setEntryUUID(
- Strings.uuidToBytes( entry.get( SchemaConstants.ENTRY_UUID_AT ).getString() ) );
+ String uuidStr = entry.get( SchemaConstants.ENTRY_UUID_AT ).getString();
+ syncStateValue.setEntryUUID( Strings.uuidToBytes( uuidStr ) );
syncStateValue.setCookie( getCookie( entry ) );
return syncStateValue;
@@ -184,7 +181,7 @@ public class SyncReplSearchListener impl
* Send the result to the consumer. If the consumer has disconnected, we fail back to the queue.
*/
private void sendResult( SearchResultEntry searchResultEntry, Entry entry, EventType eventType,
- SyncStateValue syncStateValue, SyncModifyDn syncModifyDn )
+ SyncStateValue syncStateValue )
{
searchResultEntry.addControl( syncStateValue );
@@ -192,7 +189,7 @@ public class SyncReplSearchListener impl
WriteFuture future = session.getIoSession().write( searchResultEntry );
// Now, send the entry to the consumer
- handleWriteFuture( future, entry, eventType, syncModifyDn );
+ handleWriteFuture( future, entry, eventType );
}
@@ -223,7 +220,7 @@ public class SyncReplSearchListener impl
// Create the control which will be added to the response.
SyncStateValue syncAdd = createControl( directoryService, SyncStateTypeEnum.ADD, entry );
- sendResult( resultEntry, entry, EventType.ADD, syncAdd, null );
+ sendResult( resultEntry, entry, EventType.ADD, syncAdd );
}
}
@@ -266,7 +263,7 @@ public class SyncReplSearchListener impl
SyncStateValue syncDelete = createControl( directoryService, SyncStateTypeEnum.DELETE, entry );
- sendResult( resultEntry, entry, EventType.DELETE, syncDelete, null );
+ sendResult( resultEntry, entry, EventType.DELETE, syncDelete );
}
}
catch ( LdapInvalidAttributeValueException e )
@@ -301,7 +298,7 @@ public class SyncReplSearchListener impl
SyncStateValue syncModify = createControl( directoryService, SyncStateTypeEnum.MODIFY, alteredEntry );
- sendResult( resultEntry, alteredEntry, EventType.MODIFY, syncModify, null );
+ sendResult( resultEntry, alteredEntry, EventType.MODIFY, syncModify );
}
}
catch ( Exception e )
@@ -319,7 +316,8 @@ public class SyncReplSearchListener impl
*/
public void entryMoved( MoveOperationContext moveContext )
{
- Entry entry = moveContext.getOriginalEntry();
+ // should always send the modified entry cause the consumer perform the modDn operation locally
+ Entry entry = moveContext.getModifiedEntry();
try
{
@@ -329,24 +327,18 @@ public class SyncReplSearchListener impl
return;
}
- SyncModifyDn modDnControl =
- new SyncModifyDnDecorator( directoryService.getLdapCodecService(), SyncModifyDnType.MOVE );
- modDnControl.setEntryDn( moveContext.getDn().getNormName() );
- modDnControl.setNewSuperiorDn( moveContext.getNewSuperior().getNormName() );
-
//System.out.println( "MOVE Listener : log " + moveContext.getDn() + " moved to " + moveContext.getNewSuperior() );
- consumerMsgLog.log( new ReplicaEventMessage( modDnControl, entry ) );
+ consumerMsgLog.log( new ReplicaEventMessage( ChangeType.MODDN, entry ) );
if ( pushInRealTime )
{
SearchResultEntry resultEntry = new SearchResultEntryImpl( searchRequest.getMessageId() );
resultEntry.setObjectName( moveContext.getDn() );
resultEntry.setEntry( entry );
- resultEntry.addControl( modDnControl );
SyncStateValue syncModify = createControl( directoryService, SyncStateTypeEnum.MODDN, entry );
- sendResult( resultEntry, entry, null, syncModify, modDnControl );
+ sendResult( resultEntry, entry, null, syncModify );
}
}
catch ( Exception e )
@@ -372,30 +364,22 @@ public class SyncReplSearchListener impl
return;
}
- SyncModifyDnDecorator modDnControl =
- new SyncModifyDnDecorator( directoryService.getLdapCodecService(), SyncModifyDnType.MOVE_AND_RENAME );
- modDnControl.setEntryDn( moveAndRenameContext.getDn().getNormName() );
- modDnControl.setNewSuperiorDn( moveAndRenameContext.getNewSuperiorDn().getNormName() );
- modDnControl.setNewRdn( moveAndRenameContext.getNewRdn().getNormName() );
- modDnControl.setDeleteOldRdn( moveAndRenameContext.getDeleteOldRdn() );
-
- // should always send the original entry cause the consumer perform the modDn operation there
- Entry entry = moveAndRenameContext.getOriginalEntry();
+ // should always send the modified entry cause the consumer perform the modDn operation locally
+ Entry entry = moveAndRenameContext.getModifiedEntry();
//System.out.println( "MOVE AND RENAME Listener : log " + moveAndRenameContext.getDn() +
// " moved to " + moveAndRenameContext.getNewSuperiorDn() + " renamed to " + moveAndRenameContext.getNewRdn() );
- consumerMsgLog.log( new ReplicaEventMessage( modDnControl, entry ) );
+ consumerMsgLog.log( new ReplicaEventMessage( ChangeType.MODDN, entry ) );
if ( pushInRealTime )
{
SearchResultEntry resultEntry = new SearchResultEntryImpl( searchRequest.getMessageId() );
resultEntry.setObjectName( entry.getDn() );
resultEntry.setEntry( entry );
- resultEntry.addControl( modDnControl );
SyncStateValue syncModify = createControl( directoryService, SyncStateTypeEnum.MODDN, entry );
- sendResult( resultEntry, entry, null, syncModify, modDnControl );
+ sendResult( resultEntry, entry, null, syncModify );
}
}
catch ( Exception e )
@@ -413,33 +397,27 @@ public class SyncReplSearchListener impl
*/
public void entryRenamed( RenameOperationContext renameContext )
{
- Entry entry = renameContext.getOriginalEntry();
+ // should always send the modified entry cause the consumer perform the modDn operation locally
+ Entry entry = renameContext.getModifiedEntry();
try
{
- SyncModifyDnDecorator modDnControl = new SyncModifyDnDecorator( directoryService.getLdapCodecService() );
- modDnControl.setModDnType( SyncModifyDnType.RENAME );
- modDnControl.setEntryDn( renameContext.getDn().getName() );
- modDnControl.setNewRdn( renameContext.getNewRdn().getName() );
- modDnControl.setDeleteOldRdn( renameContext.getDeleteOldRdn() );
-
// should always send the original entry cause the consumer perform the modDn operation there
//System.out.println( "RENAME Listener : log " + renameContext.getDn() + " renamed to " + renameContext.getNewRdn() );
- consumerMsgLog.log( new ReplicaEventMessage( modDnControl, entry ) );
+ consumerMsgLog.log( new ReplicaEventMessage( ChangeType.MODDN, entry ) );
if ( pushInRealTime )
{
SearchResultEntry resultEntry = new SearchResultEntryImpl( searchRequest.getMessageId() );
resultEntry.setObjectName( entry.getDn() );
resultEntry.setEntry( entry );
- resultEntry.addControl( modDnControl );
SyncStateValue syncModify = createControl( directoryService, SyncStateTypeEnum.MODDN, entry );
// In this case, the cookie is different
syncModify.setCookie( getCookie( entry ) );
- sendResult( resultEntry, entry, null, syncModify, modDnControl );
+ sendResult( resultEntry, entry, null, syncModify );
}
}
catch ( Exception e )
@@ -482,7 +460,7 @@ public class SyncReplSearchListener impl
/**
* Process the writing of the replicated entry to the consumer
*/
- private void handleWriteFuture( WriteFuture future, Entry entry, EventType event, SyncModifyDn modDnControl )
+ private void handleWriteFuture( WriteFuture future, Entry entry, EventType event )
{
// Let the operation be executed.
// Note : we wait 10 seconds max
Modified: directory/apacheds/trunk/server-annotations/src/main/java/org/apache/directory/server/factory/ServerAnnotationProcessor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-annotations/src/main/java/org/apache/directory/server/factory/ServerAnnotationProcessor.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/server-annotations/src/main/java/org/apache/directory/server/factory/ServerAnnotationProcessor.java (original)
+++ directory/apacheds/trunk/server-annotations/src/main/java/org/apache/directory/server/factory/ServerAnnotationProcessor.java Thu Sep 1 10:00:21 2011
@@ -39,7 +39,7 @@ import org.apache.directory.server.ldap.
import org.apache.directory.server.ldap.handlers.bind.ntlm.NtlmProvider;
import org.apache.directory.server.ldap.replication.SyncreplConfiguration;
import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumer;
-import org.apache.directory.server.ldap.replication.consumer.SyncReplConsumer;
+import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumerImpl;
import org.apache.directory.server.protocol.shared.transport.TcpTransport;
import org.apache.directory.server.protocol.shared.transport.Transport;
import org.apache.directory.server.protocol.shared.transport.UdpTransport;
@@ -225,7 +225,7 @@ public class ServerAnnotationProcessor
*/
private static ReplicationConsumer createConsumer( CreateConsumer createConsumer )
{
- ReplicationConsumer consumer = new SyncReplConsumer();
+ ReplicationConsumer consumer = new ReplicationConsumerImpl();
SyncreplConfiguration config = new SyncreplConfiguration();
config.setRemoteHost( createConsumer.remoteHost() );
Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/ClientServerReplicationIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/ClientServerReplicationIT.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/ClientServerReplicationIT.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/ClientServerReplicationIT.java Thu Sep 1 10:00:21 2011
@@ -44,7 +44,7 @@ import org.apache.directory.server.core.
import org.apache.directory.server.factory.ServerAnnotationProcessor;
import org.apache.directory.server.ldap.LdapServer;
import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumer;
-import org.apache.directory.server.ldap.replication.consumer.SyncReplConsumer;
+import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumerImpl;
import org.apache.directory.server.ldap.replication.provider.SyncReplRequestHandler;
import org.apache.directory.shared.ldap.model.entry.DefaultEntry;
import org.apache.directory.shared.ldap.model.entry.Entry;
@@ -106,6 +106,7 @@ public class ClientServerReplicationIT
searchRequest.setBase( new Dn( schemaManager, "dc=example,dc=com" ) );
searchRequest.setFilter( "(objectClass=*)" );
searchRequest.setScope( SearchScope.SUBTREE );
+ searchRequest.addAttributes( "entryUuid" );
System.out.println( "-----------> Dumping the consumer <-----------" );
System.out.println( "-----------> Looking for " + entryDn.getNormName() + " <-----------" );
@@ -122,7 +123,7 @@ public class ClientServerReplicationIT
break;
}
- System.out.println( "Entry " + entry.getDn().getNormName() + " exists" );
+ System.out.println( "Entry " + entry.getDn().getNormName() + " exists, entrtyUuid = " + entry.get( "entryUuid" ) );
}
cursor.close();
@@ -191,27 +192,29 @@ public class ClientServerReplicationIT
private boolean checkEntryDeletion( CoreSession session, Dn entryDn ) throws Exception
{
boolean exists = session.exists( entryDn );
- boolean deleted = false;
+
+ if ( ! exists )
+ {
+ return true;
+ }
for ( int i = 0; i < 100; i++ )
{
Thread.sleep( 50 );
- if ( !session.exists( entryDn ) )
+ exists = session.exists( entryDn );
+
+ if ( !exists )
{
- deleted = true;
- break;
+ return true;
}
Thread.sleep( 50 );
}
- if ( !exists || !deleted )
- {
- dump( session, entryDn );
- }
+ dump( session, entryDn );
- return exists && deleted;
+ return false;
}
@@ -386,6 +389,7 @@ public class ClientServerReplicationIT
@Test
+ @Ignore( "Ignored until Selcuk's fix is injected into trunk" )
public void testRebootConsumer() throws Exception
{
System.out.println( "----> 1 testRebootConsumer started --------------------------------" );
@@ -558,7 +562,7 @@ public class ClientServerReplicationIT
DirectoryService provDirService = DSAnnotationProcessor.getDirectoryService();
consumerServer = ServerAnnotationProcessor.getLdapServer( provDirService );
- final SyncReplConsumer consumer = (SyncReplConsumer)ServerAnnotationProcessor.createConsumer();
+ final ReplicationConsumerImpl consumer = (ReplicationConsumerImpl)ServerAnnotationProcessor.createConsumer();
List<ReplicationConsumer> replConsumers = new ArrayList<ReplicationConsumer>();
replConsumers.add( consumer );
Modified: directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/MockSyncReplConsumer.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/MockSyncReplConsumer.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/MockSyncReplConsumer.java (original)
+++ directory/apacheds/trunk/server-integ/src/test/java/org/apache/directory/server/replication/MockSyncReplConsumer.java Thu Sep 1 10:00:21 2011
@@ -44,14 +44,15 @@ import org.apache.directory.shared.ldap.
import org.apache.directory.shared.ldap.codec.api.LdapApiServiceFactory;
import org.apache.directory.shared.ldap.extras.controls.SyncDoneValue;
import org.apache.directory.shared.ldap.extras.controls.SyncInfoValue;
-import org.apache.directory.shared.ldap.extras.controls.SyncModifyDn;
import org.apache.directory.shared.ldap.extras.controls.SyncModifyDnType;
+import org.apache.directory.shared.ldap.extras.controls.SyncRequestValue;
import org.apache.directory.shared.ldap.extras.controls.SyncStateTypeEnum;
import org.apache.directory.shared.ldap.extras.controls.SyncStateValue;
import org.apache.directory.shared.ldap.extras.controls.SynchronizationModeEnum;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncInfoValueDecorator;
import org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncRequestValueDecorator;
import org.apache.directory.shared.ldap.model.constants.SchemaConstants;
+import org.apache.directory.shared.ldap.model.cursor.EntryCursor;
import org.apache.directory.shared.ldap.model.entry.Attribute;
import org.apache.directory.shared.ldap.model.entry.DefaultAttribute;
import org.apache.directory.shared.ldap.model.entry.DefaultModification;
@@ -73,6 +74,7 @@ import org.apache.directory.shared.ldap.
import org.apache.directory.shared.ldap.model.message.SearchResultDone;
import org.apache.directory.shared.ldap.model.message.SearchResultEntry;
import org.apache.directory.shared.ldap.model.message.SearchResultReference;
+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.apache.directory.shared.ldap.model.schema.AttributeType;
@@ -317,7 +319,7 @@ public class MockSyncReplConsumer implem
switch ( state )
{
case ADD:
- //System.out.println( "Entry added : " + remoteEntry.getDn() );
+ LOG.debug( "adding entry with dn {}, {}", remoteEntry.getDn().getName(), remoteEntry );
nbAdded.getAndIncrement();
break;
@@ -327,9 +329,9 @@ public class MockSyncReplConsumer implem
break;
case MODDN:
- SyncModifyDn adsModDnControl = ( SyncModifyDn ) syncResult.getControls().get( SyncModifyDn.OID );
- //Apache Directory Server's special control
- applyModDnOperation( adsModDnControl );
+ String entryUuid = Strings.uuidToString( syncStateCtrl.getEntryUUID() );
+ applyModDnOperation( remoteEntry, entryUuid );
+
break;
case DELETE:
@@ -514,7 +516,7 @@ public class MockSyncReplConsumer implem
*/
private void doSyncSearch( SynchronizationModeEnum syncType, boolean reloadHint ) throws Exception
{
- SyncRequestValueDecorator syncReq = new SyncRequestValueDecorator( ldapCodecService );
+ SyncRequestValue syncReq = new SyncRequestValueDecorator( ldapCodecService );
syncReq.setMode( syncType );
syncReq.setReloadHint( reloadHint );
@@ -553,6 +555,7 @@ public class MockSyncReplConsumer implem
ResultCodeEnum resultCode = handleSearchDone( ( SearchResultDone ) resp );
LOG.debug( "sync operation returned result code {}", resultCode );
+
if ( resultCode == ResultCodeEnum.NO_SUCH_OBJECT )
{
// log the error and handle it appropriately
@@ -697,42 +700,77 @@ public class MockSyncReplConsumer implem
}
- private void applyModDnOperation( SyncModifyDn modDnControl ) throws Exception
+ private void applyModDnOperation( Entry remoteEntry, String entryUuid ) throws Exception
{
- SyncModifyDnType modDnType = modDnControl.getModDnType();
+ LOG.debug( "MODDN for entry {}, new entry : {}", entryUuid, remoteEntry );
+
+ // First, compute the MODDN type
+ SyncModifyDnType modDnType = null;
- Dn entryDn = new Dn( modDnControl.getEntryDn() );
- switch ( modDnType )
+ try
{
- case MOVE:
+ // Retrieve locally the moved or renamed entry
+ String filter = "(entryUuid=" + entryUuid + ")";
+ EntryCursor cursor = connection.search( Dn.ROOT_DSE, filter, SearchScope.SUBTREE, SchemaConstants.ALL_ATTRIBUTES_ARRAY );
+
+ Entry localEntry = cursor.get();
+
+ // Compute the DN, parentDn and Rdn for both entries
+ Dn localDn = localEntry.getDn();
+ Dn remoteDn = remoteEntry.getDn();
+
+ Dn localParentDn = localDn.getParent();
+ Dn remoteParentDn = remoteDn.getParent();
- LOG.debug( "moving {} to the new parent {}", entryDn, modDnControl.getNewSuperiorDn() );
+ Rdn localRdn = localDn.getRdn();
+ Rdn remoteRdn = remoteDn.getRdn();
- //session.move( entryDn, new Dn( modDnControl.getNewSuperiorDn() ) );
- break;
+ // If the RDN are equals, it's a MOVE
+ if ( localRdn.equals( remoteRdn ) )
+ {
+ modDnType = SyncModifyDnType.MOVE;
+ }
+
+ // If the parentDn are equals, it's a RENAME
+ if ( localParentDn.equals( remoteParentDn ) )
+ {
+ modDnType = SyncModifyDnType.RENAME;
+ }
- case RENAME:
+ // Otherwise, it's a MOVE and RENAME
+ if ( modDnType == null )
+ {
+ modDnType = SyncModifyDnType.MOVE_AND_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 ) } );
+ // Check if the OldRdn has been deleted
+ boolean deleteOldRdn = remoteEntry.contains( localRdn.getNormType(), localRdn.getNormValue() );
- //session.rename( entryDn, newRdn, deleteOldRdn );
- break;
+ switch ( modDnType )
+ {
+ case MOVE:
+ LOG.debug( "moving {} to the new parent {}", localDn, remoteParentDn );
+
+ break;
- case MOVE_AND_RENAME:
+ case RENAME:
+ LOG.debug( "renaming the Dn {} with new Rdn {} and deleteOldRdn flag set to {}", new String[]
+ { localDn.getName(), remoteRdn.getName(), String.valueOf( deleteOldRdn ) } );
- Dn newParentDn = new Dn( modDnControl.getNewSuperiorDn() );
- newRdn = new Rdn( modDnControl.getNewRdn() );
- deleteOldRdn = modDnControl.isDeleteOldRdn();
+ break;
- 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 ) } );
+ case MOVE_AND_RENAME:
+ LOG.debug(
+ "moveAndRename on the Dn {} with new newParent Dn {}, new Rdn {} and deleteOldRdn flag set to {}",
+ new String[]
+ { localDn.getName(), remoteParentDn.getName(), remoteRdn.getName(), String.valueOf( deleteOldRdn ) } );
- //session.moveAndRename( entryDn, newParentDn, newRdn, deleteOldRdn );
+ break;
+ }
+ }
+ catch ( Exception e )
+ {
+ throw e;
}
}
Modified: directory/apacheds/trunk/service-builder/src/main/java/org/apache/directory/server/config/ServiceBuilder.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/service-builder/src/main/java/org/apache/directory/server/config/ServiceBuilder.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/service-builder/src/main/java/org/apache/directory/server/config/ServiceBuilder.java (original)
+++ directory/apacheds/trunk/service-builder/src/main/java/org/apache/directory/server/config/ServiceBuilder.java Thu Sep 1 10:00:21 2011
@@ -84,7 +84,7 @@ import org.apache.directory.server.ldap.
import org.apache.directory.server.ldap.replication.ReplicationTrustManager;
import org.apache.directory.server.ldap.replication.SyncreplConfiguration;
import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumer;
-import org.apache.directory.server.ldap.replication.consumer.SyncReplConsumer;
+import org.apache.directory.server.ldap.replication.consumer.ReplicationConsumerImpl;
import org.apache.directory.server.ldap.replication.provider.ReplicationRequestHandler;
import org.apache.directory.server.ntp.NtpServer;
import org.apache.directory.server.protocol.shared.transport.TcpTransport;
@@ -997,7 +997,7 @@ public class ServiceBuilder
{
if( className == null )
{
- consumerClass = SyncReplConsumer.class;
+ consumerClass = ReplicationConsumerImpl.class;
}
else
{
Modified: directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkRunner.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkRunner.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkRunner.java (original)
+++ directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkRunner.java Thu Sep 1 10:00:21 2011
@@ -102,7 +102,6 @@ public class FrameworkRunner extends Blo
"org.apache.directory.shared.ldap.extras.controls.ppolicy.PasswordPolicyFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncDoneValueFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncInfoValueFactory," +
- "org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncModifyDnFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncRequestValueFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncStateValueFactory" );
Modified: directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkSuite.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkSuite.java?rev=1163978&r1=1163977&r2=1163978&view=diff
==============================================================================
--- directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkSuite.java (original)
+++ directory/apacheds/trunk/test-framework/src/main/java/org/apache/directory/server/core/integ/FrameworkSuite.java Thu Sep 1 10:00:21 2011
@@ -78,7 +78,6 @@ public class FrameworkSuite extends Suit
"org.apache.directory.shared.ldap.extras.controls.ppolicy.PasswordPolicyFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncDoneValueFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncInfoValueFactory," +
- "org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncModifyDnFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncRequestValueFactory," +
"org.apache.directory.shared.ldap.extras.controls.syncrepl_impl.SyncStateValueFactory" );