-package org.simantics.document.server.io;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-public class CommandContextImpl implements CommandContextMutable {\r
-\r
- private Map<String,List<List<Object>>> data = new HashMap<String,List<List<Object>>>();\r
-\r
- @Override\r
- public boolean containsKey(String key) {\r
- return data.containsKey(key);\r
- }\r
- \r
- @Override\r
- public List<List<Object>> getRows(String key) {\r
- List<List<Object>> rows = data.get(key);\r
- if (rows != null) \r
- return rows;\r
- else\r
- return Collections.emptyList();\r
- }\r
-\r
- @Override\r
- public CommandContextMutable putRow(String key, List<Object> row) {\r
- List<List<Object>> rows = ensureRowsAvailable(key);\r
- rows.add(row);\r
- return this;\r
- }\r
-\r
- @Override\r
- public String getString(String key) {\r
- Object o = getValue(key);\r
- return (String)o;\r
- }\r
- \r
- @Override\r
- public CommandContextMutable putString(String key, String value) {\r
- return putValue(key, value);\r
- }\r
-\r
- private List<List<Object>> ensureRowsAvailable(String key) {\r
- List<List<Object>> rows = data.get(key);\r
- if (rows == null) {\r
- rows = new ArrayList<List<Object>>();\r
- data.put(key, rows);\r
- }\r
- return rows;\r
- }\r
-\r
- @Override\r
- public Map<String, List<List<Object>>> getData() {\r
- return data;\r
- }\r
- \r
- @Override\r
- public List<String> getKeys() {\r
- return new ArrayList<String>(data.keySet());\r
- }\r
- \r
- @Override\r
- public CommandContextMutable merge(CommandContext context) {\r
- if (context != null) {\r
- Map<String,List<List<Object>>> from = context.getData(); \r
- for (Map.Entry<String, List<List<Object>>> entry : from.entrySet()) {\r
- List<List<Object>> rows = ensureRowsAvailable(entry.getKey());\r
- rows.addAll(entry.getValue());\r
- }\r
- }\r
- return this;\r
- }\r
- \r
- public static CommandContextMutable create() {\r
- return new CommandContextImpl();\r
- }\r
- \r
- @Override\r
- public String toString() {\r
- StringBuilder sb = new StringBuilder();\r
- for (Map.Entry<String, List<List<Object>>> entry : data.entrySet()) {\r
- sb.append(entry.getKey());\r
- sb.append(":");\r
- sb.append(entry.getValue());\r
- sb.append("\n");\r
- }\r
- return sb.toString();\r
- }\r
- \r
- @Override\r
- public int hashCode() {\r
- final int prime = 31;\r
- int result = 1;\r
- result = prime * result + ((data == null) ? 0 : data.hashCode());\r
- return result;\r
- }\r
-\r
- @Override\r
- public boolean equals(Object obj) {\r
- if (this == obj)\r
- return true;\r
- if (obj == null)\r
- return false;\r
- if (getClass() != obj.getClass())\r
- return false;\r
- CommandContextImpl other = (CommandContextImpl) obj;\r
- if (data == null) {\r
- if (other.data != null)\r
- return false;\r
- } else if (!data.equals(other.data))\r
- return false;\r
- return true;\r
- }\r
-\r
- @Override\r
- public CommandContextMutable putValue(String key, Object value) {\r
- if(data.containsKey(key)) data.remove(key);\r
- List<List<Object>> rows = ensureRowsAvailable(key);\r
- List<Object> t = new ArrayList<Object>();\r
- t.add(key);\r
- t.add(value);\r
- rows.add(t);\r
- return this;\r
- }\r
- \r
- @Override\r
- public <T> T getValue(String key) {\r
- List<List<Object>> rows = getRows(key);\r
- if((rows == null) || (rows.size() != 1)) return null;\r
- List<Object> t = (List<Object>)rows.get(0);\r
- if(t.size() != 2) return null;\r
- @SuppressWarnings("unchecked")\r
- T o = (T) t.get(1);\r
- return o;\r
- }\r
+package org.simantics.document.server.io;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CommandContextImpl implements CommandContextMutable {
+
+ private Map<String,List<List<Object>>> data = new HashMap<String,List<List<Object>>>();
+
+ @Override
+ public boolean containsKey(String key) {
+ return data.containsKey(key);
+ }
+
+ @Override
+ public List<List<Object>> getRows(String key) {
+ List<List<Object>> rows = data.get(key);
+ if (rows != null)
+ return rows;
+ else
+ return Collections.emptyList();
+ }
+
+ @Override
+ public CommandContextMutable putRow(String key, List<Object> row) {
+ List<List<Object>> rows = ensureRowsAvailable(key);
+ rows.add(row);
+ return this;
+ }
+
+ @Override
+ public String getString(String key) {
+ Object o = getValue(key);
+ return (String)o;
+ }
+
+ @Override
+ public CommandContextMutable putString(String key, String value) {
+ return putValue(key, value);
+ }
+
+ private List<List<Object>> ensureRowsAvailable(String key) {
+ List<List<Object>> rows = data.get(key);
+ if (rows == null) {
+ rows = new ArrayList<List<Object>>();
+ data.put(key, rows);
+ }
+ return rows;
+ }
+
+ @Override
+ public Map<String, List<List<Object>>> getData() {
+ return data;
+ }
+
+ @Override
+ public List<String> getKeys() {
+ return new ArrayList<String>(data.keySet());
+ }
+
+ @Override
+ public CommandContextMutable merge(CommandContext context) {
+ if (context != null) {
+ Map<String,List<List<Object>>> from = context.getData();
+ for (Map.Entry<String, List<List<Object>>> entry : from.entrySet()) {
+ String key = entry.getKey();
+ Object existing = getValue(key);
+ Object newValue = context.getValue(key);
+ // Do not merge duplicates!
+ if (newValue != null && newValue.equals(existing))
+ continue;
+ List<List<Object>> rows = ensureRowsAvailable(entry.getKey());
+ rows.addAll(entry.getValue());
+ }
+ }
+ return this;
+ }
+
+ public static CommandContextMutable create() {
+ return new CommandContextImpl();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("CommandContext:\n");
+ for (Map.Entry<String, List<List<Object>>> entry : data.entrySet()) {
+ String key = entry.getKey();
+ if(key.startsWith("__")) continue;
+ sb.append(key);
+ sb.append(":");
+ List<List<Object>> value = entry.getValue();
+ if(value.size() == 1) {
+ List<Object> t = (List<Object>)value.get(0);
+ if(t.size() == 2) {
+ sb.append(t.get(1));
+ } else {
+ sb.append(t);
+ }
+ } else {
+ sb.append(value);
+ }
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((data == null) ? 0 : data.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ CommandContextImpl other = (CommandContextImpl) obj;
+ if (data == null) {
+ if (other.data != null)
+ return false;
+ } else if (!data.equals(other.data))
+ return false;
+ return true;
+ }
+
+ @Override
+ public CommandContextMutable putValue(String key, Object value) {
+ if(data.containsKey(key)) data.remove(key);
+ List<List<Object>> rows = ensureRowsAvailable(key);
+ List<Object> t = new ArrayList<Object>();
+ t.add(key);
+ t.add(value);
+ rows.add(t);
+ return this;
+ }
+
+ @Override
+ public <T> T getValue(String key) {
+ List<List<Object>> rows = getRows(key);
+ if((rows == null) || (rows.size() != 1)) return null;
+ List<Object> t = (List<Object>)rows.get(0);
+ if(t.size() != 2) return null;
+ @SuppressWarnings("unchecked")
+ T o = (T) t.get(1);
+ return o;
+ }
}
\ No newline at end of file