diff --git a/src/main/java/com/github/fge/jsonschema/keyword/validator/common/PatternValidator.java b/src/main/java/com/github/fge/jsonschema/keyword/validator/common/PatternValidator.java index 653428a27..bad68a787 100644 --- a/src/main/java/com/github/fge/jsonschema/keyword/validator/common/PatternValidator.java +++ b/src/main/java/com/github/fge/jsonschema/keyword/validator/common/PatternValidator.java @@ -19,6 +19,9 @@ package com.github.fge.jsonschema.keyword.validator.common; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import com.fasterxml.jackson.databind.JsonNode; import com.github.fge.jsonschema.core.exceptions.ProcessingException; import com.github.fge.jsonschema.core.processing.Processor; @@ -31,13 +34,15 @@ /** * Keyword validator for {@code pattern} * - * @see RhinoHelper */ public final class PatternValidator extends AbstractKeywordValidator { + private HashMap _patterns; + public PatternValidator(final JsonNode digest) { + _patterns = new HashMap(); super("pattern"); } @@ -50,7 +55,11 @@ public void validate(final Processor processor, final String regex = data.getSchema().getNode().get(keyword) .textValue(); final String value = data.getInstance().getNode().textValue(); - if (!RhinoHelper.regMatch(regex, value)) + + Pattern pattern = getPattern(regex); + Matcher matches = pattern.matcher(value); + + if (!matches.find()) report.error(newMsg(data, bundle, "err.common.pattern.noMatch") .putArgument("regex", regex).putArgument("string", value)); } @@ -60,4 +69,15 @@ public String toString() { return keyword; } + + private Pattern getPattern(String regex) + { + // If there is not any existing compiled pattern, create one now! + if (!_patterns.containsKey(regex)) + { + _patterns.put(regex, Pattern.compile(regex)); + } + + return _patterns.get(regex); + } }