You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jb...@apache.org on 2005/02/24 23:21:14 UTC

svn commit: r155261 - in geronimo/trunk/modules/kernel/src: java/org/apache/geronimo/gbean/GBeanName.java test/org/apache/geronimo/gbean/GBeanNameTest.java

Author: jboynes
Date: Thu Feb 24 14:21:12 2005
New Revision: 155261

URL: http://svn.apache.org/viewcvs?view=rev&rev=155261
Log:
Added method to String format name with keys in a specified order
Changed (String,Map) constructor to generate name in iteration order


Modified:
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java
    geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java?view=diff&r1=155260&r2=155261
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanName.java Thu Feb 24 14:21:12 2005
@@ -18,6 +18,7 @@
 
 import java.io.Serializable;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -50,10 +51,10 @@
 
     /**
      * Construct a GBeanName by combining a domain with explicit properties.
-     * The string representation of this name is generated by combining the properties in sorted order.
+     * The string representation of this name is generated by combining the properties in iteration order.
      *
      * @param domain the domain
-     * @param props the properties used to qualify this name; a Map<String,String>
+     * @param props  the properties used to qualify this name; a Map<String,String>
      */
     public GBeanName(String domain, Map props) {
         if (domain == null) {
@@ -65,12 +66,26 @@
         }
         this.domain = domain;
         this.props = new HashMap(props);
-        this.name = sortName(domain, props);
+        this.name = buildName(domain, props);
         this.hashCode = domain.hashCode() + 37 * props.hashCode();
     }
 
+    private static String buildName(String domain, Map props) {
+        StringBuffer buf = new StringBuffer(128);
+        buf.append(domain).append(':');
+        Iterator i = props.entrySet().iterator();
+        Map.Entry entry = (Map.Entry) i.next();
+        buf.append(entry.getKey()).append('=').append(entry.getValue());
+        while (i.hasNext()) {
+            entry = (Map.Entry) i.next();
+            buf.append(',').append(entry.getKey()).append('=').append(entry.getValue());
+        }
+        return buf.toString();
+    }
+
     /**
      * Construct a GBeanName by parsing a string.
+     *
      * @param name the name to parse
      */
     public GBeanName(String name) {
@@ -105,19 +120,6 @@
         return props;
     }
 
-    private static String sortName(String domain, Map props) {
-        String[] names = (String[]) props.keySet().toArray(new String[props.size()]);
-        Arrays.sort(names);
-        StringBuffer buf = new StringBuffer(128);
-        buf.append(domain).append(':');
-        buf.append(names[0]).append('=').append(props.get(names[0]));
-        for (int i = 1; i < names.length; i++) {
-            String name = names[i];
-            buf.append(',').append(name).append('=').append(props.get(name));
-        }
-        return buf.toString();
-    }
-
     /**
      * Determine if this name matches the supplied pattern.
      * This performs a fast but simplistic pattern match which is true if:
@@ -129,7 +131,7 @@
      * and always match; in other words GBeanName.match(null, new Properties()) will
      * always evaluate to true.
      *
-     * @param domain the domain to match
+     * @param domain  the domain to match
      * @param pattern the set properties to match; a Map<String,String>
      * @return true if this instance matches the pattern
      */
@@ -156,6 +158,7 @@
      * Test for equality.
      * This instance will be equal if the supplied object is a GBeanName with
      * equal domain and properties.
+     *
      * @param obj
      * @return
      */
@@ -173,12 +176,35 @@
     /**
      * Return a human readable version of this GBeanName. If the instance was created
      * by parsing a String, this will be the supplied value; it it was created by
-     * supplying properties, the name will contain properties in sorted order.
+     * supplying properties, the name will contain properties in an unspecified order.
      *
      * @return a readable name
      */
     public String toString() {
         return name;
+    }
+
+    /**
+     * Return a String representation of ths GBeanName.
+     * The format will be <domain> ':' <key> '=' <value> ( ',' <key> '=' <value> )*
+     * Keys are appended in the order determined by the supplied Comparator.
+     *
+     * @param keySorter the Comparator to use to order the keys.
+     * @return a String representation of this GBean
+     */
+    public String toString(Comparator keySorter) {
+        String[] keyList = (String[]) props.keySet().toArray(new String[props.keySet().size()]);
+        Arrays.sort(keyList, keySorter);
+
+        StringBuffer buf = new StringBuffer(128);
+        buf.append(domain).append(':');
+        String key = keyList[0];
+        buf.append(key).append('=').append(props.get(key));
+        for (int i = 1; i < keyList.length; i++) {
+            key = keyList[i];
+            buf.append(',').append(key).append('=').append(props.get(key));
+        }
+        return buf.toString();
     }
 
     private Object readResolve() {

Modified: geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java?view=diff&r1=155260&r2=155261
==============================================================================
--- geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java (original)
+++ geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/GBeanNameTest.java Thu Feb 24 14:21:12 2005
@@ -19,6 +19,9 @@
 import java.util.Properties;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Comparator;
 import java.rmi.MarshalledObject;
 
 import junit.framework.TestCase;
@@ -31,6 +34,7 @@
 
     public void testPropertyConstruction() {
         String domain = "testDomain";
+        Map props = new LinkedHashMap();
         props.put("prop1", "value1");
         props.put("prop2", "value2");
         GBeanName name = new GBeanName(domain, props);
@@ -63,6 +67,20 @@
         assertTrue(name.matches("testDomain", props));
         props.setProperty("prop3", "value3");
         assertFalse(name.matches("testDomain", props));
+    }
+
+    public void testStringForms() {
+        GBeanName name = new GBeanName("testDomain:prop2=value2,prop3=value3,prop1=value1");
+        assertEquals("testDomain:prop1=value1,prop2=value2,prop3=value3", name.toString(new Comparator() {
+            public int compare(Object o1, Object o2) {
+                return ((String)o1).compareTo(o2);
+            }
+        }));
+        assertEquals("testDomain:prop3=value3,prop2=value2,prop1=value1", name.toString(new Comparator() {
+            public int compare(Object o1, Object o2) {
+                return - ((String)o1).compareTo(o2);
+            }
+        }));
     }
 
     public void testInvalidNames() {