opendj3-server-dev/src/server/org/opends/server/replication/server/ChangelogBaseDNVirtualAttributeProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/ChangelogBaseDNVirtualAttributeProvider.java @@ -24,14 +24,16 @@ * Copyright 2009 Sun Microsystems, Inc. * Portions Copyright 2011-2014 ForgeRock AS */ package org.opends.server.replication.common; package org.opends.server.replication.server; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.opendj.ldap.ResultCode; import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg; import org.opends.server.api.VirtualAttributeProvider; import org.opends.server.core.SearchOperation; import org.opends.server.types.*; import org.opends.server.types.Attribute; import org.opends.server.types.Attributes; import org.opends.server.types.Entry; import org.opends.server.types.VirtualAttributeRule; import org.opends.server.util.ServerConstants; import static org.opends.messages.ExtensionMessages.*; @@ -40,8 +42,7 @@ * This class implements a virtual attribute provider that specifies the * changelog attribute of the root DSE entry that contain the baseDn of the ECL. */ public class ChangelogBaseDNVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> class ChangelogBaseDNVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> { /** @@ -61,14 +62,14 @@ } /** {@inheritDoc} */ @Override() @Override public boolean isMultiValued() { return false; } /** {@inheritDoc} */ @Override() @Override public Attribute getValues(Entry entry, VirtualAttributeRule rule) { if (values == null) @@ -80,7 +81,7 @@ } /** {@inheritDoc} */ @Override() @Override public boolean isSearchable(VirtualAttributeRule rule, SearchOperation searchOperation, boolean isPreIndexed) @@ -90,14 +91,12 @@ } /** {@inheritDoc} */ @Override() public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation) @Override public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation) { searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM); final LocalizableMessage message = ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE.get( rule.getAttributeType().getNameOrOID()); searchOperation.appendErrorMessage(message); searchOperation.appendErrorMessage(ERR_CHANGELOGBASEDN_VATTR_NOT_SEARCHABLE.get( rule.getAttributeType().getNameOrOID())); } } opendj3-server-dev/src/server/org/opends/server/replication/server/FirstChangeNumberVirtualAttributeProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java @@ -24,24 +24,24 @@ * Copyright 2009 Sun Microsystems, Inc. * Portions Copyright 2011-2014 ForgeRock AS */ package org.opends.server.replication.common; package org.opends.server.replication.server; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.i18n.slf4j.LocalizedLogger; import org.forgerock.opendj.ldap.ResultCode; import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg; import org.opends.server.api.VirtualAttributeProvider; import org.opends.server.core.SearchOperation; import org.opends.server.replication.server.ReplicationServer; import org.opends.server.types.*; import org.opends.server.types.Attribute; import org.opends.server.types.Attributes; import org.opends.server.types.Entry; import org.opends.server.types.VirtualAttributeRule; import static org.opends.messages.ExtensionMessages.*; /** * Virtual attribute returning the oldest change number from the changelogDB. */ public class FirstChangeNumberVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> class FirstChangeNumberVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> { /** The tracer object for the debug logger. */ private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); @@ -56,12 +56,11 @@ */ public FirstChangeNumberVirtualAttributeProvider(ReplicationServer replicationServer) { super(); this.replicationServer = replicationServer; } /** {@inheritDoc} */ @Override() @Override public boolean isMultiValued() { return false; @@ -76,7 +75,7 @@ } /** {@inheritDoc} */ @Override() @Override public Attribute getValues(Entry entry,VirtualAttributeRule rule) { String value = "0"; @@ -84,8 +83,7 @@ { if (replicationServer != null) { final long[] limits = replicationServer.getECLChangeNumberLimits(); value = String.valueOf(limits[0]); value = String.valueOf(replicationServer.getOldestChangeNumber()); } } catch(Exception e) @@ -100,7 +98,7 @@ } /** {@inheritDoc} */ @Override() @Override public boolean isSearchable(VirtualAttributeRule rule, SearchOperation searchOperation, boolean isPreIndexed) @@ -111,14 +109,12 @@ } /** {@inheritDoc} */ @Override() public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation) @Override public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation) { searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM); final LocalizableMessage message = ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get( rule.getAttributeType().getNameOrOID()); searchOperation.appendErrorMessage(message); searchOperation.appendErrorMessage(ERR_FIRSTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get( rule.getAttributeType().getNameOrOID())); } } opendj3-server-dev/src/server/org/opends/server/replication/server/LastChangeNumberVirtualAttributeProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java @@ -24,24 +24,24 @@ * Copyright 2009 Sun Microsystems, Inc. * Portions Copyright 2011-2014 ForgeRock AS */ package org.opends.server.replication.common; package org.opends.server.replication.server; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.i18n.slf4j.LocalizedLogger; import org.forgerock.opendj.ldap.ResultCode; import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg; import org.opends.server.api.VirtualAttributeProvider; import org.opends.server.core.SearchOperation; import org.opends.server.replication.server.ReplicationServer; import org.opends.server.types.*; import org.opends.server.types.Attribute; import org.opends.server.types.Attributes; import org.opends.server.types.Entry; import org.opends.server.types.VirtualAttributeRule; import static org.opends.messages.ExtensionMessages.*; /** * Virtual attribute returning the newest change number from the changelogDB. */ public class LastChangeNumberVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> class LastChangeNumberVirtualAttributeProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> { /** The tracer object for the debug logger. */ private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); @@ -56,12 +56,11 @@ */ public LastChangeNumberVirtualAttributeProvider(ReplicationServer replicationServer) { super(); this.replicationServer = replicationServer; } /** {@inheritDoc} */ @Override() @Override public boolean isMultiValued() { return false; @@ -76,7 +75,7 @@ } /** {@inheritDoc} */ @Override() @Override public Attribute getValues(Entry entry,VirtualAttributeRule rule) { String value = "0"; @@ -84,8 +83,7 @@ { if (replicationServer != null) { final long[] limits = replicationServer.getECLChangeNumberLimits(); value = String.valueOf(limits[1]); value = String.valueOf(replicationServer.getNewestChangeNumber()); } } catch(Exception e) @@ -100,7 +98,7 @@ } /** {@inheritDoc} */ @Override() @Override public boolean isSearchable(VirtualAttributeRule rule, SearchOperation searchOperation, boolean isPreIndexed) @@ -111,14 +109,12 @@ } /** {@inheritDoc} */ @Override() public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation) @Override public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation) { searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM); final LocalizableMessage message = ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get( rule.getAttributeType().getNameOrOID()); searchOperation.appendErrorMessage(message); searchOperation.appendErrorMessage(ERR_LASTCHANGENUMBER_VATTR_NOT_SEARCHABLE.get(rule.getAttributeType() .getNameOrOID())); } } opendj3-server-dev/src/server/org/opends/server/replication/server/LastCookieVirtualProvider.java
File was renamed from opendj3-server-dev/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java @@ -24,15 +24,13 @@ * Copyright 2009 Sun Microsystems, Inc. * Portions Copyright 2011-2014 ForgeRock AS */ package org.opends.server.replication.common; package org.opends.server.replication.server; import org.forgerock.i18n.LocalizableMessage; import org.forgerock.i18n.slf4j.LocalizedLogger; import org.forgerock.opendj.ldap.ResultCode; import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg; import org.opends.server.api.VirtualAttributeProvider; import org.opends.server.core.SearchOperation; import org.opends.server.replication.server.ReplicationServer; import org.opends.server.types.Attribute; import org.opends.server.types.Attributes; import org.opends.server.types.Entry; @@ -46,8 +44,7 @@ * that contains the last (newest) cookie (cross domain state) * available in the server. */ public class LastCookieVirtualProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> class LastCookieVirtualProvider extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> { private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass(); @@ -61,28 +58,26 @@ */ public LastCookieVirtualProvider(ReplicationServer replicationServer) { super(); this.replicationServer = replicationServer; } /** {@inheritDoc} */ @Override() @Override public boolean hasValue(Entry entry, VirtualAttributeRule rule) { // There's only a value for the rootDSE, i.e. the Null DN. return entry.getName().isRootDN(); } /** {@inheritDoc} */ @Override() @Override public boolean isMultiValued() { return false; } /** {@inheritDoc} */ @Override() @Override public Attribute getValues(Entry entry, VirtualAttributeRule rule) { try @@ -101,7 +96,7 @@ } /** {@inheritDoc} */ @Override() @Override public boolean isSearchable(VirtualAttributeRule rule, SearchOperation searchOperation, boolean isPreIndexed) @@ -112,14 +107,13 @@ } /** {@inheritDoc} */ @Override() @Override public void processSearch(VirtualAttributeRule rule, SearchOperation searchOperation) { searchOperation.setResultCode(ResultCode.UNWILLING_TO_PERFORM); final LocalizableMessage message = ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE.get( rule.getAttributeType().getNameOrOID()); searchOperation.appendErrorMessage(message); searchOperation.appendErrorMessage(ERR_LASTCOOKIE_VATTR_NOT_SEARCHABLE.get( rule.getAttributeType().getNameOrOID())); } } opendj3-server-dev/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -38,14 +38,16 @@ import org.forgerock.opendj.ldap.ResultCode; import org.forgerock.opendj.ldap.SearchScope; import org.opends.server.admin.server.ConfigurationChangeListener; import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn.ConflictBehavior; import org.opends.server.admin.std.meta.ReplicationServerCfgDefn.ReplicationDBImplementation; import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn.ConflictBehavior; import org.opends.server.admin.std.server.ReplicationServerCfg; import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg; import org.opends.server.api.VirtualAttributeProvider; import org.opends.server.backends.ChangelogBackend; import org.opends.server.core.DirectoryServer; import org.opends.server.replication.common.*; import org.opends.server.replication.common.CSN; import org.opends.server.replication.common.MultiDomainServerState; import org.opends.server.replication.common.ServerState; import org.opends.server.replication.plugin.MultimasterReplication; import org.opends.server.replication.protocol.*; import org.opends.server.replication.server.changelog.api.ChangeNumberIndexDB; @@ -1225,38 +1227,50 @@ } /** * Get the oldest and newest change numbers. * Returns the oldest change number in the change number index DB. * * @return an array of size 2 holding the oldest and newest change numbers at * indexes 0 and 1. * @return the oldest change number in the change number index DB * @throws DirectoryException * When it happens. * When a problem happens */ public long[] getECLChangeNumberLimits() throws DirectoryException public long getOldestChangeNumber() throws DirectoryException { try { final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB(); final ChangeNumberIndexRecord oldestRecord = cnIndexDB.getOldestRecord(); if (oldestRecord == null) if (oldestRecord != null) { // The database is empty, just keep increasing numbers since last time // we generated one change number. final long lastGeneratedCN = cnIndexDB.getLastGeneratedChangeNumber(); return new long[] { lastGeneratedCN, lastGeneratedCN }; return oldestRecord.getChangeNumber(); } // database is empty return cnIndexDB.getLastGeneratedChangeNumber(); } catch (ChangelogException e) { throw new DirectoryException(ResultCode.OPERATIONS_ERROR, e); } } /** * Returns the newest change number in the change number index DB. * * @return the newest change number in the change number index DB * @throws DirectoryException * When a problem happens */ public long getNewestChangeNumber() throws DirectoryException { try { final ChangeNumberIndexDB cnIndexDB = getChangeNumberIndexDB(); final ChangeNumberIndexRecord newestRecord = cnIndexDB.getNewestRecord(); if (newestRecord == null) if (newestRecord != null) { // Edge case: DB was cleaned (or purged) in between calls to // getOldest*() and getNewest*(). // The only remaining solution is to fail fast. throw new DirectoryException(ResultCode.OPERATIONS_ERROR, ERR_READING_OLDEST_THEN_NEWEST_IN_CHANGENUMBER_DATABASE.get()); return newestRecord.getChangeNumber(); } return new long[] { oldestRecord.getChangeNumber(), newestRecord.getChangeNumber() }; // database is empty return cnIndexDB.getLastGeneratedChangeNumber(); } catch (ChangelogException e) {