in dubbo-admin-server/src/main/java/org/apache/dubbo/admin/service/impl/ProviderServiceImpl.java [261:305]
public Set<ServiceDTO> getServiceDTOS(String pattern, String filter, String env) {
List<Provider> providers = new ArrayList<>();
if (!filter.contains(Constants.ANY_VALUE) && !filter.contains(Constants.INTERROGATION_POINT)) {
// filter with specific string
if (Constants.IP.equals(pattern)) {
providers = findByAddress(filter);
} else if (Constants.SERVICE.equals(pattern)) {
providers = findByService(filter);
} else if (Constants.APPLICATION.equals(pattern)) {
providers = findByApplication(filter);
}
} else {
// filter with fuzzy search
Set<String> candidates = Collections.emptySet();
if (Constants.SERVICE.equals(pattern)) {
candidates = findServices();
} else if (Constants.APPLICATION.equals(pattern)) {
candidates = findApplications();
} else if (Constants.IP.equals(pattern)) {
candidates = new HashSet<>(findAddresses());
}
// replace dot symbol and asterisk symbol to java-based regex pattern
filter = filter.toLowerCase().replace(Constants.PUNCTUATION_POINT, Constants.PUNCTUATION_SEPARATOR_POINT);
// filter start with [* 、? 、+] will triggering PatternSyntaxException
if (filter.startsWith(Constants.ANY_VALUE) || filter.startsWith(Constants.INTERROGATION_POINT) || filter.startsWith(Constants.PLUS_SIGNS)) {
filter = Constants.PUNCTUATION_POINT + filter;
}
// search with no case insensitive
Pattern regex = Pattern.compile(filter, Pattern.CASE_INSENSITIVE);
for (String candidate : candidates) {
Matcher matcher = regex.matcher(candidate);
if (matcher.matches() || matcher.lookingAt()) {
if (Constants.SERVICE.equals(pattern)) {
providers.addAll(findByService(candidate));
} else if (Constants.IP.equals(pattern)) {
providers.addAll(findByAddress(candidate));
} else {
providers.addAll(findByApplication(candidate));
}
}
}
}
return convertProviders2DTO(providers);
}