diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/AbstractSettingsToJsonSerializer.java b/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/AbstractSettingsToJsonSerializer.java index df384361dd5..f87e9a5d2ad 100644 --- a/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/AbstractSettingsToJsonSerializer.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/AbstractSettingsToJsonSerializer.java @@ -80,32 +80,49 @@ public abstract class AbstractSettingsToJsonSerializer { public OBJECT serialize(SettingsMap settingsMap) { final OBJECT jsonObject = newOBJECT(); + serializeToObject(settingsMap, jsonObject); + return jsonObject; + } + + private void serializeToObject(SettingsMap settingsMap, final OBJECT jsonObject) { for (Map.Entry entry : settingsMap.getSettingsPerComponentId().entrySet()) { + String key = entry.getKey(); Settings settings = entry.getValue(); - final Object serializedObject; - if(settings instanceof SettingsMap) { - serializedObject = serialize((SettingsMap)settings); - } else if(settings instanceof GenericSerializableSettings) { - serializedObject = serialize((GenericSerializableSettings)settings); + if(key == null) { + if(settings instanceof SettingsMap) { + serializeToObject((SettingsMap)settings, jsonObject); + } else if(settings instanceof GenericSerializableSettings) { + serializeToObject((GenericSerializableSettings)settings, jsonObject); + } } else { - serializedObject = null; - } - if(serializedObject != null) { - set(jsonObject, entry.getKey().toString(), serializedObject); + final OBJECT serializedObject; + if(settings instanceof SettingsMap) { + serializedObject = serialize((SettingsMap)settings); + } else if(settings instanceof GenericSerializableSettings) { + serializedObject = serialize((GenericSerializableSettings)settings); + } else { + serializedObject = null; + } + if(serializedObject != null) { + set(jsonObject, key.toString(), serializedObject); + } } } - return jsonObject; } public OBJECT serialize(GenericSerializableSettings settings) { final OBJECT jsonObject = newOBJECT(); + serializeToObject(settings, jsonObject); + return jsonObject; + } + + private void serializeToObject(GenericSerializableSettings settings, final OBJECT jsonObject) { for (Map.Entry entry : settings.getChildSettings().entrySet()) { Setting setting = entry.getValue(); if (!setting.isDefaultValue()) { set(jsonObject, entry.getKey(), serialize(setting)); } } - return jsonObject; } private Object serialize(Setting setting) { @@ -146,9 +163,15 @@ public abstract class AbstractSettingsToJsonSerializer { public T deserialize(T settingsMap, OBJECT json) { if (json != null) { for (Map.Entry entry : settingsMap.getSettingsPerComponentId().entrySet()) { - String key = entry.getKey().toString(); - if(hasProperty(json, key)) { - Settings settings = entry.getValue(); + String key = entry.getKey(); + Settings settings = entry.getValue(); + if(key == null) { + if(settings instanceof SettingsMap) { + deserialize((SettingsMap)settings, json); + } else if(settings instanceof GenericSerializableSettings) { + deserializeObject((GenericSerializableSettings)settings, json); + } + } else if(hasProperty(json, key)) { Object serializedObject = get(json, key); if(settings instanceof SettingsMap) { @SuppressWarnings("unchecked") diff --git a/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/SettingsToStringMapSerializer.java b/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/SettingsToStringMapSerializer.java index eedb8d62f07..17b3f4b4180 100644 --- a/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/SettingsToStringMapSerializer.java +++ b/java/com.sap.sse.common/src/com/sap/sse/common/settings/serializer/SettingsToStringMapSerializer.java @@ -37,7 +37,8 @@ public class SettingsToStringMapSerializer { private void serialize(String prefix, SettingsMap settingsMap, Map> serialized) { for (Map.Entry entry : settingsMap.getSettingsPerComponentId().entrySet()) { - String childPrefix = prefix + entry.getKey() + GenericSerializableSettings.PATH_SEPARATOR; + String key = entry.getKey(); + String childPrefix = key == null ? prefix : prefix + key + GenericSerializableSettings.PATH_SEPARATOR; Settings settings = entry.getValue(); if(settings instanceof SettingsMap) { serialize(childPrefix, (SettingsMap) settings, serialized); @@ -109,7 +110,7 @@ public class SettingsToStringMapSerializer { for (Map.Entry entry : childSettings) { final String key = entry.getKey(); final Settings settings = entry.getValue(); - final Map> innerValues = mappedInnerValues.get(key.toString()); + final Map> innerValues = key == null ? values : mappedInnerValues.get(key.toString()); if(innerValues != null) { if(settings instanceof SettingsMap) { deserializeSettingsMap((SettingsMap) settings, innerValues); diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/shared/perspective/PerspectiveCompositeSettings.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/shared/perspective/PerspectiveCompositeSettings.java index 09e24b47de7..99fec0fcbca 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/shared/perspective/PerspectiveCompositeSettings.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/shared/perspective/PerspectiveCompositeSettings.java @@ -23,8 +23,6 @@ import com.sap.sse.gwt.client.shared.components.CompositeSettings; * is assigned to which component, or how the perspective displays itself, such as embedded or not */ public class PerspectiveCompositeSettings extends CompositeSettings { - private static final String OWN_SETTINGS_KEY = "_"; - private final PS perspectiveOwnSettings; public PerspectiveCompositeSettings(PS perspectiveOwnSettings, Map settingsPerComponent) { @@ -60,7 +58,7 @@ public class PerspectiveCompositeSettings extends Composite allSettings = super.getSettingsPerComponentId(); } else { allSettings = new HashMap<>(super.getSettingsPerComponentId()); - allSettings.put(OWN_SETTINGS_KEY, perspectiveOwnSettings); + allSettings.put(null, perspectiveOwnSettings); } return allSettings; } diff --git a/java/com.sap.sse.shared.android.test/src/com/sap/sse/shared/android/test/AbstractSettingsSerializationTestWithSettingsMap.java b/java/com.sap.sse.shared.android.test/src/com/sap/sse/shared/android/test/AbstractSettingsSerializationTestWithSettingsMap.java index b1bdc15c8c5..275dcf7b9c1 100644 --- a/java/com.sap.sse.shared.android.test/src/com/sap/sse/shared/android/test/AbstractSettingsSerializationTestWithSettingsMap.java +++ b/java/com.sap.sse.shared.android.test/src/com/sap/sse/shared/android/test/AbstractSettingsSerializationTestWithSettingsMap.java @@ -27,7 +27,6 @@ public abstract class AbstractSettingsSerializationTestWithSettingsMap exte @Test public void testSettingsMapWithMultipleSerializableSettings() throws Exception { - final GenericSerializableSettings settingsValues1 = createTestSettingsWithValues(); final GenericSerializableSettings settingsValues2 = createTestSettingsWithValues2(); Map settings = new HashMap<>(); @@ -44,6 +43,24 @@ public abstract class AbstractSettingsSerializationTestWithSettingsMap exte assertEquals(deserializedSettingsMap.getSettingsPerComponentId().size(), 2); } + @Test + public void testSettingsMapWithNullKey() throws Exception { + final GenericSerializableSettings settingsValues1 = createTestSettingsWithValues(); + final GenericSerializableSettings settingsValues2 = createTestSettingsWithValues2(); + Map settings = new HashMap<>(); + settings.put("aaa", settingsValues1); + settings.put(null, settingsValues2); + + SettingsMap settingsMapToSave = new SettingsMapImpl(settings); + + final SettingsMap deserializedSettingsMap = serializeAndDeserialize(settingsMapToSave); + Settings deserializedSettingsValues1 = deserializedSettingsMap.getSettingsPerComponentId().get("aaa"); + Settings deserializedSettingsValues2 = deserializedSettingsMap.getSettingsPerComponentId().get(null); + assertEquals(deserializedSettingsValues1, createTestSettingsWithValues()); + assertEquals(deserializedSettingsValues2, createTestSettingsWithValues2()); + assertEquals(deserializedSettingsMap.getSettingsPerComponentId().size(), 2); + } + @Test public void testSettingsMapWithNestedSettingsMapWithOneSerializableSettingsChild() throws Exception { final GenericSerializableSettings childSettingsValues = createTestSettingsWithValues();