]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.server.io/src/org/simantics/document/server/io/CommandContextImpl.java
Fixed CommandContextImpl.merge to not duplicate same values in result
[simantics/platform.git] / bundles / org.simantics.document.server.io / src / org / simantics / document / server / io / CommandContextImpl.java
1 package org.simantics.document.server.io;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
8
9 public class CommandContextImpl implements CommandContextMutable {
10
11         private Map<String,List<List<Object>>> data = new HashMap<String,List<List<Object>>>();
12
13         @Override
14         public boolean containsKey(String key) {
15                 return data.containsKey(key);
16         }
17         
18         @Override
19         public List<List<Object>> getRows(String key) {
20                 List<List<Object>> rows = data.get(key);
21                 if (rows != null) 
22                         return rows;
23                 else
24                         return Collections.emptyList();
25         }
26
27         @Override
28         public CommandContextMutable putRow(String key, List<Object> row) {
29                 List<List<Object>> rows = ensureRowsAvailable(key);
30                 rows.add(row);
31                 return this;
32         }
33
34         @Override
35         public String getString(String key) {
36                 Object o = getValue(key);
37                 return (String)o;
38         }
39         
40         @Override
41         public CommandContextMutable putString(String key, String value) {
42             return putValue(key, value);
43         }
44
45         private List<List<Object>> ensureRowsAvailable(String key) {
46                 List<List<Object>> rows = data.get(key);
47                 if (rows == null) {
48                         rows = new ArrayList<List<Object>>();
49                         data.put(key, rows);
50                 }
51                 return rows;
52         }
53
54         @Override
55         public Map<String, List<List<Object>>> getData() {
56                 return data;
57         }
58         
59         @Override
60         public List<String> getKeys() {
61                 return new ArrayList<String>(data.keySet());
62         }
63         
64         @Override
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))
74                                         continue;
75                                 List<List<Object>> rows = ensureRowsAvailable(entry.getKey());
76                                 rows.addAll(entry.getValue());
77                         }
78                 }
79                 return this;
80         }
81         
82         public static CommandContextMutable create() {
83                 return new CommandContextImpl();
84         }
85         
86         @Override
87         public String toString() {
88                 StringBuilder sb = new StringBuilder();
89                 for (Map.Entry<String, List<List<Object>>> entry : data.entrySet()) {
90                          sb.append(entry.getKey());
91                          sb.append(":");
92                          sb.append(entry.getValue());
93                          sb.append("\n");
94                 }
95                 return sb.toString();
96         }
97         
98         @Override
99         public int hashCode() {
100                 final int prime = 31;
101                 int result = 1;
102                 result = prime * result + ((data == null) ? 0 : data.hashCode());
103                 return result;
104         }
105
106         @Override
107         public boolean equals(Object obj) {
108                 if (this == obj)
109                         return true;
110                 if (obj == null)
111                         return false;
112                 if (getClass() != obj.getClass())
113                         return false;
114                 CommandContextImpl other = (CommandContextImpl) obj;
115                 if (data == null) {
116                         if (other.data != null)
117                                 return false;
118                 } else if (!data.equals(other.data))
119                         return false;
120                 return true;
121         }
122
123     @Override
124     public CommandContextMutable putValue(String key, Object value) {
125         if(data.containsKey(key)) data.remove(key);
126         List<List<Object>> rows = ensureRowsAvailable(key);
127         List<Object> t = new ArrayList<Object>();
128         t.add(key);
129         t.add(value);
130         rows.add(t);
131         return this;
132     }
133     
134     @Override
135     public <T> T getValue(String key) {
136         List<List<Object>> rows = getRows(key);
137         if((rows == null) || (rows.size() != 1)) return null;
138         List<Object> t = (List<Object>)rows.get(0);
139         if(t.size() != 2) return null;
140         @SuppressWarnings("unchecked")
141         T o = (T) t.get(1);
142         return o;
143     }
144 }