Changeset 18195 in josm for trunk/src


Ignore:
Timestamp:
2021-09-07T23:46:34+02:00 (3 years ago)
Author:
Don-vip
Message:

fix #21300 - NPE in search compiler (patch by taylor.smock)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/search/SearchCompiler.java

    r17787 r18195  
    291291            return match(object);
    292292        }
     293
     294        /**
     295         * Check if this is a valid match object
     296         * @return {@code this}, for easy chaining
     297         * @throws SearchParseError If the match is not valid
     298         */
     299        public Match validate() throws SearchParseError {
     300            // Default to no-op
     301            return this;
     302        }
    293303    }
    294304
     
    861871                return false;
    862872            return true;
     873        }
     874
     875        @Override
     876        public Match validate() throws SearchParseError {
     877            if (this.referenceValue == null) {
     878                final String referenceType;
     879                if (this.compareMode == +1) {
     880                    referenceType = ">";
     881                } else if (this.compareMode == -1) {
     882                    referenceType = "<";
     883                } else {
     884                    referenceType = "<unknown>";
     885                }
     886                throw new SearchParseError(tr("Reference value for ''{0}'' expected", referenceType));
     887            }
     888            return this;
    863889        }
    864890    }
     
    21092135            String key = tokenizer.getText();
    21102136            if (tokenizer.readIfEqual(Token.EQUALS)) {
    2111                 return new ExactKeyValue(regexSearch, caseSensitive, key, tokenizer.readTextOrNumber());
     2137                return new ExactKeyValue(regexSearch, caseSensitive, key, tokenizer.readTextOrNumber()).validate();
    21122138            } else if (tokenizer.readIfEqual(Token.TILDE)) {
    2113                 return new ExactKeyValue(true, caseSensitive, key, tokenizer.readTextOrNumber());
     2139                return new ExactKeyValue(true, caseSensitive, key, tokenizer.readTextOrNumber()).validate();
    21142140            } else if (tokenizer.readIfEqual(Token.LESS_THAN)) {
    2115                 return new ValueComparison(key, tokenizer.readTextOrNumber(), -1);
     2141                return new ValueComparison(key, tokenizer.readTextOrNumber(), -1).validate();
    21162142            } else if (tokenizer.readIfEqual(Token.GREATER_THAN)) {
    2117                 return new ValueComparison(key, tokenizer.readTextOrNumber(), +1);
     2143                return new ValueComparison(key, tokenizer.readTextOrNumber(), +1).validate();
    21182144            } else if (tokenizer.readIfEqual(Token.COLON)) {
    21192145                // see if we have a Match that takes a data parameter
     
    21242150                UnaryMatchFactory unaryFactory = unaryMatchFactoryMap.get(key);
    21252151                if (unaryFactory != null)
    2126                     return unaryFactory.get(key, parseFactor(), tokenizer);
     2152                    return unaryFactory.get(key, parseFactor(), tokenizer).validate();
    21272153
    21282154                // key:value form where value is a string (may be OSM key search)
    21292155                final String value = tokenizer.readTextOrNumber();
    2130                 return new KeyValue(key, value != null ? value : "", regexSearch, caseSensitive);
     2156                return new KeyValue(key, value != null ? value : "", regexSearch, caseSensitive).validate();
    21312157            } else if (tokenizer.readIfEqual(Token.QUESTION_MARK))
    21322158                return new BooleanMatch(key, false);
     
    21342160                SimpleMatchFactory factory = simpleMatchFactoryMap.get(key);
    21352161                if (factory != null)
    2136                     return factory.get(key, caseSensitive, regexSearch, null);
     2162                    return factory.get(key, caseSensitive, regexSearch, null).validate();
    21372163
    21382164                UnaryMatchFactory unaryFactory = unaryMatchFactoryMap.get(key);
    21392165                if (unaryFactory != null)
    2140                     return unaryFactory.get(key, parseFactor(), null);
     2166                    return unaryFactory.get(key, parseFactor(), null).validate();
    21412167
    21422168                // match string in any key or value
    2143                 return new Any(key, regexSearch, caseSensitive);
     2169                return new Any(key, regexSearch, caseSensitive).validate();
    21442170            }
    21452171        } else
Note: See TracChangeset for help on using the changeset viewer.