Changeset 8811 in josm


Ignore:
Timestamp:
2015-10-01T21:06:10+02:00 (9 years ago)
Author:
simon04
Message:

see #11916 - Refactoring of SearchAction/SearchCompiler

Location:
trunk
Files:
15 edited

Legend:

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

    r8540 r8811  
    286286                if (buttonIndex == 0) {
    287287                    try {
    288                         SearchCompiler.compile(hcbSearchString.getText(), caseSensitive.isSelected(), regexSearch.isSelected());
     288                        SearchSetting ss = new SearchSetting();
     289                        ss.text = hcbSearchString.getText();
     290                        ss.caseSensitive = caseSensitive.isSelected();
     291                        ss.regexSearch = regexSearch.isSelected();
     292                        SearchCompiler.compile(ss);
    289293                        super.buttonAction(buttonIndex, evt);
    290294                    } catch (ParseError e) {
     
    454458        int foundMatches = 0;
    455459        try {
    456             String searchText = s.text;
    457             SearchCompiler.Match matcher = SearchCompiler.compile(searchText, s.caseSensitive, s.regexSearch);
     460            SearchCompiler.Match matcher = SearchCompiler.compile(s);
    458461
    459462            if (s.mode == SearchMode.replace) {
     
    508511    public static void getSelection(SearchSetting s, Collection<OsmPrimitive> all, Property<OsmPrimitive, Boolean> p) {
    509512        try {
    510             String searchText = s.text;
    511513            if (s instanceof Filter && ((Filter) s).inverted) {
    512                 searchText = String.format("-(%s)", searchText);
    513             }
    514             SearchCompiler.Match matcher = SearchCompiler.compile(searchText, s.caseSensitive, s.regexSearch);
     514                s = new SearchSetting(s);
     515                s.text = String.format("-(%s)", s.text);
     516            }
     517            SearchCompiler.Match matcher = SearchCompiler.compile(s);
    515518
    516519            for (OsmPrimitive osm : all) {
     
    540543
    541544    public static void search(String search, SearchMode mode) {
    542         search(new SearchSetting(search, mode, false, false, false));
     545        final SearchSetting searchSetting = new SearchSetting();
     546        searchSetting.text = search;
     547        searchSetting.mode = mode;
     548        search(searchSetting);
    543549    }
    544550
     
    579585
    580586    public static class SearchSetting {
    581         public String text;
    582         public SearchMode mode;
     587        public String text = "";
     588        public SearchMode mode = SearchMode.replace;
    583589        public boolean caseSensitive;
    584590        public boolean regexSearch;
     
    589595         */
    590596        public SearchSetting() {
    591             this("", SearchMode.replace, false /* case insensitive */,
    592                     false /* no regexp */, false /* only useful primitives */);
    593         }
    594 
    595         public SearchSetting(String text, SearchMode mode, boolean caseSensitive,
    596                 boolean regexSearch, boolean allElements) {
    597             this.caseSensitive = caseSensitive;
    598             this.regexSearch = regexSearch;
    599             this.allElements = allElements;
    600             this.mode = mode;
    601             this.text = text;
    602597        }
    603598
    604599        public SearchSetting(SearchSetting original) {
    605             this(original.text, original.mode, original.caseSensitive,
    606                     original.regexSearch, original.allElements);
     600            text = original.text;
     601            mode = original.mode;
     602            caseSensitive = original.caseSensitive;
     603            regexSearch = original.regexSearch;
     604            allElements = original.allElements;
    607605        }
    608606
     
    612610                    /*case sensitive*/  trc("search", "CS") :
    613611                        /*case insensitive*/  trc("search", "CI");
    614                     String rx = regexSearch ? ", " +
     612            String rx = regexSearch ? ", " +
    615613                            /*regex search*/ trc("search", "RX") : "";
    616                     String all = allElements ? ", " +
     614            String all = allElements ? ", " +
    617615                            /*all elements*/ trc("search", "A") : "";
    618                     return "\"" + text + "\" (" + cs + rx + all + ", " + mode + ")";
     616            return "\"" + text + "\" (" + cs + rx + all + ", " + mode + ")";
    619617        }
    620618
  • trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java

    r8781 r8811  
    14021402    }
    14031403
    1404     public static Match compile(String searchStr, boolean caseSensitive, boolean regexSearch) throws ParseError {
    1405         return new SearchCompiler(caseSensitive, regexSearch,
     1404    /**
     1405     * Compiles the search expression.
     1406     * @param searchStr the search expression
     1407     * @return a {@link Match} object for the expression
     1408     * @throws ParseError if an error has been encountered while compiling
     1409     * @see #compile(org.openstreetmap.josm.actions.search.SearchAction.SearchSetting)
     1410     */
     1411    public static Match compile(String searchStr) throws ParseError {
     1412        return new SearchCompiler(false, false,
    14061413                new PushbackTokenizer(
    14071414                        new PushbackReader(new StringReader(searchStr))))
    1408         .parse();
     1415                .parse();
     1416    }
     1417
     1418    /**
     1419     * Compiles the search expression.
     1420     * @param setting the settings to use
     1421     * @return a {@link Match} object for the expression
     1422     * @throws ParseError if an error has been encountered while compiling
     1423     * @see #compile(String)
     1424     */
     1425    public static Match compile(SearchAction.SearchSetting setting) throws ParseError {
     1426        return new SearchCompiler(setting.caseSensitive, setting.regexSearch,
     1427                new PushbackTokenizer(
     1428                        new PushbackReader(new StringReader(setting.text))))
     1429                .parse();
    14091430    }
    14101431
  • trunk/src/org/openstreetmap/josm/data/osm/Filter.java

    r7083 r8811  
    2222     */
    2323    public Filter() {
    24         super("", SearchMode.add, false, false, false);
    25     }
    26 
    27     public Filter(String text, SearchMode mode, boolean caseSensitive,
    28             boolean regexSearch, boolean allElements) {
    29         super(text, mode, caseSensitive, regexSearch, allElements);
     24        super();
     25        mode = SearchMode.add;
    3026    }
    3127
    3228    public Filter(FilterPreferenceEntry e) {
    33         super(e.text, SearchMode.add, false, false, false);
     29        this();
     30        text = e.text;
    3431        if ("replace".equals(e.mode)) {
    3532            mode = SearchMode.replace;
  • trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java

    r8510 r8811  
    8484            }
    8585
    86             Match compiled = SearchCompiler.compile(filter.text, filter.caseSensitive, filter.regexSearch);
     86            Match compiled = SearchCompiler.compile(filter);
    8787            this.match = filter.inverted ? new Not(compiled) : compiled;
    8888            this.isInverted = filter.inverted;
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r8767 r8811  
    795795
    796796        try {
    797             reversedDirectionKeys = SearchCompiler.compile(Main.pref.get("tags.reversed_direction", reversedDirectionDefault), false, false);
     797            reversedDirectionKeys = SearchCompiler.compile(Main.pref.get("tags.reversed_direction", reversedDirectionDefault));
    798798        } catch (ParseError e) {
    799799            Main.error("Unable to compile pattern for tags.reversed_direction, trying default pattern: " + e.getMessage());
    800800
    801801            try {
    802                 reversedDirectionKeys = SearchCompiler.compile(reversedDirectionDefault, false, false);
     802                reversedDirectionKeys = SearchCompiler.compile(reversedDirectionDefault);
    803803            } catch (ParseError e2) {
    804804                throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage(), e2);
     
    806806        }
    807807        try {
    808             directionKeys = SearchCompiler.compile(Main.pref.get("tags.direction", directionDefault), false, false);
     808            directionKeys = SearchCompiler.compile(Main.pref.get("tags.direction", directionDefault));
    809809        } catch (ParseError e) {
    810810            Main.error("Unable to compile pattern for tags.direction, trying default pattern: " + e.getMessage());
    811811
    812812            try {
    813                 directionKeys = SearchCompiler.compile(directionDefault, false, false);
     813                directionKeys = SearchCompiler.compile(directionDefault);
    814814            } catch (ParseError e2) {
    815815                throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage(), e2);
  • trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

    r8540 r8811  
    289289                    f.setBackground(UIManager.getColor("TextField.background"));
    290290                    f.setToolTipText(tr("Relation list filter"));
    291                     model.setFilter(SearchCompiler.compile(filter.getText(), false, false));
     291                    model.setFilter(SearchCompiler.compile(filter.getText()));
    292292                } catch (SearchCompiler.ParseError ex) {
    293293                    f.setBackground(new Color(255, 224, 224));
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

    r8693 r8811  
    13231323            }
    13241324
    1325             SearchSetting ss = new SearchSetting(s.toString(), SearchMode.replace, true, false, false);
     1325            final SearchSetting ss = new SearchSetting();
     1326            ss.text = s.toString();
     1327            ss.caseSensitive = true;
    13261328            org.openstreetmap.josm.actions.search.SearchAction.searchWithoutHistory(ss);
    13271329        }
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java

    r8795 r8811  
    664664            Match m;
    665665            try {
    666                 m = SearchCompiler.compile(searchStr, false, false);
     666                m = SearchCompiler.compile(searchStr);
    667667            } catch (ParseError ex) {
    668668                return null;
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java

    r8710 r8811  
    202202    public void setName_template_filter(String filter) throws SAXException {
    203203        try {
    204             this.nameTemplateFilter = SearchCompiler.compile(filter, false, false);
     204            this.nameTemplateFilter = SearchCompiler.compile(filter);
    205205        } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
    206206            Main.error("Error while parsing" + filter + ": " + e.getMessage());
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java

    r8786 r8811  
    5252
    5353import org.openstreetmap.josm.Main;
     54import org.openstreetmap.josm.actions.search.SearchAction;
    5455import org.openstreetmap.josm.actions.search.SearchCompiler;
    5556import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    204205        public void setMember_expression(String member_expression) throws SAXException {
    205206            try {
    206                 this.memberExpression = SearchCompiler.compile(member_expression, true, true);
     207                final SearchAction.SearchSetting searchSetting = new SearchAction.SearchSetting();
     208                searchSetting.text = member_expression;
     209                searchSetting.caseSensitive = true;
     210                searchSetting.regexSearch = true;
     211                this.memberExpression = SearchCompiler.compile(searchSetting);
    207212            } catch (SearchCompiler.ParseError ex) {
    208213                throw new SAXException(tr("Illegal member expression: {0}", ex.getMessage()), ex);
  • trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java

    r8510 r8811  
    196196        } else if (args.containsKey("search") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
    197197            try {
    198                 final SearchCompiler.Match search = SearchCompiler.compile(args.get("search"), false, false);
     198                final SearchCompiler.Match search = SearchCompiler.compile(args.get("search"));
    199199                Main.worker.submit(new Runnable() {
    200200                    @Override
  • trunk/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java

    r8509 r8811  
    9090                try {
    9191                    result.getEntries().add(new SearchExpressionCondition(
    92                             SearchCompiler.compile(searchExpression.getText(), false, false), condition));
     92                            SearchCompiler.compile(searchExpression.getText()), condition));
    9393                } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
    9494                    throw new ParseError(searchExpression.getPosition(), e);
     
    119119        else {
    120120            try {
    121                 Match match = SearchCompiler.compile(searchExpression.getText(), false, false);
     121                Match match = SearchCompiler.compile(searchExpression.getText());
    122122                result = new ContextSwitchTemplate(match, template, searchExpression.getPosition());
    123123            } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
  • trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.groovy

    r7938 r8811  
    55import org.openstreetmap.josm.JOSMFixture
    66import org.openstreetmap.josm.TestUtils
     7import org.openstreetmap.josm.actions.search.SearchAction
    78import org.openstreetmap.josm.actions.search.SearchCompiler
    89import org.openstreetmap.josm.data.osm.Relation
     
    2627    }
    2728
     29    static def regexpSearch(String search) {
     30        def setting = new SearchAction.SearchSetting()
     31        setting.text = search
     32        setting.regexSearch = true
     33        return setting
     34    }
     35
    2836    @Test
    2937    public void testCreate1() {
     
    3745    public void testCreate2() {
    3846        def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
    39         def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1.", false, false))
     47        def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1."))
    4048        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
    4149        assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1.1:inner, 1.1.2:inner]"
     
    4553    public void testUpdate1() {
    4654        def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
    47         def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=\".*1\$\"", false, true))
     55        def ways = Utils.filter(ds.getWays(), SearchCompiler.compile(regexpSearch("ref=\".*1\$\"")))
    4856        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
    4957        assert mp.b.getMembersCount() == 3
    5058        assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer]"
    51         def ways2 = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1.2", false, true))
     59        def ways2 = Utils.filter(ds.getWays(), SearchCompiler.compile(regexpSearch("ref=1.2")))
    5260        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, mp.b)
    5361        assert mp2.b.getMembersCount() == 4
     
    5866    public void testUpdate2() {
    5967        def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
    60         def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1.1", false, false))
     68        def ways = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1.1"))
    6169        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
    6270        assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1.1:inner]"
    63         def ways2 = Utils.filter(ds.getWays(), SearchCompiler.compile("ref=1.1 OR ref=1.2 OR ref=1.1.2", false, true))
     71        def ways2 = Utils.filter(ds.getWays(), SearchCompiler.compile(regexpSearch("ref=1.1 OR ref=1.2 OR ref=1.1.2")))
    6472        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, mp.b)
    6573        assert getRefToRoleMap(mp2.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer, 1.1.2:outer, 1.2:inner]"
  • trunk/test/unit/org/openstreetmap/josm/actions/search/SearchCompilerTest.java

    r8509 r8811  
    3131    @Test
    3232    public void testAny() throws Exception {
    33         final SearchCompiler.Match c = SearchCompiler.compile("foo", false, false);
     33        final SearchCompiler.Match c = SearchCompiler.compile("foo");
    3434        Assert.assertTrue(c.match(newPrimitive("foobar", "true")));
    3535        Assert.assertTrue(c.match(newPrimitive("name", "hello-foo-xy")));
     
    3939    @Test
    4040    public void testEquals() throws Exception {
    41         final SearchCompiler.Match c = SearchCompiler.compile("foo=bar", false, false);
     41        final SearchCompiler.Match c = SearchCompiler.compile("foo=bar");
    4242        Assert.assertFalse(c.match(newPrimitive("foobar", "true")));
    4343        Assert.assertTrue(c.match(newPrimitive("foo", "bar")));
     
    4848    @Test
    4949    public void testCompare() throws Exception {
    50         final SearchCompiler.Match c1 = SearchCompiler.compile("start_date>1950", false, false);
     50        final SearchCompiler.Match c1 = SearchCompiler.compile("start_date>1950");
    5151        Assert.assertTrue(c1.match(newPrimitive("start_date", "1950-01-01")));
    5252        Assert.assertTrue(c1.match(newPrimitive("start_date", "1960")));
     
    5454        Assert.assertFalse(c1.match(newPrimitive("start_date", "1000")));
    5555        Assert.assertTrue(c1.match(newPrimitive("start_date", "101010")));
    56         final SearchCompiler.Match c2 = SearchCompiler.compile("start_date<1960", false, false);
     56        final SearchCompiler.Match c2 = SearchCompiler.compile("start_date<1960");
    5757        Assert.assertTrue(c2.match(newPrimitive("start_date", "1950-01-01")));
    5858        Assert.assertFalse(c2.match(newPrimitive("start_date", "1960")));
     
    6060        Assert.assertTrue(c2.match(newPrimitive("start_date", "1000")));
    6161        Assert.assertTrue(c2.match(newPrimitive("start_date", "200")));
    62         final SearchCompiler.Match c3 = SearchCompiler.compile("name<I", false, false);
     62        final SearchCompiler.Match c3 = SearchCompiler.compile("name<I");
    6363        Assert.assertTrue(c3.match(newPrimitive("name", "Alpha")));
    6464        Assert.assertFalse(c3.match(newPrimitive("name", "Sigma")));
    65         final SearchCompiler.Match c4 = SearchCompiler.compile("\"start_date\"<1960", false, false);
     65        final SearchCompiler.Match c4 = SearchCompiler.compile("\"start_date\"<1960");
    6666        Assert.assertTrue(c4.match(newPrimitive("start_date", "1950-01-01")));
    6767        Assert.assertFalse(c4.match(newPrimitive("start_date", "2000")));
     
    8383        way.addNode(node1);
    8484        way.addNode(node2);
    85         Assert.assertFalse(SearchCompiler.compile("nth:2", false, false).match(node1));
    86         Assert.assertTrue(SearchCompiler.compile("nth:1", false, false).match(node1));
    87         Assert.assertFalse(SearchCompiler.compile("nth:0", false, false).match(node1));
    88         Assert.assertTrue(SearchCompiler.compile("nth:0", false, false).match(node0));
    89         Assert.assertTrue(SearchCompiler.compile("nth:2", false, false).match(node2));
    90         Assert.assertTrue(SearchCompiler.compile("nth:-1", false, false).match(node2));
    91         Assert.assertTrue(SearchCompiler.compile("nth:-2", false, false).match(node1));
    92         Assert.assertTrue(SearchCompiler.compile("nth:-3", false, false).match(node0));
     85        Assert.assertFalse(SearchCompiler.compile("nth:2").match(node1));
     86        Assert.assertTrue(SearchCompiler.compile("nth:1").match(node1));
     87        Assert.assertFalse(SearchCompiler.compile("nth:0").match(node1));
     88        Assert.assertTrue(SearchCompiler.compile("nth:0").match(node0));
     89        Assert.assertTrue(SearchCompiler.compile("nth:2").match(node2));
     90        Assert.assertTrue(SearchCompiler.compile("nth:-1").match(node2));
     91        Assert.assertTrue(SearchCompiler.compile("nth:-2").match(node1));
     92        Assert.assertTrue(SearchCompiler.compile("nth:-3").match(node0));
    9393    }
    9494
    9595    @Test
    9696    public void testNthParseNegative() throws Exception {
    97         Assert.assertThat(SearchCompiler.compile("nth:-1", false, false).toString(), CoreMatchers.is("Nth{nth=-1, modulo=false}"));
     97        Assert.assertThat(SearchCompiler.compile("nth:-1").toString(), CoreMatchers.is("Nth{nth=-1, modulo=false}"));
    9898
    9999    }
  • trunk/test/unit/org/openstreetmap/josm/tools/template_engine/TemplateEngineTest.java

    r8540 r8811  
    6161
    6262    private static Match compile(String expression) throws org.openstreetmap.josm.actions.search.SearchCompiler.ParseError {
    63         return SearchCompiler.compile(expression, false, false);
     63        return SearchCompiler.compile(expression);
    6464    }
    6565
Note: See TracChangeset for help on using the changeset viewer.