--- /dev/null
+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
+}
\ No newline at end of file