Ticket #4646: 4646.patch

File 4646.patch, 6.8 KB (added by simon04, 21 months 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}