Fix some bugs in remote/sync (still not complete)
[jvcard.git] / src / be / nikiroo / jvcard / BaseClass.java
index abaa9ccbd37d04fe7a48fc8a2a57b8c59ebb267a..0aa18e6ff66336a3f2afecacc9ba6fbe1b4a380b 100644 (file)
@@ -9,7 +9,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
 
-import be.nikiroo.jvcard.tui.StringUtils;
+import be.nikiroo.jvcard.resources.StringUtils;
 
 /**
  * This class is basically a List with a parent and a "dirty" state check. It
@@ -155,17 +155,20 @@ public abstract class BaseClass<E extends BaseClass<?>> implements List<E> {
                Collections.sort(other, comparator);
 
                boolean equ = true;
-               while (mine.size() > 0 || other.size() > 0) {
-                       E here = (mine.size() > 0) ? mine.remove(0) : null;
-                       E there = (other.size() > 0) ? other.remove(0) : null;
+               E here = mine.size() > 0 ? mine.remove(0) : null;
+               E there = other.size() > 0 ? other.remove(0) : null;
 
-                       if (here == null || comparator.compare(here, there) > 0) {
+               while (here != null || there != null) {
+                       if (here == null
+                                       || (there != null && comparator.compare(here, there) > 0)) {
                                if (added != null)
                                        added.add(there);
+                               there = null;
                                equ = false;
                        } else if (there == null || comparator.compare(here, there) < 0) {
                                if (removed != null)
                                        removed.add(here);
+                               here = null;
                                equ = false;
                        } else {
                                // they represent the same item
@@ -176,7 +179,14 @@ public abstract class BaseClass<E extends BaseClass<?>> implements List<E> {
                                                to.add(there);
                                        equ = false;
                                }
+                               here = null;
+                               there = null;
                        }
+
+                       if (here == null && mine.size() > 0)
+                               here = mine.remove(0);
+                       if (there == null && other.size() > 0)
+                               there = other.remove(0);
                }
 
                return equ;
@@ -241,20 +251,37 @@ public abstract class BaseClass<E extends BaseClass<?>> implements List<E> {
 
        /**
         * Get the recursive state of the current object, i.e., its children. It
-        * represents the full state information about this object's children. It
-        * does not check the state of the object itself.
+        * represents the full state information about this object's children.
         * 
         * @return a {@link String} representing the current content state of this
-        *         object, i.e., its children
+        *         object, i.e., its children included
         */
        public String getContentState() {
                StringBuilder builder = new StringBuilder();
+               buildContentStateRaw(builder);
+               return StringUtils.getHash(builder.toString());
+       }
 
+       /**
+        * Return the (first) child element with the given ID or NULL if not found.
+        * 
+        * @param id
+        *            the id to look for
+        * 
+        * @return the child element or NULL
+        */
+       public E getById(String id) {
                for (E child : this) {
-                       builder.append(child.getContentState());
+                       if (id == null) {
+                               if (child.getId() == null)
+                                       return child;
+                       } else {
+                               if (id.equals(child.getId()))
+                                       return child;
+                       }
                }
 
-               return StringUtils.getHash(builder.toString());
+               return null;
        }
 
        /**
@@ -275,6 +302,23 @@ public abstract class BaseClass<E extends BaseClass<?>> implements List<E> {
         */
        abstract public String getState();
 
+       /**
+        * Get the recursive state of the current object, i.e., its children. It
+        * represents the full state information about this object's children.
+        * 
+        * It is not hashed.
+        * 
+        * @param builder
+        *            the {@link StringBuilder} that will represent the current
+        *            content state of this object, i.e., its children included
+        */
+       void buildContentStateRaw(StringBuilder builder) {
+               builder.append(getState());
+               for (E child : this) {
+                       child.buildContentStateRaw(builder);
+               }
+       }
+
        /**
         * Notify that this element has unsaved changes.
         */