Bladeren bron

complete basic service invocation

superfree 5 jaren geleden
bovenliggende
commit
986b7a327d
35 gewijzigde bestanden met toevoegingen van 667 en 159 verwijderingen
  1. 13 0
      .idea/libraries/Maven__com_alibaba_fastjson_1_2_60.xml
  2. 6 0
      .idea/vcs.xml
  3. 0 13
      lambda-service/src/main/java/com/example/lambda/service/interpreter/Ast.java
  4. 2 11
      lambda-service/src/main/java/com/example/lambda/service/interpreter/LambdaInterpreter.java
  5. 2 0
      lambda-service/src/main/java/com/example/lambda/service/interpreter/Result.java
  6. 29 0
      lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Abstract.java
  7. 29 0
      lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Application.java
  8. 10 0
      lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Ast.java
  9. 29 0
      lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Atom.java
  10. 7 4
      lambda-service/src/main/java/com/example/lambda/service/web/LambdaController.java
  11. 66 27
      lambda-service/src/main/java/com/example/lambda/service/web/LambdaService.java
  12. 0 24
      lambda-service/src/main/java/com/example/lambda/service/web/entity/PatternData.java
  13. 50 0
      lambda-service/src/main/java/com/example/lambda/service/web/entity/PatternParam.java
  14. 0 5
      lambda-service/src/main/java/com/example/lambda/service/web/entity/PatternTargetType.java
  15. 0 4
      lambda-service/src/main/java/com/example/lambda/service/web/entity/RenderData.java
  16. 41 0
      lambda-service/src/main/java/com/example/lambda/service/web/entity/RenderParam.java
  17. 43 12
      lambda-service/src/main/java/com/example/lambda/service/web/entity/ServiceInfo.java
  18. 24 5
      lambda-service/src/main/java/com/example/lambda/service/web/entity/ServiceResponse.java
  19. 32 0
      lambda-service/src/main/java/com/example/lambda/service/web/entity/TypeInfo.java
  20. 30 0
      lambda-service/src/main/java/com/example/lambda/service/web/entity/TypeMap.java
  21. 20 0
      lambda-service/src/main/java/com/example/lambda/service/web/type/IRType.java
  22. 8 0
      lambda-service/src/main/java/com/example/lambda/service/web/type/IType.java
  23. 1 1
      lambda-service/src/main/java/com/example/lambda/service/web/type/ServiceResponseType.java
  24. 16 0
      lambda-service/src/main/java/com/example/lambda/service/web/type/SourceType.java
  25. 16 0
      lambda-service/src/main/java/com/example/lambda/service/web/type/TargetType.java
  26. 6 0
      subject-center/pom.xml
  27. 29 0
      subject-center/src/main/java/com/example/subject/center/HttpConverterConfig.java
  28. 21 13
      subject-center/src/main/java/com/example/subject/center/SubjectCenterController.java
  29. 4 4
      subject-center/src/main/java/com/example/subject/center/SubjectCenterService.java
  30. 18 9
      subject-center/src/main/java/com/example/subject/center/SubjectCenterServiceImpl.java
  31. 41 0
      subject-center/src/main/java/com/example/subject/center/entity/PatternParam.java
  32. 0 4
      subject-center/src/main/java/com/example/subject/center/entity/RenderData.java
  33. 22 6
      subject-center/src/main/java/com/example/subject/center/entity/RenderParam.java
  34. 37 12
      subject-center/src/main/java/com/example/subject/center/entity/ServiceInfo.java
  35. 15 5
      subject-center/src/main/java/com/example/subject/center/entity/ServiceResponse.java

+ 13 - 0
.idea/libraries/Maven__com_alibaba_fastjson_1_2_60.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.alibaba:fastjson:1.2.60">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.60/fastjson-1.2.60.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.60/fastjson-1.2.60-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.60/fastjson-1.2.60-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 0 - 13
lambda-service/src/main/java/com/example/lambda/service/interpreter/Ast.java

@@ -1,13 +0,0 @@
-package com.example.lambda.service.interpreter;
-
-public class Ast {
-    private String info = "An ast";
-
-    public String getInfo() {
-        return info;
-    }
-
-    public void setInfo(String info) {
-        this.info = info;
-    }
-}

+ 2 - 11
lambda-service/src/main/java/com/example/lambda/service/interpreter/LambdaInterpreter.java

@@ -1,25 +1,16 @@
 package com.example.lambda.service.interpreter;
 
+import com.example.lambda.service.interpreter.type.Ast;
 import org.springframework.stereotype.Component;
 
 @Component
 public class LambdaInterpreter {
 
     public Result solve(String pattern) {
-        return solveSuccessStub(pattern);
-    }
-
-    public Result solveSuccessStub(String pattern) {
         Result result = new Result();
         result.setState(InterpreterState.SUCCESS);
-        result.setAst(new Ast());
+        result.setAst(Ast.ZERO());
         return result;
     }
 
-    public Result solveErrorStub(String pattern) {
-        Result result = new Result();
-        result.setState(InterpreterState.ERROR);
-        result.setMsg("solve error stub");
-        return result;
-    }
 }

+ 2 - 0
lambda-service/src/main/java/com/example/lambda/service/interpreter/Result.java

@@ -1,5 +1,7 @@
 package com.example.lambda.service.interpreter;
 
+import com.example.lambda.service.interpreter.type.Ast;
+
 public class Result {
 
     private InterpreterState state;

+ 29 - 0
lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Abstract.java

@@ -0,0 +1,29 @@
+package com.example.lambda.service.interpreter.type;
+
+public class Abstract implements Ast {
+
+    private Atom param;
+
+    private Ast sub;
+
+    public Abstract(Atom param, Ast sub) {
+        this.param = param;
+        this.sub = sub;
+    }
+
+    public Atom getParam() {
+        return param;
+    }
+
+    public void setParam(Atom param) {
+        this.param = param;
+    }
+
+    public Ast getSub() {
+        return sub;
+    }
+
+    public void setSub(Ast sub) {
+        this.sub = sub;
+    }
+}

+ 29 - 0
lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Application.java

@@ -0,0 +1,29 @@
+package com.example.lambda.service.interpreter.type;
+
+public class Application implements Ast {
+
+    private Ast left;
+
+    private Ast right;
+
+    public Application(Ast left, Ast right) {
+        this.left = left;
+        this.right = right;
+    }
+
+    public Ast getLeft() {
+        return left;
+    }
+
+    public void setLeft(Ast left) {
+        this.left = left;
+    }
+
+    public Ast getRight() {
+        return right;
+    }
+
+    public void setRight(Ast right) {
+        this.right = right;
+    }
+}

+ 10 - 0
lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Ast.java

@@ -0,0 +1,10 @@
+package com.example.lambda.service.interpreter.type;
+
+public interface Ast {
+    static Ast ZERO() {
+        Atom f = new Atom(1, "f");
+        Atom x = new Atom(2, "x");
+        Ast zero = new Abstract(f, new Abstract(x, x));
+        return zero;
+    }
+}

+ 29 - 0
lambda-service/src/main/java/com/example/lambda/service/interpreter/type/Atom.java

@@ -0,0 +1,29 @@
+package com.example.lambda.service.interpreter.type;
+
+public class Atom implements Ast {
+
+    private Integer id;
+
+    private String name;
+
+    public Atom(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 7 - 4
lambda-service/src/main/java/com/example/lambda/service/web/LambdaController.java

@@ -1,6 +1,6 @@
 package com.example.lambda.service.web;
 
-import com.example.lambda.service.web.entity.PatternData;
+import com.example.lambda.service.web.entity.PatternParam;
 import com.example.lambda.service.web.entity.ServiceInfo;
 import com.example.lambda.service.web.entity.ServiceResponse;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,9 +31,12 @@ public class LambdaController {
     }
 
     @PostMapping("/pattern")
-    public ServiceResponse pattern(@RequestBody PatternData data) {
-        System.out.println("invoke patter(target=" + data.getTarget() + ", pattern=" + data.getData() + ")");
-        return lambdaService.pattern(data.getTarget(), data.getData());
+    public ServiceResponse pattern(@RequestBody PatternParam data) {
+        System.out.println("pattern: " + data.toString());
+        ServiceResponse response = lambdaService.pattern(data);
+        System.out.println(response);
+        System.out.println(response.getData());
+        return response;
     }
 
 }

+ 66 - 27
lambda-service/src/main/java/com/example/lambda/service/web/LambdaService.java

@@ -1,20 +1,27 @@
 package com.example.lambda.service.web;
 
-import com.example.lambda.service.interpreter.Ast;
+import com.example.lambda.service.interpreter.type.Abstract;
+import com.example.lambda.service.interpreter.type.Application;
+import com.example.lambda.service.interpreter.type.Ast;
 import com.example.lambda.service.interpreter.InterpreterState;
 import com.example.lambda.service.interpreter.LambdaInterpreter;
 import com.example.lambda.service.interpreter.Result;
+import com.example.lambda.service.interpreter.type.Atom;
 import com.example.lambda.service.web.entity.*;
+import com.example.lambda.service.web.type.IRType;
+import com.example.lambda.service.web.type.IType;
+import com.example.lambda.service.web.type.SourceType;
+import com.example.lambda.service.web.type.TargetType;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 @Service
 public class LambdaService {
 
+    public static final String PATTERN_SOURCE_TYPE_UNKNOWN = "无法解析参数类型";
+
     @Autowired
     private LambdaInterpreter interpreter;
 
@@ -22,47 +29,79 @@ public class LambdaService {
         return interpreter != null ? "Interpreter is available(" + interpreter + ")" : "Interpreter is unavailable";
     }
 
+    private List<TypeInfo> createTypeInfos(IType[] types) {
+        List<TypeInfo> infos = new ArrayList<>();
+        for (IType type : types) {
+            infos.add(new TypeInfo(type));
+        }
+        return infos;
+    }
+
     public ServiceInfo info() {
         ServiceInfo info = new ServiceInfo();
-        // pattern samples
-        List<PatternData> patternSamples = new ArrayList<>();
-        for (PatternTargetType target : PatternTargetType.values()) {
-            PatternData sample = new PatternData();
-            sample.setTarget(target);
-            sample.setData("An lambda expression");
-            patternSamples.add(sample);
-        }
-        // render samples
-        List<RenderData> renderSamples = new ArrayList<>();
+        // add types
+        info.setSourceTypes(createTypeInfos(SourceType.values()));
+        info.setIrTypes(createTypeInfos(IRType.values()));
+        info.setTargetTypes(createTypeInfos(TargetType.values()));
+
+        // pattern options
+        List<TypeMap<SourceType, IRType>> patternOptions = new ArrayList<>();
+        patternOptions.add(new TypeMap<>(SourceType.PATTERN, IRType.ATOM));
+        patternOptions.add(new TypeMap<>(SourceType.PATTERN, IRType.AST));
+        info.setPatternOptions(patternOptions);
+
+        // render options
+        List<TypeMap<IRType, TargetType>> renderOptions = new ArrayList<>();
+        renderOptions.add(new TypeMap<>(IRType.ATOM, TargetType.ATOM));
+        renderOptions.add(new TypeMap<>(IRType.AST, TargetType.AST));
+        info.setRenderOptions(renderOptions);
 
-        info.setPatternSamples(patternSamples);
-        info.setRenderSamples(renderSamples);
         return info;
     }
 
-    public ServiceResponse pattern(PatternTargetType type, String pattern) {
+    public ServiceResponse pattern(PatternParam param) {
+        if (param.getType() != SourceType.PATTERN) {
+            // 参数类型不存在
+            return ServiceResponse.error(PATTERN_SOURCE_TYPE_UNKNOWN);
+        }
+        String pattern = param.getData();
         try {
-            Result res = interpreter.solveSuccessStub(pattern);
+            Result res = interpreter.solve(pattern);
 //            Result res = interpreter.solveErrorStub(pattern);
             if (res.getState() == InterpreterState.ERROR) {
+                // 解析失败
                 return ServiceResponse.error(res.getMsg());
             }
-            Object target = null;
-            switch (type) {
+            switch (param.getTarget()) {
                 case ATOM:
-                    target = extractAtoms(res.getAst());
-                    break;
+                    List<Object> atoms = extractAtoms(res.getAst());
+                    return ServiceResponse.success(atoms);
+                case AST:
+                default:
+                    return ServiceResponse.success(res.getAst());
             }
-            return ServiceResponse.success(res.getAst());
         } catch (Exception e) {
             return ServiceResponse.error("interpreter error");
         }
     }
 
-    private List<String> extractAtoms(Ast ast) {
-        List<String> atoms = new ArrayList<>();
-
-        return atoms;
+    private List<Object> extractAtoms(Ast ast) {
+        Set<Atom> atoms = new HashSet<>();
+        Queue<Ast> Q = new LinkedList<>();
+        Q.add(ast);
+        while (Q.size() > 0) {
+            Ast a = Q.poll();
+            if (a instanceof Atom) {
+                atoms.add((Atom) a);
+            } else if (a instanceof Application) {
+                Q.offer(((Application) a).getLeft());
+                Q.offer(((Application) a).getRight());
+            } else if (a instanceof Abstract) {
+                atoms.add(((Abstract) a).getParam());
+                Q.add(((Abstract) a).getSub());
+            }
+        }
+        return new ArrayList<>(atoms);
     }
 
 }

+ 0 - 24
lambda-service/src/main/java/com/example/lambda/service/web/entity/PatternData.java

@@ -1,24 +0,0 @@
-package com.example.lambda.service.web.entity;
-
-public class PatternData {
-
-    private PatternTargetType target;
-
-    private String data;
-
-    public PatternTargetType getTarget() {
-        return target;
-    }
-
-    public void setTarget(PatternTargetType target) {
-        this.target = target;
-    }
-
-    public String getData() {
-        return data;
-    }
-
-    public void setData(String data) {
-        this.data = data;
-    }
-}

+ 50 - 0
lambda-service/src/main/java/com/example/lambda/service/web/entity/PatternParam.java

@@ -0,0 +1,50 @@
+package com.example.lambda.service.web.entity;
+
+import com.example.lambda.service.web.type.IRType;
+import com.example.lambda.service.web.type.SourceType;
+
+public class PatternParam {
+
+    private SourceType type;
+    private String data;
+    private IRType target;
+
+    public PatternParam(SourceType type, String data, IRType target) {
+        this.type = type;
+        this.data = data;
+        this.target = target;
+    }
+
+    public SourceType getType() {
+        return type;
+    }
+
+    public void setType(SourceType type) {
+        this.type = type;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public IRType getTarget() {
+        return target;
+    }
+
+    public void setTarget(IRType target) {
+        this.target = target;
+    }
+
+    @Override
+    public String toString() {
+        return "PatternParam{" +
+                "type=" + type +
+                ", data='" + data + '\'' +
+                ", target=" + target +
+                '}';
+    }
+}

+ 0 - 5
lambda-service/src/main/java/com/example/lambda/service/web/entity/PatternTargetType.java

@@ -1,5 +0,0 @@
-package com.example.lambda.service.web.entity;
-
-public enum PatternTargetType {
-    ATOM
-}

+ 0 - 4
lambda-service/src/main/java/com/example/lambda/service/web/entity/RenderData.java

@@ -1,4 +0,0 @@
-package com.example.lambda.service.web.entity;
-
-public class RenderData {
-}

+ 41 - 0
lambda-service/src/main/java/com/example/lambda/service/web/entity/RenderParam.java

@@ -0,0 +1,41 @@
+package com.example.lambda.service.web.entity;
+
+import com.example.lambda.service.web.type.IRType;
+import com.example.lambda.service.web.type.TargetType;
+
+public class RenderParam {
+
+    private IRType type;
+    private Object data;
+    private TargetType target;
+
+    public RenderParam(IRType type, Object data, TargetType target) {
+        this.type = type;
+        this.data = data;
+        this.target = target;
+    }
+
+    public IRType getType() {
+        return type;
+    }
+
+    public void setType(IRType type) {
+        this.type = type;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public TargetType getTarget() {
+        return target;
+    }
+
+    public void setTarget(TargetType target) {
+        this.target = target;
+    }
+}

+ 43 - 12
lambda-service/src/main/java/com/example/lambda/service/web/entity/ServiceInfo.java

@@ -1,14 +1,21 @@
 package com.example.lambda.service.web.entity;
 
+import com.example.lambda.service.web.type.IRType;
+import com.example.lambda.service.web.type.SourceType;
+import com.example.lambda.service.web.type.TargetType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.util.List;
+import java.util.Map;
 
 public class ServiceInfo {
 
     private String serviceName;
-
-    private List<PatternData> patternSamples;
-
-    private List<RenderData> renderSamples;
+    private List<TypeInfo> sourceTypes;
+    private List<TypeInfo> irTypes;
+    private List<TypeInfo> targetTypes;
+    private List<TypeMap<SourceType, IRType>> patternOptions;
+    private List<TypeMap<IRType, TargetType>> renderOptions;
 
     public String getServiceName() {
         return serviceName;
@@ -18,19 +25,43 @@ public class ServiceInfo {
         this.serviceName = serviceName;
     }
 
-    public List<PatternData> getPatternSamples() {
-        return patternSamples;
+    public List<TypeInfo> getSourceTypes() {
+        return sourceTypes;
+    }
+
+    public void setSourceTypes(List<TypeInfo> sourceTypes) {
+        this.sourceTypes = sourceTypes;
+    }
+
+    public List<TypeInfo> getIrTypes() {
+        return irTypes;
+    }
+
+    public void setIrTypes(List<TypeInfo> irTypes) {
+        this.irTypes = irTypes;
+    }
+
+    public List<TypeInfo> getTargetTypes() {
+        return targetTypes;
+    }
+
+    public void setTargetTypes(List<TypeInfo> targetTypes) {
+        this.targetTypes = targetTypes;
+    }
+
+    public List<TypeMap<SourceType, IRType>> getPatternOptions() {
+        return patternOptions;
     }
 
-    public void setPatternSamples(List<PatternData> patternSamples) {
-        this.patternSamples = patternSamples;
+    public void setPatternOptions(List<TypeMap<SourceType, IRType>> patternOptions) {
+        this.patternOptions = patternOptions;
     }
 
-    public List<RenderData> getRenderSamples() {
-        return renderSamples;
+    public List<TypeMap<IRType, TargetType>> getRenderOptions() {
+        return renderOptions;
     }
 
-    public void setRenderSamples(List<RenderData> renderSamples) {
-        this.renderSamples = renderSamples;
+    public void setRenderOptions(List<TypeMap<IRType, TargetType>> renderOptions) {
+        this.renderOptions = renderOptions;
     }
 }

+ 24 - 5
lambda-service/src/main/java/com/example/lambda/service/web/entity/ServiceResponse.java

@@ -1,5 +1,9 @@
 package com.example.lambda.service.web.entity;
 
+import com.example.lambda.service.web.type.ServiceResponseType;
+
+import java.util.List;
+
 public class ServiceResponse {
 
     private ServiceResponseType status;
@@ -8,26 +12,33 @@ public class ServiceResponse {
 
     private Object data;
 
-    private ServiceResponse(ServiceResponseType status, String msg, Object data) {
+    private List<Object> list;
+
+    public ServiceResponse(ServiceResponseType status, String msg, Object data, List<Object> list) {
         this.status = status;
         this.msg = msg;
         this.data = data;
+        this.list = list;
     }
 
     public static ServiceResponse success() {
-        return new ServiceResponse(ServiceResponseType.SUCCESS, "success", null);
+        return new ServiceResponse(ServiceResponseType.SUCCESS, "success", null, null);
     }
 
     public static ServiceResponse success(Object data) {
-        return new ServiceResponse(ServiceResponseType.SUCCESS, "success", data);
+        return new ServiceResponse(ServiceResponseType.SUCCESS, "success", data, null);
+    }
+
+    public static ServiceResponse success(List<Object> list) {
+        return new ServiceResponse(ServiceResponseType.SUCCESS, "success", list, list);
     }
 
     public static ServiceResponse error() {
-        return new ServiceResponse(ServiceResponseType.ERROR, "unknown error", null);
+        return new ServiceResponse(ServiceResponseType.ERROR, "unknown error", null, null);
     }
 
     public static ServiceResponse error(String msg) {
-        return new ServiceResponse(ServiceResponseType.ERROR, msg, null);
+        return new ServiceResponse(ServiceResponseType.ERROR, msg, null, null);
     }
 
     public ServiceResponseType getStatus() {
@@ -53,4 +64,12 @@ public class ServiceResponse {
     public void setData(Object data) {
         this.data = data;
     }
+
+    public List<Object> getList() {
+        return list;
+    }
+
+    public void setList(List<Object> list) {
+        this.list = list;
+    }
 }

+ 32 - 0
lambda-service/src/main/java/com/example/lambda/service/web/entity/TypeInfo.java

@@ -0,0 +1,32 @@
+package com.example.lambda.service.web.entity;
+
+import com.example.lambda.service.web.type.IType;
+
+public class TypeInfo {
+    private String name;
+    private String label;
+
+    public TypeInfo() {
+    }
+
+    public TypeInfo(IType type) {
+        this.name = type.name();
+        this.label = type.getLabel();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    public void setLabel(String label) {
+        this.label = label;
+    }
+}

+ 30 - 0
lambda-service/src/main/java/com/example/lambda/service/web/entity/TypeMap.java

@@ -0,0 +1,30 @@
+package com.example.lambda.service.web.entity;
+
+import com.example.lambda.service.web.type.IType;
+
+public class TypeMap<K extends IType, V extends IType> {
+
+    private K type;
+    private V target;
+
+    public TypeMap(K type, V target) {
+        this.type = type;
+        this.target = target;
+    }
+
+    public K getType() {
+        return type;
+    }
+
+    public void setType(K type) {
+        this.type = type;
+    }
+
+    public V getTarget() {
+        return target;
+    }
+
+    public void setTarget(V target) {
+        this.target = target;
+    }
+}

+ 20 - 0
lambda-service/src/main/java/com/example/lambda/service/web/type/IRType.java

@@ -0,0 +1,20 @@
+package com.example.lambda.service.web.type;
+
+/**
+ * 中间表示
+ */
+public enum  IRType implements IType {
+    ATOM("原子"), AST("抽象语法树");
+
+    private String label;
+
+    IRType(String label) {
+        this.label = label;
+    }
+
+    @Override
+    public String getLabel() {
+        return label;
+    }
+
+}

+ 8 - 0
lambda-service/src/main/java/com/example/lambda/service/web/type/IType.java

@@ -0,0 +1,8 @@
+package com.example.lambda.service.web.type;
+
+public interface IType {
+
+    String getLabel();
+
+    String name();
+}

+ 1 - 1
lambda-service/src/main/java/com/example/lambda/service/web/entity/ServiceResponseType.java → lambda-service/src/main/java/com/example/lambda/service/web/type/ServiceResponseType.java

@@ -1,4 +1,4 @@
-package com.example.lambda.service.web.entity;
+package com.example.lambda.service.web.type;
 
 public enum ServiceResponseType {
     SUCCESS, ERROR

+ 16 - 0
lambda-service/src/main/java/com/example/lambda/service/web/type/SourceType.java

@@ -0,0 +1,16 @@
+package com.example.lambda.service.web.type;
+
+public enum SourceType implements IType {
+    PATTERN("表达式");
+
+    private String label;
+
+    SourceType(String label) {
+        this.label = label;
+    }
+
+    @Override
+    public String getLabel() {
+        return label;
+    }
+}

+ 16 - 0
lambda-service/src/main/java/com/example/lambda/service/web/type/TargetType.java

@@ -0,0 +1,16 @@
+package com.example.lambda.service.web.type;
+
+public enum TargetType implements IType {
+    ATOM("原子"), AST("抽象语法树"), VAL("符号");
+
+    private String label;
+
+    TargetType(String label) {
+        this.label = label;
+    }
+
+    @Override
+    public String getLabel() {
+        return label;
+    }
+}

+ 6 - 0
subject-center/pom.xml

@@ -32,6 +32,12 @@
 			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
 		</dependency>
 
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>1.2.60</version>
+		</dependency>
+
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter-test</artifactId>

+ 29 - 0
subject-center/src/main/java/com/example/subject/center/HttpConverterConfig.java

@@ -0,0 +1,29 @@
+package com.example.subject.center;
+
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+
+@Configuration
+public class HttpConverterConfig {
+
+    @Bean
+    public HttpMessageConverters fastJsonHttpMessageConverters() {
+        System.out.println("fast json config");
+        // 1.定义一个converters转换消息的对象
+        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
+        // 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json数据
+        FastJsonConfig fastJsonConfig = new FastJsonConfig();
+        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
+        // 3.在converter中添加配置信息
+        fastConverter.setFastJsonConfig(fastJsonConfig);
+        // 4.将converter赋值给HttpMessageConverter
+        HttpMessageConverter<?> converter = fastConverter;
+        // 5.返回HttpMessageConverters对象
+        return new HttpMessageConverters(converter);
+    }
+}

+ 21 - 13
subject-center/src/main/java/com/example/subject/center/SubjectCenterController.java

@@ -26,23 +26,31 @@ public class SubjectCenterController {
         return subjectCenterService.getServiceList();
     }
 
+    private String getServiceId(String serviceName) {
+        return serviceName + "-service";
+    }
+
     @PostMapping("/{serviceName}/pattern")
-    public Response pattern(@PathVariable String serviceName, @RequestBody PatternData patternData) {
-        String serviceId = serviceName + "-service";
-        ServiceResponse response = subjectCenterService.patternProxy(serviceId, patternData);
-        switch (response.getStatus()) {
+    public Response pattern(@PathVariable String serviceName, @RequestBody PatternParam param) {
+        ServiceResponse response = subjectCenterService.patternProxy(getServiceId(serviceName), param);
+        return solveServiceResponse(response);
+    }
+
+    @PostMapping("/{serviceName}/render")
+    public Response render(@PathVariable String serviceName, @RequestBody RenderParam param) {
+        ServiceResponse response = subjectCenterService.renderProxy(getServiceId(serviceName), param);
+        return solveServiceResponse(response);
+    }
+
+    private Response solveServiceResponse(ServiceResponse serviceResponse) {
+        switch (serviceResponse.getStatus()) {
             case SUCCESS:
-                return Response.ok(response.getData());
+                Object data = serviceResponse.getData();
+                if (data == null) data = serviceResponse.getList();
+                return Response.ok(data);
             case ERROR:
-                return Response.error(response.getMsg());
+                return Response.error(serviceResponse.getMsg());
         }
         return Response.error("unknown controller error");
     }
-
-    @PostMapping("/{serviceName}/render")
-    public Response render(@PathVariable String serviceName, @RequestBody RenderData data) {
-        String serviceId = serviceName + "-service";
-        ServiceResponse response = subjectCenterService.renderProxy(serviceId, data);
-        return Response.ok("stub render proxy");
-    }
 }

+ 4 - 4
subject-center/src/main/java/com/example/subject/center/SubjectCenterService.java

@@ -1,7 +1,7 @@
 package com.example.subject.center;
 
-import com.example.subject.center.entity.PatternData;
-import com.example.subject.center.entity.RenderData;
+import com.example.subject.center.entity.PatternParam;
+import com.example.subject.center.entity.RenderParam;
 import com.example.subject.center.entity.ServiceInfo;
 import com.example.subject.center.entity.ServiceResponse;
 
@@ -11,7 +11,7 @@ public interface SubjectCenterService {
 
     List<ServiceInfo> getServiceList();
 
-    ServiceResponse patternProxy(String serviceId, PatternData patternData);
+    ServiceResponse patternProxy(String serviceId, PatternParam patternParam);
 
-    ServiceResponse renderProxy(String serviceId, RenderData renderData);
+    ServiceResponse renderProxy(String serviceId, RenderParam renderParam);
 }

+ 18 - 9
subject-center/src/main/java/com/example/subject/center/SubjectCenterServiceImpl.java

@@ -28,31 +28,40 @@ public class SubjectCenterServiceImpl implements SubjectCenterService {
         List<ServiceInfo> serviceInfos = new ArrayList<>();
         for (String serviceId : discoveryClient.getServices()) {
             ServiceInfo info = getInfo(serviceId);
-//            ServiceInfo info = new ServiceInfo();
             info.setServiceName(serviceId.substring(0, serviceId.indexOf('-')));
             serviceInfos.add(info);
         }
         return serviceInfos;
     }
 
-    private ServiceResponse postPattern(String serviceId, Object data) {
-        String url = "http://" + serviceId + "/pattern";
-        System.out.println("post: " + url);
+    private ServiceResponse serviceProxy(String serviceId, String method, Object data) {
+        String url = "http://" + serviceId + "/" + method;
+        System.out.println("[" + method + " proxy]: " + url);
         return restTemplate.postForObject(url, data, ServiceResponse.class);
     }
 
+    private static final String PROXY_METHOD_PATTERN = "pattern";
+    private static final String PROXY_METHOD_RENDER = "render";
+
     @Override
-    public ServiceResponse patternProxy(String serviceId, PatternData data) {
-        System.out.println("request service: " + serviceId);
+    public ServiceResponse patternProxy(String serviceId, PatternParam param) {
         try {
-            return postPattern(serviceId, data);
+            ServiceResponse response = serviceProxy(serviceId, PROXY_METHOD_PATTERN, param);
+            System.out.println(response.getData());
+            System.out.println(response.getList());
+            return response;
         } catch (Exception e) {
+            e.printStackTrace();
             return ServiceResponse.error();
         }
     }
 
     @Override
-    public ServiceResponse renderProxy(String serviceId, RenderData renderData) {
-        return null;
+    public ServiceResponse renderProxy(String serviceId, RenderParam param) {
+        try {
+            return serviceProxy(serviceId, PROXY_METHOD_RENDER, param);
+        } catch (Exception e) {
+            return ServiceResponse.error();
+        }
     }
 }

+ 41 - 0
subject-center/src/main/java/com/example/subject/center/entity/PatternParam.java

@@ -0,0 +1,41 @@
+package com.example.subject.center.entity;
+
+public class PatternParam {
+
+    private Object type;
+
+    private String data;
+
+    private Object target;
+
+    public PatternParam(Object type, String data, Object target) {
+        this.type = type;
+        this.data = data;
+        this.target = target;
+    }
+
+    public Object getType() {
+        return type;
+    }
+
+    public void setType(Object type) {
+        this.type = type;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public Object getTarget() {
+        return target;
+    }
+
+    public void setTarget(Object target) {
+        this.target = target;
+    }
+
+}

+ 0 - 4
subject-center/src/main/java/com/example/subject/center/entity/RenderData.java

@@ -1,4 +0,0 @@
-package com.example.subject.center.entity;
-
-public class RenderData {
-}

+ 22 - 6
subject-center/src/main/java/com/example/subject/center/entity/PatternData.java → subject-center/src/main/java/com/example/subject/center/entity/RenderParam.java

@@ -1,19 +1,27 @@
 package com.example.subject.center.entity;
 
-public class PatternData {
+public class RenderParam {
 
-    private Object target;
+    private Object type;
 
     private Object data;
 
-    public Object getTarget() {
-        return target;
-    }
+    private Object target;
 
-    public void setTarget(Object target) {
+    public RenderParam(Object type, Object data, Object target) {
+        this.type = type;
+        this.data = data;
         this.target = target;
     }
 
+    public Object getType() {
+        return type;
+    }
+
+    public void setType(Object type) {
+        this.type = type;
+    }
+
     public Object getData() {
         return data;
     }
@@ -21,4 +29,12 @@ public class PatternData {
     public void setData(Object data) {
         this.data = data;
     }
+
+    public Object getTarget() {
+        return target;
+    }
+
+    public void setTarget(Object target) {
+        this.target = target;
+    }
 }

+ 37 - 12
subject-center/src/main/java/com/example/subject/center/entity/ServiceInfo.java

@@ -5,10 +5,11 @@ import java.util.List;
 public class ServiceInfo {
 
     private String serviceName;
-
-    private List<PatternData> patternSamples;
-
-    private List<RenderData> renderSamples;
+    private List<Object> sourceTypes;
+    private List<Object> irTypes;
+    private List<Object> targetTypes;
+    private List<Object> patternOptions;
+    private List<Object> renderOptions;
 
     public String getServiceName() {
         return serviceName;
@@ -18,19 +19,43 @@ public class ServiceInfo {
         this.serviceName = serviceName;
     }
 
-    public List<PatternData> getPatternSamples() {
-        return patternSamples;
+    public List<Object> getSourceTypes() {
+        return sourceTypes;
+    }
+
+    public void setSourceTypes(List<Object> sourceTypes) {
+        this.sourceTypes = sourceTypes;
+    }
+
+    public List<Object> getIrTypes() {
+        return irTypes;
+    }
+
+    public void setIrTypes(List<Object> irTypes) {
+        this.irTypes = irTypes;
+    }
+
+    public List<Object> getTargetTypes() {
+        return targetTypes;
+    }
+
+    public void setTargetTypes(List<Object> targetTypes) {
+        this.targetTypes = targetTypes;
+    }
+
+    public List<Object> getPatternOptions() {
+        return patternOptions;
     }
 
-    public void setPatternSamples(List<PatternData> patternSamples) {
-        this.patternSamples = patternSamples;
+    public void setPatternOptions(List<Object> patternOptions) {
+        this.patternOptions = patternOptions;
     }
 
-    public List<RenderData> getRenderSamples() {
-        return renderSamples;
+    public List<Object> getRenderOptions() {
+        return renderOptions;
     }
 
-    public void setRenderSamples(List<RenderData> renderSamples) {
-        this.renderSamples = renderSamples;
+    public void setRenderOptions(List<Object> renderOptions) {
+        this.renderOptions = renderOptions;
     }
 }

+ 15 - 5
subject-center/src/main/java/com/example/subject/center/entity/ServiceResponse.java

@@ -1,26 +1,28 @@
 package com.example.subject.center.entity;
 
-public class ServiceResponse {
+import java.util.List;
 
-    private ServiceResponseType status;
+public class ServiceResponse {
 
     private static final String SERIVE_REQUEST_ERROR = "service request error";
 
+    private ServiceResponseType status;
     private String msg;
-
     private Object data;
+    private List<Object> list;
 
     public ServiceResponse() {
     }
 
-    public ServiceResponse(ServiceResponseType status, String msg, Object data) {
+    public ServiceResponse(ServiceResponseType status, String msg, Object data, List<Object> list) {
         this.status = status;
         this.msg = msg;
         this.data = data;
+        this.list = list;
     }
 
     public static ServiceResponse error() {
-        return new ServiceResponse(ServiceResponseType.ERROR, SERIVE_REQUEST_ERROR, null);
+        return new ServiceResponse(ServiceResponseType.ERROR, SERIVE_REQUEST_ERROR, null, null);
     }
 
     public ServiceResponseType getStatus() {
@@ -46,4 +48,12 @@ public class ServiceResponse {
     public void setData(Object data) {
         this.data = data;
     }
+
+    public List<Object> getList() {
+        return list;
+    }
+
+    public void setList(List<Object> list) {
+        this.list = list;
+    }
 }