[FELIX-4761] Modifications on Properties#entrySet() are not properly reflected in the layout
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1650469 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/utils/src/main/java/org/apache/felix/utils/properties/Properties.java b/utils/src/main/java/org/apache/felix/utils/properties/Properties.java
index 30fb4df..9c56abb 100644
--- a/utils/src/main/java/org/apache/felix/utils/properties/Properties.java
+++ b/utils/src/main/java/org/apache/felix/utils/properties/Properties.java
@@ -32,9 +32,11 @@
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.AbstractMap;
+import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
+import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
@@ -202,7 +204,47 @@
@Override
public Set<Entry<String, String>> entrySet() {
- return storage.entrySet();
+ return new AbstractSet<Entry<String, String>>() {
+ @Override
+ public Iterator<Entry<String, String>> iterator() {
+ return new Iterator<Entry<String, String>>() {
+ final Iterator<Entry<String, String>> keyIterator = storage.entrySet().iterator();
+ Entry<String, String> entry;
+ public boolean hasNext() {
+ return keyIterator.hasNext();
+ }
+ public Entry<String, String> next() {
+ entry = keyIterator.next();
+ return new Entry<String, String>() {
+ public String getKey() {
+ return entry.getKey();
+ }
+ public String getValue() {
+ return entry.getValue();
+ }
+ public String setValue(String value) {
+ String old = entry.setValue(value);
+ if (old == null || !old.equals(value)) {
+ Layout l = layout.get(entry.getKey());
+ if (l != null) {
+ l.clearValue();
+ }
+ }
+ return old;
+ }
+ };
+ }
+ public void remove() {
+ keyIterator.remove();
+ }
+ };
+ }
+
+ @Override
+ public int size() {
+ return storage.size();
+ }
+ };
}
/**
@@ -283,6 +325,15 @@
return result;
}
+ public List<String> getComments(String key) {
+ if (layout.containsKey(key)) {
+ if (layout.get(key).getCommentLines() != null) {
+ return new ArrayList<String>(layout.get(key).getCommentLines());
+ }
+ }
+ return new ArrayList<String>();
+ }
+
@Override
public String remove(Object key) {
Layout l = layout.get(key);
diff --git a/utils/src/test/java/org/apache/felix/utils/properties/PropertiesTest.java b/utils/src/test/java/org/apache/felix/utils/properties/PropertiesTest.java
index a5006ea..a52e667 100644
--- a/utils/src/test/java/org/apache/felix/utils/properties/PropertiesTest.java
+++ b/utils/src/test/java/org/apache/felix/utils/properties/PropertiesTest.java
@@ -16,6 +16,8 @@
*/
package org.apache.felix.utils.properties;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
@@ -238,4 +240,27 @@
assertEquals(KEY1A + " = " + VALUE1 + "\\", rawValue.get(0));
assertEquals(VALUE1, rawValue.get(1));
}
+
+ public void testEntrySetValue() throws Exception {
+ properties.put(KEY1, VALUE1);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ properties.save(baos);
+
+ properties = new Properties();
+ properties.load(new ByteArrayInputStream(baos.toByteArray()));
+ assertEquals(VALUE1, properties.get(KEY1));
+ for (Map.Entry<String, String> entry : properties.entrySet()) {
+ entry.setValue(entry.getValue() + "x");
+ }
+ assertEquals(VALUE1 + "x", properties.get(KEY1));
+
+ baos = new ByteArrayOutputStream();
+ properties.save(baos);
+
+ properties = new Properties();
+ properties.load(new ByteArrayInputStream(baos.toByteArray()));
+ assertEquals(VALUE1 + "x", properties.get(KEY1));
+ }
+
}