svn commit: r14458 - trunk/src/argouml-app: src/org/argouml/uml/util tests/org/argouml/uml/util

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: tfmorris
Date: 2008-04-24 11:29:50-0700
New Revision: 14458

Modified:
   trunk/src/argouml-app/src/org/argouml/uml/util/PathComparator.java
   trunk/src/argouml-app/tests/org/argouml/uml/util/TestPathComparator.java

Log:
Fix null handling.  Add support for Strings.

Modified: trunk/src/argouml-app/src/org/argouml/uml/util/PathComparator.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/uml/util/PathComparator.java?view=diff&rev=14458&p1=trunk/src/argouml-app/src/org/argouml/uml/util/PathComparator.java&p2=trunk/src/argouml-app/src/org/argouml/uml/util/PathComparator.java&r1=14457&r2=14458
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/uml/util/PathComparator.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/uml/util/PathComparator.java	2008-04-24 11:29:50-0700
@@ -53,7 +53,8 @@
     
     /**
      * Compare two UML elements names, ignoring case, using names from the path
-     * as tie breakers.
+     * as tie breakers.  As a convenience, we also compare simple strings using
+     * the same primary strength collator.
      * 
      * @param o1 first model element
      * @param o2 second model element
@@ -61,25 +62,37 @@
      * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
      */
     public int compare(Object o1, Object o2) {
+        if (o1 == null) {
+            if (o2 == null) {
+                return 0;
+            }
+            return -1;
+        }
+        if (o2 == null) {
+            return 1;
+        }
         if (o1.equals(o2)) {
             return 0;
         }
+        if (o1 instanceof String && o2 instanceof String) {
+            return collator.compare((String) o1, (String) o2);
+        }
         // Elements are collated first by name hoping for a quick solution
         String name1, name2;
         try {
             name1 = Model.getFacade().getName(o1);
             name2 = Model.getFacade().getName(o2);
         } catch (IllegalArgumentException e) {
-            throw new ClassCastException("Model element required");
+            throw new ClassCastException("Model element or String required");
         }
-        int comparison = collator.compare(name1, name2);
-        if (comparison != 0) {
-            return comparison;
-        } else {
-            // and then by their enclosing path to fully distinguish them
-            return comparePaths(o1, o2);
+        if (name1 != null && name2 != null) {
+            int comparison = collator.compare(name1, name2);
+            if (comparison != 0) {
+                return comparison;
+            }
         }
-        
+        // and then by their enclosing path to fully distinguish them
+        return comparePaths(o1, o2);
     }
 
     /*
@@ -108,17 +121,35 @@
                 return -1;
             }
             String name1 = i1.next();
+            int comparison;
             if (name1 == null) {
-                return -1;
+                if (name2 == null) {
+                    comparison = 0; 
+                } else {
+                    comparison = -1;
+                }
+            } else if (name2 == null) {
+                comparison = 1;
+            } else {
+                comparison = collator.compare(name1, name2);
             }
-            int comparison = collator.compare(name1, name2);
             if (comparison != 0) {
                 return comparison;
             }
             // Keep track of first non-equal comparison to use in case the
             // case-insensitive comparisons all end up equal
             if (caseSensitiveComparison == 0) {
-                caseSensitiveComparison = name1.compareTo(name2);
+                if (name1 == null) {
+                    if (name2 == null) {
+                        caseSensitiveComparison = 0;
+                    } else {
+                        caseSensitiveComparison = -1;
+                    }
+                } else if (name2 == null) {
+                    caseSensitiveComparison = 1;
+                } else {
+                    caseSensitiveComparison = name1.compareTo(name2);
+                }
             }
         }
         if (i2.hasNext()) {

Modified: trunk/src/argouml-app/tests/org/argouml/uml/util/TestPathComparator.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/tests/org/argouml/uml/util/TestPathComparator.java?view=diff&rev=14458&p1=trunk/src/argouml-app/tests/org/argouml/uml/util/TestPathComparator.java&p2=trunk/src/argouml-app/tests/org/argouml/uml/util/TestPathComparator.java&r1=14457&r2=14458
==============================================================================
--- trunk/src/argouml-app/tests/org/argouml/uml/util/TestPathComparator.java	(original)
+++ trunk/src/argouml-app/tests/org/argouml/uml/util/TestPathComparator.java	2008-04-24 11:29:50-0700
@@ -54,7 +54,11 @@
         Object root = Model.getModelManagementFactory().createModel();
         setName(root, "rootModel");
         Object unnamed1 = Model.getCoreFactory().buildClass(root);
+        // Name is set to the empty string (yuck!) by default - fix it
+        setName(unnamed1, null);
+        
         Object unnamed2 = Model.getCoreFactory().buildClass(root);
+        setName(unnamed2, null);
         Object a = Model.getCoreFactory().buildClass("a", root);
         Object a1 = Model.getCoreFactory().buildClass("a", root);
         Object b = Model.getCoreFactory().buildClass("b", root);
@@ -64,6 +68,16 @@
         Object ba = Model.getCoreFactory().buildClass("b", a);    
         Object bc = Model.getCoreFactory().buildClass("b", c);    
         
+        assertEquals("Two nulls should be equal", 0, comp.compare(null, null));
+        
+        assertEquals("Null should be less than anything", -1, 
+                comp.compare(null, ""));
+        assertEquals("Null should be less than anything", 1, 
+                comp.compare("", null));
+        
+        assertEquals("Simple string compare failed", comp.compare("a","b"),
+                "a".compareTo("b"));
+
         assertFalse("Two different unnamed elements should not be equal", 
                 comp.compare(unnamed1, unnamed2) == 0);
         assertEquals("Unnamed elements should collate before named", -1,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.