opends/src/guitools/org/opends/guitools/controlpanel/ui/ViewEntryPanel.java
@@ -53,7 +53,7 @@ import org.opends.guitools.controlpanel.util.Utilities; import org.opends.messages.Message; import org.opends.server.api.AttributeSyntax; import org.opends.server.replication.plugin.Historical; import org.opends.server.replication.plugin.EntryHistorical; import org.opends.server.schema.SchemaConstants; import org.opends.server.types.AttributeType; import org.opends.server.types.AttributeValue; @@ -644,7 +644,7 @@ { CustomSearchResult filteredSr; List<Object> values = sr.getAttributeValues(Historical.HISTORICALATTRIBUTENAME); sr.getAttributeValues(EntryHistorical.HISTORICALATTRIBUTENAME); if (values != null) { List<Object> newValues = new ArrayList<Object>(); @@ -659,7 +659,7 @@ else { filteredSr = sr.clone(); filteredSr.set(Historical.HISTORICALATTRIBUTENAME, newValues); filteredSr.set(EntryHistorical.HISTORICALATTRIBUTENAME, newValues); } } else opends/src/server/org/opends/server/replication/plugin/AttrHistorical.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttributeInfo.java @@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -37,11 +37,9 @@ /** * This classes is used to store historical information. * One object of this type is created for each attribute that was changed in * the entry. * This class store historical information for a provided attribute. */ public abstract class AttributeInfo public abstract class AttrHistorical { /** * This method will be called when replaying an operation. @@ -76,18 +74,18 @@ ChangeNumber changeNumber, Modification mod); /** * Create a new AttributeInfo object that will be used with the given type. * Create a new object from a provided attribute type. Historical is empty. * * @param type the AttrbuteType with which the ATtributeInfo is going to be * used. * @param type the provided attribute type. * @return a new AttributeInfo object. */ public static AttributeInfo createAttributeInfo(AttributeType type) public static AttrHistorical createAttributeHistorical( AttributeType type) { if (type.isSingleValue()) return new AttrInfoSingle(); return new AttrHistoricalSingle(); else return new AttrInfoMultiple(); return new AttrHistoricalMultiple(); } /** @@ -95,25 +93,25 @@ * * @return the List of ValueInfo */ public abstract ArrayList<ValueInfo> getValuesInfo(); public abstract ArrayList<AttrValueHistorical> getValuesHistorical(); /** * Returns the last time when the attribute was deleted. * Returns the last time when this attribute was deleted. * * @return the last time when the attribute was deleted * @return the last time when this attribute was deleted */ public abstract ChangeNumber getDeleteTime(); /** * Load the provided information. * Assign the provided information to this object. * * @param histKey the key to load. * @param histKey the key to assign. * @param value the associated value or null if there is no value; * @param cn the associated ChangeNumber. */ public abstract void load( HistKey histKey, AttributeValue value, ChangeNumber cn); public abstract void assign( HistAttrModificationKey histKey, AttributeValue value, ChangeNumber cn); } opends/src/server/org/opends/server/replication/plugin/AttrHistoricalMultiple.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttrInfoMultiple.java @@ -48,42 +48,43 @@ * time a given value was deleted and the last time the whole attribute was * deleted. */ public class AttrInfoMultiple extends AttributeInfo public class AttrHistoricalMultiple extends AttrHistorical { private ChangeNumber deleteTime, // last time when the attribute was deleted lastUpdateTime; // last time the attribute was modified private ArrayList<ValueInfo> valuesInfo; // creation or deletion time for // given values /** * create a new AttrInfo object. * @param deleteTime the deletion time * @param updateTime the update time * @param valuesInfo of Value Info private ArrayList<AttrValueHistorical> valuesHist; /** * Create a new object from the provided informations. * @param deleteTime the last time this attribute was deleted * @param updateTime the last time this attribute was updated * @param valuesHist the new attribute values when updated. */ public AttrInfoMultiple(ChangeNumber deleteTime, ChangeNumber updateTime, ArrayList<ValueInfo> valuesInfo) public AttrHistoricalMultiple(ChangeNumber deleteTime, ChangeNumber updateTime, ArrayList<AttrValueHistorical> valuesHist) { this.deleteTime = deleteTime; this.lastUpdateTime = updateTime; if (valuesInfo == null) this.valuesInfo = new ArrayList<ValueInfo>(); if (valuesHist == null) this.valuesHist = new ArrayList<AttrValueHistorical>(); else this.valuesInfo = valuesInfo; this.valuesHist = valuesHist; } /** * create a new empty AttrInfo object. * Create a new object. */ public AttrInfoMultiple() public AttrHistoricalMultiple() { this.deleteTime = null; this.lastUpdateTime = null; this.valuesInfo = new ArrayList<ValueInfo>(); this.valuesHist = new ArrayList<AttrValueHistorical>(); } /** * Returns the last time when the entry was updated. * @return the last time when the entry was updated * Returns the last time when the attribute was updated. * @return the last time when the attribute was updated */ private ChangeNumber getLastUpdateTime() { @@ -92,7 +93,6 @@ /** * Returns the last time when the attribute was deleted. * * @return the last time when the attribute was deleted */ public ChangeNumber getDeleteTime() @@ -101,15 +101,15 @@ } /** * Duplicate an AttrInfo. * Duplicate an object. * ChangeNumber are duplicated by references * @return the duplicated AttrInfo * @return the duplicated object. */ AttrInfoMultiple duplicate() AttrHistoricalMultiple duplicate() { AttrInfoMultiple dup = new AttrInfoMultiple(this.deleteTime, this.lastUpdateTime, this.valuesInfo); AttrHistoricalMultiple dup = new AttrHistoricalMultiple(this.deleteTime, this.lastUpdateTime, this.valuesHist); return dup; } @@ -124,10 +124,10 @@ // iterate through the values in the valuesInfo // and suppress all the values that have not been added // after the date of this delete. Iterator<ValueInfo> it = this.valuesInfo.iterator(); Iterator<AttrValueHistorical> it = this.valuesHist.iterator(); while (it.hasNext()) { ValueInfo info = it.next(); AttrValueHistorical info = it.next(); if (CN.newerOrEquals(info.getValueUpdateTime()) && CN.newerOrEquals(info.getValueDeleteTime())) it.remove(); @@ -145,15 +145,16 @@ } /** * Change historical information after a delete value. * Update the historical of this attribute after a delete value. * * @param val value that was deleted * @param CN time when the delete was done */ protected void delete(AttributeValue val, ChangeNumber CN) { ValueInfo info = new ValueInfo(val, null, CN); this.valuesInfo.remove(info); this.valuesInfo.add(info); AttrValueHistorical info = new AttrValueHistorical(val, null, CN); this.valuesHist.remove(info); this.valuesHist.add(info); if (CN.newer(lastUpdateTime)) { lastUpdateTime = CN; @@ -161,8 +162,7 @@ } /** * Change historical information after a delete of a set of * values. * Update the historical of this attribute after deleting a set of values. * * @param attr * the attribute containing the set of values that were @@ -174,9 +174,9 @@ { for (AttributeValue val : attr) { ValueInfo info = new ValueInfo(val, null, CN); this.valuesInfo.remove(info); this.valuesInfo.add(info); AttrValueHistorical info = new AttrValueHistorical(val, null, CN); this.valuesHist.remove(info); this.valuesHist.add(info); if (CN.newer(lastUpdateTime)) { lastUpdateTime = CN; @@ -187,16 +187,16 @@ /** * Update the historical information when a value is added. * * @param val * @param addedValue * values that was added * @param CN * time when the value was added */ protected void add(AttributeValue val, ChangeNumber CN) protected void add(AttributeValue addedValue, ChangeNumber CN) { ValueInfo info = new ValueInfo(val, CN, null); this.valuesInfo.remove(info); valuesInfo.add(info); AttrValueHistorical info = new AttrValueHistorical(addedValue, CN, null); this.valuesHist.remove(info); valuesHist.add(info); if (CN.newer(lastUpdateTime)) { lastUpdateTime = CN; @@ -215,9 +215,9 @@ { for (AttributeValue val : attr) { ValueInfo info = new ValueInfo(val, CN, null); this.valuesInfo.remove(info); valuesInfo.add(info); AttrValueHistorical info = new AttrValueHistorical(val, CN, null); this.valuesHist.remove(info); valuesHist.add(info); if (CN.newer(lastUpdateTime)) { lastUpdateTime = CN; @@ -226,13 +226,13 @@ } /** * Get the List of ValueInfo for this attribute Info. * Get the list of historical informations for the values. * * @return the List of ValueInfo * @return the list of historical informations for the values. */ public ArrayList<ValueInfo> getValuesInfo() public ArrayList<AttrValueHistorical> getValuesHistorical() { return valuesInfo; return valuesHist; } /** @@ -417,9 +417,10 @@ m.setModificationType(ModificationType.REPLACE); AttributeBuilder builder = new AttributeBuilder(modAttr, true); for (Iterator<ValueInfo> it = getValuesInfo().iterator(); it.hasNext();) for (Iterator<AttrValueHistorical> it = getValuesHistorical().iterator(); it.hasNext();) { ValueInfo valInfo; valInfo = it.next(); AttrValueHistorical valInfo; valInfo = it.next(); if (changeNumber.older(valInfo.getValueUpdateTime())) { @@ -427,7 +428,7 @@ * this value has been updated after this delete, therefore * this value must be kept */ builder.add(valInfo.getValue()); builder.add(valInfo.getAttributeValue()); } else { @@ -459,7 +460,7 @@ /* * we are processing DELETE of some attribute values */ ArrayList<ValueInfo> valuesInfo = getValuesInfo(); ArrayList<AttrValueHistorical> valuesInfo = getValuesHistorical(); AttributeBuilder builder = new AttributeBuilder(modAttr); for (AttributeValue val : modAttr) @@ -468,12 +469,13 @@ Boolean addedInCurrentOp = false; /* update historical information */ ValueInfo valInfo = new ValueInfo(val, null, changeNumber); AttrValueHistorical valInfo = new AttrValueHistorical(val, null, changeNumber); int index = valuesInfo.indexOf(valInfo); if (index != -1) { /* this value already exist in the historical information */ ValueInfo oldValInfo = valuesInfo.get(index); AttrValueHistorical oldValInfo = valuesInfo.get(index); if (changeNumber.equals(oldValInfo.getValueUpdateTime())) { // This value was added earlier in the same operation @@ -561,8 +563,9 @@ AttributeBuilder builder = new AttributeBuilder(m.getAttribute()); for (AttributeValue addVal : m.getAttribute()) { ArrayList<ValueInfo> valuesInfo = getValuesInfo(); ValueInfo valInfo = new ValueInfo(addVal, changeNumber, null); ArrayList<AttrValueHistorical> valuesInfo = getValuesHistorical(); AttrValueHistorical valInfo = new AttrValueHistorical(addVal, changeNumber, null); int index = valuesInfo.indexOf(valInfo); if (index == -1) { @@ -574,7 +577,7 @@ } else { ValueInfo oldValueInfo = valuesInfo.get(index); AttrValueHistorical oldValueInfo = valuesInfo.get(index); if (oldValueInfo.isUpdate()) { /* if the value is already present @@ -637,7 +640,8 @@ * {@inheritDoc} */ @Override public void load(HistKey histKey, AttributeValue value, ChangeNumber cn) public void assign(HistAttrModificationKey histKey, AttributeValue value, ChangeNumber cn) { switch (histKey) { opends/src/server/org/opends/server/replication/plugin/AttrHistoricalSingle.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttrInfoSingle.java @@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. * Copyright 2008-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -45,7 +45,7 @@ * It allows to record the last time a given value was added, * and the last time the whole attribute was deleted. */ public class AttrInfoSingle extends AttributeInfo public class AttrHistoricalSingle extends AttrHistorical { private ChangeNumber deleteTime = null; // last time when the attribute was // deleted @@ -58,23 +58,24 @@ @Override public ChangeNumber getDeleteTime() { return deleteTime; return this.deleteTime; } /** * {@inheritDoc} */ @Override public ArrayList<ValueInfo> getValuesInfo() public ArrayList<AttrValueHistorical> getValuesHistorical() { if (addTime == null) { return new ArrayList<ValueInfo>(); return new ArrayList<AttrValueHistorical>(); } else { ArrayList<ValueInfo> values = new ArrayList<ValueInfo>(); values.add(new ValueInfo(value, addTime, null)); ArrayList<AttrValueHistorical> values = new ArrayList<AttrValueHistorical>(); values.add(new AttrValueHistorical(value, addTime, null)); return values; } } @@ -96,26 +97,26 @@ switch (mod.getModificationType()) { case DELETE: deleteTime = changeNumber; value = newValue; this.deleteTime = changeNumber; this.value = newValue; break; case ADD: addTime = changeNumber; value = newValue; this.addTime = changeNumber; this.value = newValue; break; case REPLACE: if (newValue == null) { // REPLACE with null value is actually a DELETE deleteTime = changeNumber; this.deleteTime = changeNumber; } else { deleteTime = addTime = changeNumber; this.deleteTime = addTime = changeNumber; } value = newValue; this.value = newValue; break; case INCREMENT: @@ -229,29 +230,30 @@ * {@inheritDoc} */ @Override public void load(HistKey histKey, AttributeValue value, ChangeNumber cn) public void assign(HistAttrModificationKey histKey, AttributeValue value, ChangeNumber cn) { switch (histKey) { case ADD: addTime = cn; this.addTime = cn; this.value = value; break; case DEL: deleteTime = cn; this.deleteTime = cn; if (value != null) this.value = value; break; case REPL: addTime = deleteTime = cn; this.addTime = this.deleteTime = cn; if (value != null) this.value = value; break; case DELATTR: deleteTime = cn; this.deleteTime = cn; break; } } opends/src/server/org/opends/server/replication/plugin/AttrHistoricalWithOptions.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/AttrInfoWithOptions.java @@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -34,16 +34,16 @@ * Used to store historical information. * Contain a map of AttrInfo for each options of a given attribute type. */ public class AttrInfoWithOptions public class AttrHistoricalWithOptions { private HashMap<Set<String> ,AttributeInfo> attributesInfo; private HashMap<Set<String> ,AttrHistorical> attributesInfo; /** * creates a new AttrInfoWithOptions. */ public AttrInfoWithOptions() public AttrHistoricalWithOptions() { attributesInfo = new HashMap<Set<String> ,AttributeInfo>(); attributesInfo = new HashMap<Set<String> ,AttrHistorical>(); } /** @@ -52,7 +52,7 @@ * @param options the options * @return the information */ public AttributeInfo get(Set<String> options) public AttrHistorical get(Set<String> options) { return attributesInfo.get(options); } @@ -64,7 +64,7 @@ * @param attrInfo the info to associate * @return the info to associate */ public AttributeInfo put(Set<String> options, AttributeInfo attrInfo ) public AttrHistorical put(Set<String> options, AttrHistorical attrInfo ) { return attributesInfo.put(options, attrInfo); } @@ -73,7 +73,7 @@ * get the Attributes information associated to this object. * @return the set of informations */ public HashMap<Set<String>, AttributeInfo> getAttributesInfo() public HashMap<Set<String>, AttrHistorical> getAttributesInfo() { return attributesInfo; } opends/src/server/org/opends/server/replication/plugin/AttrValueHistorical.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/ValueInfo.java @@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -30,22 +30,22 @@ import org.opends.server.types.AttributeValue; /** * Allows to store historical information about specific values * for a given attribute. * Store historical information for an attribute value. */ public class ValueInfo public class AttrValueHistorical { private AttributeValue value; private ChangeNumber valueDeleteTime; private ChangeNumber valueUpdateTime; /** * Build a new ValueInfo. * @param value value for which ValueInfo is built * @param CNupdate last time when value was updated last * @param CNdelete last time when value for deleted * Build an AttrValueHistorical for a provided AttributeValue, providing * the last time the provided value is either updated or deleted. * @param value the provided attributeValue * @param CNupdate last time when this value was updated * @param CNdelete last time when this value for deleted */ public ValueInfo(AttributeValue value, public AttrValueHistorical(AttributeValue value, ChangeNumber CNupdate, ChangeNumber CNdelete) { @@ -63,10 +63,10 @@ @Override public boolean equals(Object obj) { if (obj instanceof ValueInfo) if (obj instanceof AttrValueHistorical) { ValueInfo objVal = (ValueInfo) obj; return (value.equals(objVal.getValue())); AttrValueHistorical objVal = (AttrValueHistorical) obj; return (value.equals(objVal.getAttributeValue())); } else { @@ -104,17 +104,17 @@ } /** * Get the value for which this ValueInfo was generated. * @return the value for which this ValueInfo was generated * Get the attributeValue for which this object was generated. * @return the value for which this object was generated */ public AttributeValue getValue() public AttributeValue getAttributeValue() { return value; } /** * Check if the value associated with this ValueInfo was updated. * @return true if the value associated with this ValueInfo was updated * Check if the value associated with this object was updated. * @return true if the value associated with this object was updated */ public boolean isUpdate() { opends/src/server/org/opends/server/replication/plugin/EntryHistorical.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/Historical.java @@ -64,36 +64,74 @@ * each Historical Object contains a list of attribute historical information */ public class Historical public class EntryHistorical { /** * The name of the attribute used to store historical information. * Name of the attribute used to store historical information. */ public static final String HISTORICALATTRIBUTENAME = "ds-sync-hist"; /** * Name used to store attachment of historical information in the * operation. * operation. This attachement allows to use in several different places * the historical while reading/writing ONCE it from/to the entry. */ public static final String HISTORICAL = "ds-synch-historical"; /** * The name of the entryuuid attribute. * Name of the entryuuid attribute. */ public static final String ENTRYUIDNAME = "entryuuid"; /* * contains Historical information for each attribute sorted by attribute type /** * The in-memory historical information is made of. * * EntryHistorical ::= ADDDate MODDNDate attributesInfo * ADDDate ::= ChangeNumber // the date the entry was added * MODDNDate ::= ChangeNumber // the date the entry was last renamed * * attributesInfo ::= (AttrInfoWithOptions)* * one AttrInfoWithOptions by attributeType * * AttrInfoWithOptions ::= (AttributeInfo)* * one AttributeInfo by attributeType and option * * AttributeInfo ::= AttrInfoSingle | AttrInfoMultiple * * AttrInfoSingle ::= AddTime DeleteTime ValueInfo * * AttrInfoMultiple ::= AddTime DeleteTime ValuesInfo * * ValuesInfo ::= (AttrValueHistorical)* * AttrValueHistorical is the historical of the * the modification of one value * * AddTime ::= ChangeNumber // last time the attribute was added * // to the entry * DeleteTime ::= ChangeNumber // last time the attribute was deleted * // from the entry * * AttrValueHistorical ::= AttributeValue valueDeleteTime valueUpdateTime * valueDeleteTime ::= ChangeNumber * valueUpdateTime ::= ChangeNumber * * - a list indexed on AttributeType of AttrInfoWithOptions : * each value is the historical for this attribute * an AttrInfoWithOptions is a set indexed on the optionValue(string) of * AttributeInfo * */ private HashMap<AttributeType,AttrInfoWithOptions> attributesInfo = new HashMap<AttributeType,AttrInfoWithOptions>(); // The date when the entry was added. private ChangeNumber ADDDate = null; private ChangeNumber entryADDDate = null; // The date when the entry was last renamed. private ChangeNumber MODDNDate = null; private ChangeNumber entryMODDNDate = null; // contains Historical information for each attribute sorted by attribute type // key:AttributeType value:AttrInfoWithOptions private HashMap<AttributeType,AttrHistoricalWithOptions> attributesHistorical = new HashMap<AttributeType,AttrHistoricalWithOptions>(); /** * {@inheritDoc} @@ -120,17 +158,20 @@ { boolean bConflict = false; List<Modification> mods = modifyOperation.getModifications(); ChangeNumber changeNumber = ChangeNumber modOpChangeNumber = OperationContext.getChangeNumber(modifyOperation); for (Iterator<Modification> modsIterator = mods.iterator(); modsIterator.hasNext(); ) { // Traverse the mods of this MOD operation Modification m = modsIterator.next(); AttributeInfo attrInfo = getAttrInfo(m); // Read or create the attr historical for the attribute type and option // contained in the mod AttrHistorical attrHist = getOrCreateAttrHistorical(m); if (attrInfo.replayOperation(modsIterator, changeNumber, if (attrHist.replayOperation(modsIterator, modOpChangeNumber, modifiedEntry, m)) { bConflict = true; @@ -141,11 +182,18 @@ } /** * Append replacement of state information to a given modification. * Update the historical information for the provided operation. * Steps : * - compute the historical attribute * - update the mods in the provided operation by adding the update of the * historical attribute * - update the modifiedEntry, already computed by core since we are in the * preOperation plugin, that is called just before commiting into the DB. * * @param modifyOperation the modification. */ public void generateState(PreOperationModifyOperation modifyOperation) public void setHistoricalAttrToOperation( PreOperationModifyOperation modifyOperation) { List<Modification> mods = modifyOperation.getModifications(); Entry modifiedEntry = modifyOperation.getModifiedEntry(); @@ -153,8 +201,9 @@ OperationContext.getChangeNumber(modifyOperation); /* * If this is a local operation we need first to update the historical * information, then update the entry with the historical information * If this is a local operation we need : * - first to update the historical information, * - then update the entry with the historical information * If this is a replicated operation the historical information has * already been set in the resolveConflict phase and we only need * to update the entry @@ -163,29 +212,39 @@ { for (Modification mod : mods) { AttributeInfo attrInfo = getAttrInfo(mod); if (attrInfo != null) attrInfo.processLocalOrNonConflictModification(changeNumber, mod); // Get the current historical for this attributeType/options // (eventually read from the provided modification) AttrHistorical attrHist = getOrCreateAttrHistorical(mod); if (attrHist != null) attrHist.processLocalOrNonConflictModification(changeNumber, mod); } } // Now do the 2 updates required by the core to be consistent: // // - add the modification of the ds-sync-hist attribute, // to the current modifications of the MOD operation Attribute attr = encode(); Modification mod = new Modification(ModificationType.REPLACE, attr); mods.add(mod); // - update the already modified entry modifiedEntry.replaceAttribute(attr); } /** * Add historical information for a MODRDN operation to existing * historical information. * For a MODDN operation, add new or update existing historical information. * * This method is NOT static because it relies on this Historical object * created in the HandleConflictResolution phase. * * @param modifyDNOperation the modification for which the historical * information should be created. */ public void generateState(PreOperationModifyDNOperation modifyDNOperation) public void setHistoricalAttrToOperation( PreOperationModifyDNOperation modifyDNOperation) { // Update this historical information with the operation ChangeNumber. this.MODDNDate = OperationContext.getChangeNumber(modifyDNOperation); this.entryMODDNDate = OperationContext.getChangeNumber(modifyDNOperation); // Update the operations mods and the modified entry so that the // historical information gets stored in the DB and indexed accordingly. @@ -193,49 +252,67 @@ List<Modification> mods = modifyDNOperation.getModifications(); Attribute attr = encode(); // Now do the 2 updates required by the core to be consistent: // // - add the modification of the ds-sync-hist attribute, // to the current modifications of the operation Modification mod; mod = new Modification(ModificationType.REPLACE, attr); mods.add(mod); // - update the already modified entry modifiedEntry.removeAttribute(attr.getAttributeType()); modifiedEntry.addAttribute(attr, null); } /** * Generate and add to the Operation the historical information for * the ADD Operation. * This historical information will be used to generate fake operation * in case a Directory Server can not find a Replication Server with * all its changes at connection time. * This should only happen if a Directory Server or a Replication Server * crashes. * Generate an attribute containing the historical information * from the replication context attached to the provided operation * and set this attribute in the operation. * * @param addOperation The Operation to process. * For ADD, the historical is made of the changeNumber read from the * synchronization context attached to the operation. * * Called for both local and synchronization ADD preOperation. * * This historical information will be used to generate fake operation * in case a Directory Server can not find a Replication Server with * all its changes at connection time. * This should only happen if a Directory Server or a Replication Server * crashes. * * This method is static because there is no Historical object creation * required here or before(in the HandleConflictResolution phase) * * @param addOperation The Operation to which the historical attribute will * be added. */ public static void generateState(PreOperationAddOperation addOperation) public static void setHistoricalAttrToOperation( PreOperationAddOperation addOperation) { AttributeType historicalAttrType = DirectoryServer.getSchema().getAttributeType(HISTORICALATTRIBUTENAME); // Get the changeNumber from the attached synchronization context // Create the attribute (encoded) Attribute attr = Attributes.create(historicalAttrType, encodeAddHistorical(OperationContext.getChangeNumber(addOperation))); // Set the created attribute to the operation List<Attribute> attrList = new LinkedList<Attribute>(); attrList.add(attr); addOperation.setAttribute(historicalAttrType, attrList); } /** * Generate historical information for an ADD Operation. * This historical information will be used to generate fake operation * in case a Directory Server can not find a Replication Server with * all its changes at connection time. * This should only happen if a Directory Server or a Replication Server * crashes. * Encode in the returned attributeValue, this historical information for * an ADD operation. * For ADD Operation : "dn:changeNumber:add" * * @param cn The date when the ADD Operation happened. * @return The encoded historical information for the ADD Operation. * @return The encoded attribute value containing the historical * information for the Operation. */ private static AttributeValue encodeAddHistorical(ChangeNumber cn) { @@ -248,15 +325,13 @@ } /** * Generate historical information for a MODDN Operation. * This historical information will be used to generate fake operation * in case a Directory Server can not find a Replication Server with * all its changes at connection time. * This should only happen if a Directory Server or a Replication Server * crashes. * Encode in the returned attributeValue, the historical information for * a MODDN operation. * For MODDN Operation : "dn:changeNumber:moddn" * * @param cn The date when the MODDN Operation happened. * @return The encoded historical information for the MODDN Operation. * @return The encoded attribute value containing the historical * information for the Operation. */ private static AttributeValue encodeMODDNHistorical(ChangeNumber cn) { @@ -269,17 +344,21 @@ } /** * Get the AttrInfo for a given Modification. * The AttrInfo is the object that is used to store the historical * information of a given attribute type. * If there is no historical information for this attribute yet, a new * empty AttrInfo is created and returned. * Return an AttributeHistorical corresponding to the attribute type * and options contained in the provided mod, * The attributeHistorical is : * - either read from this EntryHistorical object if one exist, * - or created empty. * Should never return null. * * @param mod The Modification that must be used. * @return The AttrInfo corresponding to the given Modification. * @param mod the provided mod from which we'll use attributeType * and options to retrieve/create the attribute historical * @return the attribute historical retrieved or created empty. */ private AttributeInfo getAttrInfo(Modification mod) private AttrHistorical getOrCreateAttrHistorical(Modification mod) { // Read the provided mod Attribute modAttr = mod.getAttribute(); if (isHistoricalAttribute(modAttr)) { @@ -287,31 +366,36 @@ // used to store the historical information. return null; } Set<String> options = modAttr.getOptions(); AttributeType type = modAttr.getAttributeType(); AttrInfoWithOptions attrInfoWithOptions = attributesInfo.get(type); AttributeInfo attrInfo; if (attrInfoWithOptions != null) Set<String> modOptions = modAttr.getOptions(); AttributeType modAttrType = modAttr.getAttributeType(); // Read from this entryHistorical, // Create one empty if none was existing in this entryHistorical. AttrHistoricalWithOptions attrHistWithOptions = attributesHistorical.get(modAttrType); AttrHistorical attrHist; if (attrHistWithOptions != null) { attrInfo = attrInfoWithOptions.get(options); attrHist = attrHistWithOptions.get(modOptions); } else { attrInfoWithOptions = new AttrInfoWithOptions(); attributesInfo.put(type, attrInfoWithOptions); attrInfo = null; attrHistWithOptions = new AttrHistoricalWithOptions(); attributesHistorical.put(modAttrType, attrHistWithOptions); attrHist = null; } if (attrInfo == null) if (attrHist == null) { attrInfo = AttributeInfo.createAttributeInfo(type); attrInfoWithOptions.put(options, attrInfo); attrHist = AttrHistorical.createAttributeHistorical(modAttrType); attrHistWithOptions.put(modOptions, attrHist); } return attrInfo; return attrHist; } /** * Encode the historical information in an operational attribute. * Encode this historical information object in an operational attribute. * * @return The historical information encoded in an operational attribute. */ public Attribute encode() @@ -321,20 +405,20 @@ AttributeBuilder builder = new AttributeBuilder(historicalAttrType); // Encode the historical information for modify operation. for (Map.Entry<AttributeType, AttrInfoWithOptions> entryWithOptions : attributesInfo.entrySet()) for (Map.Entry<AttributeType, AttrHistoricalWithOptions> entryWithOptions : attributesHistorical.entrySet()) { AttributeType type = entryWithOptions.getKey(); HashMap<Set<String> , AttributeInfo> attrwithoptions = HashMap<Set<String> , AttrHistorical> attrwithoptions = entryWithOptions.getValue().getAttributesInfo(); for (Map.Entry<Set<String>, AttributeInfo> entry : for (Map.Entry<Set<String>, AttrHistorical> entry : attrwithoptions.entrySet()) { boolean delAttr = false; Set<String> options = entry.getKey(); String optionsString = ""; AttributeInfo info = entry.getValue(); AttrHistorical info = entry.getValue(); if (options != null) @@ -356,14 +440,14 @@ } /* generate the historical information for modified attribute values */ for (ValueInfo valInfo : info.getValuesInfo()) for (AttrValueHistorical valInfo : info.getValuesHistorical()) { String strValue; if (valInfo.getValueDeleteTime() != null) { strValue = type.getNormalizedPrimaryName() + optionsString + ":" + valInfo.getValueDeleteTime().toString() + ":del:" + valInfo.getValue().toString(); ":del:" + valInfo.getAttributeValue().toString(); AttributeValue val = AttributeValues.create(historicalAttrType, strValue); builder.add(val); @@ -371,16 +455,16 @@ else if (valInfo.getValueUpdateTime() != null) { if ((delAttr && valInfo.getValueUpdateTime() == deleteTime) && (valInfo.getValue() != null)) && (valInfo.getAttributeValue() != null)) { strValue = type.getNormalizedPrimaryName() + optionsString + ":" + valInfo.getValueUpdateTime().toString() + ":repl:" + valInfo.getValue().toString(); valInfo.getAttributeValue().toString(); delAttr = false; } else { if (valInfo.getValue() == null) if (valInfo.getAttributeValue() == null) { strValue = type.getNormalizedPrimaryName() + optionsString + ":" + valInfo.getValueUpdateTime().toString() + @@ -390,7 +474,7 @@ { strValue = type.getNormalizedPrimaryName() + optionsString + ":" + valInfo.getValueUpdateTime().toString() + ":add:" + valInfo.getValue().toString(); ":add:" + valInfo.getAttributeValue().toString(); } } @@ -413,15 +497,15 @@ } // Encode the historical information for the ADD Operation. if (ADDDate != null) if (entryADDDate != null) { builder.add(encodeAddHistorical(ADDDate)); builder.add(encodeAddHistorical(entryADDDate)); } // Encode the historical information for the MODDN Operation. if (MODDNDate != null) if (entryMODDNDate != null) { builder.add(encodeMODDNHistorical(MODDNDate)); builder.add(encodeMODDNHistorical(entryMODDNDate)); } return builder.toAttribute(); @@ -439,7 +523,7 @@ */ public boolean AddedOrRenamedAfter(ChangeNumber cn) { if (cn.older(ADDDate) || cn.older(MODDNDate)) if (cn.older(entryADDDate) || cn.older(entryMODDNDate)) { return true; } @@ -455,58 +539,76 @@ */ public ChangeNumber getDNDate() { if (ADDDate == null) return MODDNDate; if (entryADDDate == null) return entryMODDNDate; if (MODDNDate == null) return ADDDate; if (entryMODDNDate == null) return entryADDDate; if (MODDNDate.older(ADDDate)) return MODDNDate; if (entryMODDNDate.older(entryADDDate)) return entryMODDNDate; else return ADDDate; return entryADDDate; } /** * read the historical information from the entry attribute and * load it into the Historical object attached to the entry. * Construct an Historical object from the provided entry by reading the * historical attribute. * Return an empty object when the entry does not contain any * historical attribute. * * @param entry The entry which historical information must be loaded * @return the generated Historical information * @return The constructed Historical information object * */ public static Historical load(Entry entry) public static EntryHistorical newInstanceFromEntry(Entry entry) { List<Attribute> hist = getHistoricalAttr(entry); Historical histObj = new Historical(); AttributeType lastAttrType = null; Set<String> lastOptions = new HashSet<String>(); AttributeInfo attrInfo = null; AttrInfoWithOptions attrInfoWithOptions = null; AttrHistorical attrInfo = null; AttrHistoricalWithOptions attrInfoWithOptions = null; if (hist == null) // Read the DB historical attribute from the entry List<Attribute> histAttrWithOptionsFromEntry = getHistoricalAttr(entry); // Now we'll build the Historical object we want to construct EntryHistorical newHistorical = new EntryHistorical(); if (histAttrWithOptionsFromEntry == null) { return histObj; // No historical attribute in the entry, return empty object return newHistorical; } try { for (Attribute attr : hist) // For each value of the historical attr read (mod. on a user attribute) // build an AttrInfo subobject // Traverse the Attributes (when several options for the hist attr) // of the historical attribute read from the entry for (Attribute histAttrFromEntry : histAttrWithOptionsFromEntry) { for (AttributeValue val : attr) // For each Attribute (option), traverse the values for (AttributeValue histAttrValueFromEntry : histAttrFromEntry) { HistVal histVal = new HistVal(val.getValue().toString()); // From each value of the hist attr, create an object HistoricalAttributeValue histVal = new HistoricalAttributeValue( histAttrValueFromEntry.getValue().toString()); AttributeType attrType = histVal.getAttrType(); Set<String> options = histVal.getOptions(); ChangeNumber cn = histVal.getCn(); AttributeValue value = histVal.getAttributeValue(); HistKey histKey = histVal.getHistKey(); HistAttrModificationKey histKey = histVal.getHistKey(); if (histVal.isADDOperation()) { histObj.ADDDate = cn; newHistorical.entryADDDate = cn; } else if (histVal.isMODDNOperation()) { histObj.MODDNDate = cn; newHistorical.entryMODDNDate = cn; } else { @@ -533,10 +635,15 @@ */ if (attrType != lastAttrType) { attrInfo = AttributeInfo.createAttributeInfo(attrType); attrInfoWithOptions = new AttrInfoWithOptions(); attrInfo = AttrHistorical.createAttributeHistorical(attrType); // Create attrInfoWithOptions and store inside the attrInfo attrInfoWithOptions = new AttrHistoricalWithOptions(); attrInfoWithOptions.put(options, attrInfo); histObj.attributesInfo.put(attrType, attrInfoWithOptions); // Store this attrInfoWithOptions in the newHistorical object newHistorical.attributesHistorical. put(attrType, attrInfoWithOptions); lastAttrType = attrType; lastOptions = options; @@ -545,13 +652,13 @@ { if (!options.equals(lastOptions)) { attrInfo = AttributeInfo.createAttributeInfo(attrType); attrInfo = AttrHistorical.createAttributeHistorical(attrType); attrInfoWithOptions.put(options, attrInfo); lastOptions = options; } } attrInfo.load(histKey, value, cn); attrInfo.assign(histKey, value, cn); } } } @@ -565,7 +672,7 @@ } /* set the reference to the historical information in the entry */ return histObj; return newHistorical; } @@ -590,7 +697,8 @@ { for (AttributeValue val : attr) { HistVal histVal = new HistVal(val.getValue().toString()); HistoricalAttributeValue histVal = new HistoricalAttributeValue(val.getValue().toString()); if (histVal.isADDOperation()) { // Found some historical information indicating that this @@ -643,12 +751,14 @@ } /** * Get the Attribute used to store the historical information from * the given Entry. * Get the attribute used to store the historical information from * the provided Entry. * * @param entry The entry containing the historical information. * * @return The Attribute used to store the historical information. * Several values on the list if several options for this attribute. * Null if not present. */ public static List<Attribute> getHistoricalAttr(Entry entry) { @@ -721,7 +831,8 @@ public static boolean isHistoricalAttribute(Attribute attr) { AttributeType attrType = attr.getAttributeType(); return attrType.getNameOrOID().equals(Historical.HISTORICALATTRIBUTENAME); return attrType.getNameOrOID().equals(EntryHistorical.HISTORICALATTRIBUTENAME); } } opends/src/server/org/opends/server/replication/plugin/FakeAddOperation.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. * Copyright 2008-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -61,10 +61,10 @@ public AddMsg generateMessage() { return new AddMsg(getChangeNumber(), entry.getDN().toString(), Historical.getEntryUuid(entry), EntryHistorical.getEntryUuid(entry), LDAPReplicationDomain.findEntryId( entry.getDN().getParentDNInSuffix()), entry.getObjectClasses(), entry.getUserAttributes(), entry.getOperationalAttributes()); } } } opends/src/server/org/opends/server/replication/plugin/FakeModdnOperation.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. * Copyright 2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -65,7 +65,7 @@ { DN dn = entry.getDN(); return new ModifyDNMsg(dn.toString(), this.getChangeNumber(), Historical.getEntryUuid(entry), EntryHistorical.getEntryUuid(entry), LDAPReplicationDomain.findEntryId(dn.getParent()), false, dn.getParent().toString(), dn.getRDN().toString()); } opends/src/server/org/opends/server/replication/plugin/HistAttrModificationKey.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/HistKey.java @@ -22,14 +22,22 @@ * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; /** * Enumeration used for storing type of historical information. * Enumeration used for storing type of attribute modification * in the value of the replication historical information. * * Example of ds-sync-hist values: * ds-sync-hist: attrName1:changeNumber1:repl:newReplacingValue * ds-sync-hist: attrName1:changeNumber2:del:deletedValue * ds-sync-hist: attrName3:changeNumber3:add:newAddedvalue * ds-sync-hist: attrName3:changeNumber4:attrDel * */ public enum HistKey public enum HistAttrModificationKey { /** * The key for attribute value deletion. @@ -59,7 +67,7 @@ * * @param histkey The key string */ private HistKey(String histkey) private HistAttrModificationKey(String histkey) { this.key = histkey; } @@ -70,22 +78,22 @@ * @param histkey the String to decode * @return the key from the enum type */ public static HistKey decodeKey(String histkey) public static HistAttrModificationKey decodeKey(String histkey) { if (histkey == null) return null; if (histkey.compareTo("repl") == 0) return HistKey.REPL; return HistAttrModificationKey.REPL; if (histkey.compareTo("add") == 0) return HistKey.ADD; return HistAttrModificationKey.ADD; if (histkey.compareTo("del") == 0) return HistKey.DEL; return HistAttrModificationKey.DEL; if (histkey.compareTo("attrDel") == 0) return HistKey.DELATTR; return HistAttrModificationKey.DELATTR; return null; } opends/src/server/org/opends/server/replication/plugin/HistoricalAttributeValue.java
File was renamed from opends/src/server/org/opends/server/replication/plugin/HistVal.java @@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -35,56 +35,60 @@ /** * This Class is used to encode/decode historical information * from the String form to the internal usable form. * This class stores an internal usable representation of the value of * the historical related to an entry. * It encodes/decodes from the String form stored in the DB attribute * from/to the internal usable form. * * * an historical attribute value looks like : * description:00000108b3a6554100000001:add:added_value * or * description:00000108b3a6cbb800000001:del:deleted_value * or * description:00000108b3a6cbb800000001:repl:new_value * or * description:00000108b3a6cbb800000001:delAttr * or * description:00000108b3a6554100000001:add * or * dn:00000108b3a6554100000001:add (ADD operation) * or * dn:00000108b3a6554100000001:moddn (MODIFYDN operation) * * so after split * token[0] will contain the attribute name * token[1] will contain the change number * token[2] will contain the type of historical information * token[3] will contain the attribute value * * options are stored with the attribute names using; as a separator * example : * description;FR;France:00000108b3a6554100000001:add:added_value * * */ public class HistVal public class HistoricalAttributeValue { private AttributeType attrType; private String attrString; private AttributeValue attributeValue; private ChangeNumber cn; private LinkedHashSet<String> options; private HistKey histKey; private HistAttrModificationKey histKey; private String stringValue; // This flag indicates that this HistVal was generated to store the last date // This flag indicates that this value was generated to store the last date // when the entry was renamed. private boolean ismodDN = false; /** * Create a new HistVal from the String encoded form. * Create a new object from the String encoded form. * * @param strVal The String encoded form of historical information. * @param strVal The String encoded form of historical attribute value. */ public HistVal(String strVal) public HistoricalAttributeValue(String strVal) { /* * an historical attribute value looks like : * description:00000108b3a6554100000001:add:added_value * or * description:00000108b3a6cbb800000001:del:deleted_value * or * description:00000108b3a6cbb800000001:repl:new_value * or * description:00000108b3a6cbb800000001:delAttr * or * description:00000108b3a6554100000001:add * or * dn:00000108b3a6554100000001:add (ADD operation) * or * dn:00000108b3a6554100000001:moddn (MODIFYDN operation) * * so after split * token[0] will contain the attribute name * token[1] will contain the change number * token[2] will contain the type of historical information * token[3] will contain the attribute value * * options are stored with the attribute names using; as a separator * example : * description;FR;France:00000108b3a6554100000001:add:added_value */ String[] token = strVal.split(":", 4); options = new LinkedHashSet<String>(); @@ -124,9 +128,9 @@ } cn = new ChangeNumber(token[1]); histKey = HistKey.decodeKey(token[2]); histKey = HistAttrModificationKey.decodeKey(token[2]); stringValue = null; if (histKey != HistKey.DELATTR) if (histKey != HistAttrModificationKey.DELATTR) { if (token.length == 4) { @@ -177,7 +181,7 @@ * Get the HistKey. * @return Returns the histKey. */ public HistKey getHistKey() public HistAttrModificationKey getHistKey() { return histKey; } @@ -210,16 +214,18 @@ } /** * Generate a Modification equivalent to this HistVal. * Generate a Modification equivalent to this value of the historical * attribute. * * @return A Modification equivalent to this HistVal. * @return A modification equivalent to this value of the historical * attribute. */ public Modification generateMod() { AttributeBuilder builder = new AttributeBuilder(attrType, attrString); builder.setOptions(options); if (histKey != HistKey.DELATTR) if (histKey != HistAttrModificationKey.DELATTR) { builder.add(attributeValue); } @@ -247,9 +253,10 @@ } /** * Indicates if the HistVal was generated for a ADD operation. * Indicates if this value of the historical attribute was generated * for a ADD operation. * * @return a boolean indicating if the HistVal was generated for a ADD * @return a boolean indicating if this was generated for a ADD * operation. */ public boolean isADDOperation() @@ -258,9 +265,10 @@ } /** * Indicates if the HistVal was generated for a MODDN operation. * Indicates if this value of the historical attribute was generated * for a MODDN operation. * * @return a boolean indicating if the HistVal was generated for a ADDMODDN * @return a boolean indicating if this was generated for a ADDMODDN * operation. */ public boolean isMODDNOperation() opends/src/server/org/opends/server/replication/plugin/LDAPReplicationDomain.java
@@ -31,7 +31,7 @@ import static org.opends.server.loggers.ErrorLogger.logError; import static org.opends.server.loggers.debug.DebugLogger.debugEnabled; import static org.opends.server.loggers.debug.DebugLogger.getTracer; import static org.opends.server.replication.plugin.Historical.ENTRYUIDNAME; import static org.opends.server.replication.plugin.EntryHistorical.ENTRYUIDNAME; import static org.opends.server.replication.protocol.OperationContext.*; import static org.opends.server.util.ServerConstants.*; import static org.opends.server.util.StaticUtils.createEntry; @@ -203,7 +203,7 @@ // after startingChangeNumber and before endChangeNumber and // add them to the replayOperations list Iterable<FakeOperation> updates = Historical.generateFakeOperations(searchEntry); EntryHistorical.generateFakeOperations(searchEntry); for (FakeOperation op : updates) { @@ -1842,7 +1842,7 @@ * as it was in the original message. */ String operationEntryUUID = ctx.getEntryUid(); String modifiedEntryUUID = Historical.getEntryUuid(deletedEntry); String modifiedEntryUUID = EntryHistorical.getEntryUuid(deletedEntry); if (!operationEntryUUID.equals(modifiedEntryUUID)) { /* @@ -1865,7 +1865,7 @@ // There is no replication context attached to the operation // so this is not a replication operation. ChangeNumber changeNumber = generateChangeNumber(deleteOperation); String modifiedEntryUUID = Historical.getEntryUuid(deletedEntry); String modifiedEntryUUID = EntryHistorical.getEntryUuid(deletedEntry); ctx = new DeleteContext(changeNumber, modifiedEntryUUID); deleteOperation.setAttachment(SYNCHROCONTEXT, ctx); @@ -2084,7 +2084,7 @@ * as was in the original message. */ String modifiedEntryUUID = Historical.getEntryUuid(modifyDNOperation.getOriginalEntry()); EntryHistorical.getEntryUuid(modifyDNOperation.getOriginalEntry()); if (!modifiedEntryUUID.equals(ctx.getEntryUid())) { /* @@ -2119,7 +2119,8 @@ * If the object has been renamed more recently than this * operation, cancel the operation. */ Historical hist = Historical.load(modifyDNOperation.getOriginalEntry()); EntryHistorical hist = EntryHistorical.newInstanceFromEntry( modifyDNOperation.getOriginalEntry()); if (hist.AddedOrRenamedAfter(ctx.getChangeNumber())) { return new SynchronizationProviderResult.StopProcessing( @@ -2138,7 +2139,7 @@ } Entry modifiedEntry = modifyDNOperation.getOriginalEntry(); String modifiedEntryUUID = Historical.getEntryUuid(modifiedEntry); String modifiedEntryUUID = EntryHistorical.getEntryUuid(modifiedEntry); ctx = new ModifyDnContext(changeNumber, modifiedEntryUUID, newParentId); modifyDNOperation.setAttachment(SYNCHROCONTEXT, ctx); } @@ -2214,22 +2215,26 @@ Entry modifiedEntry = modifyOperation.getModifiedEntry(); if (ctx == null) { // There is no replication context attached to the operation // so this is not a replication operation. // No replication ctxt attached => not a replicated operation // - create a ctxt with : changeNumber, entryUUID // - attach the context to the op ChangeNumber changeNumber = generateChangeNumber(modifyOperation); String modifiedEntryUUID = Historical.getEntryUuid(modifiedEntry); String modifiedEntryUUID = EntryHistorical.getEntryUuid(modifiedEntry); if (modifiedEntryUUID == null) modifiedEntryUUID = modifyOperation.getEntryDN().toString(); ctx = new ModifyContext(changeNumber, modifiedEntryUUID); modifyOperation.setAttachment(SYNCHROCONTEXT, ctx); } else { // This is a replayed operation, it is necessary to // Replication ctxt attached => this is a replicated operation being // replayed here, it is necessary to // - check if the entry has been renamed // - check for conflicts String modifiedEntryUUID = ctx.getEntryUid(); String currentEntryUUID = Historical.getEntryUuid(modifiedEntry); String currentEntryUUID = EntryHistorical.getEntryUuid(modifiedEntry); if ((currentEntryUUID != null) && (!currentEntryUUID.equals(modifiedEntryUUID))) { @@ -2251,8 +2256,9 @@ /* * Solve the conflicts between modify operations */ Historical historicalInformation = Historical.load(modifiedEntry); modifyOperation.setAttachment(Historical.HISTORICAL, EntryHistorical historicalInformation = EntryHistorical.newInstanceFromEntry(modifiedEntry); modifyOperation.setAttachment(EntryHistorical.HISTORICAL, historicalInformation); if (historicalInformation.replayOperation(modifyOperation, modifiedEntry)) @@ -2276,7 +2282,7 @@ public void doPreOperation(PreOperationAddOperation addOperation) { AddContext ctx = new AddContext(generateChangeNumber(addOperation), Historical.getEntryUuid(addOperation), EntryHistorical.getEntryUuid(addOperation), findEntryId(addOperation.getEntryDN().getParentDNInSuffix())); addOperation.setAttachment(SYNCHROCONTEXT, ctx); @@ -2452,8 +2458,8 @@ } LinkedHashSet<String> attrs = new LinkedHashSet<String>(1); attrs.add(Historical.HISTORICALATTRIBUTENAME); attrs.add(Historical.ENTRYUIDNAME); attrs.add(EntryHistorical.HISTORICALATTRIBUTENAME); attrs.add(EntryHistorical.ENTRYUIDNAME); attrs.add("*"); InternalSearchOperation searchOp = conn.processSearch( ByteString.valueOf(baseDn.toString()), @@ -2467,7 +2473,7 @@ ChangeNumber entrytoRenameDate = null; for (SearchResultEntry entry : entries) { Historical history = Historical.load(entry); EntryHistorical history = EntryHistorical.newInstanceFromEntry(entry); if (entrytoRename == null) { entrytoRename = entry; @@ -2848,7 +2854,7 @@ SearchResultEntry resultEntry = result.getFirst(); if (resultEntry != null) { return Historical.getEntryUuid(resultEntry); return EntryHistorical.getEntryUuid(resultEntry); } } } @@ -3306,7 +3312,7 @@ { LinkedHashSet<String> attrs = new LinkedHashSet<String>(1); attrs.add(ENTRYUIDNAME); attrs.add(Historical.HISTORICALATTRIBUTENAME); attrs.add(EntryHistorical.HISTORICALATTRIBUTENAME); SearchFilter ALLMATCH; ALLMATCH = SearchFilter.createFilterFromString("(objectClass=*)"); @@ -3329,7 +3335,7 @@ */ conflict = true; renameConflictEntry(conflictOp, entry.getDN(), Historical.getEntryUuid(entry)); EntryHistorical.getEntryUuid(entry)); } } } @@ -4849,13 +4855,13 @@ } LDAPFilter filter = LDAPFilter.decode( "(&(" + Historical.HISTORICALATTRIBUTENAME + ">=dummy:" + fromChangeNumber + ")(" + Historical.HISTORICALATTRIBUTENAME + "(&(" + EntryHistorical.HISTORICALATTRIBUTENAME + ">=dummy:" + fromChangeNumber + ")(" + EntryHistorical.HISTORICALATTRIBUTENAME + "<=dummy:" + maxValueForId + "))"); LinkedHashSet<String> attrs = new LinkedHashSet<String>(1); attrs.add(Historical.HISTORICALATTRIBUTENAME); attrs.add(Historical.ENTRYUIDNAME); attrs.add(EntryHistorical.HISTORICALATTRIBUTENAME); attrs.add(EntryHistorical.ENTRYUIDNAME); attrs.add("*"); return conn.processSearch( ByteString.valueOf(baseDn.toString()), opends/src/server/org/opends/server/replication/plugin/MultimasterReplication.java
@@ -493,18 +493,17 @@ if ((domain == null) || (!domain.solveConflict())) return new SynchronizationProviderResult.ContinueProcessing(); Historical historicalInformation = (Historical) modifyOperation.getAttachment( Historical.HISTORICAL); EntryHistorical historicalInformation = (EntryHistorical) modifyOperation.getAttachment(EntryHistorical.HISTORICAL); if (historicalInformation == null) { Entry entry = modifyOperation.getModifiedEntry(); historicalInformation = Historical.load(entry); modifyOperation.setAttachment(Historical.HISTORICAL, historicalInformation); historicalInformation = EntryHistorical.newInstanceFromEntry(entry); modifyOperation.setAttachment(EntryHistorical.HISTORICAL, historicalInformation); } historicalInformation.generateState(modifyOperation); historicalInformation.setHistoricalAttrToOperation(modifyOperation); if (modifyOperation.getModifications().isEmpty()) { @@ -543,18 +542,22 @@ if ((domain == null) || (!domain.solveConflict())) return new SynchronizationProviderResult.ContinueProcessing(); Historical historicalInformation = (Historical) modifyDNOperation.getAttachment( Historical.HISTORICAL); // The historical object is retrieved from the attachment created // in the HandleConflictResolution phase. EntryHistorical historicalInformation = (EntryHistorical) modifyDNOperation.getAttachment(EntryHistorical.HISTORICAL); if (historicalInformation == null) { // When no Historical attached, create once by loading from the entry // and attach it to the operation Entry entry = modifyDNOperation.getUpdatedEntry(); historicalInformation = Historical.load(entry); modifyDNOperation.setAttachment(Historical.HISTORICAL, historicalInformation = EntryHistorical.newInstanceFromEntry(entry); modifyDNOperation.setAttachment(EntryHistorical.HISTORICAL, historicalInformation); } historicalInformation.generateState(modifyDNOperation); // Add to the operation the historical attribute : "dn:changeNumger:moddn" historicalInformation.setHistoricalAttrToOperation(modifyDNOperation); return new SynchronizationProviderResult.ContinueProcessing(); } @@ -566,15 +569,18 @@ public SynchronizationProviderResult doPreOperation( PreOperationAddOperation addOperation) { // Check replication domain LDAPReplicationDomain domain = findDomain(addOperation.getEntryDN(), addOperation); if (domain == null) return new SynchronizationProviderResult.ContinueProcessing(); // For LOCAL op only, generate ChangeNumber and attach Context if (!addOperation.isSynchronizationOperation()) domain.doPreOperation(addOperation); Historical.generateState(addOperation); // Add to the operation the historical attribute : "dn:changeNumger:add" EntryHistorical.setHistoricalAttrToOperation(addOperation); return new SynchronizationProviderResult.ContinueProcessing(); } opends/src/server/org/opends/server/replication/plugin/PersistentServerState.java
@@ -422,7 +422,7 @@ ChangeNumber serverStateMaxCn; ChangeNumber dbMaxCn; final AttributeType histType = DirectoryServer.getAttributeType(Historical.HISTORICALATTRIBUTENAME); DirectoryServer.getAttributeType(EntryHistorical.HISTORICALATTRIBUTENAME); // Retrieves the entries that have changed since the // maxCn stored in the serverState @@ -461,7 +461,8 @@ while (true) { AttributeValue attrVal = iav.next(); HistVal histVal = new HistVal(attrVal.toString()); HistoricalAttributeValue histVal = new HistoricalAttributeValue(attrVal.toString()); ChangeNumber cn = histVal.getCn(); if ((cn != null) && (cn.getServerId() == serverId)) opends/src/server/org/opends/server/replication/protocol/AddMsg.java
@@ -42,7 +42,7 @@ import org.opends.server.protocols.asn1.ASN1; import org.opends.server.protocols.asn1.ASN1Exception; import org.opends.server.replication.common.ChangeNumber; import org.opends.server.replication.plugin.Historical; import org.opends.server.replication.plugin.EntryHistorical; import org.opends.server.types.*; import org.opends.server.types.operation.PostOperationAddOperation; @@ -345,7 +345,7 @@ { for (Attribute a : list) { if (!Historical.isHistoricalAttribute(a)) if (!EntryHistorical.isHistoricalAttribute(a)) if (!a.isVirtual()) new LDAPAttribute(a).write(writer); } @@ -356,7 +356,7 @@ { for (Attribute a : list) { if (!Historical.isHistoricalAttribute(a)) if (!EntryHistorical.isHistoricalAttribute(a)) if (!a.isVirtual()) new LDAPAttribute(a).write(writer); } opends/src/server/org/opends/server/replication/protocol/ModifyCommonMsg.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. * Copyright 2009-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.protocol; @@ -37,7 +37,7 @@ import org.opends.server.protocols.ldap.LDAPAttribute; import org.opends.server.protocols.ldap.LDAPModification; import org.opends.server.replication.common.ChangeNumber; import org.opends.server.replication.plugin.Historical; import org.opends.server.replication.plugin.EntryHistorical; import org.opends.server.types.Attribute; import org.opends.server.types.AttributeType; import org.opends.server.types.AttributeUsage; @@ -153,7 +153,7 @@ } } if (!Historical.isHistoricalAttribute(attr)) if (!EntryHistorical.isHistoricalAttribute(attr)) { LDAPModification ldapmod = new LDAPModification( mod.getModificationType(), new LDAPAttribute(mod.getAttribute())); opends/src/server/org/opends/server/replication/protocol/OperationContext.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.protocol; @@ -101,7 +101,8 @@ } /** * Get the change number of an operation. * Get the change number of an operation from the synchronization context * attached to the provided operation. * * @param op The operation. * opends/tests/unit-tests-testng/src/server/org/opends/server/replication/ExternalChangeLogTest.java
@@ -26,6 +26,10 @@ */ package org.opends.server.replication; import static org.opends.messages.ReplicationMessages.ERR_INVALID_COOKIE_SYNTAX; import static org.opends.messages.ReplicationMessages.ERR_RESYNC_REQUIRED_MISSING_DOMAIN_IN_PROVIDED_COOKIE; import static org.opends.messages.ReplicationMessages.ERR_RESYNC_REQUIRED_TOO_OLD_DOMAIN_IN_PROVIDED_COOKIE; import static org.opends.messages.ReplicationMessages.ERR_RESYNC_REQUIRED_UNKNOWN_DOMAIN_IN_PROVIDED_COOKIE; import static org.opends.server.TestCaseUtils.TEST_ROOT_DN_STRING; import static org.opends.server.loggers.debug.DebugLogger.debugEnabled; import static org.opends.server.loggers.debug.DebugLogger.getTracer; @@ -54,6 +58,10 @@ import java.util.SortedSet; import java.util.TreeSet; import static org.opends.server.loggers.ErrorLogger.logError; import org.opends.messages.Category; import org.opends.messages.Message; import org.opends.messages.Severity; import org.opends.server.TestCaseUtils; import org.opends.server.api.Backend; import org.opends.server.api.ConnectionHandler; @@ -141,8 +149,6 @@ import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import static org.opends.messages.ReplicationMessages.*; import org.opends.messages.Message; /** * Tests for the replicationServer code. @@ -330,16 +336,16 @@ // Request from an invalid draft change number ECLCompatBadSeqnum(); // Write changes and read ECL from start // Write 4 changes and read ECL from start int ts = ECLCompatWriteReadAllOps(1); // Write additional changes and read ECL from a provided draft change number // Write 4 additional changes and read ECL from a provided draft change number ts = ECLCompatWriteReadAllOps(5); // Test request from a provided change number // Test request from a provided change number - read 6 ECLCompatReadFrom(6); // Test request from a provided change number interval // Test request from a provided change number interval - read 5-7 ECLCompatReadFromTo(5,7); // Test first and last draft changenumber @@ -4102,4 +4108,4 @@ operation.getErrorMessage().toString()); } } } } opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/AttrInfoTest.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2006-2009 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -31,8 +31,8 @@ import org.opends.server.core.DirectoryServer; import org.opends.server.replication.ReplicationTestCase; import org.opends.server.replication.common.ChangeNumber; import org.opends.server.replication.plugin.AttrInfoMultiple; import org.opends.server.replication.plugin.ValueInfo; import org.opends.server.replication.plugin.AttrHistoricalMultiple; import org.opends.server.replication.plugin.AttrValueHistorical; import org.opends.server.types.AttributeType; import org.opends.server.types.AttributeValue; import org.opends.server.types.Attributes; @@ -85,50 +85,50 @@ throws Exception { // Create an empty AttrInfo AttrInfoMultiple attrInfo1 = new AttrInfoMultiple(); AttrHistoricalMultiple attrInfo1 = new AttrHistoricalMultiple(); // Check add(AttributeValue val, ChangeNumber CN) attrInfo1.add(att, updateTime); ArrayList<ValueInfo> values1 = attrInfo1.getValuesInfo(); ArrayList<AttrValueHistorical> values1 = attrInfo1.getValuesHistorical(); assertTrue(values1.size() == 1); ValueInfo valueInfo1 = new ValueInfo(att, updateTime, null); AttrValueHistorical valueInfo1 = new AttrValueHistorical(att, updateTime, null); assertTrue(values1.get(0).equals(valueInfo1)); // Check constructor with parameter ValueInfo valueInfo2 = new ValueInfo(att, updateTime, deleteTime); ArrayList<ValueInfo> values = new ArrayList<ValueInfo>(); AttrValueHistorical valueInfo2 = new AttrValueHistorical(att, updateTime, deleteTime); ArrayList<AttrValueHistorical> values = new ArrayList<AttrValueHistorical>(); values.add(valueInfo2); AttrInfoMultiple attrInfo2 = new AttrInfoMultiple(deleteTime, updateTime, values); AttrHistoricalMultiple attrInfo2 = new AttrHistoricalMultiple(deleteTime, updateTime, values); // Check equality //assertTrue(attrInfo1.getDeleteTime().compareTo(attrInfo2.getDeleteTime())==0); // Check constructor with time parameter and not Value AttrInfoMultiple attrInfo3 = new AttrInfoMultiple(deleteTime, updateTime, null); AttrHistoricalMultiple attrInfo3 = new AttrHistoricalMultiple(deleteTime, updateTime, null); attrInfo3.add(att, updateTime); ArrayList<ValueInfo> values3 = attrInfo3.getValuesInfo(); ArrayList<AttrValueHistorical> values3 = attrInfo3.getValuesHistorical(); assertTrue(values3.size() == 1); valueInfo1 = new ValueInfo(att, updateTime, null); valueInfo1 = new AttrValueHistorical(att, updateTime, null); assertTrue(values3.get(0).equals(valueInfo1)); // Check duplicate AttrInfoMultiple attrInfo4 = attrInfo3.duplicate(); ArrayList<ValueInfo> values4 = attrInfo4.getValuesInfo(); AttrHistoricalMultiple attrInfo4 = attrInfo3.duplicate(); ArrayList<AttrValueHistorical> values4 = attrInfo4.getValuesHistorical(); assertTrue(attrInfo4.getDeleteTime().compareTo(attrInfo3.getDeleteTime())==0); assertEquals(values4.size(), values3.size()); // Check delete(AttributeValue val, ChangeNumber CN) attrInfo4.delete(att, updateTime); assertTrue(attrInfo4.getValuesInfo().size() == 1); assertTrue(attrInfo4.getValuesHistorical().size() == 1); // Check delete(LinkedHashSet<AttributeValue> values, ChangeNumber CN) AttributeType type = DirectoryServer.getAttributeType("description"); attrInfo3.delete(Attributes.create(type, att), updateTime) ; assertTrue(attrInfo3.getValuesInfo().size() == 1); assertTrue(attrInfo3.getValuesHistorical().size() == 1); // Check delete(ChangeNumber CN) attrInfo2.delete(updateTime) ; assertTrue(attrInfo2.getValuesInfo().size() == 0); assertTrue(attrInfo2.getValuesHistorical().size() == 0); } } opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalCsnOrderingTest.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2008-2009 Sun Microsystems, Inc. * Copyright 2008-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -141,7 +141,7 @@ long startTime = TimeThread.getTime(); final DN dn1 = DN.decode("cn=test1," + baseDn.toString()); final AttributeType histType = DirectoryServer.getAttributeType(Historical.HISTORICALATTRIBUTENAME); DirectoryServer.getAttributeType(EntryHistorical.HISTORICALATTRIBUTENAME); logError(Message.raw(Category.SYNC, Severity.INFORMATION, "Starting replication test : changesCmpTest")); opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/HistoricalTest.java
@@ -22,7 +22,7 @@ * CDDL HEADER END * * * Copyright 2008-2009 Sun Microsystems, Inc. * Copyright 2008-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; @@ -183,11 +183,11 @@ DN dn = DN.decode("uid=user.1," + TEST_ROOT_DN_STRING); Entry entry = DirectoryServer.getEntry(dn); List<Attribute> attrs = Historical.getHistoricalAttr(entry); List<Attribute> attrs = EntryHistorical.getHistoricalAttr(entry); Attribute before = attrs.get(0); // Check that encoding and decoding preserves the history information. Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); Attribute after = hist.encode(); assertEquals(after, before); @@ -368,7 +368,7 @@ // This will ensure both that the Add historical information is // correctly added and also that the code that rebuild operation // from this historical information is working. Iterable<FakeOperation> ops = Historical.generateFakeOperations(entry); Iterable<FakeOperation> ops = EntryHistorical.generateFakeOperations(entry); // Perform a few check on the Operation to see that it // was correctly generated. @@ -387,7 +387,7 @@ // use historical information to generate new list of operations // equivalent to the operations that have been applied to this entry. ops = Historical.generateFakeOperations(entry); ops = EntryHistorical.generateFakeOperations(entry); // Perform a few check on the operation list to see that it // was correctly generated. @@ -406,7 +406,7 @@ // use historical information to generate new list of operations // equivalent to the operations that have been applied to this entry. ops = Historical.generateFakeOperations(entry); ops = EntryHistorical.generateFakeOperations(entry); // Perform a few check on the operation list to see that it // was correctly generated. @@ -450,7 +450,7 @@ assertTrue(addOp.getChangeNumber() != null); AddMsg addmsg = addOp.generateMessage(); assertTrue(dn1.equals(DN.decode(addmsg.getDn()))); assertTrue(addmsg.getUniqueId().equals(Historical.getEntryUuid(entry))); assertTrue(addmsg.getUniqueId().equals(EntryHistorical.getEntryUuid(entry))); String parentId = LDAPReplicationDomain.findEntryId(dn1.getParent()); assertTrue(addmsg.getParentUid().equals(parentId)); addmsg.createOperation(InternalClientConnection.getRootConnection()); opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ModifyConflictTest.java
@@ -48,7 +48,7 @@ import org.opends.server.replication.common.ChangeNumber; import org.opends.server.replication.plugin.FakeOperation; import org.opends.server.replication.plugin.FakeOperationComparator; import org.opends.server.replication.plugin.Historical; import org.opends.server.replication.plugin.EntryHistorical; import org.opends.server.replication.protocol.ModifyContext; import org.opends.server.replication.protocol.ReplicationMsg; import org.opends.server.types.*; @@ -86,7 +86,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a modify-replace done at time t10 @@ -128,7 +128,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a modify-replace done at time t10 @@ -171,7 +171,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a replace with null done at time t3 @@ -212,7 +212,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a modify-add done at time t10 @@ -254,7 +254,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a modify-add done at time 2 @@ -289,7 +289,7 @@ // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of the whole description attribute done at time @@ -345,7 +345,7 @@ // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of the description attribute value "value1" @@ -401,7 +401,7 @@ // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of the description attribute values @@ -449,7 +449,7 @@ entry.addAttribute(attribute, duplicateValues); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of attribute employeenumber. @@ -483,7 +483,7 @@ entry.addAttribute(attribute, duplicateValues); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * now simulate a delete of value "value1" @@ -523,7 +523,7 @@ entry.addAttribute(builder.toAttribute(), duplicateValues); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of the description attribute value "value1" @@ -569,7 +569,7 @@ entry.addAttribute(attribute, duplicateValues); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of the whole description attribute done at time @@ -612,7 +612,7 @@ // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of the whole description attribute done at time @@ -657,7 +657,7 @@ entry.addAttribute(builder.toAttribute(), duplicateValues); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); // simulate a REPLACE of the attribute with values : value1, value2, value3 // at time t1. @@ -714,7 +714,7 @@ entry.addAttribute(builder.toAttribute(), duplicateValues); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); // simulate a DELETE of the attribute values : value3 and value4 // at time t2. @@ -786,7 +786,7 @@ entry.addAttribute(attribute, duplicateValues); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a delete of the whole description attribute done at time @@ -813,7 +813,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a add of the description attribute done at time t10 @@ -855,7 +855,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a add of the description attribute done at time t10 @@ -898,7 +898,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * Now simulate a del and a add in the same operation @@ -937,7 +937,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a add of the description attribute done at time 1 @@ -967,7 +967,7 @@ entry = initializeEntry(); // load historical from the entry hist = Historical.load(entry); hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate an add of the description attribute values @@ -1002,7 +1002,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a add of the description attribute done at time t10 @@ -1044,7 +1044,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a add of the description attribute done at time t1 @@ -1082,7 +1082,7 @@ Entry entry = initializeEntry(); // load historical from the entry Historical hist = Historical.load(entry); EntryHistorical hist = EntryHistorical.newInstanceFromEntry(entry); /* * simulate a add of the description attribute done at time t1 @@ -1134,7 +1134,7 @@ { AttributeType entryuuidAttrType = DirectoryServer.getSchema().getAttributeType( Historical.ENTRYUIDNAME); EntryHistorical.ENTRYUIDNAME); /* * Objectclass and DN do not have any impact on the modify conflict @@ -1174,14 +1174,14 @@ * helper function. */ private void testHistoricalAndFake( Historical hist, Entry entry) EntryHistorical hist, Entry entry) { AttributeType entryuuidAttrType = DirectoryServer.getSchema().getAttributeType(Historical.ENTRYUIDNAME); DirectoryServer.getSchema().getAttributeType(EntryHistorical.ENTRYUIDNAME); // Get the historical uuid associated to the entry // (the one that needs to be tested) String uuid = Historical.getEntryUuid(entry); String uuid = EntryHistorical.getEntryUuid(entry); // Get the Entry uuid in String format List<Attribute> uuidAttrs = entry @@ -1202,7 +1202,7 @@ // Test FakeOperation try { Iterable<FakeOperation> fks = Historical.generateFakeOperations(entry); Iterable<FakeOperation> fks = EntryHistorical.generateFakeOperations(entry); if (fks.iterator().hasNext()) { FakeOperation fk = fks.iterator().next(); @@ -1230,7 +1230,7 @@ * */ private void testModify(Entry entry, Historical hist, String attrName, EntryHistorical hist, String attrName, ModificationType modType, String value, int date, boolean keepChangeResult) throws DirectoryException { @@ -1242,7 +1242,7 @@ * */ private void testModify(Entry entry, Historical hist, String attrName, Modification mod, EntryHistorical hist, String attrName, Modification mod, int date, boolean keepChangeResult) throws DirectoryException { List<Modification> mods = replayModify(entry, hist, mod, date); @@ -1273,7 +1273,7 @@ */ private void replayModifies( Entry entry, Historical hist, List<Modification> mods, int date) Entry entry, EntryHistorical hist, List<Modification> mods, int date) { InternalClientConnection connection = InternalClientConnection.getRootConnection(); @@ -1289,11 +1289,11 @@ } private List<Modification> replayModify( Entry entry, Historical hist, Modification mod, int date) Entry entry, EntryHistorical hist, Modification mod, int date) { AttributeType historicalAttrType = DirectoryServer.getSchema().getAttributeType( Historical.HISTORICALATTRIBUTENAME); EntryHistorical.HISTORICALATTRIBUTENAME); InternalClientConnection connection = InternalClientConnection.getRootConnection(); @@ -1330,7 +1330,7 @@ */ entry.removeAttribute(historicalAttrType); entry.addAttribute(hist.encode(), null); Historical hist2 = Historical.load(entry); EntryHistorical hist2 = EntryHistorical.newInstanceFromEntry(entry); assertEquals(hist2.encode().toString(), hist.encode().toString()); return mods; @@ -1367,15 +1367,15 @@ * */ private void testHistorical( Historical hist, LocalBackendAddOperation addOp) EntryHistorical hist, LocalBackendAddOperation addOp) { AttributeType entryuuidAttrType = DirectoryServer.getSchema().getAttributeType( Historical.ENTRYUIDNAME); EntryHistorical.ENTRYUIDNAME); // Get the historical uuid associated to the entry // (the one that needs to be tested) String uuid = Historical.getEntryUuid(addOp); String uuid = EntryHistorical.getEntryUuid(addOp); // Get the op uuid in String format List<Attribute> uuidAttrs = addOp.getOperationalAttributes().get( opends/tests/unit-tests-testng/src/server/org/opends/server/replication/plugin/ValueInfoTest.java
@@ -22,14 +22,14 @@ * CDDL HEADER END * * * Copyright 2006-2009 Sun Microsystems, Inc. * Copyright 2006-2010 Sun Microsystems, Inc. */ package org.opends.server.replication.plugin; import org.opends.server.core.DirectoryServer; import org.opends.server.replication.ReplicationTestCase; import org.opends.server.replication.common.ChangeNumber; import org.opends.server.replication.plugin.ValueInfo; import org.opends.server.replication.plugin.AttrValueHistorical; import org.opends.server.types.AttributeType; import org.opends.server.types.AttributeValue; import org.opends.server.types.AttributeValues; @@ -80,9 +80,9 @@ throws Exception { AttributeType type = DirectoryServer.getAttributeType("description"); ValueInfo valInfo1 = new ValueInfo(value,CNupdate,CNdelete); ValueInfo valInfo2 = new ValueInfo(value,CNupdate,CNupdate); ValueInfo valInfo3 = new ValueInfo(AttributeValues.create(type,"Test"), AttrValueHistorical valInfo1 = new AttrValueHistorical(value,CNupdate,CNdelete); AttrValueHistorical valInfo2 = new AttrValueHistorical(value,CNupdate,CNupdate); AttrValueHistorical valInfo3 = new AttrValueHistorical(AttributeValues.create(type,"Test"), CNupdate,CNupdate); // Check equals @@ -107,7 +107,7 @@ } // Check getValue assertTrue(valInfo1.getValue().equals(value)) ; assertTrue(valInfo1.getAttributeValue().equals(value)) ; // Chek valueUpdateTime if (CNupdate == null)