source: josm/trunk/src/org/openstreetmap/josm/data/validation/TestError.java@ 7489

Last change on this file since 7489 was 7005, checked in by Don-vip, 10 years ago

see #8465 - use diamond operator where applicable

  • Property svn:eol-style set to native
File size: 10.5 KB
Line 
1// License: GPL. See LICENSE file for details.
2package org.openstreetmap.josm.data.validation;
3
4import java.util.ArrayList;
5import java.util.Collection;
6import java.util.Collections;
7import java.util.List;
8import java.util.TreeSet;
9
10import org.openstreetmap.josm.Main;
11import org.openstreetmap.josm.command.Command;
12import org.openstreetmap.josm.data.osm.Node;
13import org.openstreetmap.josm.data.osm.OsmPrimitive;
14import org.openstreetmap.josm.data.osm.Relation;
15import org.openstreetmap.josm.data.osm.Way;
16import org.openstreetmap.josm.data.osm.WaySegment;
17import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
18import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
19import org.openstreetmap.josm.data.osm.event.DataSetListener;
20import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
21import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
22import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
23import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
24import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
25import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
26import org.openstreetmap.josm.data.validation.util.MultipleNameVisitor;
27import org.openstreetmap.josm.tools.AlphanumComparator;
28
29/**
30 * Validation error
31 * @since 3669
32 */
33public class TestError implements Comparable<TestError>, DataSetListener {
34 /** is this error on the ignore list */
35 private Boolean ignored = false;
36 /** Severity */
37 private Severity severity;
38 /** The error message */
39 private String message;
40 /** Deeper error description */
41 private String description;
42 private String description_en;
43 /** The affected primitives */
44 private Collection<? extends OsmPrimitive> primitives;
45 /** The primitives or way segments to be highlighted */
46 private Collection<?> highlighted;
47 /** The tester that raised this error */
48 private Test tester;
49 /** Internal code used by testers to classify errors */
50 private int code;
51 /** If this error is selected */
52 private boolean selected;
53
54 /**
55 * Constructs a new {@code TestError}.
56 * @param tester The tester
57 * @param severity The severity of this error
58 * @param message The error message
59 * @param primitives The affected primitives
60 * @param code The test error reference code
61 */
62 public TestError(Test tester, Severity severity, String message, String description, String description_en,
63 int code, Collection<? extends OsmPrimitive> primitives, Collection<?> highlighted) {
64 this.tester = tester;
65 this.severity = severity;
66 this.message = message;
67 this.description = description;
68 this.description_en = description_en;
69 this.primitives = primitives;
70 this.highlighted = highlighted;
71 this.code = code;
72 }
73
74 public TestError(Test tester, Severity severity, String message, int code, Collection<? extends OsmPrimitive> primitives,
75 Collection<?> highlighted) {
76 this(tester, severity, message, null, null, code, primitives, highlighted);
77 }
78
79 public TestError(Test tester, Severity severity, String message, String description, String description_en,
80 int code, Collection<? extends OsmPrimitive> primitives) {
81 this(tester, severity, message, description, description_en, code, primitives, primitives);
82 }
83
84 public TestError(Test tester, Severity severity, String message, int code, Collection<? extends OsmPrimitive> primitives) {
85 this(tester, severity, message, null, null, code, primitives, primitives);
86 }
87
88 public TestError(Test tester, Severity severity, String message, int code, OsmPrimitive primitive) {
89 this(tester, severity, message, null, null, code, Collections.singletonList(primitive), Collections
90 .singletonList(primitive));
91 }
92
93 public TestError(Test tester, Severity severity, String message, String description, String description_en,
94 int code, OsmPrimitive primitive) {
95 this(tester, severity, message, description, description_en, code, Collections.singletonList(primitive));
96 }
97
98 /**
99 * Gets the error message
100 * @return the error message
101 */
102 public String getMessage() {
103 return message;
104 }
105
106 /**
107 * Gets the error message
108 * @return the error description
109 */
110 public String getDescription() {
111 return description;
112 }
113
114 /**
115 * Sets the error message
116 * @param message The error message
117 */
118 public void setMessage(String message) {
119 this.message = message;
120 }
121
122 /**
123 * Gets the list of primitives affected by this error
124 * @return the list of primitives affected by this error
125 */
126 public Collection<? extends OsmPrimitive> getPrimitives() {
127 return primitives;
128 }
129
130 /**
131 * Gets the list of primitives affected by this error and are selectable
132 * @return the list of selectable primitives affected by this error
133 */
134 public Collection<? extends OsmPrimitive> getSelectablePrimitives() {
135 List<OsmPrimitive> selectablePrimitives = new ArrayList<>(primitives.size());
136 for (OsmPrimitive o : primitives) {
137 if (o.isSelectable()) {
138 selectablePrimitives.add(o);
139 }
140 }
141 return selectablePrimitives;
142 }
143
144 /**
145 * Sets the list of primitives affected by this error
146 * @param primitives the list of primitives affected by this error
147 */
148 public void setPrimitives(List<OsmPrimitive> primitives) {
149 this.primitives = primitives;
150 }
151
152 /**
153 * Gets the severity of this error
154 * @return the severity of this error
155 */
156 public Severity getSeverity() {
157 return severity;
158 }
159
160 /**
161 * Sets the severity of this error
162 * @param severity the severity of this error
163 */
164 public void setSeverity(Severity severity) {
165 this.severity = severity;
166 }
167
168 /**
169 * Sets the ignore state for this error
170 */
171 public String getIgnoreState() {
172 Collection<String> strings = new TreeSet<>();
173 StringBuilder ignorestring = new StringBuilder(getIgnoreSubGroup());
174 for (OsmPrimitive o : primitives) {
175 // ignore data not yet uploaded
176 if (o.isNew())
177 return null;
178 String type = "u";
179 if (o instanceof Way) {
180 type = "w";
181 } else if (o instanceof Relation) {
182 type = "r";
183 } else if (o instanceof Node) {
184 type = "n";
185 }
186 strings.add(type + "_" + o.getId());
187 }
188 for (String o : strings) {
189 ignorestring.append(":").append(o);
190 }
191 return ignorestring.toString();
192 }
193
194 public String getIgnoreSubGroup() {
195 String ignorestring = getIgnoreGroup();
196 if (description_en != null) {
197 ignorestring += "_" + description_en;
198 }
199 return ignorestring;
200 }
201
202 public String getIgnoreGroup() {
203 return Integer.toString(code);
204 }
205
206 public void setIgnored(boolean state) {
207 ignored = state;
208 }
209
210 public Boolean getIgnored() {
211 return ignored;
212 }
213
214 /**
215 * Gets the tester that raised this error
216 * @return the tester that raised this error
217 */
218 public Test getTester() {
219 return tester;
220 }
221
222 public void setTester(Test tester) {
223 this.tester = tester;
224 }
225
226 /**
227 * Gets the code
228 * @return the code
229 */
230 public int getCode() {
231 return code;
232 }
233
234 /**
235 * Returns true if the error can be fixed automatically
236 *
237 * @return true if the error can be fixed
238 */
239 public boolean isFixable() {
240 return tester != null && tester.isFixable(this);
241 }
242
243 /**
244 * Fixes the error with the appropriate command
245 *
246 * @return The command to fix the error
247 */
248 public Command getFix() {
249 if (tester == null || !tester.isFixable(this) || primitives.isEmpty())
250 return null;
251
252 return tester.fixError(this);
253 }
254
255 /**
256 * Sets the selection flag of this error
257 * @param selected if this error is selected
258 */
259 public void setSelected(boolean selected) {
260 this.selected = selected;
261 }
262
263 @SuppressWarnings("unchecked")
264 public void visitHighlighted(ValidatorVisitor v) {
265 for (Object o : highlighted) {
266 if (o instanceof OsmPrimitive) {
267 v.visit((OsmPrimitive) o);
268 } else if (o instanceof WaySegment) {
269 v.visit((WaySegment) o);
270 } else if (o instanceof List<?>) {
271 v.visit((List<Node>)o);
272 }
273 }
274 }
275
276 /**
277 * Returns the selection flag of this error
278 * @return true if this error is selected
279 * @since 5671
280 */
281 public boolean isSelected() {
282 return selected;
283 }
284
285 /**
286 * Returns The primitives or way segments to be highlighted
287 * @return The primitives or way segments to be highlighted
288 * @since 5671
289 */
290 public Collection<?> getHighlighted() {
291 return highlighted;
292 }
293
294 @Override
295 public int compareTo(TestError o) {
296 if (equals(o)) return 0;
297
298 MultipleNameVisitor v1 = new MultipleNameVisitor();
299 MultipleNameVisitor v2 = new MultipleNameVisitor();
300
301 v1.visit(getPrimitives());
302 v2.visit(o.getPrimitives());
303 return AlphanumComparator.getInstance().compare(v1.toString(), v2.toString());
304 }
305
306 @Override public void primitivesRemoved(PrimitivesRemovedEvent event) {
307 // Remove purged primitives (fix #8639)
308 try {
309 primitives.removeAll(event.getPrimitives());
310 } catch (UnsupportedOperationException e) {
311 if (event.getPrimitives().containsAll(primitives)) {
312 primitives = Collections.emptyList();
313 } else {
314 Main.warn("Unable to remove primitives from "+this);
315 }
316 }
317 }
318
319 @Override public void primitivesAdded(PrimitivesAddedEvent event) {}
320 @Override public void tagsChanged(TagsChangedEvent event) {}
321 @Override public void nodeMoved(NodeMovedEvent event) {}
322 @Override public void wayNodesChanged(WayNodesChangedEvent event) {}
323 @Override public void relationMembersChanged(RelationMembersChangedEvent event) {}
324 @Override public void otherDatasetChange(AbstractDatasetChangedEvent event) {}
325 @Override public void dataChanged(DataChangedEvent event) {}
326
327 @Override
328 public String toString() {
329 return "TestError [tester=" + tester + ", code=" + code + "]";
330 }
331}
Note: See TracBrowser for help on using the repository browser.