service test execute
diff --git a/dubbo-admin-backend/pom.xml b/dubbo-admin-backend/pom.xml
index 7986fbd..d2510ae 100644
--- a/dubbo-admin-backend/pom.xml
+++ b/dubbo-admin-backend/pom.xml
@@ -92,6 +92,10 @@
</exclusions>
</dependency>
<dependency>
+ <groupId>org.apache.curator</groupId>
+ <artifactId>curator-recipes</artifactId>
+ </dependency>
+ <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
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 dfe14c4..3ded7c2 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
@@ -1,10 +1,20 @@
package org.apache.dubbo.admin.controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.apache.dubbo.admin.model.dto.ServiceTestDTO;
+import org.apache.dubbo.admin.service.impl.GenericServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/{env}/test")
public class ServiceTestController {
-
+
+ @Autowired
+ private GenericServiceImpl genericService;
+
+ @RequestMapping(method = RequestMethod.POST)
+ public Object test(@PathVariable String env, @RequestBody ServiceTestDTO serviceTestDTO) {
+ return genericService.invoke(serviceTestDTO.getService(), serviceTestDTO.getMethod(), serviceTestDTO.getTypes(), null);
+// return null;
+ }
}
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/dto/ServiceTestDTO.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/dto/ServiceTestDTO.java
new file mode 100644
index 0000000..7934e7c
--- /dev/null
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/model/dto/ServiceTestDTO.java
@@ -0,0 +1,40 @@
+package org.apache.dubbo.admin.model.dto;
+
+public class ServiceTestDTO {
+ private String service;
+ private String method;
+ private String[] types;
+ private String params;
+
+ public String getService() {
+ return service;
+ }
+
+ public void setService(String service) {
+ this.service = service;
+ }
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+ public String[] getTypes() {
+ return types;
+ }
+
+ public void setTypes(String[] types) {
+ this.types = types;
+ }
+
+ public String getParams() {
+ return params;
+ }
+
+ public void setParams(String params) {
+ this.params = params;
+ }
+}
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/GenericServiceImpl.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/GenericServiceImpl.java
new file mode 100644
index 0000000..6b6e748
--- /dev/null
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/service/impl/GenericServiceImpl.java
@@ -0,0 +1,42 @@
+package org.apache.dubbo.admin.service.impl;
+
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.registry.Registry;
+import org.apache.dubbo.rpc.service.GenericService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Component
+public class GenericServiceImpl {
+
+ private ReferenceConfig<GenericService> reference;
+
+ @Autowired
+ private Registry registry;
+
+ @PostConstruct
+ public void init() {
+ reference = new ReferenceConfig<>();
+ reference.setGeneric(true);
+
+ RegistryConfig registryConfig = new RegistryConfig();
+ registryConfig.setAddress(registry.getUrl().getProtocol() + "://" + registry.getUrl().getAddress());
+
+ ApplicationConfig applicationConfig = new ApplicationConfig();
+ applicationConfig.setName("dubbo-admin");
+ applicationConfig.setRegistry(registryConfig);
+
+ reference.setApplication(applicationConfig);
+ }
+
+ public Object invoke(String service, String method, String[] parameterTypes, Object[] params) {
+
+ reference.setInterface(service);
+ GenericService genericService = reference.get();
+ return genericService.$invoke(method, parameterTypes, params);
+ }
+}
diff --git a/dubbo-admin-frontend/src/components/ServiceTest.vue b/dubbo-admin-frontend/src/components/ServiceTest.vue
index d4711cd..b1f05b2 100644
--- a/dubbo-admin-frontend/src/components/ServiceTest.vue
+++ b/dubbo-admin-frontend/src/components/ServiceTest.vue
@@ -20,28 +20,55 @@
<v-flex xs12>
<search v-model="filter" label="Search by service name" :submit="search"></search>
</v-flex>
+ <v-flex xs12>
+ <h3>Methods</h3>
+ </v-flex>
+ <v-flex xs12>
+ <v-data-table :headers="headers" :items="methods" hide-actions class="elevation-1">
+ <template slot="items" slot-scope="props">
+ <td>{{ props.item.name }}</td>
+ <td><v-chip xs v-for="(type, index) in props.item.parameterTypes" :key="index" label>{{ type }}</v-chip></td>
+ <td><v-chip label>{{ props.item.returnType }}</v-chip></td>
+ <td class="text-xs-right">
+ <v-tooltip bottom>
+ <v-icon small
+ class="mr-2"
+ color="blue"
+ slot="activator"
+ @click="toTest(props.item)">input</v-icon>
+ <span>Try it</span>
+ </v-tooltip>
+ </td>
+ </template>
+ </v-data-table>
+ </v-flex>
</v-layout>
- <v-card>
- <v-card-text>
- <v-layout row>
- <v-flex xs6>
- <v-data-table :headers="headers" :items="methods" hide-actions>
- <template slot="items" slot-scope="props">
- <td>
- <div>Name: {{ props.item.name }}</div>
- <div>Return: {{ props.item.returnType }}</div>
- </td>
- <td></td>
- </template>
- </v-data-table>
- </v-flex>
- <v-flex xs6>
- <json-editor v-model="json" />
- </v-flex>
- </v-layout>
- </v-card-text>
- </v-card>
+ <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>
+ </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>
@@ -53,23 +80,37 @@
name: 'ServiceTest',
data () {
return {
- filter: null,
+ filter: 'org.apache.dubbo.demo.api.DemoService',
headers: [
{
- text: 'Method',
- value: 'name',
- align: 'left'
+ text: 'Method Name',
+ value: 'method',
+ sortable: false
},
{
- text: 'Operation',
+ text: 'Parameter List',
+ value: 'parameter',
+ sortable: false
+ },
+ {
+ text: 'Return Type',
+ value: 'returnType',
+ sortable: false
+ },
+ {
+ text: '',
value: 'operation',
- sortable: false,
- width: '115px'
+ sortable: false
}
],
service: null,
methods: [],
- json: {}
+ modal: {
+ method: null,
+ enable: false,
+ types: null,
+ json: []
+ }
}
},
methods: {
@@ -89,6 +130,36 @@
}).catch(error => {
this.showSnackbar('error', error.response.data.message)
})
+ },
+ toTest (item) {
+ Object.assign(this.modal, {
+ enable: true,
+ method: item.name
+ })
+ this.modal.json = []
+ this.modal.types = item.parameterTypes
+ item.parameterTypes.forEach((i, index) => {
+ this.modal.json.push(this.getType(i))
+ })
+ },
+ test () {
+ this.$axios.post('/test', {
+ service: this.service.metadata.canonicalName,
+ method: this.modal.method,
+ types: this.modal.types,
+ params: JSON.stringify(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 ''
+ }
}
},
components: {
diff --git a/dubbo-admin-frontend/src/components/public/JsonEditor.vue b/dubbo-admin-frontend/src/components/public/JsonEditor.vue
index 2891879..c4cbbf5 100644
--- a/dubbo-admin-frontend/src/components/public/JsonEditor.vue
+++ b/dubbo-admin-frontend/src/components/public/JsonEditor.vue
@@ -52,6 +52,7 @@
const options = {
name: 'Parameters',
navigationBar: false,
+ search: false,
mode: this.mode,
modes: this.modes,
onChange: () => {
diff --git a/pom.xml b/pom.xml
index c87b23f..e975680 100644
--- a/pom.xml
+++ b/pom.xml
@@ -109,6 +109,17 @@
<version>${curator-version}</version>
</dependency>
<dependency>
+ <groupId>org.apache.curator</groupId>
+ <artifactId>curator-recipes</artifactId>
+ <version>${curator-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.zookeeper</groupId>
+ <artifactId>zookeeper</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson-version}</version>