add service test util
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 f469f70..1d1dab6 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
@@ -17,6 +17,7 @@
package org.apache.dubbo.admin.common.util;
+import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.admin.model.domain.MethodMetadata;
import org.apache.dubbo.admin.model.dto.MethodDTO;
import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
@@ -25,9 +26,13 @@
import org.apache.dubbo.metadata.definition.model.TypeDefinition;
import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class ServiceTestUtil {
+ private static Pattern COLLECTION_PATTERN = Pattern.compile("^java\\.util\\..*(Set|List|Queue|Collection|Deque)(<.*>)*$");
+ private static Pattern MAP_PATTERN = Pattern.compile("^java\\.util\\..*Map.*(<.*>)*$");
public static boolean sameMethod(MethodDefinition m, MethodDTO methodDTO) {
return (m.getName().equals(methodDTO.getName())
@@ -47,7 +52,8 @@
return methodMetadata;
}
- private static boolean isPrimitiveType(String type) {
+ private static boolean isPrimitiveType(TypeDefinition td) {
+ String type = td.getType();
return type.equals("byte") || type.equals("java.lang.Byte") ||
type.equals("short") || type.equals("java.lang.Short") ||
type.equals("int") || type.equals("java.lang.Integer") ||
@@ -64,14 +70,8 @@
private static List generateParameterTypes(String[] parameterTypes, ServiceDefinition serviceDefinition) {
List parameters = new ArrayList();
for (String type : parameterTypes) {
- if (isPrimitiveType(type)) {
- generatePrimitiveType(parameters, type);
- } else {
- TypeDefinition typeDefinition = findTypeDefinition(serviceDefinition, type);
- Map<String, Object> holder = new HashMap<>();
- generateComplexType(holder, typeDefinition);
- parameters.add(holder);
- }
+ Object result = generateType(serviceDefinition, type);
+ parameters.add(result);
}
return parameters;
}
@@ -82,28 +82,131 @@
.findFirst().orElse(new TypeDefinition(type));
}
- private static void generateComplexType(Map<String, Object> holder, TypeDefinition td) {
+ private static void generateComplexType(ServiceDefinition sd, TypeDefinition td, Map holder) {
for (Map.Entry<String, TypeDefinition> entry : td.getProperties().entrySet()) {
- String type = entry.getValue().getType();
- if (isPrimitiveType(type)) {
- holder.put(entry.getKey(), type);
+ if (isPrimitiveType(td)) {
+ holder.put(entry.getKey(), td.getType());
} else {
- generateEnclosedType(holder, entry.getKey(), entry.getValue());
+ generateEnclosedType(holder, entry.getKey(), sd, entry.getValue());
}
}
}
-
- private static void generatePrimitiveType(List parameters, String type) {
- parameters.add(type);
+ private static Object generateComplexType(ServiceDefinition sd, TypeDefinition td) {
+ Map<String, Object> holder = new HashMap<>();
+ generateComplexType(sd, td, holder);
+ return holder;
}
- private static void generateEnclosedType(Map<String, Object> holder, String key, TypeDefinition typeDefinition) {
- if (typeDefinition.getProperties() == null || typeDefinition.getProperties().size() == 0) {
- holder.put(key, typeDefinition.getType());
+ private static boolean isMap(TypeDefinition td) {
+ String type = StringUtils.substringBefore(td.getType(), "<");
+ Matcher matcher = MAP_PATTERN.matcher(type);
+ return matcher.matches();
+ }
+
+ private static boolean isCollection(TypeDefinition td) {
+ String type = StringUtils.substringBefore(td.getType(), "<");
+ Matcher matcher = COLLECTION_PATTERN.matcher(type);
+ return matcher.matches();
+ }
+
+ private static boolean isArray(TypeDefinition td) {
+ return StringUtils.endsWith(td.getType(), "[]");
+ }
+
+ private static Object generatePrimitiveType(TypeDefinition td) {
+ String type = td.getType();
+ switch (type) {
+ case "byte":
+ case "java.lang.Byte":
+ case "short":
+ case "java.lang.Short":
+ case "int":
+ case "java.lang.Integer":
+ case "long":
+ case "java.lang.Long":
+ return 0;
+ case "float":
+ case "java.lang.Float":
+ case "double":
+ case "java.lang.Double":
+ return 0.0;
+ case "boolean":
+ case "java.lang.Boolean":
+ return true;
+ case "void":
+ case "java.lang.Void":
+ return null;
+ case "java.lang.String":
+ return "";
+ case "java.lang.Object":
+ return Collections.emptyMap();
+ case "java.util.Date":
+ return System.currentTimeMillis();
+ default:
+ return Collections.emptyMap();
+ }
+ }
+
+ private static Object generateType(ServiceDefinition sd, String type) {
+ TypeDefinition td = findTypeDefinition(sd, type);
+ return generateType(sd, td);
+ }
+
+ private static Object generateType(ServiceDefinition sd, TypeDefinition td) {
+ if (isPrimitiveType(td)) {
+ return generatePrimitiveType(td);
+ } else if (isMap(td)) {
+ return generateMapType(sd, td);
+ } else if (isArray(td)) {
+ return generateArrayType(sd, td);
+ } else if (isCollection(td)) {
+ return generateCollectionType(sd, td);
+ } else {
+ return generateComplexType(sd, td);
+ }
+ }
+
+ private static Object generateMapType(ServiceDefinition sd, TypeDefinition td) {
+ String keyType = StringUtils.substringAfter(td.getType(), "<");
+ keyType = StringUtils.substringBefore(keyType, ",");
+ keyType = StringUtils.strip(keyType);
+
+ Map<Object, Object> map = new HashMap<>();
+ // 生成 key 默认值
+ Object key = generateType(sd, keyType);
+
+ // 生成 value 默认值
+ String valueType = StringUtils.substringAfter(td.getType(), ",");
+ valueType = StringUtils.substringBefore(valueType, ">");
+ valueType = StringUtils.strip(valueType);
+ valueType = StringUtils.isNotEmpty(valueType) ? valueType : "java.lang.Object";
+ Object value = generateType(sd, valueType);
+ map.put(key, value);
+ return map;
+ }
+
+ private static Object generateCollectionType(ServiceDefinition sd, TypeDefinition td) {
+ String type = StringUtils.substringAfter(td.getType(), "<");
+ type = StringUtils.substringBefore(type, ">");
+ if (StringUtils.isEmpty(type)) {
+ // 如果 collection 类型未声明,则生成空 collection
+ return new Object[] {};
+ }
+ return new Object[]{generateType(sd, type)};
+
+ }
+ private static Object generateArrayType(ServiceDefinition sd, TypeDefinition td) {
+ String type = StringUtils.substringBeforeLast(td.getType(), "[]");
+ return new Object[]{generateType(sd, type)};
+ }
+
+ private static void generateEnclosedType(Map<String, Object> holder, String key, ServiceDefinition sd, TypeDefinition td) {
+ if (td.getProperties() == null || td.getProperties().size() == 0) {
+ holder.put(key, generateType(sd, td));
} else {
Map<String, Object> enclosedMap = new HashMap<>();
holder.put(key, enclosedMap);
- generateComplexType(enclosedMap, typeDefinition);
+ generateComplexType(sd, td, enclosedMap);
}
}
}
diff --git a/dubbo-admin-frontend/src/router/index.js b/dubbo-admin-frontend/src/router/index.js
index 98507b8..866295a 100644
--- a/dubbo-admin-frontend/src/router/index.js
+++ b/dubbo-admin-frontend/src/router/index.js
@@ -19,7 +19,6 @@
import Router from 'vue-router'
import ServiceSearch from '@/components/ServiceSearch'
import ServiceDetail from '@/components/ServiceDetail'
-import ServiceTest from '@/components/test/ServiceTest'
import TestMethod from '@/components/test/TestMethod'
import RoutingRule from '@/components/governance/RoutingRule'
import TagRule from '@/components/governance/TagRule'