From 4a7857571e2375e00d2d22d2d09ddbcb0013236b Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 1 Feb 2018 12:41:00 -0800 Subject: [PATCH 1/3] GUACAMOLE-96: Reference Map.Entry rather than HashMap.Entry. --- .../guacamole/auth/jdbc/base/ArbitraryAttributeMap.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java index e2cb43805..797965aad 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java @@ -23,6 +23,7 @@ import java.util.AbstractCollection; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; +import java.util.Map; /** * Map of arbitrary attribute name/value pairs which can alternatively be @@ -129,7 +130,7 @@ public class ArbitraryAttributeMap extends HashMap { public Iterator iterator() { // Get iterator over all string name/value entries - final Iterator> iterator = entrySet().iterator(); + final Iterator> iterator = entrySet().iterator(); // Dynamically translate each string name/value entry into a // corresponding attribute model object as iteration continues @@ -142,7 +143,7 @@ public class ArbitraryAttributeMap extends HashMap { @Override public ArbitraryAttributeModel next() { - Entry entry = iterator.next(); + Map.Entry entry = iterator.next(); return new ArbitraryAttributeModel(entry.getKey(), entry.getValue()); } From 1c012f4ed0c780cd2418a26efefbdddcc42f11c3 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 1 Feb 2018 12:43:24 -0800 Subject: [PATCH 2/3] GUACAMOLE-96: Implement Iterator.remove() within ArbitraryAttributeMap's iterator. --- .../guacamole/auth/jdbc/base/ArbitraryAttributeMap.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java index 797965aad..61a7ff77c 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java @@ -148,6 +148,11 @@ public class ArbitraryAttributeMap extends HashMap { entry.getValue()); } + @Override + public void remove() { + iterator.remove(); + } + }; } From 3a90dbbd0011416d7116da7a901c215f1186a682 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Thu, 1 Feb 2018 13:01:43 -0800 Subject: [PATCH 3/3] GUACAMOLE-96: Do not rely on Map.remove(key, value) which is specific to Java 8. --- .../auth/jdbc/base/ArbitraryAttributeMap.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java index 61a7ff77c..219abe85b 100644 --- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java +++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/base/ArbitraryAttributeMap.java @@ -83,10 +83,22 @@ public class ArbitraryAttributeMap extends HashMap { if (!(o instanceof ArbitraryAttributeModel)) return false; - // The attribute should be removed only if the value matches + // Remove only if key is actually present ArbitraryAttributeModel model = (ArbitraryAttributeModel) o; - return ArbitraryAttributeMap.this.remove(model.getName(), - model.getValue()); + if (!ArbitraryAttributeMap.this.containsKey(model.getName())) + return false; + + // The attribute should be removed only if the value matches + String currentValue = ArbitraryAttributeMap.this.get(model.getName()); + if (currentValue == null) { + if (model.getValue() != null) + return false; + } + else if (!currentValue.equals(model.getValue())) + return false; + + ArbitraryAttributeMap.this.remove(model.getName()); + return true; }