Changeset 2863 in josm


Ignore:
Timestamp:
2010-01-15T21:58:46+01:00 (11 years ago)
Author:
jttt
Message:

Fixed #4377 routes plugin search for user names defect, added boolean search operator

Location:
trunk/src/org/openstreetmap/josm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/search/PushbackTokenizer.java

    r2777 r2863  
    11// License: GPL. Copyright 2007 by Immanuel Scholz and others
    22package org.openstreetmap.josm.actions.search;
     3
     4import static org.openstreetmap.josm.tools.I18n.marktr;
     5import static org.openstreetmap.josm.tools.I18n.tr;
    36
    47import java.io.IOException;
     
    1922    }
    2023
    21     public enum Token {NOT, OR, LEFT_PARENT, RIGHT_PARENT, COLON, EQUALS, KEY, EOF}
     24    public enum Token {
     25        NOT(marktr("<not>")), OR(marktr("<or>")), LEFT_PARENT(marktr("<left parent>")),
     26        RIGHT_PARENT(marktr("<right parent>")), COLON(marktr("<colon>")), EQUALS(marktr("<equals>")),
     27        KEY(marktr("<key>")), QUESTION_MARK(marktr("<question mark>")), EOF(marktr("<end-of-file>"));
     28
     29        private Token(String name) {
     30            this.name = name;
     31        }
     32
     33        private final String name;
     34
     35        @Override
     36        public String toString() {
     37            return tr(name);
     38        }
     39    }
     40
    2241
    2342    private void getChar() {
     
    6988            getChar();
    7089            return Token.OR;
     90        case '?':
     91            getChar();
     92            return Token.QUESTION_MARK;
    7193        case '"':
    7294        {
     
    90112        {
    91113            StringBuilder s = new StringBuilder();
    92             while (!(c == -1 || Character.isWhitespace(c) || c == '"'|| c == ':' || c == '(' || c == ')' || c == '|' || c == '=')) {
     114            while (!(c == -1 || Character.isWhitespace(c) || c == '"'|| c == ':' || c == '(' || c == ')' || c == '|' || c == '=' || c == '?')) {
    93115                s.append((char)c);
    94116                getChar();
  • trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java

    r2857 r2863  
    122122                    + "<li>"+tr("<b>type=*</b> - key ''type'' with any value. Try also <b>*=value</b>, <b>type=</b>, <b>*=*</b>, <b>*=</b>") + "</li>"
    123123                    + "<li>"+tr("<b>-name:Bak</b> - not ''Bak'' in the name.")+"</li>"
     124                    + "<li>"+tr("<b>oneway?</b> - oneway=yes, true, 1 or on")+"</li>"
    124125                    + "<li>"+tr("<b>foot:</b> - key=foot set to any value.")+"</li>"
    125126                    + "<li>"+tr("<u>Special targets:</u>")+"</li>"
     
    321322        public String toString() {
    322323            String cs = caseSensitive ?
    323                     /*case sensitive*/  trc("search", "CS") :                               
     324                    /*case sensitive*/  trc("search", "CS") :
    324325                        /*case insensitive*/  trc("search", "CI");
    325326                    /*regex search*/
    326             String rx = regexSearch ? (", " + trc("search", "RX")) : "";
    327             return "\"" + text + "\" (" + cs + rx + ", " + mode + ")";
     327                    String rx = regexSearch ? (", " + trc("search", "RX")) : "";
     328                    return "\"" + text + "\" (" + cs + rx + ", " + mode + ")";
    328329        }
    329330
  • trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java

    r2791 r2863  
    77import java.io.PushbackReader;
    88import java.io.StringReader;
    9 import java.util.List;
    109import java.util.Map.Entry;
    1110import java.util.regex.Matcher;
     
    1716import org.openstreetmap.josm.data.osm.Node;
    1817import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.OsmUtils;
    1919import org.openstreetmap.josm.data.osm.Relation;
    2020import org.openstreetmap.josm.data.osm.RelationMember;
    21 import org.openstreetmap.josm.data.osm.User;
    2221import org.openstreetmap.josm.data.osm.Way;
    2322import org.openstreetmap.josm.tools.DateUtils;
     
    3635 ( expression )
    3736 -fact
     37 term?
    3838 term=term
    3939 term:term
     
    8080        }
    8181        @Override public String toString() {return "!"+match;}
     82    }
     83
     84    private static class BooleanMatch extends Match {
     85        private final String key;
     86        private final boolean defaultValue;
     87
     88        public BooleanMatch(String key, boolean defaultValue) {
     89            this.key = key;
     90            this.defaultValue = defaultValue;
     91        }
     92        @Override
     93        public boolean match(OsmPrimitive osm) {
     94            Boolean ret = OsmUtils.getOsmBoolean(osm.get(key));
     95            if (ret == null)
     96                return defaultValue;
     97            else
     98                return ret;
     99        }
    82100    }
    83101
     
    430448
    431449    private static class UserMatch extends Match {
    432         private User user;
     450        private String user;
    433451        public UserMatch(String user) {
    434452            if (user.equals("anonymous")) {
    435453                this.user = null;
    436454            } else {
    437                 List<User> users = User.getByName(user);
    438                 if (!users.isEmpty()) {
    439                     // selecting an arbitrary user
    440                     this.user = users.get(0);
    441                 } else {
    442                     this.user = User.createLocalUser(user);
    443                 }
    444             }
    445         }
    446 
    447         @Override public boolean match(OsmPrimitive osm) {
    448             if (osm.getUser() == null && user == null) return true;
    449             if (osm.getUser() == null) return false;
    450             return osm.getUser().equals(user);
     455                this.user = user;
     456            }
     457        }
     458
     459        @Override public boolean match(OsmPrimitive osm) {
     460            if (osm.getUser() == null)
     461                return user == null;
     462            else
     463                return osm.getUser().hasName(user);
    451464        }
    452465
    453466        @Override public String toString() {
    454             return "user=" + user == null ? "" : user.getName();
     467            return "user=" + user == null ? "" : user;
    455468        }
    456469    }
     
    641654            Match expression = parseExpression();
    642655            if (!tokenizer.readIfEqual(Token.RIGHT_PARENT))
    643                 throw new ParseError(tr("Missing right parenthesis"));
     656                throw new ParseError(tr("Unexpected token. Expected {0}, found {1}", Token.RIGHT_PARENT, tokenizer.nextToken()));
    644657            return expression;
    645658        } else if (tokenizer.readIfEqual(Token.NOT))
     
    651664            else if (tokenizer.readIfEqual(Token.COLON))
    652665                return parseKV(key, tokenizer.readText());
     666            else if (tokenizer.readIfEqual(Token.QUESTION_MARK))
     667                return new BooleanMatch(key, false);
    653668            else if ("modified".equals(key))
    654669                return new Modified();
  • trunk/src/org/openstreetmap/josm/data/osm/User.java

    r2711 r2863  
    118118    }
    119119
    120     /*
     120    /**
    121121     * Returns the list of user names
    122122     *
     
    127127    }
    128128
    129     /*
     129    /**
    130130     * Adds a user name to the list if it is not there, yet.
    131131     *
     
    136136    }
    137137
    138     /*
     138    /**
    139139     * Returns true if the name is in the names list
    140140     *
Note: See TracChangeset for help on using the changeset viewer.