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() {


Reply via email to