1 package org.vaadin.aceeditor.client;
2
3 import java.io.Serializable;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.HashSet;
7 import java.util.Map;
8 import java.util.Map.Entry;
9 import java.util.Set;
10
11 import org.vaadin.aceeditor.client.TransportDiff.TransportMarkerAddition;
12 import org.vaadin.aceeditor.client.TransportDiff.TransportMarkerDiff;
13 import org.vaadin.aceeditor.client.TransportDiff.TransportMarkerSetDiff;
14
15 @SuppressWarnings("serial")
16 public class MarkerSetDiff implements Serializable {
17
18 private final Map<String, MarkerAddition> added;
19 private final Map<String, MarkerDiff> moved;
20 private final Set<String> removed;
21
22 public MarkerSetDiff(Map<String, MarkerAddition> added, Set<String> removed) {
23 this.added = added;
24 this.moved = Collections.emptyMap();
25 this.removed = removed;
26 }
27
28 public MarkerSetDiff(Map<String, MarkerAddition> added,
29 Map<String, MarkerDiff> moved, Set<String> removed) {
30 this.added = added;
31 this.moved = moved;
32 this.removed = removed;
33 }
34
35 public static MarkerSetDiff diff(Map<String, AceMarker> m1, Map<String, AceMarker> m2, String text2) {
36
37 Map<String, MarkerAddition> added = new HashMap<String, MarkerAddition>();
38 Map<String, MarkerDiff> diffs = new HashMap<String, MarkerDiff>();
39 for (Entry<String, AceMarker> e : m2.entrySet()) {
40 AceMarker c1 = m1.get(e.getKey());
41 if (c1 != null) {
42 MarkerDiff d = MarkerDiff.diff(c1, e.getValue());
43 if (!d.isIdentity()) {
44 diffs.put(e.getKey(), d);
45 }
46 } else {
47 added.put(e.getKey(), new MarkerAddition(e.getValue(), text2));
48 }
49 }
50
51 Set<String> removedIds = new HashSet<String>(m1.keySet());
52 removedIds.removeAll(m2.keySet());
53
54 return new MarkerSetDiff(added, diffs, removedIds);
55 }
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 public Map<String, AceMarker> applyTo(Map<String, AceMarker> markers, String text2) {
86 Map<String, AceMarker> markers2 = new HashMap<String, AceMarker>();
87 for (Entry<String, MarkerAddition> e : added.entrySet()) {
88 AceMarker adjusted = e.getValue().getAdjustedMarker(text2);
89 if (adjusted != null) {
90 markers2.put(e.getKey(), adjusted);
91 }
92 }
93
94 for (Entry<String, AceMarker> e : markers.entrySet()) {
95 if (removed.contains(e.getKey())) {
96 continue;
97 }
98 AceMarker m = e.getValue();
99
100
101 if (markers2.containsKey(e.getKey())) {
102 m = markers2.get(e.getKey());
103 }
104
105 MarkerDiff md = moved.get(e.getKey());
106 if (md != null) {
107 markers2.put(e.getKey(), md.applyTo(m));
108 } else {
109 markers2.put(e.getKey(), m);
110 }
111 }
112
113 return markers2;
114 }
115
116 @Override
117 public String toString() {
118 return "added: " + added + "\n" +
119 "moved: " + moved + "\n" +
120 "removed: " + removed;
121 }
122
123 public boolean isIdentity() {
124 return added.isEmpty() && moved.isEmpty() && removed.isEmpty();
125 }
126
127 public TransportMarkerSetDiff asTransportDiff() {
128 TransportMarkerSetDiff msd = new TransportMarkerSetDiff();
129 msd.added = getTransportAdded();
130 msd.moved = getTransportMoved();
131 msd.removed = getTransportRemoved();
132 return msd;
133 }
134
135 private Map<String, TransportMarkerAddition> getTransportAdded() {
136 HashMap<String, TransportMarkerAddition> ta = new HashMap<String, TransportMarkerAddition>();
137 for (Entry<String, MarkerAddition> e : added.entrySet()) {
138 ta.put(e.getKey(), e.getValue().asTransport());
139 }
140 return ta;
141 }
142
143 private Map<String, TransportMarkerDiff> getTransportMoved() {
144 HashMap<String, TransportMarkerDiff> ta = new HashMap<String, TransportMarkerDiff>();
145 for (Entry<String, MarkerDiff> e : moved.entrySet()) {
146 ta.put(e.getKey(), e.getValue().asTransport());
147 }
148 return ta;
149 }
150
151 private Set<String> getTransportRemoved() {
152 return removed;
153 }
154
155 public static MarkerSetDiff fromTransportDiff(TransportMarkerSetDiff td) {
156 return new MarkerSetDiff(
157 addedFromTransport(td.added),
158 movedFromTransport(td.moved),
159 removedFromTransport(td.removed));
160 }
161
162 private static Map<String, MarkerAddition> addedFromTransport(
163 Map<String, TransportMarkerAddition> added2) {
164 HashMap<String, MarkerAddition> added = new HashMap<String, MarkerAddition>();
165 for (Entry<String, TransportMarkerAddition> e : added2.entrySet()) {
166 added.put(e.getKey(), MarkerAddition.fromTransport(e.getValue()));
167 }
168 return added;
169 }
170
171 private static Map<String, MarkerDiff> movedFromTransport(
172 Map<String, TransportMarkerDiff> mt) {
173 HashMap<String, MarkerDiff> moved = new HashMap<String, MarkerDiff>();
174 for (Entry<String, TransportMarkerDiff> e : mt.entrySet()) {
175 moved.put(e.getKey(), MarkerDiff.fromTransport(e.getValue()));
176 }
177 return moved;
178 }
179
180 private static Set<String> removedFromTransport(Set<String> tr) {
181 return tr;
182 }
183
184 }