Sfoglia il codice sorgente

流程编辑器后端修改

zhenglingfeng 8 anni fa
parent
commit
d800be4c8a
21 ha cambiato i file con 463 aggiunte e 276 eliminazioni
  1. 32 0
      hos-broker/src/main/java/com/yihu/hos/broker/common/processor/AggregateProcessor.java
  2. 31 0
      hos-broker/src/main/java/com/yihu/hos/broker/common/processor/DefaultHttpProcessor.java
  3. 18 0
      hos-broker/src/main/java/com/yihu/hos/broker/common/processor/HttpProcessor.java
  4. 1 1
      hos-camel/src/main/java/crawler/Aggregate.java
  5. 11 0
      hos-broker/src/main/java/com/yihu/hos/broker/util/Split.java
  6. 32 0
      hos-camel/src/main/java/com/yihu/hos/broker/common/processor/AggregateProcessor.java
  7. 31 0
      hos-camel/src/main/java/com/yihu/hos/broker/common/processor/DefaultHttpProcessor.java
  8. 18 0
      hos-camel/src/main/java/com/yihu/hos/broker/common/processor/HttpProcessor.java
  9. 19 0
      hos-camel/src/main/java/com/yihu/hos/broker/util/Aggregate.java
  10. 1 1
      hos-camel/src/main/java/crawler/Split.java
  11. 0 18
      hos-camel/src/main/java/crawler/processor/Processor0.java
  12. 0 16
      hos-camel/src/main/java/crawler/processor/Processor1.java
  13. 0 24
      hos-camel/src/main/java/crawler/processor/Processor2.java
  14. 2 2
      hos-camel/src/main/java/crawler/route/CrawlerQuartzRoute.java
  15. 5 5
      hos-camel/src/main/java/crawler/route/CrawlerRouteBulider.java
  16. 2 2
      hos-camel/src/main/java/crawler/route/QuartzRoute.java
  17. 6 6
      hos-camel/src/main/java/crawler/route/RouteBulider1.java
  18. 5 18
      src/main/java/com/yihu/hos/common/graph/BFSGraph.java
  19. 1 1
      src/main/java/com/yihu/hos/common/graph/DGraph.java
  20. 214 0
      src/main/java/com/yihu/hos/system/service/ProcessEditor.java
  21. 34 182
      src/main/java/com/yihu/hos/system/service/ProcessManager.java

+ 32 - 0
hos-broker/src/main/java/com/yihu/hos/broker/common/processor/AggregateProcessor.java

@ -0,0 +1,32 @@
package com.yihu.hos.broker.common.processor;
import net.sf.json.JSONObject;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import java.util.Iterator;
public class AggregateProcessor implements Processor {
    private String paramJson;
    public AggregateProcessor(String paramJson) {
        this.paramJson = paramJson;
    }
    public void process(Exchange exchange) throws Exception {
        Message inMessage = exchange.getIn();
        Message outMessage = exchange.getOut();
        JSONObject jsonObject = JSONObject.fromObject(paramJson);
        Iterator iterator = jsonObject.keys();
        while (iterator.hasNext()) {
            String name = (String) iterator.next();
            String value = (String) jsonObject.get(name);
            outMessage.setHeader(name, value);
        }
        String body = inMessage.getBody(String.class);
        outMessage.setBody(body);
    }
}

+ 31 - 0
hos-broker/src/main/java/com/yihu/hos/broker/common/processor/DefaultHttpProcessor.java

@ -0,0 +1,31 @@
package com.yihu.hos.broker.common.processor;
import com.yihu.hos.core.datatype.StringUtil;
import net.sf.json.JSONObject;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import java.util.Iterator;
public class DefaultHttpProcessor implements Processor {
    private String paramJson;
    public DefaultHttpProcessor(String paramJson) {
        this.paramJson = paramJson;
    }
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        JSONObject jsonObject = JSONObject.fromObject(paramJson);
        Iterator iterator = jsonObject.keys();
        String queryStr = "";
        while (iterator.hasNext()) {
            String name = (String) iterator.next();
            String value = (String) jsonObject.get(name);
            queryStr += name + "=" + value + "&&";
        }
        queryStr = StringUtil.substring(queryStr, 0, queryStr.length()-2);
        outMessage.setHeader(Exchange.HTTP_QUERY, queryStr);
    }
}

+ 18 - 0
hos-broker/src/main/java/com/yihu/hos/broker/common/processor/HttpProcessor.java

@ -0,0 +1,18 @@
package com.yihu.hos.broker.common.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
public class HttpProcessor implements Processor {
    private String paramName;
    public HttpProcessor(String paramName) {
        this.paramName = paramName;
    }
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        Message inMessage = exchange.getIn();
        outMessage.setHeader(Exchange.HTTP_QUERY, paramName + "=" + inMessage.getBody(String.class));
    }
}

+ 1 - 1
hos-camel/src/main/java/crawler/Aggregate.java

@ -1,4 +1,4 @@
package crawler;
package com.yihu.hos.broker.util;
import org.apache.camel.Exchange;
import org.apache.camel.processor.aggregate.AggregationStrategy;

+ 11 - 0
hos-broker/src/main/java/com/yihu/hos/broker/util/Split.java

@ -0,0 +1,11 @@
package com.yihu.hos.broker.util;
import net.sf.json.JSONArray;
import org.apache.camel.Body;
public class Split {
    public JSONArray splitJsonArray(@Body String jsonArrayStr) {
        return JSONArray.fromObject(jsonArrayStr);
    }
}

+ 32 - 0
hos-camel/src/main/java/com/yihu/hos/broker/common/processor/AggregateProcessor.java

@ -0,0 +1,32 @@
package com.yihu.hos.broker.common.processor;
import net.sf.json.JSONObject;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import java.util.Iterator;
public class AggregateProcessor implements Processor {
    private String paramJson;
    public AggregateProcessor(String paramJson) {
        this.paramJson = paramJson;
    }
    public void process(Exchange exchange) throws Exception {
        Message inMessage = exchange.getIn();
        Message outMessage = exchange.getOut();
        JSONObject jsonObject = JSONObject.fromObject(paramJson);
        Iterator iterator = jsonObject.keys();
        while (iterator.hasNext()) {
            String name = (String) iterator.next();
            String value = (String) jsonObject.get(name);
            outMessage.setHeader(name, value);
        }
        String body = inMessage.getBody(String.class);
        outMessage.setBody(body);
    }
}

+ 31 - 0
hos-camel/src/main/java/com/yihu/hos/broker/common/processor/DefaultHttpProcessor.java

@ -0,0 +1,31 @@
package com.yihu.hos.broker.common.processor;
import com.yihu.hos.core.datatype.StringUtil;
import net.sf.json.JSONObject;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import java.util.Iterator;
public class DefaultHttpProcessor implements Processor {
    private String paramJson;
    public DefaultHttpProcessor(String paramJson) {
        this.paramJson = paramJson;
    }
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        JSONObject jsonObject = JSONObject.fromObject(paramJson);
        Iterator iterator = jsonObject.keys();
        String queryStr = "";
        while (iterator.hasNext()) {
            String name = (String) iterator.next();
            String value = (String) jsonObject.get(name);
            queryStr += name + "=" + value + "&&";
        }
        queryStr = StringUtil.substring(queryStr, 0, queryStr.length()-2);
        outMessage.setHeader(Exchange.HTTP_QUERY, queryStr);
    }
}

+ 18 - 0
hos-camel/src/main/java/com/yihu/hos/broker/common/processor/HttpProcessor.java

@ -0,0 +1,18 @@
package com.yihu.hos.broker.common.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
public class HttpProcessor implements Processor {
    private String paramName;
    public HttpProcessor(String paramName) {
        this.paramName = paramName;
    }
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        Message inMessage = exchange.getIn();
        outMessage.setHeader(Exchange.HTTP_QUERY, paramName + "=" + inMessage.getBody(String.class));
    }
}

+ 19 - 0
hos-camel/src/main/java/com/yihu/hos/broker/util/Aggregate.java

@ -0,0 +1,19 @@
package com.yihu.hos.broker.util;
import org.apache.camel.Exchange;
import org.apache.camel.processor.aggregate.AggregationStrategy;
public class Aggregate implements AggregationStrategy {
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
        //如果oldExchange为null,则说明是第一个分解包
        if (oldExchange == null) {
            return newExchange;
        }
        String oldBody = oldExchange.getIn().getBody(String.class);
        String newBody = newExchange.getIn().getBody(String.class);
        //将新与旧包进行合并,再设置进Message的body中
        oldExchange.getIn().setBody(oldBody + "\n" + newBody);
        return oldExchange;
    }
}

+ 1 - 1
hos-camel/src/main/java/crawler/Split.java

@ -1,4 +1,4 @@
package crawler;
package com.yihu.hos.broker.util;
import net.sf.json.JSONArray;
import org.apache.camel.Body;

+ 0 - 18
hos-camel/src/main/java/crawler/processor/Processor0.java

@ -1,18 +0,0 @@
package crawler.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.apache.camel.http.common.HttpMessage;
import java.util.Map;
/**
 * Created by Zdm on 2016/7/13.
 */
public class Processor0 implements Processor {
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        outMessage.setHeader(Exchange.HTTP_QUERY, "jobId=5ad5c11655d443c30155d477a6b10000");
    }
}

+ 0 - 16
hos-camel/src/main/java/crawler/processor/Processor1.java

@ -1,16 +0,0 @@
package crawler.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
/**
 * Created by Zdm on 2016/7/13.
 */
public class Processor1 implements Processor {
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        Message inMessage = exchange.getIn();
        outMessage.setHeader(Exchange.HTTP_QUERY, "str=" + inMessage.getBody(String.class));
    }
}

+ 0 - 24
hos-camel/src/main/java/crawler/processor/Processor2.java

@ -1,24 +0,0 @@
package crawler.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
/**
 * Created by Zdm on 2016/7/13.
 */
public class Processor2 implements Processor {
    private String key;
    public Processor2(String key) {
        this.key = key;
    }
    public void process(Exchange exchange) throws Exception {
        Message inMessage = exchange.getIn();
        Message outMessage = exchange.getOut();
        outMessage.setHeader("test_correlation_key", this.key);
        String body = inMessage.getBody(String.class);
        outMessage.setBody(body);
    }
}

+ 2 - 2
hos-camel/src/main/java/crawler/route/CrawlerQuartzRoute.java

@ -1,6 +1,6 @@
package crawler.route;
import crawler.processor.Processor0;
import com.yihu.hos.broker.common.processor.DefaultHttpProcessor;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
@ -9,7 +9,7 @@ import org.apache.camel.builder.RouteBuilder;
 */
public class CrawlerQuartzRoute extends RouteBuilder {
    public void configure() throws Exception {
        from("quartz://myGroup/myTimerName?cron=0/3 * * * * ?").routeId("routeId").process(new Processor0())
        from("quartz://myGroup/myTimerName?cron=0/3 * * * * ?").routeId("routeId").process(new DefaultHttpProcessor("{\"jobId\": \"sfsfsgafcas\"}"))
                .setHeader(Exchange.HTTP_METHOD, constant("POST")).to("http4://localhost:8088/crawler/patientList").to("stream:out");
    }
}

+ 5 - 5
hos-camel/src/main/java/crawler/route/CrawlerRouteBulider.java

@ -1,6 +1,6 @@
package crawler.route;
import crawler.processor.Processor0;
import com.yihu.hos.broker.common.processor.DefaultHttpProcessor;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
@ -13,19 +13,19 @@ public class CrawlerRouteBulider extends RouteBuilder {
    public void configure() throws Exception {
        from("jetty:http://192.168.131.96:8066/crawlerPull").routeId("crawlerPull")
                .process(new Processor0()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .process(new DefaultHttpProcessor()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .to("http://192.168.131.96:8088/crawler/patientList");
        from("jetty:http://192.168.131.96:8066/crawlerPush").routeId("crawlerPush")
                .process(new Processor0()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .process(new DefaultHttpProcessor()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .to("http://192.168.131.96:8088/crawler/patient");
        from("jetty:http://192.168.131.96:8066/crawlerFlowPull").routeId("crawlerFlowPull")
                .process(new Processor0()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .process(new DefaultHttpProcessor()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .to("http://192.168.131.96:8088/crawler/patientListFlow");
        from("jetty:http://192.168.131.96:8066/crawlerFlowPush").routeId("crawlerFlowPush")
                .process(new Processor0()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .process(new DefaultHttpProcessor()).setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .to("http://192.168.131.96:8088/crawler/patientFlow");
    }
}

+ 2 - 2
hos-camel/src/main/java/crawler/route/QuartzRoute.java

@ -1,6 +1,6 @@
package crawler.route;
import crawler.processor.Processor0;
import com.yihu.hos.broker.common.processor.DefaultHttpProcessor;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
@ -15,7 +15,7 @@ public class QuartzRoute extends RouteBuilder {
        from("quartz://myGroupName/myTimerName?cron=0/5+*+*+*+*+?")
                .process(new Processor0() {
                .process(new DefaultHttpProcessor() {
                    @Override
                    public void process(Exchange exchange) throws Exception {
                        System.out.println("I'm running every 5 sec...Change by XXXX===========");

+ 6 - 6
hos-camel/src/main/java/crawler/route/RouteBulider1.java

@ -1,9 +1,9 @@
package crawler.route;
import crawler.Aggregate;
import crawler.processor.Processor1;
import crawler.Split;
import crawler.processor.Processor2;
import com.yihu.hos.broker.util.Aggregate;
import com.yihu.hos.broker.common.processor.HttpProcessor;
import com.yihu.hos.broker.util.Split;
import com.yihu.hos.broker.common.processor.AggregateProcessor;
import org.apache.camel.builder.RouteBuilder;
/**
@ -15,8 +15,8 @@ public class RouteBulider1 extends RouteBuilder {
        from("quartz://myGroup/myTimerName?cron=0/5 * * * * ? ").routeId("list")
                .to("http://localhost:9999/list")
                .split().method(Split.class, "splitJsonArray")
                .process(new Processor1()).to("http://localhost:9999/str")
                .process(new Processor2("key1"))
                .process(new HttpProcessor()).to("http://localhost:9999/str")
                .process(new AggregateProcessor("key1"))
                .aggregate(header("test_correlation_key"), new Aggregate()).completionSize(3).to("stream:out");
    }

+ 5 - 18
src/main/java/com/yihu/hos/common/graph/BFSGraph.java

@ -9,8 +9,8 @@ import java.util.*;
 * 邻接链表(Adjacency List)实现的有向图
 * @param <V>
 */
public class BFSGraph<V> implements DGraph<V>{
    private static Logger logger = LoggerFactory.getLogger(BFSGraph.class);
public class DGraphImpl<V> implements IDGraph<V> {
    private static Logger logger = LoggerFactory.getLogger(DGraphImpl.class);
    /**
     * 顶点对象,其中有对应的顶点以及从以此顶点为起点的边
     */
@ -27,7 +27,6 @@ public class BFSGraph<V> implements DGraph<V>{
        public VE(V v) {
            this.v = v;
            this.mEdgeList = new LinkedList<Edge<V>>();
            logger.info("VE construct : %s", v);
        }
        
        @Override
@ -42,11 +41,10 @@ public class BFSGraph<V> implements DGraph<V>{
         * @param e
         */
        public void addEdge(Edge<V> e) {
            logger.info("add edge : %s", e);
            if(getEdge(e.getDest()) == null) {
                mEdgeList.add(e);
            } else {
                logger.info("edge exist : %s", e);
                logger.warn("edge exist : %s", e);
            }
        }
        
@ -61,7 +59,6 @@ public class BFSGraph<V> implements DGraph<V>{
                for(Edge<V> edge : mEdgeList) {
                    if(edge.getDest() != null &&
                       dest.equals(edge.getDest())) {
                        logger.info("get edge : %s", edge);
                        ret = edge;
                        break;
                    }
@ -81,7 +78,6 @@ public class BFSGraph<V> implements DGraph<V>{
                for(Edge<V> edge : mEdgeList) {
                    if(edge.getDest() != null &&
                       dest.equals(edge.getDest())) {
                        logger.info("remove edge : %s", edge);
                        ret = edge;
                        mEdgeList.remove(edge);
                        break;
@ -116,7 +112,6 @@ public class BFSGraph<V> implements DGraph<V>{
        
        @Override
        public boolean hasNext() {
            logger.info("queue size : " + mVQueue.size());
            if(mVQueue.size() > 0) {
                return true;
            } else {
@ -141,7 +136,6 @@ public class BFSGraph<V> implements DGraph<V>{
                        if(!VinList(dest, mVisitList.iterator()) &&
                           !VinList(dest, mVQueue.iterator())) {
                            mVQueue.offer(dest);
                            logger.info("add to queue : " + dest);
                        }
                    }
                }
@ -166,16 +160,14 @@ public class BFSGraph<V> implements DGraph<V>{
    /**
     * 构造邻接链表有向图
     */
    public BFSGraph() {
    public DGraphImpl() {
        mVEList = new LinkedList<VE>();
        logger.info("ListDGraph construct!");
    }
    @Override
    public int add(V v) {
        int index = -1;
        if(v != null) {
            logger.info("add v: %s", v);
            VE ve = new VE(v);
            mVEList.add(ve);
            index = mVEList.indexOf(ve);
@ -186,14 +178,13 @@ public class BFSGraph<V> implements DGraph<V>{
    @Override
    public void add(Edge<V> e) {
        if(e != null) {
            logger.info("add edge: %s", e);
            VE ve = getVE(e.getSource());
            if(ve != null) {
                //若边的起点已经在列表里,则直接将其添加到对应的顶点对象中
                ve.addEdge(e);
            } else {
                //否则提示错误
                logger.info("Error, can't find v : %s", e.getSource());
                logger.error("Error, can't find v : %s", e.getSource());
            }
        }
    }
@ -233,7 +224,6 @@ public class BFSGraph<V> implements DGraph<V>{
            VE ve = mVEList.get(index);
            if(ve != null) {
                ret = ve.v;
                logger.info("get , index : %s , v : %s", index, ret);
            }
        }
        return ret;
@ -279,7 +269,6 @@ public class BFSGraph<V> implements DGraph<V>{
        if(v != null) {
            for(VE ve : mVEList) {
                if(ve.v != null && v.equals(ve.v)) {
                    logger.info("getVE : %s", ve);
                    ret = ve;
                    break;
                }
@ -301,7 +290,6 @@ public class BFSGraph<V> implements DGraph<V>{
        if(v != null) {
            for(VE ve : mVEList) {
                if(ve.v != null && v.equals(ve.v)) {
                    logger.info("getVE : %s", ve);
                    ret = ve;
                    break;
                }
@ -320,7 +308,6 @@ public class BFSGraph<V> implements DGraph<V>{
        if(v != null) {
            for(VE ve : mVEList) {
                if(ve.v != null && v.equals(ve.v)) {
                    logger.info("removeVE : %s", v);
                    ret = ve;
                    mVEList.remove(ve);
                    break;

+ 1 - 1
src/main/java/com/yihu/hos/common/graph/DGraph.java

@ -7,7 +7,7 @@ import java.util.List;
 * 有向图接口,定义需要实现的各个方法,可以选择使用邻接矩阵或者邻接链表来实现
 * @param <V> V代表端点,可以根据需要设置器数据类型
 */
public interface DGraph<V> {
public interface IDGraph<V> {
    
    /**广度优先遍历*/
    public static final int ITERATOR_TYPE_BFS = 0;

+ 214 - 0
src/main/java/com/yihu/hos/system/service/ProcessEditor.java

@ -0,0 +1,214 @@
package com.yihu.hos.system.service;
import com.fasterxml.jackson.databind.JsonNode;
import com.yihu.hos.common.graph.IDGraph;
import com.yihu.hos.common.graph.Edge;
import com.yihu.hos.core.datatype.StringUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class ProcessEditor {
    private String code;
    private Map<String, JsonNode> lineMap;
    private Map<String, JsonNode> nodeMap;
    private Iterator<String> nodeIt;
    private IDGraph<String> mDG;
    private StringBuilder bodyBuilder = new StringBuilder();
    private StringBuilder packageBuilder = new StringBuilder();
    private StringBuilder otherRouteBuilder = new StringBuilder();
    public String generate() throws IOException {
        Boolean isFirstNodeFlg = true;
        StringBuilder allBuilder = new StringBuilder();
        String javaName = toUpperCaseFirstOne(code)+"Route";
        packageBuilder.append("package "+code+".route;\n\n");
//        packageBuilder.append("import org.apache.camel.Exchange;\n");
        packageBuilder.append("import org.apache.camel.builder.RouteBuilder;\n");
        for (String key : nodeMap.keySet()) {
            JsonNode node = nodeMap.get(key);
            String nodeType = node.get("nodeType").asText();
            if (nodeType.equals("processor")) {
                packageBuilder.append("import " + node.get("value").asText() + ";\n");
            }
        }
        bodyBuilder.append("public class "+javaName+" extends RouteBuilder {\n");
        bodyBuilder.append("public void configure() throws Exception {\n");
        String nodeName = "";
        while(nodeIt.hasNext()) {
            if (isFirstNodeFlg) {
                nodeName = nodeIt.next();
                isFirstNodeFlg = false;
                bodyBuilder.append(montage(nodeName));
            } else {
                List<Edge<String>> edgeList = mDG.getEdgeList(nodeName);
                for (Edge<String> edge : edgeList) {
                    nodeIt.next();
                    nodeName = edge.getDest();
                    bodyBuilder.append(montage(nodeName));
                }
            }
        }
        bodyBuilder.append(";");
        bodyBuilder.append(otherRouteBuilder);
        bodyBuilder.append("\n}\n}");
        allBuilder.append(packageBuilder).append(bodyBuilder);
        System.out.println(allBuilder.toString());
//        String packageFilePath = System.getProperty("user.dir");
//
//        String filePath = packageFilePath + "/" + javaName + ".java";
//        File file = new File(filePath);
//
//        FileWriter fw = new FileWriter(file);
//        fw.write(bodyBuilder.toString());
//        fw.flush();
//        fw.close();//这里只是产生一个JAVA文件,简单的IO操作
//
//        //upload to mongo
//        String newFileName;
//        try {
//            newFileName = GridFSUtil.uploadFile(filePath, file.getName(), null);
//            if (!StringUtil.isEmpty(newFileName)) {
//                return newFileName;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        return "";
    }
    //首字母转大写
    public static String toUpperCaseFirstOne(String s) {
        if(Character.isUpperCase(s.charAt(0)))
            return s;
        else
            return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
    }
    public StringBuilder montage(String nodeName) {
        JsonNode node = nodeMap.get(nodeName);
        String nodeType = node.get("nodeType").asText();
        String value = node.get("value").asText();
        String name = node.get("name").asText();
        StringBuilder bodyBuilderTemp = new StringBuilder();
        if (nodeType.equals("default")) {
            bodyBuilder.append("from(\"");
            bodyBuilder.append(value + "\")");
            if (!StringUtil.isEmpty(code)) {
                bodyBuilder.append(".routeId(\""+code+"\")");
            }
        } else if (nodeType.equals("processor")) {
            packageBuilder.append("import " + node.get("value").asText() + ";\n");
            JsonNode param = node.get("param");
            if (param == null) {
                bodyBuilderTemp.append("\n.process(new "+name+"())");
            } else {
                bodyBuilderTemp.append("\n.process(new "+name+"("+param+"))");
            }
        } else if (nodeType.equals("judgement")) {
            judgement(value, nodeName, bodyBuilderTemp);
        } else if (nodeType.equals("circle")) {
            split(value, bodyBuilderTemp);
        } else if (nodeType.equals("aggregate")) {
            aggregate(value, bodyBuilderTemp);
        } else if (nodeType.equals("multicast")) {
            multicast(value, nodeName, bodyBuilderTemp);
        } else {
//                    bodyBuilder.append("\n.setHeader(Exchange.HTTP_METHOD, constant(\"POST\"))");
            bodyBuilderTemp.append("\n.to(\"");
            bodyBuilderTemp.append(value + "\")");
        }
        return bodyBuilderTemp;
    }
    public void judgement(String value, String nodeName, StringBuilder bodyBuilderTemp) {
        bodyBuilderTemp.append("\n.choice()");
        bodyBuilderTemp.append("\n.when("+value+")");
        String trueNodeName = "";
        String falseNodeName = "";
        for (Edge<String> edge : mDG.getEdgeList(nodeName)) {
            nodeIt.next();
            String nextNodeName = edge.getDest();
            String nextLineName = edge.getName();
            JsonNode nextLine = lineMap.get(nextLineName);
            if (nextLine.get("value") != null && nextLine.get("value").asText().equals("correct")) {
                trueNodeName = nextNodeName;
            } else {
                falseNodeName = nextNodeName;
            }
        }
        JsonNode node1 = nodeMap.get(trueNodeName);
        JsonNode node2 = nodeMap.get(falseNodeName);
        String firstValue = node1.get("value").asText();
        String secondValue =  node2.get("value").asText();
        bodyBuilderTemp.append("\n.to(\"");
        bodyBuilderTemp.append(firstValue + "\")");
        bodyBuilderTemp.append(".otherwise()");
        bodyBuilderTemp.append("\n.to(\"");
        bodyBuilderTemp.append(secondValue + "\")");
        bodyBuilderTemp.append("\n.end()");
    }
    public void split(String value, StringBuilder bodyBuilderTemp) {
        packageBuilder.append("import com.yihu.hos.broker.util.Split;\n");
        bodyBuilderTemp.append("\n.split().method(Split.class, \""+value+"\")");
    }
    public void aggregate(String value, StringBuilder bodyBuilderTemp) {
        packageBuilder.append("import com.yihu.hos.broker.util.Aggregate;\n");
        bodyBuilderTemp.append("\n.aggregate(header(\""+value+"\"), new Aggregate()).completionSize(3)");
    }
    public void multicast(String value, String nodeName, StringBuilder bodyBuilderTemp) {
        String directs = "";
        int i = 'a';
        List<String> directList = new ArrayList<>();
        List<Edge<String>> edgeList = mDG.getEdgeList(nodeName);
        for (Edge<String> edge : edgeList) {
            nodeIt.next();
            String direct = "direct:" + (char)i++;
            directList.add(direct);
            directs += "\"" + direct + "\",";
            StringBuilder directBuilder = new StringBuilder();
            directBuilder.append("\nfrom(\"");
            directBuilder.append(direct + "\")");
            nodeName = edge.getDest();
            otherRouteBuilder.append(directBuilder).append(montage(nodeName)).append(";");
        }
        directs = StringUtil.substring(directs, 0, directs.length() - 1);
        bodyBuilderTemp.append("\n.multicast().stopOnException().to("+directs+").end()");
    }
    public void setCode(String code) {
        this.code = code;
    }
    public void setLineMap(Map<String, JsonNode> lineMap) {
        this.lineMap = lineMap;
    }
    public void setNodeIt(Iterator<String> nodeIt) {
        this.nodeIt = nodeIt;
    }
    public void setNodeMap(Map<String, JsonNode> nodeMap) {
        this.nodeMap = nodeMap;
    }
    public void setmDG(IDGraph<String> mDG) {
        this.mDG = mDG;
    }
}

+ 34 - 182
src/main/java/com/yihu/hos/system/service/ProcessManager.java

@ -2,8 +2,8 @@ package com.yihu.hos.system.service;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.common.graph.BFSGraph;
import com.yihu.hos.common.graph.DGraph;
import com.yihu.hos.common.graph.DGraphImpl;
import com.yihu.hos.common.graph.IDGraph;
import com.yihu.hos.common.graph.Edge;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.system.dao.AppDao;
@ -17,7 +17,6 @@ import net.sf.json.JSONObject;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
@Service("ProcessManager")
@ -101,34 +100,36 @@ public class ProcessManager {
                "    \"code\": \"crawler\",\n" +
                "    \"nodes\": {\n" +
                "        \"node_1\": {\n" +
                "            \"name\": \"quartz\",\n" +
                "            \"name\": \"Quartz\",\n" +
                "            \"value\": \"quartz://myGroup/myTimerName?cron=0/3 * * * * ?\",\n" +
                "            \"type\": \"service\"\n" +
                "            \"nodeType\": \"default\"\n" +
                "        },\n" +
                "        \"node_2\": {\n" +
                "            \"name\": \"Processor0\",\n" +
                "            \"value\": \"crawler.processor.Processor0\",\n" +
                "            \"type\": \"processor\"\n" +
                "           \"name\": \"DefaultHttpProcessor\",\n" +
                "            \"value\": \"com.yihu.hos.broker.common.processor.DefaultHttpProcessor\",\n" +
                "\t\t\t\"param\": \"{\\\"jobId\\\":\\\"5ad5c11655d443c30155d477a6b10000\\\"}\",\n" +
                "            \"nodeType\": \"processor\"\n" +
                "        },\n" +
                "        \"node_3\": {\n" +
                "            \"name\": \"crawler0\",\n" +
                "            \"value\": \"http4://localhost:8088/crawler/patientList\",\n" +
                "            \"type\": \"service\"\n" +
                "            \"name\": \"Crawler0\",\n" +
                "            \"value\": \"http4://localhost:8088/crawler/patientList?method=post\",\n" +
                "            \"nodeType\": \"service\"\n" +
                "        },\n" +
                "        \"node_4\": {\n" +
                "            \"name\": \"multicast0\",\n" +
                "            \"value\": \"2\",\n" +
                "            \"type\": \"multicast\"\n" +
                "            \"name\": \"Circle\",\n" +
                "            \"value\": \"splitJsonArray\",\n" +
                "            \"nodeType\": \"circle\"\n" +
                "        },\n" +
                "        \"node_5\": {\n" +
                "            \"name\": \"crawle1r1\",\n" +
                "            \"value\": \"http4://localhost:8088/crawler/cralwer\",\n" +
                "            \"type\": \"service\"\n" +
                "            \"name\": \"HttpProcessor\",\n" +
                "            \"value\": \"com.yihu.hos.broker.common.processor.HttpProcessor\",\n" +
                "\t\t\t\"param\": \"str\",\n" +
                "            \"nodeType\": \"processor\"\n" +
                "        },\n" +
                "        \"node_6\": {\n" +
                "            \"name\": \"crawler2\",\n" +
                "            \"value\": \"http4://localhost:8088/crawler/collect\",\n" +
                "            \"type\": \"service\"\n" +
                "            \"name\": \"Crawler2\",\n" +
                "            \"value\": \"http4://localhost:8088/crawler/collect?method=post\",\n" +
                "            \"nodeType\": \"service\"\n" +
                "        }\n" +
                "    },\n" +
                "    \"lines\": {\n" +
@ -140,7 +141,7 @@ public class ProcessManager {
                "            \"from\": \"node_2\",\n" +
                "            \"to\": \"node_3\"\n" +
                "        },\n" +
                "        \"line3\": {\n" +
                "        \"line_3\": {\n" +
                "            \"from\": \"node_3\",\n" +
                "            \"to\": \"node_4\"\n" +
                "        },\n" +
@ -149,7 +150,7 @@ public class ProcessManager {
                "            \"to\": \"node_5\"\n" +
                "        },\n" +
                "        \"line_5\": {\n" +
                "            \"from\": \"node_4\",\n" +
                "            \"from\": \"node_5\",\n" +
                "            \"to\": \"node_6\"\n" +
                "        }\n" +
                "    }\n" +
@ -172,11 +173,12 @@ public class ProcessManager {
        //for the java code import processor class
        Map<String, JsonNode> nodeMap = new HashMap<>();
        Map<String, JsonNode> lineMap = new HashMap<>();
        DGraph<String> mDG = new BFSGraph<String>();
        IDGraph<String> mDG = new DGraphImpl<String>();
        while (nodeIterator.hasNext()) {
            Map.Entry<String, JsonNode> map = nodeIterator.next();
            nodeMap.put(map.getKey(), map.getValue());
            if (StringUtil.isEmpty(mDG.get(0))) {
            String type = map.getValue().get("nodeType").asText();
            if (StringUtil.isEmpty(root) && type.equals("default")) {
                root = map.getKey();
            }
            mDG.add(map.getKey());
@ -189,164 +191,14 @@ public class ProcessManager {
            String nodeNameTo = map.getValue().get("to").asText();
            mDG.add(new Edge<>(nodeNameFrom, nodeNameTo, map.getKey()));
        }
        ProcessEditor editor = new ProcessEditor();
        Iterator<String> nodeIt = mDG.iterator(root);
        editor.setCode(code);
        editor.setNodeIt(nodeIt);
        editor.setmDG(mDG);
        editor.setLineMap(lineMap);
        editor.setNodeMap(nodeMap);
        //generate the java code
        return generate(code, root, lineMap, nodeMap, mDG);
    }
    public static String generate(String code, String root, Map<String, JsonNode> lineMap, Map<String, JsonNode> nodeMap, DGraph<String> mDG) throws IOException {
        Boolean isFirstNodeFlg = true;
        StringBuilder javaBuilder = new StringBuilder();
        StringBuilder bodyBuilder = new StringBuilder();
        StringBuilder packageBuilder = new StringBuilder();
        String javaName = toUpperCaseFirstOne(code)+"Route";
        packageBuilder.append("package "+code+".route;\n\n");
        packageBuilder.append("import org.apache.camel.Exchange;\n");
        packageBuilder.append("import org.apache.camel.builder.RouteBuilder;\n");
        for (String key : nodeMap.keySet()) {
            JsonNode node = nodeMap.get(key);
            String type = node.get("type").asText();
            if (type.equals("processor")) {
                packageBuilder.append("import " + node.get("value").asText() + ";\n");
            }
        }
        bodyBuilder.append("public class "+javaName+" extends RouteBuilder {\n");
        bodyBuilder.append("public void configure() throws Exception {\n");
        Iterator<String> it = mDG.iterator(root);
        while(it.hasNext()) {
            String nodeName = it.next();
            JsonNode node = nodeMap.get(nodeName);
            String type = node.get("type").asText();
            String value = node.get("value").asText();
            String name = node.get("name").asText();
            if (isFirstNodeFlg) {
                bodyBuilder.append("from(\"");
                bodyBuilder.append(value + "\")");
                bodyBuilder.append(".routeId(\""+code+"\")");
                isFirstNodeFlg = false;
            } else {
                if (type.equals("processor")) {
                    JsonNode args = node.get("args");
                    if (args == null) {
                        bodyBuilder.append("\n.process(new "+name+"())");
                    } else {
                        String argStr = "";
                        String[] argArr = args.asText().split(",");
                        for (String arg : argArr) {
                            argStr += "\"" + arg + "\",";
                        }
                        argStr = StringUtil.substring(argStr, 0, argStr.length() - 1);
                        bodyBuilder.append("\n.process(new "+name+"("+argStr+"))");
                    }
                } else if (type.equals("judgement")) {
                    judgement(bodyBuilder, value, getEdgeList(nodeName, mDG), it, lineMap, nodeMap);
                } else if (type.equals("circle")) {
                    split(bodyBuilder, packageBuilder, value);
                } else if (type.equals("aggregate")) {
                    aggregate(bodyBuilder, packageBuilder, value);
                } else if (type.equals("multicast")) {
                    mulitcast(bodyBuilder, value, getEdgeList(nodeName, mDG), it, lineMap, nodeMap);
                } else {
//                    bodyBuilder.append("\n.setHeader(Exchange.HTTP_METHOD, constant(\"POST\"))");
                    bodyBuilder.append("\n.to(\"");
                    bodyBuilder.append(value + "\")");
                }
            }
        }
        bodyBuilder.append(";");
        bodyBuilder.append("\n}\n}");
        javaBuilder.append(packageBuilder).append(bodyBuilder);
        System.out.println(javaBuilder.toString());
//        String packageFilePath = System.getProperty("user.dir");
//
//        String filePath = packageFilePath + "/" + javaName + ".java";
//        File file = new File(filePath);
//
//        FileWriter fw = new FileWriter(file);
//        fw.write(bodyBuilder.toString());
//        fw.flush();
//        fw.close();//这里只是产生一个JAVA文件,简单的IO操作
//
//        //upload to mongo
//        String newFileName;
//        try {
//            newFileName = GridFSUtil.uploadFile(filePath, file.getName(), null);
//            if (!StringUtil.isEmpty(newFileName)) {
//                return newFileName;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        return "";
    }
    //首字母转大写
    public static String toUpperCaseFirstOne(String s) {
        if(Character.isUpperCase(s.charAt(0)))
            return s;
        else
            return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
    }
    public static List<Edge<String>> getEdgeList(String nodeName, DGraph<String> mDG) {
        return mDG.getEdgeList(nodeName);
    }
    public static void judgement(StringBuilder bodyBuilder, String value, List<Edge<String>> edgeList, Iterator<String> it,  Map<String, JsonNode> lineMap, Map<String, JsonNode> nodeMap) {
        bodyBuilder.append("\n.choice()");
        bodyBuilder.append("\n.when("+value+")");
        String trueNodeName = "";
        String falseNodeName = "";
        for (Edge<String> edge : edgeList) {
            it.next();
            String nextNodeName = edge.getDest();
            String nextLineName = edge.getName();
            JsonNode nextLine = lineMap.get(nextLineName);
            if (nextLine.get("value") != null && nextLine.get("value").asText().equals("correct")) {
                trueNodeName = nextNodeName;
            } else {
                falseNodeName = nextNodeName;
            }
        }
        JsonNode node1 = nodeMap.get(trueNodeName);
        JsonNode node2 = nodeMap.get(falseNodeName);
        String firstValue = node1.get("value").asText();
        String secondValue =  node2.get("value").asText();
        bodyBuilder.append("\n.setHeader(Exchange.HTTP_METHOD, constant(\"POST\"))");
        bodyBuilder.append("\n.to(\"");
        bodyBuilder.append(firstValue + "\")");
        bodyBuilder.append(".otherwise()");
        bodyBuilder.append("\n.setHeader(Exchange.HTTP_METHOD, constant(\"POST\"))");
        bodyBuilder.append("\n.to(\"");
        bodyBuilder.append(secondValue + "\")");
        bodyBuilder.append("\n.end()");
    }
    public static void split(StringBuilder bodyBuilder, StringBuilder packageBuilder, String value) {
        packageBuilder.append("import crawler.Split;\n");
        bodyBuilder.append("\n.split().method(Split.class, \""+value+"\")");
    }
    public static void aggregate(StringBuilder bodyBuilder, StringBuilder packageBuilder, String value) {
        packageBuilder.append("import crawler.Aggregate;\n");
        bodyBuilder.append("\n.aggregate(header(\"test_correlation_key\"), new Aggregate()).completionSize(3)");
    }
    public static void mulitcast(StringBuilder bodyBuilder, String value, List<Edge<String>> edgeList, Iterator<String> it,  Map<String, JsonNode> lineMap, Map<String, JsonNode> nodeMap) {
        String endpoints = "";
        for (Edge<String> edge : edgeList) {
            String nextNodeName = edge.getDest();
            JsonNode node = nodeMap.get(nextNodeName);
            endpoints += node.get("value") + ",";
            it.next();
        }
        endpoints = StringUtil.substring(endpoints, 0, endpoints.length() - 1);
        bodyBuilder.append("\n.multicast().stopOnException().to("+endpoints+").end()");
        return editor.generate();
    }
}