SLING-9408 do not throw IAE in case old value is array and new value is
not
diff --git a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
index c5dc328..1e42ade 100644
--- a/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
+++ b/src/main/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtil.java
@@ -98,7 +98,7 @@
for(final String key : keysA ) {
final Object valA = a.get(key);
final Object valB = b.get(key);
- if ( valA.getClass().isArray() ) {
+ if ( valA.getClass().isArray() && valB.getClass().isArray()) {
final Object[] arrA = convertToObjectArray(valA);
final Object[] arrB = convertToObjectArray(valB);
@@ -112,12 +112,16 @@
break;
}
}
- } else {
- // we always do a string comparison
+ } else if (!valA.getClass().isArray() && !valB.getClass().isArray()) {
+ // if no arrays do a string comparison
if ( !(String.valueOf(valA).equals(String.valueOf(valB))) ) {
result = false;
break;
}
+ } else {
+ // one value is array the other is not!
+ result = false;
+ break;
}
}
}
diff --git a/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java b/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
index e63eed8..57e0402 100644
--- a/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
+++ b/src/test/java/org/apache/sling/installer/factories/configuration/impl/ConfigUtilTest.java
@@ -119,4 +119,16 @@
Configuration cfg = ConfigUtil.getConfiguration(cm, "a.b.c", "c1");
assertSame(c1, cfg);
}
+
+
+ @Test public void testIsSameDataWithSwitchFromArrayToSingleValue() throws Exception {
+ final Dictionary<String, Object> a = new Hashtable<>();
+ final Dictionary<String, Object> b = new Hashtable<>();
+
+ a.put("b", new int[] {1,2,3});
+ b.put("b", 1);
+
+ assertFalse(ConfigUtil.isSameData(a, b));
+ assertFalse(ConfigUtil.isSameData(b, a));
+ }
}