source: josm/trunk/src/org/openstreetmap/josm/actions/ValidateAction.java@ 8899

Last change on this file since 8899 was 8855, checked in by Don-vip, 9 years ago

sonar - Unused private method should be removed
sonar - Unused protected methods should be removed
sonar - Sections of code should not be "commented out"
sonar - Empty statements should be removed
sonar - squid:S1172 - Unused method parameters should be removed
sonar - squid:S1481 - Unused local variables should be removed

  • Property svn:eol-style set to native
File size: 6.8 KB
RevLine 
[8378]1// License: GPL. For details, see LICENSE file.
[3669]2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.io.IOException;
9import java.util.ArrayList;
10import java.util.Collection;
11import java.util.List;
12
13import org.openstreetmap.josm.Main;
14import org.openstreetmap.josm.data.osm.OsmPrimitive;
15import org.openstreetmap.josm.data.validation.OsmValidator;
16import org.openstreetmap.josm.data.validation.Test;
17import org.openstreetmap.josm.data.validation.TestError;
[4075]18import org.openstreetmap.josm.data.validation.util.AggregatePrimitivesVisitor;
[3669]19import org.openstreetmap.josm.gui.PleaseWaitRunnable;
[6529]20import org.openstreetmap.josm.gui.preferences.validator.ValidatorPreference;
[5452]21import org.openstreetmap.josm.gui.util.GuiHelper;
[3669]22import org.openstreetmap.josm.io.OsmTransferException;
23import org.openstreetmap.josm.tools.Shortcut;
24import org.xml.sax.SAXException;
25
26/**
27 * The action that does the validate thing.
28 * <p>
29 * This action iterates through all active tests and give them the data, so that
30 * each one can test it.
31 *
32 * @author frsantos
33 */
34public class ValidateAction extends JosmAction {
[4874]35
[3669]36 /** Last selection used to validate */
[8308]37 private transient Collection<OsmPrimitive> lastSelection;
[3669]38
39 /**
40 * Constructor
41 */
42 public ValidateAction() {
43 super(tr("Validation"), "dialogs/validator", tr("Performs the data validation"),
[5463]44 Shortcut.registerShortcut("tools:validate", tr("Tool: {0}", tr("Validation")),
45 KeyEvent.VK_V, Shortcut.SHIFT), true);
[3669]46 }
47
[6084]48 @Override
[3669]49 public void actionPerformed(ActionEvent ev) {
[8855]50 doValidate(true);
[3669]51 }
52
53 /**
54 * Does the validation.
55 * <p>
56 * If getSelectedItems is true, the selected items (or all items, if no one
57 * is selected) are validated. If it is false, last selected items are
58 * revalidated
59 *
60 * @param getSelectedItems If selected or last selected items must be validated
61 */
[8855]62 public void doValidate(boolean getSelectedItems) {
[5463]63 if (Main.map == null || !Main.map.isVisible())
[3669]64 return;
65
[6779]66 OsmValidator.initializeTests();
[3669]67 OsmValidator.initializeErrorLayer();
68
69 Collection<Test> tests = OsmValidator.getEnabledTests(false);
70 if (tests.isEmpty())
71 return;
72
73 Collection<OsmPrimitive> selection;
74 if (getSelectedItems) {
[5360]75 selection = Main.main.getCurrentDataSet().getAllSelected();
[3669]76 if (selection.isEmpty()) {
77 selection = Main.main.getCurrentDataSet().allNonDeletedPrimitives();
78 lastSelection = null;
79 } else {
[4075]80 AggregatePrimitivesVisitor v = new AggregatePrimitivesVisitor();
[3669]81 selection = v.visit(selection);
82 lastSelection = selection;
83 }
84 } else {
[3671]85 if (lastSelection == null) {
[3669]86 selection = Main.main.getCurrentDataSet().allNonDeletedPrimitives();
[3671]87 } else {
[3669]88 selection = lastSelection;
[3671]89 }
[3669]90 }
91
92 ValidationTask task = new ValidationTask(tests, selection, lastSelection);
93 Main.worker.submit(task);
94 }
95
96 @Override
97 public void updateEnabledState() {
98 setEnabled(getEditLayer() != null);
99 }
100
[5526]101 @Override
102 public void destroy() {
103 // Hack - this action should stay forever because it could be added to toolbar
104 // Do not call super.destroy() here
105 }
106
[3669]107 /**
108 * Asynchronous task for running a collection of tests against a collection
109 * of primitives
110 *
111 */
[4874]112 static class ValidationTask extends PleaseWaitRunnable {
[3669]113 private Collection<Test> tests;
[4076]114 private Collection<OsmPrimitive> validatedPrimitives;
[3669]115 private Collection<OsmPrimitive> formerValidatedPrimitives;
116 private boolean canceled;
117 private List<TestError> errors;
118
119 /**
120 *
121 * @param tests the tests to run
122 * @param validatedPrimitives the collection of primitives to validate.
123 * @param formerValidatedPrimitives the last collection of primitives being validates. May be null.
124 */
[8836]125 ValidationTask(Collection<Test> tests, Collection<OsmPrimitive> validatedPrimitives,
[8509]126 Collection<OsmPrimitive> formerValidatedPrimitives) {
[3669]127 super(tr("Validating"), false /*don't ignore exceptions */);
[4076]128 this.validatedPrimitives = validatedPrimitives;
[3669]129 this.formerValidatedPrimitives = formerValidatedPrimitives;
130 this.tests = tests;
131 }
132
133 @Override
134 protected void cancel() {
135 this.canceled = true;
136 }
137
138 @Override
139 protected void finish() {
140 if (canceled) return;
141
142 // update GUI on Swing EDT
143 //
[5452]144 GuiHelper.runInEDT(new Runnable() {
[3671]145 @Override
[3669]146 public void run() {
147 Main.map.validatorDialog.tree.setErrors(errors);
148 Main.map.validatorDialog.unfurlDialog();
149 Main.main.getCurrentDataSet().fireSelectionChanged();
150 }
[5452]151 });
[3669]152 }
153
154 @Override
155 protected void realRun() throws SAXException, IOException,
[4874]156 OsmTransferException {
[3671]157 if (tests == null || tests.isEmpty())
158 return;
[7005]159 errors = new ArrayList<>(200);
[4076]160 getProgressMonitor().setTicksCount(tests.size() * validatedPrimitives.size());
[3669]161 int testCounter = 0;
162 for (Test test : tests) {
[3671]163 if (canceled)
164 return;
[3669]165 testCounter++;
[8510]166 getProgressMonitor().setCustomText(tr("Test {0}/{1}: Starting {2}", testCounter, tests.size(), test.getName()));
[3669]167 test.setPartialSelection(formerValidatedPrimitives != null);
[4076]168 test.startTest(getProgressMonitor().createSubTaskMonitor(validatedPrimitives.size(), false));
169 test.visit(validatedPrimitives);
[3669]170 test.endTest();
171 errors.addAll(test.getErrors());
172 }
173 tests = null;
174 if (Main.pref.getBoolean(ValidatorPreference.PREF_USE_IGNORE, true)) {
175 getProgressMonitor().subTask(tr("Updating ignored errors ..."));
176 for (TestError error : errors) {
177 if (canceled) return;
[7005]178 List<String> s = new ArrayList<>();
[3669]179 s.add(error.getIgnoreState());
180 s.add(error.getIgnoreGroup());
181 s.add(error.getIgnoreSubGroup());
182 for (String state : s) {
183 if (state != null && OsmValidator.hasIgnoredError(state)) {
184 error.setIgnored(true);
185 }
186 }
187 }
188 }
189 }
190 }
191}
Note: See TracBrowser for help on using the repository browser.