1 package org.simantics.document.server.io;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
9 public class CommandContextImpl implements CommandContextMutable {
11 private Map<String,List<List<Object>>> data = new HashMap<String,List<List<Object>>>();
14 public boolean containsKey(String key) {
15 return data.containsKey(key);
19 public List<List<Object>> getRows(String key) {
20 List<List<Object>> rows = data.get(key);
24 return Collections.emptyList();
28 public CommandContextMutable putRow(String key, List<Object> row) {
29 List<List<Object>> rows = ensureRowsAvailable(key);
35 public String getString(String key) {
36 Object o = getValue(key);
41 public CommandContextMutable putString(String key, String value) {
42 return putValue(key, value);
45 private List<List<Object>> ensureRowsAvailable(String key) {
46 List<List<Object>> rows = data.get(key);
48 rows = new ArrayList<List<Object>>();
55 public Map<String, List<List<Object>>> getData() {
60 public List<String> getKeys() {
61 return new ArrayList<String>(data.keySet());
65 public CommandContextMutable merge(CommandContext context) {
66 if (context != null) {
67 Map<String,List<List<Object>>> from = context.getData();
68 for (Map.Entry<String, List<List<Object>>> entry : from.entrySet()) {
69 String key = entry.getKey();
70 Object existing = getValue(key);
71 Object newValue = context.getValue(key);
72 // Do not merge duplicates!
73 if (newValue != null && newValue.equals(existing))
75 List<List<Object>> rows = ensureRowsAvailable(entry.getKey());
76 rows.addAll(entry.getValue());
82 public static CommandContextMutable create() {
83 return new CommandContextImpl();
87 public String toString() {
88 StringBuilder sb = new StringBuilder();
89 sb.append("CommandContext:\n");
90 for (Map.Entry<String, List<List<Object>>> entry : data.entrySet()) {
91 String key = entry.getKey();
92 if(key.startsWith("__")) continue;
95 List<List<Object>> value = entry.getValue();
96 if(value.size() == 1) {
97 List<Object> t = (List<Object>)value.get(0);
108 return sb.toString();
112 public int hashCode() {
113 final int prime = 31;
115 result = prime * result + ((data == null) ? 0 : data.hashCode());
120 public boolean equals(Object obj) {
125 if (getClass() != obj.getClass())
127 CommandContextImpl other = (CommandContextImpl) obj;
129 if (other.data != null)
131 } else if (!data.equals(other.data))
137 public CommandContextMutable putValue(String key, Object value) {
138 if(data.containsKey(key)) data.remove(key);
139 List<List<Object>> rows = ensureRowsAvailable(key);
140 List<Object> t = new ArrayList<Object>();
148 public <T> T getValue(String key) {
149 List<List<Object>> rows = getRows(key);
150 if((rows == null) || (rows.size() != 1)) return null;
151 List<Object> t = (List<Object>)rows.get(0);
152 if(t.size() != 2) return null;
153 @SuppressWarnings("unchecked")