mxd 4 anni fa
parent
commit
003062756a

+ 78 - 21
src/main/java/org/ssssssss/magicapi/swagger/SwaggerEntity.java

@@ -15,9 +15,9 @@ public class SwaggerEntity {
 
 	private Info info;
 
-	private Set<Tag> tags = new HashSet<>();
+	private Set<Tag> tags = new TreeSet<>(Comparator.comparing(Tag::getName));
 
-	private Map<String,String> definitions = Collections.emptyMap();
+	private Map<String, String> definitions = Collections.emptyMap();
 
 	private Map<String, Map<String, Path>> paths = new HashMap<>();
 
@@ -31,7 +31,7 @@ public class SwaggerEntity {
 
 	public void addPath(String path, String method, Path pathInfo) {
 		Map<String, Path> map = paths.get(path);
-		if(map == null){
+		if (map == null) {
 			map = new HashMap<>();
 			paths.put(path, map);
 		}
@@ -66,7 +66,7 @@ public class SwaggerEntity {
 		this.basePath = basePath;
 	}
 
-	public Map<String,String> getDefinitions() {
+	public Map<String, String> getDefinitions() {
 		return definitions;
 	}
 
@@ -79,7 +79,49 @@ public class SwaggerEntity {
 	}
 
 
-	public static class Info{
+	private static Map<String, Object> doProcessSchema(Object target) {
+		Map<String, Object> result = new HashMap<>(3);
+		result.put("type", getType(target));
+		if (target instanceof List) {
+			List targetList = (List) target;
+			if (targetList.size() > 0) {
+				result.put("items", doProcessSchema(targetList.get(0)));
+			} else {
+				result.put("items", Collections.emptyList());
+			}
+		} else if (target instanceof Map) {
+			Set<Map.Entry> entries = ((Map) target).entrySet();
+			Map<String, Map<String, Object>> properties = new HashMap<>(entries.size());
+			for (Map.Entry entry : entries) {
+				properties.put(Objects.toString(entry.getKey()), doProcessSchema(entry.getValue()));
+			}
+			result.put("properties", properties);
+		} else {
+			result.put("example", target == null ? "": target);
+		}
+		return result;
+	}
+
+	private static String getType(Object object) {
+		if (object instanceof Number) {
+			return "number";
+		}
+		if (object instanceof String) {
+			return "string";
+		}
+		if (object instanceof Boolean) {
+			return "boolean";
+		}
+		if (object instanceof List) {
+			return "array";
+		}
+		if (object instanceof Map) {
+			return "object";
+		}
+		return "string";
+	}
+
+	public static class Info {
 
 		private String description;
 
@@ -135,6 +177,8 @@ public class SwaggerEntity {
 
 		private String summary;
 
+		private String operationId = UUID.randomUUID().toString().replace("-","");
+
 		private List<String> produces = new ArrayList<>();
 
 		private List<String> consumes = new ArrayList<>();
@@ -155,11 +199,19 @@ public class SwaggerEntity {
 			this.parameters.add(parameter);
 		}
 
+		public String getOperationId() {
+			return operationId;
+		}
+
+		public void setOperationId(String operationId) {
+			this.operationId = operationId;
+		}
+
 		public void addResponse(String status, Object object) {
 			Map<String, Object> response = new HashMap<>();
-			response.put("description","OK");
-			response.put("schema",new HashMap<>());
-			response.put("examples",object);
+			response.put("description", "OK");
+			response.put("schema", doProcessSchema(object));
+			response.put("example", object);
 			this.responses.put(status, response);
 		}
 
@@ -167,7 +219,7 @@ public class SwaggerEntity {
 			return tags;
 		}
 
-		public void addTag(String tag){
+		public void addTag(String tag) {
 			this.tags.add(tag);
 		}
 
@@ -226,16 +278,28 @@ public class SwaggerEntity {
 
 		private String type;
 
-		private Map<String,Object> schema;
+		private Map<String, Object> schema;
 
-		private Object examples;
+		private String description;
 
-		public Parameter(String name, String in, String type, Object examples) {
+		public Parameter(String name, String in, String type, String description, Object example) {
 			this.name = name;
 			this.in = in;
 			this.schema = new HashMap<>();
-			this.schema.put("type",type);
-			this.examples = examples;
+			this.schema.put("type", type);
+			this.schema.put("example", example);
+			this.description = description;
+			if ("body".equalsIgnoreCase(in)) {
+				this.schema = doProcessSchema(example);
+			}
+		}
+
+		public String getDescription() {
+			return description;
+		}
+
+		public void setDescription(String description) {
+			this.description = description;
 		}
 
 		public String getName() {
@@ -278,13 +342,6 @@ public class SwaggerEntity {
 			this.schema = schema;
 		}
 
-		public Object getExamples() {
-			return examples;
-		}
-
-		public void setExamples(Object examples) {
-			this.examples = examples;
-		}
 	}
 
 	public static class Tag {

+ 71 - 14
src/main/java/org/ssssssss/magicapi/swagger/SwaggerProvider.java

@@ -7,10 +7,8 @@ import org.ssssssss.magicapi.model.ApiInfo;
 import org.ssssssss.magicapi.provider.GroupServiceProvider;
 
 import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 生成swagger用的json
@@ -64,25 +62,49 @@ public class SwaggerProvider {
 		swaggerEntity.setInfo(new SwaggerEntity.Info(this.description, this.version, this.title, license));
 		ObjectMapper mapper = new ObjectMapper();
 		for (ApiInfo info : infos) {
-			String groupName = groupServiceProvider.getFullName(info.getGroupId());
+			String groupName = groupServiceProvider.getFullName(info.getGroupId()).replace("/","-");
 			swaggerEntity.addTag(groupName, groupServiceProvider.getFullPath(info.getGroupId()));
 			SwaggerEntity.Path path = new SwaggerEntity.Path();
 			path.addTag(groupName);
 			try {
-				path.addResponse("200", mapper.readValue(Objects.toString(info.getResponseBody(), "{}"), Object.class));
-			} catch (IOException ignored) {
+				parseParameters(mapper,info).forEach(path::addParameter);
+				path.addResponse("200", mapper.readValue(Objects.toString(info.getResponseBody(), "{}"),Object.class));
+			} catch (Exception ignored) {
 			}
 			path.addConsume("*/*");
 			path.addProduce("application/json");
 			path.setSummary(info.getName());
+
+			swaggerEntity.addPath(mappingHandlerMapping.getRequestPath(info.getGroupId(), info.getPath()), info.getMethod(), path);
+		}
+		return swaggerEntity;
+	}
+
+	private List<SwaggerEntity.Parameter> parseParameters(ObjectMapper mapper, ApiInfo info) {
+		String content = info.getParameter();
+		content = content.trim();
+		List<SwaggerEntity.Parameter> parameters = new ArrayList<>();
+		if (content.startsWith("[")) {    // 0.5.0
 			try {
-				Map map = mapper.readValue(Objects.toString(info.getParameter(), "{}"), Map.class);
+				List<KeyValueDescription> kvs = readKeyValues(mapper, content);
+				parameters.addAll(kvs.stream().map(kv -> new SwaggerEntity.Parameter(kv.getName(), "query", "string", kv.getDescription(), kv.getValue())).collect(Collectors.toList()));
+				kvs = readKeyValues(mapper, Objects.toString(info.getRequestHeader(),"[]"));
+				parameters.addAll(kvs.stream().map(kv -> new SwaggerEntity.Parameter(kv.getName(), "header", "string", kv.getDescription(), kv.getValue())).collect(Collectors.toList()));
+				Object object = mapper.readValue(info.getRequestBody(),Object.class);
+				if(object instanceof List || object instanceof Map){
+					parameters.add(new SwaggerEntity.Parameter("body", "body", object instanceof List ? "array": "object", null, object));
+				}
+			} catch (Exception ignored) {
+			}
+		} else {
+			try {
+				Map map = mapper.readValue(Objects.toString(content, "{}"), Map.class);
 				Object request = map.get("request");
 				if (request instanceof Map) {
 					Map requestMap = (Map) request;
 					Set keys = requestMap.keySet();
 					for (Object key : keys) {
-						path.addParameter(new SwaggerEntity.Parameter(key.toString(), "query", "string", requestMap.getOrDefault(key, "")));
+						parameters.add(new SwaggerEntity.Parameter(key.toString(), "query", "string", key.toString(), requestMap.getOrDefault(key, "")));
 					}
 				}
 				Object header = map.get("header");
@@ -90,18 +112,53 @@ public class SwaggerProvider {
 					Map headers = (Map) header;
 					Set keys = headers.keySet();
 					for (Object key : keys) {
-						path.addParameter(new SwaggerEntity.Parameter(key.toString(), "header", "string", headers.getOrDefault(key, "")));
+						parameters.add(new SwaggerEntity.Parameter(key.toString(), "header", "string", key.toString(), headers.getOrDefault(key, "")));
 					}
 				}
 				if (map.containsKey("body")) {
-					path.addParameter(new SwaggerEntity.Parameter("body", "body", null, map.get("body")));
+					parameters.add(new SwaggerEntity.Parameter("body", "body", null, null, map.get("body")));
 				}
-			} catch (IOException ignored) {
+			} catch (Exception ignored) {
 			}
-			swaggerEntity.addPath(mappingHandlerMapping.getRequestPath(info.getGroupId(), info.getPath()), info.getMethod(), path);
 		}
-		return swaggerEntity;
+		return parameters;
 	}
 
+	private List<KeyValueDescription> readKeyValues(ObjectMapper mapper, String json) throws IOException {
+		return Arrays.asList(mapper.readValue(json, KeyValueDescription[].class));
+	}
+
+	static class KeyValueDescription {
+
+		private String name;
+
+		private String value;
+
+		private String description;
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getValue() {
+			return value;
+		}
+
+		public void setValue(String value) {
+			this.value = value;
+		}
+
+		public String getDescription() {
+			return description;
+		}
+
+		public void setDescription(String description) {
+			this.description = description;
+		}
+	}
 
 }