Class Diff3

java.lang.Object
net.sf.basedb.util.Diff3

public class Diff3
extends Object
This class is helpful when a client application needs to implement long-running transactions and still be able to update items with as few clashes as possible. Using this class it is possible to avoid ItemModifiedException:s even when two or more users are modifying the same item at the same time. The only requirement is that they don't change the same property to different values. Here is how to use this class:
  • The oldItem is loaded and the user is presented with a screen to modify the properties of the item. The client application must keep the item in memory while the user is doing the modifications.
  • When the user submits the changes the newItem is loaded. Both objects are passed to the Diff3(BasicItem, BasicItem) constructor. The construcor checks if both objects are of the same version or not.
  • The client application uses the getValue(Object, Object, Object) method to set the properties on the newItem object.
edit.jsp
Label label = Label.getById(dbControl, labelId);
sessionControl.setSessionSetting("LABEL", label);

submit.jsp
Label oldLabel = (Label)sessionControl.getSessionSetting("LABEL");
Label newLabel = Label.getById(dbControl, labelId);
Diff3 d3 = new Diff3(oldLabel, newLabel);
newLabel.setName(d3.getValue(oldLabel.getName(), newLabel.getName(), 
   request.getParameter("name")));
// ... etc ...
dbControl.commit();
Additional code to check for session timeouts and creating new items is also required.
Version:
2.0
Author:
Nicklas
Last modified
$Date: 2009-04-06 14:52:39 +0200 (må, 06 apr 2009) $
  • Field Details

    • sameVersion

      private final boolean sameVersion
    • what

      private final String what
  • Constructor Details

    • Diff3

      public Diff3​(BasicItem oldItem, BasicItem newItem) throws InvalidDataException
      Create a new Diff3 object to compare properties of the oldItem and newItem. Both objects mustn't be null and they must represent the same item in the database. For new objects, not yet in the database, both parameters must be the same instance.
      Parameters:
      oldItem - The "old" representation of the item
      newItem - The "new" representation of the item
      Throws:
      InvalidDataException - If one of the parameters is null or they don't represent the same database item
  • Method Details

    • getValue

      public <T> T getValue​(T oldValue, T newValue, T requestValue) throws ItemModifiedException
      Get the correct value to set on the newItem object.
      • If the old and new item have the same version or if the oldValue is the same as the newValue the requestValue is returned. This represents the case that no other user has modified the item, or it was modified but not this particular property.
      • If the old and request value are equal the newValue is returned. This represents the case that the other user has modified the property, but the current user hasn't.
      • If the new and request value are equal the newValue is returned. This represents the case that both users has modified the property and, fortunately, set it to the same value.
      • Otherwise, it all three values are different, a ItemModifiedException is thrown.
      Parameters:
      oldValue - The value of the property on the old item
      newValue - The value of the property on the new item
      requestValue - The vale of the property the current user has set on the edit screen
      Returns:
      The most appropriate value as described above
      Throws:
      ItemModifiedException - If all values are different
    • isEqualOrNull

      public static boolean isEqualOrNull​(Object o1, Object o2)
      Check if two objects are both null or equal as defined by the Object.equals(Object) method.
      Parameters:
      o1 - Object to compare
      o2 - Object to compare
      Returns:
      TRUE if equal or null, FALSE otherwise.