diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java index 270a507aaa..4e52f29b95 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; /** * Utility class that can be used to filter source data using a name regular expression. @@ -31,6 +32,7 @@ import java.util.regex.Pattern; * @author Phillip Webb * @author Sergei Egorov * @author Andy Wilkinson + * @author Dylian Bego * @since 1.3.0 */ abstract class NamePatternFilter { @@ -44,13 +46,13 @@ abstract class NamePatternFilter { } public Map getResults(String name) { - if (!isRegex(name)) { + Pattern pattern = compilePatternIfNecessary(name); + if (pattern == null) { Object value = getValue(this.source, name); Map result = new HashMap(); result.put(name, value); return result; } - Pattern pattern = Pattern.compile(name); ResultCollectingNameCallback resultCollector = new ResultCollectingNameCallback( pattern); getNames(this.source, resultCollector); @@ -58,13 +60,18 @@ abstract class NamePatternFilter { } - private boolean isRegex(String name) { + private Pattern compilePatternIfNecessary(String name) { for (String part : REGEX_PARTS) { if (name.contains(part)) { - return true; + try { + return Pattern.compile(name); + } + catch (PatternSyntaxException ex) { + return null; + } } } - return false; + return null; } protected abstract void getNames(T source, NameCallback callback); diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java index 1cdee18298..582c973444 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Phillip Webb * @author Andy Wilkinson + * @author Dylian Bego */ public class NamePatternFilterTests { @@ -38,6 +39,13 @@ public class NamePatternFilterTests { assertThat(filter.isGetNamesCalled()).isFalse(); } + @Test + public void nonRegexThatContainsRegexPart() throws Exception { + MockNamePatternFilter filter = new MockNamePatternFilter(); + assertThat(filter.getResults("*")).containsEntry("*", "*"); + assertThat(filter.isGetNamesCalled()).isFalse(); + } + @Test public void regexRepetitionZeroOrMore() { MockNamePatternFilter filter = new MockNamePatternFilter();