You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by mi...@apache.org on 2018/11/08 07:21:33 UTC
[incubator-dubbo-ops] branch develop updated: support wildcard
search
This is an automated email from the ASF dual-hosted git repository.
min pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-ops.git
The following commit(s) were added to refs/heads/develop by this push:
new b36bbf2 support wildcard search
b36bbf2 is described below
commit b36bbf20522721ed2875a23a64034d0e2a6108b3
Author: nzomkxia <z8...@gmail.com>
AuthorDate: Thu Nov 8 15:21:38 2018 +0800
support wildcard search
---
.../dubbo/admin/controller/ServiceController.java | 92 ++++++++++------------
.../org/apache/dubbo/admin/dto/ServiceDTO.java | 19 ++++-
.../admin/governance/sync/util/SyncUtils.java | 2 +-
.../src/components/ServiceSearch.vue | 47 ++++++-----
4 files changed, 89 insertions(+), 71 deletions(-)
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
index 501376d..b21f72d 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceController.java
@@ -29,6 +29,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
@RestController
@@ -45,50 +47,55 @@ public class ServiceController {
}
@RequestMapping(method = RequestMethod.GET)
- public List<ServiceDTO> searchService(@RequestParam String pattern,
- @RequestParam(required = false) String filter,@PathVariable String env) {
+ public Set<ServiceDTO> searchService(@RequestParam String pattern,
+ @RequestParam String filter,@PathVariable String env) {
- List<Provider> allProviders = providerService.findAll();
- Set<String> serviceUrl = new HashSet<>();
+ List<Provider> providers = new ArrayList<>();
+ if (!filter.contains("*") && !filter.contains("?")) {
+ if (pattern.equals("ip")) {
+ providers = providerService.findByAddress(filter);
+ } else if (pattern.equals("serviceName")) {
+ providers = providerService.findByService(filter);
+ } else if (pattern.equals("application")) {
+ providers = providerService.findByApplication(filter);
+ }
+ } else {
+ List<String> candidates = Collections.emptyList();
+ if (pattern.equals("serviceName")) {
+ candidates = providerService.findServices();
+ } else if (pattern.equals("application")) {
+ candidates = providerService.findApplications();
+ }
+ filter = filter.toLowerCase().replace(".", "\\.");
+ if (filter.startsWith("*")) {
+ filter = "." + filter;
+ }
+ Pattern regex = Pattern.compile(filter);
+ for (String candidate : candidates) {
+ Matcher matcher = regex.matcher(candidate);
+ if (matcher.matches() || matcher.lookingAt()) {
+ if (pattern.equals("serviceName")) {
+ providers.addAll(providerService.findByService(candidate));
+ } else {
+ providers.addAll(providerService.findByApplication(candidate));
+ }
+ }
+ }
+ }
- List<ServiceDTO> result = new ArrayList<>();
- for (Provider provider : allProviders) {
+ Set<ServiceDTO> result = new TreeSet<>();
+ for (Provider provider : providers) {
Map<String, String> map = StringUtils.parseQueryString(provider.getParameters());
String app = provider.getApplication();
String service = map.get(Constants.INTERFACE_KEY);
String group = map.get(Constants.GROUP_KEY);
String version = map.get(Constants.VERSION_KEY);
- String url = app + service + group + version;
- if (serviceUrl.contains(url)) {
- continue;
- }
ServiceDTO s = new ServiceDTO();
- if (org.apache.commons.lang3.StringUtils.isEmpty(filter)) {
- s.setAppName(app);
- s.setService(service);
- s.setGroup(group);
- s.setVersion(version);
- result.add(s);
- serviceUrl.add(url);
- } else {
- filter = filter.toLowerCase();
- String key = null;
- switch (pattern) {
- case "application":
- key = provider.getApplication().toLowerCase();
- break;
- case "serviceName":
- key = provider.getService().toLowerCase();
- break;
- case "ip":
- key = provider.getAddress().toLowerCase();
- break;
- }
- if (key != null && key.contains(filter)) {
- result.add(createService(provider, map));
- serviceUrl.add(url);
- }
- }
+ s.setAppName(app);
+ s.setService(service);
+ s.setGroup(group);
+ s.setVersion(version);
+ result.add(s);
}
return result;
}
@@ -105,17 +112,4 @@ public class ServiceController {
serviceDetailDTO.setProviders(providers);
return serviceDetailDTO;
}
-
- private ServiceDTO createService(Provider provider, Map<String, String> map) {
- ServiceDTO serviceDTO = new ServiceDTO();
- serviceDTO.setAppName(provider.getApplication());
- String service = map.get(Constants.INTERFACE_KEY);
- String group = map.get(Constants.GROUP_KEY);
- String version = map.get(Constants.VERSION_KEY);
- serviceDTO.setService(service);
- serviceDTO.setGroup(group);
- serviceDTO.setVersion(version);
- return serviceDTO;
- }
-
}
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java
index a510293..42e2e8c 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/ServiceDTO.java
@@ -17,7 +17,9 @@
package org.apache.dubbo.admin.dto;
-public class ServiceDTO {
+import org.apache.commons.lang3.StringUtils;
+
+public class ServiceDTO implements Comparable<ServiceDTO>{
private String service;
private String appName;
private String group;
@@ -54,4 +56,19 @@ public class ServiceDTO {
public void setVersion(String version) {
this.version = version;
}
+
+ @Override
+ public int compareTo(ServiceDTO o) {
+ int result = StringUtils.trimToEmpty(appName).compareTo(StringUtils.trimToEmpty(o.getAppName()));
+ if (result == 0) {
+ result = StringUtils.trimToEmpty(service).compareTo(StringUtils.trimToEmpty(o.getService()));
+ if (result == 0) {
+ result = StringUtils.trimToEmpty(group).compareTo(StringUtils.trimToEmpty(o.getGroup()));
+ }
+ if (result == 0) {
+ result = StringUtils.trimToEmpty(version).compareTo(StringUtils.trimToEmpty(o.getVersion()));
+ }
+ }
+ return result;
+ }
}
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java
index 271e51d..418b112 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/governance/sync/util/SyncUtils.java
@@ -227,7 +227,7 @@ public class SyncUtils {
String value = e.getValue();
if (ADDRESS_FILTER_KEY.equals(key)) {
- if (!value.equals(url.getAddress())) {
+ if (!value.equals(url.getIp())) {
match = false;
break;
}
diff --git a/dubbo-admin-frontend/src/components/ServiceSearch.vue b/dubbo-admin-frontend/src/components/ServiceSearch.vue
index 32a3a24..7b9dd51 100644
--- a/dubbo-admin-frontend/src/components/ServiceSearch.vue
+++ b/dubbo-admin-frontend/src/components/ServiceSearch.vue
@@ -23,7 +23,8 @@
<v-card-text>
<v-form>
<v-layout row wrap>
- <v-autocomplete
+ <v-combobox
+ id="serviceSearch"
:loading="loading"
:items="typeAhead"
:search-input.sync="input"
@@ -33,9 +34,8 @@
hide-no-data
:suffix="queryBy"
:hint="hint"
- open-on-clear
label="Search Dubbo Services"
- ></v-autocomplete>
+ ></v-combobox>
<v-menu class="hidden-xs-only">
<v-btn slot="activator" large icon>
<v-icon>unfold_more</v-icon>
@@ -151,10 +151,7 @@
},
watch: {
input (val) {
- console.log(val)
- console.log(this.typeAhead)
- if (val === undefined || val === '' || val === null || val.length < 5) {
- this.filter = null
+ if (val === undefined || val === '' || val === null || val.length < 4) {
this.typeAhead = []
return
}
@@ -163,16 +160,20 @@
},
methods: {
querySelections (v) {
- // this.loading = true
- if (this.selected === 0) {
- this.typeAhead = this.serviceItem.filter(e => {
- return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
- })
- } else if (this.selected === 2) {
- this.typeAhead = this.appItem.filter(e => {
- return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
- })
- }
+ this.loading = true
+ // Simulated ajax query
+ setTimeout(() => {
+ if (this.selected === 0) {
+ this.typeAhead = this.serviceItem.filter(e => {
+ return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
+ })
+ } else if (this.selected === 2) {
+ this.typeAhead = this.appItem.filter(e => {
+ return (e || '').toLowerCase().indexOf((v || '').toLowerCase()) > -1
+ })
+ }
+ this.loading = false
+ }, 500)
},
getHref: function (service, app, group, version) {
let query = 'service=' + service + '&app=' + app
@@ -185,8 +186,13 @@
return '/#/serviceDetail?' + query
},
submit () {
- let pattern = this.items[this.selected].value
- this.search(this.filter, pattern, true)
+ this.filter = document.querySelector('#serviceSearch').value.trim()
+ if (this.filter) {
+ let pattern = this.items[this.selected].value
+ this.search(this.filter, pattern, true)
+ } else {
+ return false
+ }
},
search: function (filter, pattern, rewrite) {
this.$axios.get('/service', {
@@ -228,7 +234,8 @@
}
this.$axios.get('/service', {
params: {
- pattern: 'serviceName'
+ pattern: 'serviceName',
+ filter: '*'
}
}).then(response => {
let length = response.data.length