View Javadoc
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  //	public Map<String, TransportMarker> applyTo(Map<String, TransportMarker> markers) {
58  //		Map<String, TransportMarker> markers2 = new HashMap<String, TransportMarker>();
59  //		for (Entry<String, TransportMarkerAddition> e : added.entrySet()) {
60  //			TransportMarker adjusted = e.getValue().marker; // TODO: adjust
61  //			if (adjusted != null) {
62  //				markers2.put(e.getKey(), adjusted);
63  //			}
64  //		}
65  //
66  //		for (Entry<String, TransportMarker> e : markers.entrySet()) {
67  //			if (removed.contains(e.getKey())) {
68  //				continue;
69  //			}
70  //			TransportMarker m = e.getValue();
71  //			if (added.containsKey(e.getKey())) {
72  //				 m = added.get(e.getKey()).marker;
73  //			}
74  //			TransportMarkerDiff md = moved.get(e.getKey());
75  //			if (md != null) {
76  //				markers2.put(e.getKey(), md.applyTo(m));
77  //			} else {
78  //				markers2.put(e.getKey(), m);
79  //			}
80  //		}
81  //
82  //		return markers2;
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; // No need for a defensive copy??
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; // No need for a defensive copy??
182 	}
183 	
184 }