Support Ant-style package name with component index
This commit improves the component index so that it supports ant-style package name (i.e. com.example.**.foo). Issue: SPR-16152
This commit is contained in:
@@ -22,6 +22,8 @@ import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.util.AntPathMatcher;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
@@ -46,7 +48,9 @@ import org.springframework.util.MultiValueMap;
|
||||
*/
|
||||
public class CandidateComponentsIndex {
|
||||
|
||||
private final MultiValueMap<String, String> index;
|
||||
private final static AntPathMatcher pathMatcher = new AntPathMatcher(".");
|
||||
|
||||
private final MultiValueMap<String, Entry> index;
|
||||
|
||||
|
||||
CandidateComponentsIndex(List<Properties> content) {
|
||||
@@ -62,26 +66,47 @@ public class CandidateComponentsIndex {
|
||||
* or an empty set if none has been found for the specified {@code basePackage}
|
||||
*/
|
||||
public Set<String> getCandidateTypes(String basePackage, String stereotype) {
|
||||
List<String> candidates = this.index.get(stereotype);
|
||||
List<Entry> candidates = this.index.get(stereotype);
|
||||
if (candidates != null) {
|
||||
return candidates.parallelStream()
|
||||
.filter(t -> t.startsWith(basePackage))
|
||||
.filter(t -> t.match(basePackage))
|
||||
.map(t -> t.type)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
||||
private static MultiValueMap<String, String> parseIndex(List<Properties> content) {
|
||||
MultiValueMap<String, String> index = new LinkedMultiValueMap<>();
|
||||
private static MultiValueMap<String, Entry> parseIndex(List<Properties> content) {
|
||||
MultiValueMap<String, Entry> index = new LinkedMultiValueMap<>();
|
||||
for (Properties entry : content) {
|
||||
entry.forEach((type, values) -> {
|
||||
String[] stereotypes = ((String) values).split(",");
|
||||
for (String stereotype : stereotypes) {
|
||||
index.add(stereotype, (String) type);
|
||||
index.add(stereotype, new Entry((String) type));
|
||||
}
|
||||
});
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
private static class Entry {
|
||||
private final String type;
|
||||
private final String packageName;
|
||||
|
||||
Entry(String type) {
|
||||
this.type = type;
|
||||
this.packageName = ClassUtils.getPackageName(type);
|
||||
}
|
||||
|
||||
public boolean match(String basePackage) {
|
||||
if (pathMatcher.isPattern(basePackage)) {
|
||||
return pathMatcher.match(basePackage, this.packageName);
|
||||
}
|
||||
else {
|
||||
return this.type.startsWith(basePackage);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user