Fix a bug of stringPropertyNames and add 2 test cases
git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/classlib/branches/java6@905238 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/modules/luni/src/main/java/java/util/Properties.java b/modules/luni/src/main/java/java/util/Properties.java
index f2068b8..07e048f 100644
--- a/modules/luni/src/main/java/java/util/Properties.java
+++ b/modules/luni/src/main/java/java/util/Properties.java
@@ -493,10 +493,10 @@
*/
public Enumeration<?> propertyNames() {
Hashtable<Object, Object> selected = new Hashtable<Object, Object>();
- selectProperties(selected);
+ selectProperties(selected, false);
return selected.keys();
}
-
+
/**
* Answers a set of keys in this property list whose key and value are
* strings.
@@ -504,30 +504,39 @@
* @return a set of keys in the property list
*
* @since 1.6
- */
- public Set<String> stringPropertyNames(){
- Hashtable<Object, Object> selected = new Hashtable<Object, Object>();
- selectProperties(selected);
- Enumeration<?> keys = selected.keys();
- HashSet<String> set = new HashSet<String>();
+ */
+ public Set<String> stringPropertyNames() {
+ Hashtable<String, String> stringProperties = new Hashtable<String, String>();
+ selectProperties(stringProperties, true);
+ return Collections.unmodifiableSet(stringProperties.keySet());
+ }
+
+ /*
+ * Select properties including defaults according to requirements
+ */
+ private void selectProperties(Hashtable selectProperties,
+ final boolean isStringOnly) {
+ if (defaults != null) {
+ defaults.selectProperties(selectProperties, isStringOnly);
+ }
+
+ Enumeration<?> keys = keys();
Object key, value;
while (keys.hasMoreElements()) {
key = keys.nextElement();
- if (key instanceof String) {
- value = selected.get(key);
- if (value instanceof String){
- set.add((String)key);
+ if (isStringOnly) {
+ // Only select property with string key and value
+ if (key instanceof String) {
+ value = get(key);
+ if (value instanceof String) {
+ selectProperties.put(key, value);
+ }
}
- }
+ } else {
+ value = get(key);
+ selectProperties.put(key, value);
+ }
}
- return Collections.unmodifiableSet(set);
- }
-
- private void selectProperties(Hashtable<Object, Object> selected) {
- if(defaults != null) {
- defaults.selectProperties(selected);
- }
- selected.putAll(this);
}
/**
diff --git a/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/PropertiesTest.java b/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/PropertiesTest.java
index 6375825..e8506fa 100644
--- a/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/PropertiesTest.java
+++ b/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/PropertiesTest.java
@@ -956,6 +956,76 @@
assertEquals(1, props.size());
}
+ public void test_SequentialpropertyNames() {
+ Properties parent = new Properties();
+ parent.setProperty("parent.a.key", "parent.a.value");
+ parent.setProperty("parent.b.key", "parent.b.value");
+
+ Enumeration<?> names = parent.propertyNames();
+ assertEquals("parent.a.key", names.nextElement());
+ assertEquals("parent.b.key", names.nextElement());
+ assertFalse(names.hasMoreElements());
+
+ Properties current = new Properties(parent);
+ current.setProperty("current.a.key", "current.a.value");
+ current.setProperty("current.b.key", "current.b.value");
+
+ names = current.propertyNames();
+ assertEquals("parent.a.key", names.nextElement());
+ assertEquals("current.b.key", names.nextElement());
+ assertEquals("parent.b.key", names.nextElement());
+ assertEquals("current.a.key", names.nextElement());
+ assertFalse(names.hasMoreElements());
+
+ Properties child = new Properties(current);
+ child.setProperty("child.a.key", "child.a.value");
+ child.setProperty("child.b.key", "child.b.value");
+
+ names = child.propertyNames();
+ assertEquals("parent.a.key", names.nextElement());
+ assertEquals("child.b.key", names.nextElement());
+ assertEquals("current.b.key", names.nextElement());
+ assertEquals("parent.b.key", names.nextElement());
+ assertEquals("child.a.key", names.nextElement());
+ assertEquals("current.a.key", names.nextElement());
+ assertFalse(names.hasMoreElements());
+ }
+
+ public void test_SequentialstringPropertyNames() {
+ Properties parent = new Properties();
+ parent.setProperty("parent.a.key", "parent.a.value");
+ parent.setProperty("parent.b.key", "parent.b.value");
+
+ Iterator<String> nameIterator = parent.stringPropertyNames().iterator();
+ assertEquals("parent.a.key", nameIterator.next());
+ assertEquals("parent.b.key", nameIterator.next());
+ assertFalse(nameIterator.hasNext());
+
+ Properties current = new Properties(parent);
+ current.setProperty("current.a.key", "current.a.value");
+ current.setProperty("current.b.key", "current.b.value");
+
+ nameIterator = current.stringPropertyNames().iterator();
+ assertEquals("parent.a.key", nameIterator.next());
+ assertEquals("current.b.key", nameIterator.next());
+ assertEquals("parent.b.key", nameIterator.next());
+ assertEquals("current.a.key", nameIterator.next());
+ assertFalse(nameIterator.hasNext());
+
+ Properties child = new Properties(current);
+ child.setProperty("child.a.key", "child.a.value");
+ child.setProperty("child.b.key", "child.b.value");
+
+ nameIterator = child.stringPropertyNames().iterator();
+ assertEquals("parent.a.key", nameIterator.next());
+ assertEquals("child.b.key", nameIterator.next());
+ assertEquals("current.b.key", nameIterator.next());
+ assertEquals("parent.b.key", nameIterator.next());
+ assertEquals("child.a.key", nameIterator.next());
+ assertEquals("current.a.key", nameIterator.next());
+ assertFalse(nameIterator.hasNext());
+ }
+
/**
* Sets up the fixture, for example, open a network connection. This method
* is called before a test is executed.