Ticket #4646: 4646.patch

File 4646.patch, 6.8 KB (added by simon04, 15 years ago)
  • src/org/openstreetmap/josm/data/validation/tests/UntaggedNode.java

    diff --git a/src/org/openstreetmap/josm/data/validation/tests/UntaggedNode.java b/src/org/openstreetmap/josm/data/validation/tests/UntaggedNode.java
    index d6eb236..0ee9003 100644
    a b import static org.openstreetmap.josm.tools.I18n.marktr;  
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66
    77import java.util.Collection;
     8import java.util.HashMap;
     9import java.util.LinkedList;
    810import java.util.Map;
    911
    1012import org.openstreetmap.josm.Main;
    import org.openstreetmap.josm.data.osm.OsmPrimitive;  
    1517import org.openstreetmap.josm.data.validation.Severity;
    1618import org.openstreetmap.josm.data.validation.Test;
    1719import org.openstreetmap.josm.data.validation.TestError;
    18 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    1920
    2021/**
    2122 * Checks for nodes with uninteresting tags that are in no way
    public class UntaggedNode extends Test {  
    4142    }
    4243
    4344    @Override
    44     public void startTest(ProgressMonitor monitor) {
    45         super.startTest(monitor);
    46     }
    47 
    48     @Override
    4945    public void visit(Collection<OsmPrimitive> selection) {
    5046        for (OsmPrimitive p : selection) {
    5147            if (p.isUsable() && p instanceof Node) {
    public class UntaggedNode extends Test {  
    5450        }
    5551    }
    5652
     53    Map<Integer,TestError> fixableErrors = new HashMap<Integer, TestError>();
     54
    5755    @Override
    5856    public void visit(Node n) {
    59         if(n.isUsable() && !n.isTagged() && n.getReferrers().isEmpty()) {
     57        if (n.isUsable() && !n.isTagged() && n.getReferrers().isEmpty()
     58                && Main.main.getCurrentDataSet().getDataSourceArea().contains(n.getCoor())) {
    6059            if (!n.hasKeys()) {
    61                 String msg = marktr("No tags");
    62                 errors.add(new TestError(this, Severity.WARNING, tr("Unconnected nodes without physical tags"), tr(msg), msg, UNTAGGED_NODE_BLANK, n));
     60                addError(marktr("No tags"), UNTAGGED_NODE_BLANK, n);
    6361                return;
    6462            }
    6563            for (Map.Entry<String, String> tag : n.getKeys().entrySet()) {
    public class UntaggedNode extends Test {  
    6765                if (contains(tag, "fixme") || contains(tag, "FIXME")) {
    6866                    /* translation note: don't translate quoted words */
    6967                    String msg = marktr("Has tag containing ''fixme'' or ''FIXME''");
    70                     errors.add(new TestError(this, Severity.WARNING, tr("Unconnected nodes without physical tags"),
    71                             tr(msg), msg, UNTAGGED_NODE_FIXME, n));
     68                    addError(msg, UNTAGGED_NODE_FIXME, n);
    7269                    return;
    7370                }
    7471
    75                 String msg = null;
    76                 int code = 0;
    7772                if (key.startsWith("note") || key.startsWith("comment") || key.startsWith("description")) {
    7873                    /* translation note: don't translate quoted words */
    79                     msg = marktr("Has key ''note'' or ''comment'' or ''description''");
    80                     code = UNTAGGED_NODE_NOTE;
     74                    String msg = marktr("Has key ''note'' or ''comment'' or ''description''");
     75                    addError(msg, UNTAGGED_NODE_NOTE, n);
     76                    return;
    8177                } else if (key.startsWith("created_by") || key.startsWith("converted_by")) {
    8278                    /* translation note: don't translate quoted words */
    83                     msg = marktr("Has key ''created_by'' or ''converted_by''");
    84                     code = UNTAGGED_NODE_CREATED_BY;
     79                    String msg = marktr("Has key ''created_by'' or ''converted_by''");
     80                    addError(msg, UNTAGGED_NODE_CREATED_BY, n);
     81                    return;
    8582                } else if (key.startsWith("watch")) {
    8683                    /* translation note: don't translate quoted words */
    87                     msg = marktr("Has key ''watch''");
    88                     code = UNTAGGED_NODE_WATCH;
     84                    String msg = marktr("Has key ''watch''");
     85                    addError(msg, UNTAGGED_NODE_WATCH, n);
     86                    return;
    8987                } else if (key.startsWith("source")) {
    9088                    /* translation note: don't translate quoted words */
    91                     msg = marktr("Has key ''source''");
    92                     code = UNTAGGED_NODE_SOURCE;
    93                 }
    94                 if (msg != null) {
    95                     errors.add(new TestError(this, Severity.WARNING, tr("Unconnected nodes without physical tags"),
    96                             tr(msg), msg, code, n));
     89                    String msg = marktr("Has key ''source''");
     90                    addError(msg, UNTAGGED_NODE_SOURCE, n);
    9791                    return;
    9892                }
    9993            }
    10094            // Does not happen, but just to be sure. Maybe definition of uninteresting tags changes in future.
    101             errors.add(new TestError(this, Severity.WARNING, tr("Unconnected nodes without physical tags"),
    102                     tr("Other"), "Other", UNTAGGED_NODE_OTHER, n));
     95            addError(tr("Other"), UNTAGGED_NODE_OTHER, n);
     96        }
     97    }
     98
     99    @SuppressWarnings("unchecked")
     100    private void addError(String msg, int code, OsmPrimitive n) {
     101        final String errMsg = tr("Unconnected nodes without physical tags");
     102        if (!isFixable(code)) {
     103            errors.add(new TestError(this, Severity.WARNING, errMsg, tr(msg), msg, code, n));
     104        } else {
     105            TestError err = fixableErrors.get(code);
     106            if (err == null) {
     107                err = new TestError(this, Severity.WARNING, errMsg, tr(msg), msg,
     108                        code, new LinkedList<OsmPrimitive>());
     109                fixableErrors.put(code, err);
     110                errors.add(err);
     111            }
     112            ((Collection<OsmPrimitive>) err.getPrimitives()).add(n);
    103113        }
    104114    }
    105115
    106116    private boolean contains(Map.Entry<String, String> tag, String s) {
    107         return tag.getKey().indexOf(s) != -1 || tag.getValue().indexOf(s) != -1;
     117        return tag.getKey().contains(s) || tag.getValue().contains(s);
    108118    }
    109119
    110120    @Override
    public class UntaggedNode extends Test {  
    115125    @Override
    116126    public boolean isFixable(TestError testError) {
    117127        if (testError.getTester() instanceof UntaggedNode) {
    118             int code = testError.getCode();
    119             switch (code) {
     128            return isFixable(testError.getCode());
     129        }
     130        return false;
     131    }
     132
     133    private boolean isFixable(int code) {
     134        switch (code) {
    120135            case UNTAGGED_NODE_BLANK:
    121136            case UNTAGGED_NODE_CREATED_BY:
    122137            case UNTAGGED_NODE_WATCH:
    123138            case UNTAGGED_NODE_SOURCE:
    124139                return true;
    125             }
     140            default:
     141                return false;
    126142        }
    127         return false;
    128143    }
    129144}