test service's parameterized methods (#277)
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java
index ad84fd0..c65a244 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/common/util/ServiceTestUtil.java
@@ -49,10 +49,10 @@
MethodMetadata methodMetadata = new MethodMetadata();
String[] parameterTypes = methodDefinition.getParameterTypes();
String returnType = methodDefinition.getReturnType();
- String signature = methodDefinition.getName() + "~" + Arrays.stream(parameterTypes).collect(Collectors.joining(";"));
+ String signature = methodDefinition.getName() + "~" + String.join(";", parameterTypes);
methodMetadata.setSignature(signature);
methodMetadata.setReturnType(returnType);
- List parameters = generateParameterTypes(parameterTypes, serviceDefinition);
+ List<Object> parameters = generateParameterTypes(parameterTypes, serviceDefinition);
methodMetadata.setParameterTypes(parameters);
return methodMetadata;
}
@@ -72,8 +72,8 @@
type.equals("java.lang.Object");
}
- private static List generateParameterTypes(String[] parameterTypes, ServiceDefinition serviceDefinition) {
- List parameters = new ArrayList();
+ private static List<Object> generateParameterTypes(String[] parameterTypes, ServiceDefinition serviceDefinition) {
+ List<Object> parameters = new ArrayList<>();
for (String type : parameterTypes) {
Object result = generateType(serviceDefinition, type);
parameters.add(result);
@@ -87,7 +87,7 @@
.findFirst().orElse(new TypeDefinition(type));
}
- private static void generateComplexType(ServiceDefinition sd, TypeDefinition td, Map holder) {
+ private static void generateComplexType(ServiceDefinition sd, TypeDefinition td, Map<String, Object> holder) {
for (Map.Entry<String, TypeDefinition> entry : td.getProperties().entrySet()) {
if (isPrimitiveType(td)) {
holder.put(entry.getKey(), generatePrimitiveType(td));
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceTestController.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceTestController.java
index a39c063..8279212 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceTestController.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/ServiceTestController.java
@@ -20,12 +20,13 @@
@RestController
@RequestMapping("/api/{env}/test")
public class ServiceTestController {
+ private final GenericServiceImpl genericService;
+ private final ProviderService providerService;
- @Autowired
- private GenericServiceImpl genericService;
-
- @Autowired
- private ProviderService providerService;
+ public ServiceTestController(GenericServiceImpl genericService, ProviderService providerService) {
+ this.genericService = genericService;
+ this.providerService = providerService;
+ }
@RequestMapping(method = RequestMethod.POST)
public Object test(@PathVariable String env, @RequestBody ServiceTestDTO serviceTestDTO) {
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/domain/MethodMetadata.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/domain/MethodMetadata.java
index 25a98c9..1889e7b 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/domain/MethodMetadata.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/domain/MethodMetadata.java
@@ -22,7 +22,7 @@
public class MethodMetadata {
private String signature;
- private List parameterTypes;
+ private List<Object> parameterTypes;
private String returnType;
public String getSignature() {
@@ -33,11 +33,11 @@
this.signature = signature;
}
- public List getParameterTypes() {
+ public List<Object> getParameterTypes() {
return parameterTypes;
}
- public void setParameterTypes(List parameterTypes) {
+ public void setParameterTypes(List<Object> parameterTypes) {
this.parameterTypes = parameterTypes;
}
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
index 48c3cf3..af334e3 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/registry/metadata/impl/ZookeeperMetaDataCollector.java
@@ -27,6 +27,8 @@
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.metadata.identifier.MetadataIdentifier;
+import javax.annotation.PostConstruct;
+
public class ZookeeperMetaDataCollector implements MetaDataCollector {
private static final Logger logger = LoggerFactory.getLogger(ZookeeperMetaDataCollector.class);
diff --git a/dubbo-admin-backend/src/main/resources/application.properties b/dubbo-admin-backend/src/main/resources/application.properties
index 514345f..e765b06 100644
--- a/dubbo-admin-backend/src/main/resources/application.properties
+++ b/dubbo-admin-backend/src/main/resources/application.properties
@@ -19,6 +19,7 @@
admin.registry.address=zookeeper://127.0.0.1:2181
admin.config-center=zookeeper://127.0.0.1:2181
admin.metadata.address=zookeeper://127.0.0.1:2181
+dubbo.configcenter="zookeeper://127.0.0.1:2181"
diff --git a/dubbo-admin-frontend/src/components/public/JsonEditor.vue b/dubbo-admin-frontend/src/components/public/JsonEditor.vue
index 327e5ff..f420cf8 100644
--- a/dubbo-admin-frontend/src/components/public/JsonEditor.vue
+++ b/dubbo-admin-frontend/src/components/public/JsonEditor.vue
@@ -34,7 +34,15 @@
type: Array,
default: () => ['tree', 'code']
},
- templates: Array
+ templates: Array,
+ name: {
+ type: String,
+ default: 'Parameters'
+ },
+ readonly: {
+ type: Boolean,
+ default: false
+ }
},
data () {
return {
@@ -44,27 +52,28 @@
watch: {
value (newVal, oldVal) {
if (newVal !== oldVal && this.$jsoneditor) {
- this.$jsoneditor.update(newVal)
+ this.$jsoneditor.update(newVal || {})
}
}
},
mounted () {
const options = {
- name: 'Parameters',
+ name: this.name,
navigationBar: false,
search: false,
mode: this.mode,
modes: this.modes,
+ onEditable: (node) => !this.readonly,
onChange: () => {
if (this.$jsoneditor) {
- var json = this.$jsoneditor.get()
+ const json = this.$jsoneditor.get()
this.$emit('input', json)
}
},
templates: this.templates
}
this.$jsoneditor = new JSONEditor(this.$el, options)
- this.$jsoneditor.set(this.value)
+ this.$jsoneditor.set(this.value || {})
this.$jsoneditor.expandAll()
},
beforeDestroy () {
diff --git a/dubbo-admin-frontend/src/components/public/Search.vue b/dubbo-admin-frontend/src/components/public/Search.vue
index 15e3432..92d5ef2 100644
--- a/dubbo-admin-frontend/src/components/public/Search.vue
+++ b/dubbo-admin-frontend/src/components/public/Search.vue
@@ -23,7 +23,9 @@
:label="label" clearable
:hint="hint"
v-bind:value="value"
- v-on:input="$emit('input', $event)"></v-text-field>
+ v-on:input="$emit('input', $event)"
+ @keydown.enter="submit"
+ ></v-text-field>
<v-btn @click="submit" color="primary" large>{{$t('search')}}</v-btn>
</v-layout>
</v-card-text>
diff --git a/dubbo-admin-frontend/src/components/test/ServiceTest.vue b/dubbo-admin-frontend/src/components/test/ServiceTest.vue
index 2d08265..35b9eec 100644
--- a/dubbo-admin-frontend/src/components/test/ServiceTest.vue
+++ b/dubbo-admin-frontend/src/components/test/ServiceTest.vue
@@ -18,7 +18,7 @@
<v-container grid-list-xl fluid>
<v-layout row wrap>
<v-flex xs12>
- <search id="serviceSearch" v-model="filter" label="Search by service name" :submit="search"></search>
+ <search v-model="filter" label="Search by service name" :submit="search"></search>
</v-flex>
<v-flex xs12>
<h3>Methods</h3>
@@ -44,33 +44,6 @@
</v-data-table>
</v-flex>
</v-layout>
-
- <v-dialog v-model="modal.enable" width="1000px" persistent>
- <v-card>
- <v-card-title>
- <span class="headline">Test {{ modal.method }}</span>
- </v-card-title>
- <v-container grid-list-xl fluid>
- <v-layout row>
- <v-flex lg6>
- <json-editor v-model="modal.json" />
- </v-flex>
- <v-flex lg6>
- <json-editor v-model="modal.json" />
- </v-flex>
- </v-layout>
- </v-container>
- <v-card-actions>
- <v-spacer></v-spacer>
- <v-btn color="darken-1"
- flat
- @click="modal.enable = false">Close</v-btn>
- <v-btn color="primary"
- depressed
- @click="test">Execute</v-btn>
- </v-card-actions>
- </v-card>
- </v-dialog>
</v-container>
</template>
@@ -80,9 +53,13 @@
export default {
name: 'ServiceTest',
+ components: {
+ JsonEditor,
+ Search
+ },
data () {
return {
- filter: '',
+ filter: this.$route.query['service'] || '',
headers: [
{
text: 'Method Name',
@@ -106,35 +83,26 @@
}
],
service: null,
- methods: [],
- modal: {
- method: null,
- enable: false,
- parameterTypes: null,
- json: []
- }
+ methods: []
}
},
methods: {
search () {
if (!this.filter) {
- this.filter = document.querySelector('#serviceSearch').value.trim()
- if (!this.filter) {
- return
- }
+ return
}
- this.$router.push({
- path: 'test',
+ this.$router.replace({
query: { service: this.filter }
})
this.$axios.get('/service/' + this.filter).then(response => {
this.service = response.data
- if (this.service.hasOwnProperty('metadata')) {
- let data = this.service.metadata.methods
- for (let i = 0; i < data.length; i++) {
+ this.methods = []
+ if (this.service.metadata) {
+ let methods = this.service.metadata.methods
+ for (let i = 0; i < methods.length; i++) {
let method = {}
- let sig = data[i].name + '~'
- let parameters = data[i].parameterTypes
+ let sig = methods[i].name + '~'
+ let parameters = methods[i].parameterTypes
let length = parameters.length
for (let j = 0; j < length; j++) {
sig = sig + parameters[j]
@@ -143,9 +111,9 @@
}
}
method.signature = sig
- method.name = data[i].name
- method.parameterTypes = data[i].parameterTypes
- method.returnType = data[i].returnType
+ method.name = methods[i].name
+ method.parameterTypes = methods[i].parameterTypes
+ method.returnType = methods[i].returnType
method.service = response.data.service
method.application = response.data.application
this.methods.push(method)
@@ -155,58 +123,12 @@
this.showSnackbar('error', error.response.data.message)
})
},
- toTest (item) {
- Object.assign(this.modal, {
- enable: true,
- method: item.name
- })
- this.modal.json = []
- this.modal.parameterTypes = item.parameterTypes
- item.parameterTypes.forEach((i, index) => {
- this.modal.json.push(this.getType(i))
- })
- },
getHref (application, service, method) {
- let base = '/#/testMethod?'
- let query = 'application=' + application + '&service=' + service + '&method=' + method
- return base + query
- },
- test () {
- this.$axios.post('/test', {
- service: this.service.metadata.canonicalName,
- method: this.modal.method,
- parameterTypes: this.modal.parameterTypes,
- params: this.modal.json
- }).then(response => {
- console.log(response)
- })
- },
- getType (type) {
- if (type.indexOf('java.util.List') === 0) {
- return []
- } else if (type.indexOf('java.util.Map') === 0) {
- return []
- } else {
- return ''
- }
+ return `/#/testMethod?application=${application}&service=${service}&method=${method}`
}
},
- mounted: function () {
- let query = this.$route.query
- let filter = null
- Object.keys(query).forEach(function (key) {
- if (key === 'service') {
- filter = query[key]
- }
- })
- if (filter !== null) {
- this.filter = filter
- this.search()
- }
- },
- components: {
- JsonEditor,
- Search
+ created () {
+ this.search()
}
}
</script>
diff --git a/dubbo-admin-frontend/src/components/test/TestMethod.vue b/dubbo-admin-frontend/src/components/test/TestMethod.vue
index 9657f92..a5093f1 100644
--- a/dubbo-admin-frontend/src/components/test/TestMethod.vue
+++ b/dubbo-admin-frontend/src/components/test/TestMethod.vue
@@ -18,110 +18,85 @@
<template>
<v-container grid-list-xl fluid>
<v-layout row wrap>
- <v-flex lg12>
- </v-flex>
- <v-flex lg12>
+ <v-flex class="test-form" lg12 xl6>
<v-card>
- <v-flex lg8>
- <v-card-title>
- <span>Service: {{service}}<br> Method: {{method.name}}</span>
- </v-card-title>
- <v-card-text>
- <json-editor id="test" v-model="method.json"/>
- </v-card-text>
- <v-card-actions>
- <v-spacer></v-spacer>
- <v-btn id="execute" mt-0 color="primary" @click="executeMethod()">EXECUTE</v-btn>
- </v-card-actions>
- </v-flex>
- <v-flex lg8>
- <v-card-text>
- <h2>Test Result</h2>
- <json-editor id="result" v-model="result" v-if="showResult"></json-editor>
- </v-card-text>
- </v-flex>
+ <v-card-title class="headline">Test: {{service}}#{{method.name}}</v-card-title>
+ <v-card-text>
+ <json-editor id="test" v-model="method.json"/>
+ </v-card-text>
+ <v-card-actions>
+ <v-spacer></v-spacer>
+ <v-btn id="execute" mt-0 color="primary" @click="executeMethod()">EXECUTE</v-btn>
+ </v-card-actions>
</v-card>
</v-flex>
-
+ <v-flex class="test-result" lg12 xl6>
+ <v-card>
+ <v-card-title class="headline">Result</v-card-title>
+ <v-card-text>
+ <json-editor v-model="result" name="Result" readonly></json-editor>
+ </v-card-text>
+ </v-card>
+ </v-flex>
</v-layout>
-
</v-container>
</template>
<script>
import JsonEditor from '@/components/public/JsonEditor'
+
export default {
name: 'TestMethod',
+ components: {
+ JsonEditor
+ },
data () {
return {
- basic: [],
- service: null,
- application: null,
+ service: this.$route.query['service'],
+ application: this.$route.query['application'],
method: {
name: null,
parameterTypes: [],
json: []
},
- showResult: false,
- result: {}
+ result: null
}
},
-
methods: {
- executeMethod: function () {
- let serviceTestDTO = {}
- serviceTestDTO.service = this.service
- serviceTestDTO.method = this.method.name
- serviceTestDTO.parameterType = this.method.parameterTypes
- serviceTestDTO.params = this.method.json
- this.$axios.post('/test', serviceTestDTO)
- .then(response => {
- if (response.status === 200) {
- this.result = response.data
- this.showResult = true
- }
- })
+ executeMethod () {
+ let serviceTestDTO = {
+ service: this.service,
+ method: this.method.name,
+ parameterTypes: this.method.parameterTypes,
+ params: this.method.json
+ }
+ this.$axios.post('/test', serviceTestDTO).then(response => {
+ if (response.status === 200) {
+ this.result = response.data
+ }
+ })
}
},
+ mounted () {
+ const query = this.$route.query
+ const method = query['method']
- mounted: function () {
- let query = this.$route.query
- let vm = this
- let method = null
- Object.keys(query).forEach(function (key) {
- if (key === 'service') {
- let item = {}
- item.name = 'service'
- item.value = query[key]
- vm.basic.push(item)
- vm.service = query[key]
- }
- if (key === 'method') {
- let item = {}
- item.name = 'method'
- item.value = query[key]
- vm.method.name = query[key].split('~')[0]
- method = query[key]
- vm.basic.push(item)
- }
- if (key === 'application') {
- vm.application = query[key]
- }
- })
+ if (method) {
+ const [methodName, parametersTypes] = method.split('~')
+ this.method.name = methodName
+ this.method.parameterTypes = parametersTypes.split(';')
+ }
+
this.$axios.get('/test/method', {
params: {
- application: vm.application,
- service: vm.service,
+ application: this.application,
+ service: this.service,
method: method
}
}).then(response => {
this.method.json = response.data.parameterTypes
})
- },
- components: {
- JsonEditor
}
-
}
</script>