Browse Source

冲突合并

zhenglingfeng 8 years ago
parent
commit
66ab74df0f
51 changed files with 1535 additions and 511 deletions
  1. 30 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/common/constants/Constants.java
  2. 33 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/controllers/ProxyController.java
  3. 2 1
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/controllers/ServiceFlowController.java
  4. 54 0
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/models/BrokerServer.java
  5. 75 33
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/models/ServiceFlow.java
  6. 1 1
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/routers/EndpointEventRouter.java
  7. 19 2
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/routers/ServiceFlowEventRouter.java
  8. 78 2
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/BrokerServerService.java
  9. 124 126
      hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/ServiceFlowService.java
  10. 1 2
      hos-broker/src/main/java/com/yihu/hos/HosBrokerApplication.java
  11. 1 1
      hos-broker/src/main/java/com/yihu/hos/common/listener/ApplicationStartListener.java
  12. 34 1
      hos-core/src/main/java/com/yihu/hos/core/file/FileUtil.java
  13. 73 9
      hos-core/src/main/java/com/yihu/hos/core/http/DefaultClientImpl.java
  14. 6 0
      hos-core/src/main/java/com/yihu/hos/core/http/HTTPClient.java
  15. 12 0
      hos-core/src/main/java/com/yihu/hos/core/http/HttpClientKit.java
  16. 4 3
      hos-web-camel-dependencies/pom.xml
  17. 24 2
      hos-web-framework/src/main/java/com/yihu/hos/web/framework/util/GridFSUtil.java
  18. 0 58
      src/main/java/com/yihu/hos/common/ApplicationStart.java
  19. 81 3
      src/main/java/com/yihu/hos/common/CommonPageController.java
  20. 20 15
      src/main/java/com/yihu/hos/common/constants/Constants.java
  21. 5 0
      src/main/java/com/yihu/hos/common/constants/ContextAttributes.java
  22. 1 1
      src/main/java/com/yihu/hos/config/WebMvcConfig.java
  23. 14 1
      src/main/java/com/yihu/hos/interceptor/AuditInterceptor.java
  24. 1 1
      src/main/java/com/yihu/hos/interceptor/LocalContext.java
  25. 54 0
      src/main/java/com/yihu/hos/listeners/ApplicationStart.java
  26. 0 25
      src/main/java/com/yihu/hos/services/DatacollectJob.java
  27. 0 13
      src/main/java/com/yihu/hos/services/IBaseJob.java
  28. 0 10
      src/main/java/com/yihu/hos/services/IBaseManager.java
  29. 109 41
      src/main/java/com/yihu/hos/services/ServiceFlowEventService.java
  30. 0 25
      src/main/java/com/yihu/hos/services/TestJob.java
  31. 20 4
      src/main/java/com/yihu/hos/system/controller/SystemController.java
  32. 3 9
      src/main/java/com/yihu/hos/system/dao/FlowClassDao.java
  33. 3 6
      src/main/java/com/yihu/hos/system/dao/FlowDao.java
  34. 1 5
      src/main/java/com/yihu/hos/system/dao/FlowTempDao.java
  35. 0 18
      src/main/java/com/yihu/hos/system/dao/intf/IFlowClassDao.java
  36. 0 20
      src/main/java/com/yihu/hos/system/dao/intf/IFlowDao.java
  37. 0 19
      src/main/java/com/yihu/hos/system/dao/intf/IFlowTempDao.java
  38. 115 0
      src/main/java/com/yihu/hos/system/model/bo/ServiceFlow.java
  39. 167 36
      src/main/java/com/yihu/hos/system/service/FlowManager.java
  40. 1 2
      src/main/java/com/yihu/hos/system/service/intf/IAppManager.java
  41. 13 8
      src/main/java/com/yihu/hos/system/service/intf/IFlowManage.java
  42. 24 0
      src/main/java/com/yihu/hos/tenant/dao/TenantDao.java
  43. 2 1
      hos-saas/src/main/java/com/yihu/hos/saas/models/common/IdModel.java
  44. 109 0
      src/main/java/com/yihu/hos/tenant/model/TenantModel.java
  45. 51 0
      src/main/java/com/yihu/hos/tenant/model/TenantSession.java
  46. 78 0
      src/main/java/com/yihu/hos/tenant/service/AuthenticateService.java
  47. 31 0
      src/main/java/com/yihu/hos/tenant/service/TenatService.java
  48. 6 0
      src/main/resources/application.yml
  49. 5 5
      src/main/resources/spring/applicationContext.xml
  50. 38 1
      src/main/webapp/WEB-INF/ehr/jsp/common/indexJs.jsp
  51. 12 1
      src/test/java/com/yihu/hos/HosAdminApplicationTests.java

+ 30 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/common/constants/Constants.java

@ -0,0 +1,30 @@
package com.yihu.hos.arbiter.common.constants;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/8/25.
 */
public interface Constants {
    //流程-模板类型
    String JAVA = "java";
    String CLASS = "class";
    //流程-操作消息
    String FlOW_REFRESH = "flowRefresh";
    String FLOW_STARTED = "flowStarted";
    String PROCESSOR_ADDED = "processorAdded";
    String PROCESSOR_DATA_CHANGED = "processorDataChanged";
    String PROCESSOR_DATA_DELETED = "processorDataDeleted";
    String ROUTE_DEFINE_ADDED = "routeDefineAdded";
    String ROUTE_DEFINE_CHANGED = "routeDefineChanged";
    String ROUTE_DEFINE_DELETED = "routeDefineDeleted";
    String ROUTE_CLASS_ADDED = "routeClassAdded";   //java类型的路由添加
    String ROUTE_CLASS_CHANGED = "routeClassChanged";//java类型的路由修改
    String PROCESSOR_CLASS_ADDED = "processorClassAdded"; //java类型的处理器添加
    String PROCESSOR_CLASS_CHANGED = "processorClassChanged"; //java类型的处理器修改
    //BrokerServer
    String BROKER_SERVER_ON = "brokerServerOn";
    String BROKER_SERVER_OFF = "brokerServerOff";
}

+ 33 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/controllers/ProxyController.java

@ -0,0 +1,33 @@
package com.yihu.hos.arbiter.controllers;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * @author Airhead
 * @since 2016/12/2.
 */
@RestController
@RequestMapping("/proxy")
public class ProxyController {
    @Autowired
    private CamelContext camelContext;
    @RequestMapping()
    public void proxy(@RequestHeader Map<String, String> headers,
                      @RequestBody String body) {
        Map<String, Object> header = new HashMap<>();
        header.put("event", headers.get("event"));
        ProducerTemplate producerTemplate = camelContext.createProducerTemplate();
        producerTemplate.sendBodyAndHeader("service.flow.event", body, header);
    }
}

+ 2 - 1
hos-arbiter/src/main/java/com/yihu/hos/arbiter/controllers/ServiceFlowController.java

@ -18,7 +18,8 @@ public class ServiceFlowController {
    @RequestMapping(method = RequestMethod.POST)
    public void save(String serviceFlow) {
        serviceFlowService.save(serviceFlow);
        serviceFlowService.save(null);
    }
    @RequestMapping(method = RequestMethod.GET)

+ 54 - 0
hos-arbiter/src/main/java/com/yihu/hos/arbiter/models/BrokerServer.java

@ -4,6 +4,7 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.ArrayList;
import java.util.Date;
/**
@ -19,6 +20,21 @@ public class BrokerServer {
    private boolean enable;
    @Indexed(name = "updateTime_1", expireAfterSeconds = 30)
    private Date updateTime;
    private ArrayList<Flow> onFlowList;
    public boolean isFlowOn(String routeCode) {
        if (onFlowList == null) {
            return false;
        }
        for (Flow flow : onFlowList) {
            if (flow.getRouteCode().equals(routeCode)) {
                return true;
            }
        }
        return false;
    }
    public String getId() {
        return id;
@ -71,4 +87,42 @@ public class BrokerServer {
    public void setEnable(boolean enable) {
        this.enable = enable;
    }
    public ArrayList<Flow> getOnFlowList() {
        return onFlowList;
    }
    public void setOnFlowList(ArrayList<Flow> onFlowList) {
        this.onFlowList = onFlowList;
    }
    public class Flow {
        String routeCode;
        String type;
        Date updated;
        public String getRouteCode() {
            return routeCode;
        }
        public void setRouteCode(String routeCode) {
            this.routeCode = routeCode;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public Date getUpdated() {
            return updated;
        }
        public void setUpdated(Date updated) {
            this.updated = updated;
        }
    }
}

+ 75 - 33
hos-arbiter/src/main/java/com/yihu/hos/arbiter/models/ServiceFlow.java

@ -2,6 +2,7 @@ package com.yihu.hos.arbiter.models;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.ArrayList;
import java.util.Date;
/**
@ -9,13 +10,11 @@ import java.util.Date;
 */
@Document
public class ServiceFlow {
    private String event;
    private String serviceFlow;
    private String packageName;
    private String className;
    private String path;
    private Date updateTime;
    private String cron;
    private String routeCode;
    private ArrayList<HandleFile> handleFiles;
    private Date updated;
    private String flowType;    //pull or push?
    private String cron;    //采集任务时使用
    public String getCron() {
        return cron;
@ -25,51 +24,94 @@ public class ServiceFlow {
        this.cron = cron;
    }
    public String getEvent() {
        return event;
    public String getRouteCode() {
        return routeCode;
    }
    public void setEvent(String event) {
        this.event = event;
    public void setRouteCode(String routeCode) {
        this.routeCode = routeCode;
    }
    public String getServiceFlow() {
        return serviceFlow;
    public Date getUpdated() {
        return updated;
    }
    public void setServiceFlow(String serviceFlow) {
        this.serviceFlow = serviceFlow;
    public void setUpdated(Date updated) {
        this.updated = updated;
    }
    public String getPackageName() {
        return packageName;
    public ArrayList<HandleFile> getHandleFiles() {
        return handleFiles;
    }
    public void setPackageName(String packageName) {
        this.packageName = packageName;
    public void setHandleFiles(ArrayList<HandleFile> handleFiles) {
        this.handleFiles = handleFiles;
    }
    public String getClassName() {
        return className;
    }
    public void addHandleFile(HandleFile handleFile) {
        if (handleFiles == null) {
            handleFiles = new ArrayList<>();
        }
    public void setClassName(String className) {
        this.className = className;
        handleFiles.add(handleFile);
    }
    public String getPath() {
        return path;
    public String getFlowType() {
        return flowType;
    }
    public void setPath(String path) {
        this.path = path;
    public void setFlowType(String flowType) {
        this.flowType = flowType;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public class HandleFile {
        private String usage;   //router or processor
        private String packageName;
        private String className;
        private String filePath;
        private String fileType;    //java or class
        public HandleFile() {
        }
        public String getPackageName() {
            return packageName;
        }
        public void setPackageName(String packageName) {
            this.packageName = packageName;
        }
        public String getClassName() {
            return className;
        }
        public void setClassName(String className) {
            this.className = className;
        }
        public String getFilePath() {
            return filePath;
        }
        public void setFilePath(String filePath) {
            this.filePath = filePath;
        }
        public String getFileType() {
            return fileType;
        }
        public void setFileType(String fileType) {
            this.fileType = fileType;
        }
        public String getUsage() {
            return usage;
        }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
        public void setUsage(String usage) {
            this.usage = usage;
        }
    }
}

+ 1 - 1
hos-arbiter/src/main/java/com/yihu/hos/arbiter/routers/EndpointEventRouter.java

@ -25,6 +25,6 @@ public class EndpointEventRouter extends RouteBuilder {
        // Note we can explicit name the component
        context.addComponent("endpoint.event", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        from("endpoint.event:queue:configuration.endpoint")
                .to("bean:endpointService?method=trigger"); //TODO:这边可以做Message Filter,减化trigger逻辑
                .to("bean:endpointService?method=addBrokerServer"); //TODO:这边可以做Message Filter,减化trigger逻辑
    }
}

+ 19 - 2
hos-arbiter/src/main/java/com/yihu/hos/arbiter/routers/ServiceFlowEventRouter.java

@ -1,5 +1,6 @@
package com.yihu.hos.arbiter.routers;
import com.yihu.hos.arbiter.common.constants.Constants;
import com.yihu.hos.arbiter.configuration.ActivemqConfiguration;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.builder.RouteBuilder;
@ -17,14 +18,30 @@ import javax.jms.ConnectionFactory;
public class ServiceFlowEventRouter extends RouteBuilder {
    @Autowired
    private ActivemqConfiguration activemqConfiguration;
    @Override
    public void configure() throws Exception {
        ModelCamelContext context = this.getContext();
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                activemqConfiguration.getUser(), activemqConfiguration.getPassword(),activemqConfiguration.getBrokerURL());
                activemqConfiguration.getUser(), activemqConfiguration.getPassword(), activemqConfiguration.getBrokerURL());
        // Note we can explicit name the component
        context.addComponent("service.flow.event", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        from("service.flow.event:queue:configuration.service.flow")
                .to("bean:serviceFlowService?method=trigger"); //TODO:这边可以做Message Filter,减化trigger逻辑
                .choice()
                .when(header("tenant").isNotNull()).to("bean:serviceFlowService?method=proxy")
                .when(header("event").isEqualTo(Constants.FlOW_REFRESH)).to("bean:serviceFlowService?method=flowRefresh")
                .when(header("event").isEqualTo(Constants.PROCESSOR_ADDED)).to("bean:serviceFlowService?method=processorAdded")
                .when(header("event").isEqualTo(Constants.PROCESSOR_DATA_CHANGED)).to("bean:serviceFlowService?method=processorDataChanged")
                .when(header("event").isEqualTo(Constants.PROCESSOR_DATA_DELETED)).to("bean:serviceFlowService?method=processorDataDeleted")
                .when(header("event").isEqualTo(Constants.ROUTE_DEFINE_ADDED)).to("bean:serviceFlowService?method=routeDefineAdded")
                .when(header("event").isEqualTo(Constants.ROUTE_DEFINE_CHANGED)).to("bean:serviceFlowService?method=routeDefineChanged")
                .when(header("event").isEqualTo(Constants.ROUTE_DEFINE_DELETED)).to("bean:serviceFlowService?method=routeDefineDeleted")
                .when(header("event").isEqualTo(Constants.ROUTE_CLASS_ADDED)).to("bean:serviceFlowService?method=routeClassAdded")
                .when(header("event").isEqualTo(Constants.ROUTE_CLASS_CHANGED)).to("bean:serviceFlowService?method=routeClassChanged")
                .when(header("event").isEqualTo(Constants.PROCESSOR_CLASS_ADDED)).to("bean:serviceFlowService?method=processorClassAdded")
                .when(header("event").isEqualTo(Constants.PROCESSOR_CLASS_CHANGED)).to("bean:serviceFlowService?method=processorClassChanged")
                .when(header("event").isEqualTo(Constants.BROKER_SERVER_ON)).to("bean:serviceFlowService?method=brokerServerOn")
                .when(header("event").isEqualTo(Constants.FLOW_STARTED)).to("bean:brokerServerService?method=flowStarted")
                .endChoice();
    }
}

+ 78 - 2
hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/BrokerServerService.java

@ -1,6 +1,12 @@
package com.yihu.hos.arbiter.services;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.WriteResult;
import com.yihu.hos.arbiter.common.constants.Constants;
import com.yihu.hos.arbiter.models.BrokerServer;
import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@ -12,22 +18,33 @@ import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @created Airhead 2016/7/27.
 */
@Service
@Service("brokerServerService")
public class BrokerServerService {
    private static final Logger logger = LogManager.getLogger(BrokerServerService.class);
    @Autowired
    private MongoOperations mongoOperations;
    @Autowired
    private CamelContext camelContext;
    @Autowired
    private ProducerTemplate producerTemplate;
    @Autowired
    private ObjectMapper objectMapper;
    public void save(BrokerServer brokerServer) {
        Query query = new Query();
        query.addCriteria(Criteria.where("hostName").is(brokerServer.getHostName()));
        query.addCriteria(Criteria.where("hostAddress").is(brokerServer.getHostAddress()));
        query.addCriteria(Criteria.where("port").is(brokerServer.getPort()));
        Update update = new Update();
        update.set("hostName", brokerServer.getHostName());
@ -35,8 +52,49 @@ public class BrokerServerService {
        update.set("port", brokerServer.getPort());
        update.set("updateTime", brokerServer.getUpdateTime());
        update.set("enable", brokerServer.isEnable());
        if (brokerServer.getOnFlowList() != null) {
            update.set("onFlowList", brokerServer.getOnFlowList());
        }
        WriteResult writeResult = mongoOperations.upsert(query, update, BrokerServer.class);
        if (writeResult.isUpdateOfExisting()) {
            return;
        }
        mongoOperations.upsert(query, update, BrokerServer.class);
        brokerServer = mongoOperations.findById(writeResult.getUpsertedId(), BrokerServer.class);
        try {
            String msg = objectMapper.writeValueAsString(brokerServer);
            ProducerTemplate producerTemplate = createProducerTemplate();
            Map<String, Object> header = new HashMap<>();
            header.put("event", Constants.BROKER_SERVER_ON);
            producerTemplate.sendBodyAndHeaders("service.flow.event", msg, header);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
    public void updateFlowOn(BrokerServer brokerServer, BrokerServer.Flow flow) {
        Query query = new Query();
        query.addCriteria(Criteria.where("hostName").is(brokerServer.getHostName()));
        query.addCriteria(Criteria.where("hostAddress").is(brokerServer.getHostAddress()));
        query.addCriteria(Criteria.where("port").is(brokerServer.getPort()));
        BrokerServer broker = mongoOperations.findOne(query, BrokerServer.class);
        if (broker == null) {
            return;
        }
        ArrayList<BrokerServer.Flow> onFlowList = broker.getOnFlowList();
        if (onFlowList == null) {
            onFlowList = new ArrayList<>();
        }
        onFlowList.add(flow);
        Update update = new Update();
        update.set("onFlowList", onFlowList);
        mongoOperations.updateFirst(query, update, BrokerServer.class);
        //可以用ExecCommand的方法。
    }
    /**
@ -68,4 +126,22 @@ public class BrokerServerService {
        query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "updateTime")));
        return mongoOperations.find(query, BrokerServer.class);
    }
    public List<BrokerServer> getFlowOnBroker(String routeCode) {
        Query query = new Query();
        query.addCriteria(Criteria.where("onFlowList.routeCode").is(routeCode));
        return mongoOperations.find(query, BrokerServer.class);
    }
    public void flowStarted(String msg) {
    }
    private ProducerTemplate createProducerTemplate() {
        if (producerTemplate == null) {
            producerTemplate = camelContext.createProducerTemplate();
        }
        return producerTemplate;
    }
}

+ 124 - 126
hos-arbiter/src/main/java/com/yihu/hos/arbiter/services/ServiceFlowService.java

@ -1,178 +1,176 @@
package com.yihu.hos.arbiter.services;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.arbiter.common.constants.Constants;
import com.yihu.hos.arbiter.models.BrokerServer;
import com.yihu.hos.arbiter.models.ServiceFlow;
import com.yihu.hos.core.datatype.StringUtil;
import org.apache.http.Consts;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import com.yihu.hos.core.http.HttpClientKit;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * Broker原则上具有等同性,这样Arbiter无论选择了哪个Broker能提供的服务都是一样的。
 * 但是因为Broker上还是会运行一些定时的采集任务,这些采集任务如果是多台Broker运行的话,可能会引起数据重复问题。
 * 所以在事件触发时需要做一些策略的调整:
 * 1.实时任务,通知所有的Broker进行更新路由
 * 2.采集任务,只通知其中的一台进行更新路由
 *
 * @created Airhead 2016/8/16.
 */
@Service("serviceFlowService")
public class ServiceFlowService {
    private static final Logger logger = LogManager.getLogger(BrokerServerService.class);
    @Autowired
    private MongoOperations mongoOperations;
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private BrokerServerService brokerServerService;
    public void save(String serviceFlow) {
    public void save(ServiceFlow serviceFlow) {
        Query query = new Query();
        query.addCriteria(Criteria.where("routeCode").is(serviceFlow.getRouteCode()));
        Update update = new Update();
        update.set("routeCode", serviceFlow.getRouteCode());
        update.set("handleFiles", serviceFlow.getHandleFiles());
        update.set("updated", serviceFlow.getUpdated());
        update.set("flowType", serviceFlow.getFlowType());
        update.set("cron", serviceFlow.getCron());
        mongoOperations.upsert(query, update, BrokerServer.class);
    }
    public String get(String serviceName) {
        return null;
    }
    public List<ServiceFlow> getAll() {
        return mongoOperations.findAll(ServiceFlow.class);
    }
    public String put(String serviceName, String ClientInfo) {
        return null;
    }
    public void flowRefresh(String msg) {
        flowController("post", "/esb/serviceFlow", msg);
    }
    public void processorAdded(String msg) {
        flowController("post", "/esb/processor", msg);
    }
    public void processorDataChanged(String msg) {
        flowController("put", "/esb/processor", msg);
    }
    public void processorDataDeleted(String msg) {
        flowController("delete", "/esb/processor", msg);
    }
    public void routeDefineAdded(String msg) {
        flowController("post", "/esb/route", msg);
    }
    public void routeDefineChanged(String msg) {
        flowController("put", "/esb/route", msg);
    }
    public void routeDefineDeleted(String msg) {
        flowController("delete", "/esb/route", msg);
    }
    public void routeClassAdded(String msg) {
        flowController("post", "/esb/genRoute", msg);
    }
    public void routeClassChanged(String msg) {
        flowController("put", "/esb/updateRoute", msg);
    }
    public void processorClassAdded(String msg) {
        flowController("post", "/esb/genProcessor", msg);
    }
    public void processorClassChanged(String msg) {
        flowController("put", "/esb/genProcessor", msg);
    }
    public void brokerServerOn(String msg) {
        List<ServiceFlow> serviceFlowList = getAll();
        serviceFlowList.forEach(serviceFlow -> {
            try {
                String serviceFlowMsg = objectMapper.writeValueAsString(serviceFlow);
                flowController("post", "/esb/serviceFlow", serviceFlowMsg);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        });
    }
    /**
     * Broker原则上具有等同性,这样Arbiter无论选择了哪个Broker能提供的服务都是一样的。
     * 但是因为Broker上还是会运行一些定时的采集任务,这些采集任务如果是多台Broker运行的话,可能引起数据问题。
     * 所以在事件触发时需要做一些策略的调整:
     * 1.实时任务,通知所有的Broker进行更新路由
     * 2.采集任务,只通知其中的一台进行更新路由
     * TODO:遗留BUG多Broker启动时,采集任务会在多个Broker中被启动。
     * SAAS化的管理端过来的消息会被proxy进行中转,之后发送到终端的Arbiter对Broker进行实际的控制。
     *
     * @param msg 数据流
     * @param header 消息头部信息
     * @param msg    消息
     */
    public void trigger(String msg) {
        System.out.println(msg);
    public void proxy(Map<String, Object> header, String msg) {
    }
        ObjectMapper objectMapper = new ObjectMapper();
    private void flowController(String method, String path, String msg) {
        try {
            ServiceFlow serviceFlow = objectMapper.readValue(msg, ServiceFlow.class);
            List<NameValuePair> nameValuePairList = new ArrayList<>();
            nameValuePairList.add(new BasicNameValuePair("serviceFlow", serviceFlow.getServiceFlow()));
            nameValuePairList.add(new BasicNameValuePair("packageName", serviceFlow.getPackageName()));
            nameValuePairList.add(new BasicNameValuePair("className", serviceFlow.getClassName()));
            nameValuePairList.add(new BasicNameValuePair("path", serviceFlow.getPath()));
            nameValuePairList.add(new BasicNameValuePair("cron", serviceFlow.getCron()));
            boolean one = !StringUtil.isEmpty(serviceFlow.getCron());   //有cron表达式,就是采集任务。
            List<BrokerServer> brokerServerList = brokerServerService.get(one);
            for (BrokerServer brokerServer : brokerServerList) {
                CloseableHttpClient httpclient = HttpClients.createDefault();
                switch (serviceFlow.getEvent()) {
                    case "processorAdded": {
                        HttpPost httpPost = new HttpPost(brokerServer.getURL() + "/esb/processor");
                        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8));
                        CloseableHttpResponse response = httpclient.execute(httpPost);
                        response.close();
                        break;
                    }
                    case "processorDataChanged": {
                        HttpPut httpPut = new HttpPut(brokerServer.getURL() + "/esb/processor");
                        httpPut.setEntity(new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8));
                        CloseableHttpResponse response = httpclient.execute(httpPut);
                        response.close();
                        break;
                    }
                    case "routeDefineAdded": {
                        HttpPost httpPost = new HttpPost(brokerServer.getURL() + "/esb/route");
                        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8));
                        CloseableHttpResponse response = httpclient.execute(httpPost);
                        response.close();
                        break;
                    }
            this.save(serviceFlow);
                    case "routeDefineChanged": {
                        HttpPut httpPut = new HttpPut(brokerServer.getURL() + "/esb/route");
                        httpPut.setEntity(new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8));
                        CloseableHttpResponse response = httpclient.execute(httpPut);
                        response.close();
                        break;
                    }
                    case "routeDefineDelete": {
                        try {
                            URI uri = new URIBuilder()
                                    .setScheme("http")
                                    .setHost(brokerServer.getHostAddress() + ":" + brokerServer.getPort())
                                    .setPath("/esb/route")
                                    .setParameter("serviceFlow", serviceFlow.getServiceFlow())
                                    .setParameter("packageName", serviceFlow.getPackageName())
                                    .setParameter("className", serviceFlow.getClassName())
                                    .build();
                            HttpDelete httpDelete = new HttpDelete(uri);
                            CloseableHttpResponse response = httpclient.execute(httpDelete);
                            response.close();
                        } catch (URISyntaxException e) {
                            e.printStackTrace();
                        }
            boolean one = serviceFlow.getFlowType().equals(Constants.JAVA);   //有cron表达式,就是采集任务。
            if (one) {
                List<BrokerServer> flowOnBroker = brokerServerService.getFlowOnBroker(serviceFlow.getRouteCode());
                if (flowOnBroker != null && flowOnBroker.size() != 0) {
                    return;
                }
            }
            List<BrokerServer> brokerServerList = brokerServerService.get(one);
            for (BrokerServer brokerServer : brokerServerList) {
                if (brokerServer.isFlowOn(serviceFlow.getRouteCode())) {
                    continue;
                }
                switch (method) {
                    case "post":
                        HttpClientKit.post(brokerServer.getURL() + path, msg);
                        break;
                    }
                    case "routeClassAdded": {
                        HttpPost httpPost = new HttpPost(brokerServer.getURL() + "/esb/genRoute");
                        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8));
                        CloseableHttpResponse response = httpclient.execute(httpPost);
                        response.close();
                        break;
                    }
                    case "routeClassChanged": {
                        HttpPut httpPut = new HttpPut(brokerServer.getURL() + "/esb/updateRoute");
                        httpPut.setEntity(new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8));
                        CloseableHttpResponse response = httpclient.execute(httpPut);
                        response.close();
                        break;
                    }
                    case "processorClassAdded": {
                        HttpPost httpPost = new HttpPost(brokerServer.getURL() + "/esb/genProcessor");
                        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList, Consts.UTF_8));
                        CloseableHttpResponse response = httpclient.execute(httpPost);
                        response.close();
                    case "put":
                        HttpClientKit.post(brokerServer.getURL() + path, msg);
                        break;
                    }
                    case "processorDataDeleted": {
                        try {
                            URI uri = new URIBuilder()
                                    .setScheme("http")
                                    .setHost(brokerServer.getHostAddress() + ":" + brokerServer.getPort())
                                    .setPath("/esb/processor")
                                    .setParameter("serviceFlow", serviceFlow.getServiceFlow())
                                    .setParameter("packageName", serviceFlow.getPackageName())
                                    .setParameter("className", serviceFlow.getClassName())
                                    .build();
                            HttpDelete httpDelete = new HttpDelete(uri);
                            CloseableHttpResponse response = httpclient.execute(httpDelete);
                            response.close();
                        } catch (URISyntaxException e) {
                            e.printStackTrace();
                        }
                    case "delete":
                        HttpClientKit.post(brokerServer.getURL() + path, msg);
                        break;
                    }
                    default:
                        break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
}

+ 1 - 2
hos-broker/src/main/java/com/yihu/hos/HosBrokerApplication.java

@ -14,9 +14,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
public class HosBrokerApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(HosBrokerApplication.class);
        app.addListeners(new ApplicationStartListener());
//        app.addListeners(new ApplicationStartListener());
        app.run(args);
    }

+ 1 - 1
hos-broker/src/main/java/com/yihu/hos/common/listener/ApplicationStartListener.java

@ -132,7 +132,7 @@ public class ApplicationStartListener implements ApplicationListener<ContextRefr
                            }
                        } catch (Exception e) {
                            logger.info("缺少class文件:" + code);
                            continue;
                             continue;
                        }
                    }
                }

+ 34 - 1
hos-core/src/main/java/com/yihu/hos/core/file/FileUtil.java

@ -143,7 +143,10 @@ public class FileUtil {
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
        }
        return output.toByteArray();
        byte[] bytes =output.toByteArray();
        input.close();
        output.close();
        return bytes;
    }
@ -314,5 +317,35 @@ public class FileUtil {
        return stringBuilder.toString();
    }
    /**
     * 读取文件内容
     * @param bytes
     * @return
     */
    public static String readFileText(byte[] bytes) {
        StringBuilder stringBuilder = new StringBuilder();
        InputStream in = null;
        BufferedReader br = null;
        try {
            in = new ByteArrayInputStream(bytes);
            br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
            }
        }
        return stringBuilder.toString();
    }
}

+ 73 - 9
hos-core/src/main/java/com/yihu/hos/core/http/DefaultClientImpl.java

@ -12,7 +12,8 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
 * @created Airhead 2016/8/24.
 * @author Airhead
 * @since 2016/8/24.
 */
class DefaultClientImpl implements HTTPClient {
    private static final Log log = LogFactory.getLog(DefaultClientImpl.class);
@ -49,11 +50,11 @@ class DefaultClientImpl implements HTTPClient {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(500, "");
        return new HTTPResponse(417, "");
    }
    public HTTPResponse post(String url) {
        return post(url, null);
        return post(url, (Map<String, String>) null);
    }
    public HTTPResponse post(String url, Map<String, String> params) {
@ -84,7 +85,28 @@ class DefaultClientImpl implements HTTPClient {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(500, "");
        return new HTTPResponse(417, "");
    }
    @Override
    public HTTPResponse post(String url, String json) {
        try {
            final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            RequestBody body = RequestBody.create(JSON, json);
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            Response response = httpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                return new HTTPResponse(response.code(), response.body().string());
            }
        } catch (IOException ex) {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(417, "");
    }
    public HTTPResponse postFile(String url, String path) {
@ -117,17 +139,38 @@ class DefaultClientImpl implements HTTPClient {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(500, "");
        return new HTTPResponse(417, "");
    }
    public HTTPResponse put(String url) {
        return put(url, null);
        return put(url, (Map<String, String>) null);
    }
    public HTTPResponse put(String url, Map<String, String> params) {
        return put(url, params, null);
    }
    @Override
    public HTTPResponse put(String url, String json) {
        try {
            final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            RequestBody body = RequestBody.create(JSON, json);
            Request request = new Request.Builder()
                    .url(url)
                    .put(body)
                    .build();
            Response response = httpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                return new HTTPResponse(response.code(), response.body().string());
            }
        } catch (IOException ex) {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(417, "");
    }
    public HTTPResponse put(String url, Map<String, String> params, Map<String, String> headers) {
        try {
            FormBody.Builder fromBodyBuilder = new FormBody.Builder();
@ -152,17 +195,38 @@ class DefaultClientImpl implements HTTPClient {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(500, "");
        return new HTTPResponse(417, "");
    }
    public HTTPResponse delete(String url) {
        return delete(url, null);
        return delete(url, (Map<String, String>) null);
    }
    public HTTPResponse delete(String url, Map<String, String> params) {
        return delete(url, params, null);
    }
    @Override
    public HTTPResponse delete(String url, String json) {
        try {
            final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            RequestBody body = RequestBody.create(JSON, json);
            Request request = new Request.Builder()
                    .url(url)
                    .delete(body)
                    .build();
            Response response = httpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                return new HTTPResponse(response.code(), response.body().string());
            }
        } catch (IOException ex) {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(417, "");
    }
    public HTTPResponse delete(String url, Map<String, String> params, Map<String, String> headers) {
        try {
            FormBody.Builder fromBodyBuilder = new FormBody.Builder();
@ -187,7 +251,7 @@ class DefaultClientImpl implements HTTPClient {
            log.error(ex.getMessage());
        }
        return new HTTPResponse(500, "");
        return new HTTPResponse(417, "");
    }
    public HTTPResponse request(String method, String url, Map<String, String> params, Map<String, String> headers) {

+ 6 - 0
hos-core/src/main/java/com/yihu/hos/core/http/HTTPClient.java

@ -24,6 +24,8 @@ public interface HTTPClient {
    HTTPResponse post(String url, Map<String, String> params, Map<String, String> headers);
    HTTPResponse post(String url, String json);
    HTTPResponse postFile(String url, String path);
    HTTPResponse postFile(String url, String path, Map<String, String> params);
@ -34,12 +36,16 @@ public interface HTTPClient {
    HTTPResponse put(String url, Map<String, String> params);
    HTTPResponse put(String url, String json);
    HTTPResponse put(String url, Map<String, String> params, Map<String, String> headers);
    HTTPResponse delete(String url);
    HTTPResponse delete(String url, Map<String, String> params);
    HTTPResponse delete(String url, String json);
    HTTPResponse delete(String url, Map<String, String> params, Map<String, String> headers);
    HTTPResponse request(String method, String url, Map<String, String> params, Map<String, String> headers);

+ 12 - 0
hos-core/src/main/java/com/yihu/hos/core/http/HttpClientKit.java

@ -66,6 +66,10 @@ public class HttpClientKit {
        return use().post(url, params);
    }
    public static HTTPResponse post(String url, String json) {
        return use().post(url, json);
    }
    public static HTTPResponse post(String url, Map<String, String> params, Map<String, String> headers) {
        return use().post(url, params, headers);
    }
@ -90,6 +94,10 @@ public class HttpClientKit {
        return use().put(url, params);
    }
    public static HTTPResponse put(String url, String json) {
        return use().put(url, json);
    }
    public static HTTPResponse put(String url, Map<String, String> params, Map<String, String> headers) {
        return use().put(url, params, headers);
    }
@ -102,6 +110,10 @@ public class HttpClientKit {
        return use().delete(url, params);
    }
    public static HTTPResponse delete(String url, String json) {
        return use().delete(url, json);
    }
    public static HTTPResponse delete(String url, Map<String, String> params, Map<String, String> headers) {
        return use().delete(url, params, headers);
    }

+ 4 - 3
hos-web-camel-dependencies/pom.xml

@ -15,10 +15,11 @@
    </parent>
    <properties>
        <camel.version>2.17.1</camel.version>
        <camel.version>2.18.0</camel.version>
        <camel.osgi.export.pkg>org.apache.camel.dataformat.xmljson.*</camel.osgi.export.pkg>
        <camel.osgi.export.service>org.apache.camel.spi.DataFormatResolver;dataformat=xmljson</camel.osgi.export.service>
     </properties>
        <camel.osgi.export.service>org.apache.camel.spi.DataFormatResolver;dataformat=xmljson
        </camel.osgi.export.service>
    </properties>
    <pluginRepositories>
        <pluginRepository>
            <id>pluginCentral</id>

+ 24 - 2
hos-web-framework/src/main/java/com/yihu/hos/web/framework/util/GridFSUtil.java

@ -494,7 +494,6 @@ public class GridFSUtil {
        //获取mongodb连接
//        MongodbHelper mongoOrigin = new MongodbHelper(dbName);
        //创建一个容器
        File file = new File(filePath);
        MongoDatabase db = MongodbFactory.getDB(dbName);
        GridFSBucket gridFS = GridFSBuckets.create(db);
        //自定义字段
@ -516,6 +515,8 @@ public class GridFSUtil {
        finally {
            if (uploadStream != null) {
                uploadStream.close();
                File file = new File(filePath);
                file.deleteOnExit();
            }
        }
        return "";
@ -538,6 +539,27 @@ public class GridFSUtil {
        }
    }
    /**
     * 读取文件内容
     * @param dbName    数据库名
     * @param fileName  文件名
     * @return
     */
    public static String readFile(String dbName, String fileName){
        try {
            MongoDatabase db = MongodbFactory.getDB(dbName);
            GridFSBucket gridFS = GridFSBuckets.create(db);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            gridFS.downloadToStreamByName(fileName, out);
            String content = FileUtil.readFileText(out.toByteArray());
            out.close();
            return content;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 从 mongodb GridFS 下载文件
@ -555,7 +577,7 @@ public class GridFSUtil {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        gridFS.downloadToStreamByName(fileName, out);
        try {
            boolean succ = FileUtil.writeFile(savePath, out.toByteArray(), "utf-8");
            boolean succ = FileUtil.writeFile(savePath, out.toByteArray(), "UTF-8");
            if (succ) {
                return savePath;
            } else {

+ 0 - 58
src/main/java/com/yihu/hos/common/ApplicationStart.java

@ -1,58 +0,0 @@
package com.yihu.hos.common;
import com.yihu.hos.web.framework.constrant.DateConvert;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import org.apache.commons.beanutils.ConvertUtils;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Date;
/**
 * 项目启动执行
 * add by hzp at 2016-01-25
 */
public class ApplicationStart implements ServletContextListener {
    static private final Logger logger = LoggerFactory.getLogger(ApplicationStart.class);
    private static int rebootCount = 0;
    @Override
    public void contextInitialized(ServletContextEvent context) {
        //使用自定义转化器转化时间格式
        ConvertUtils.register(new DateConvert(), Date.class);
        //initQuartz();//启动任务
    }
    @Override
    public void contextDestroyed(ServletContextEvent context) {
        destroyedQuartz();
    }
    /**
     * 初始化任务
     * @return
     */
    public void initQuartz(){
        try {
            //QuartzManager.startJobs();
        } catch(Exception e){
            logger.error(" Quartz job initing Exception " + e.getMessage());
        }
    }
    /**
     * 终止任务
     */
    public void destroyedQuartz(){
        try {
            //QuartzManager.shutdownJobs();
        } catch(Exception e){
           logger.error(" Quartz job destroying Exception " + e.getMessage());
        }
    }
}

+ 81 - 3
src/main/java/com/yihu/hos/common/CommonPageController.java

@ -1,14 +1,21 @@
package com.yihu.hos.common;
import com.yihu.hos.web.framework.util.PKUtil;
import com.yihu.hos.web.framework.util.controller.BaseController;
import com.yihu.hos.system.model.SystemUser;
import com.yihu.hos.tenant.service.AuthenticateService;
import com.yihu.hos.web.framework.util.controller.BaseController;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * 数据采集配置页面
@ -18,14 +25,85 @@ import javax.servlet.http.HttpSession;
@Controller("commonPageController")
public class CommonPageController extends BaseController {
    @Value("${spring.administrators}")
    private String saasAdmin;
    @Autowired
    private AuthenticateService authenticateService;
    /*
    登录页面
     */
    @RequestMapping("loginPage")
    public String login(Model model) {
    public String login(Model model, HttpServletRequest request,HttpServletResponse response) {
        HttpSession session = request.getSession();
        try {
            boolean auth = authenticateService.auth(session, saasAdmin);
            if (!auth){
                //授权失败
                response.setCharacterEncoding("UTF-8");
                response.setHeader("Content-type", "text/html;charset=UTF-8");
                PrintWriter out = null;
                try {
                    out = response.getWriter();
                    out.print("<script>alert('登录地址有误-用户授权失败!');</script>");
                    response.sendRedirect("/esb/loginPage");
                    out.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    IOUtils.closeQuietly(out);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        model.addAttribute("contentPage","/common/login");
        return "pageView";
    }
    /**
     * 租户登录页面
     * @param model
     * @param tenantName
     * @param request
     * @return
     */
    @RequestMapping("{tenantName}/loginPage")
    public String tenantLogin(Model model,
                            @PathVariable(name = "tenantName") String tenantName,
                            HttpServletRequest request,HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        boolean auth = false;
        try {
            auth = authenticateService.auth(session, tenantName);
        System.out.println("auth:   "+auth);
        if (!auth) {
            //授权失败,切换回管理平台数据库
            auth = authenticateService.auth(session, saasAdmin);
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-type", "text/html;charset=UTF-8");
            PrintWriter out = null;
            try {
                out = response.getWriter();
                out.print("<script>alert('请求地址不存在!');</script>");
                response.sendRedirect("/esb/loginPage");
                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                IOUtils.closeQuietly(out);
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
        model.addAttribute("contentPage","/common/login");
        return "pageView";
    }
    /*

+ 20 - 15
src/main/java/com/yihu/hos/common/constants/Constants.java

@ -5,28 +5,33 @@ package com.yihu.hos.common.constants;
 * @vsrsion 1.0
 * Created at 2016/8/25.
 */
public class Constants {
public interface Constants {
    //流程-队列名称
    public static String FLOW_QUEUE_NAME = "configuration.service.flow";
    String FLOW_QUEUE_NAME = "configuration.service.flow";
    //流程-模板类型
    public static String JAVA = "java";
    public static String CLASS = "class";
    String JAVA = "java";
    String CLASS = "class";
    //流程-路由类型
    public static String FLOW_TYPE_ROUTE = "route";
    public static String FLOW_TYPE_PROCESSOR = "processor";
    String FLOW_TYPE_ROUTE = "route";
    String FLOW_TYPE_PROCESSOR = "processor";
    //流程-路由类型
    public static String FLOW_OP_UPDATE = "update";
    public static String FLOW_OP_DELETE = "delete";
    public static String FLOW_OP_ADD = "add";
    String FLOW_OP_UPDATE = "update";
    String FLOW_OP_DELETE = "delete";
    String FLOW_OP_ADD = "add";
    //流程-操作消息
    public static String PROCESSOR_ADD = "processorAdded";
    public static String PROCESSOR_DATA_CHANGE = "processorDataChanged";
    public static String PROCESSOR_DATA_DELETE = "processorDataDelete";
    public static String ROUTE_DEFINE_ADD = "routeDefineAdded";
    public static String ROUTE_DEFINE_CHANGE = "routeDefineChanged";
    public static String ROUTE_DEFINE_DELETE = "routeDefineDelete";
    String FlOW_REFRESH = "flowRefresh";
    String PROCESSOR_ADDED = "processorAdded";
    String PROCESSOR_DATA_CHANGED = "processorDataChanged";
    String PROCESSOR_DATA_DELETED = "processorDataDeleted";
    String ROUTE_DEFINE_ADDED = "routeDefineAdded";
    String ROUTE_DEFINE_CHANGED = "routeDefineChanged";
    String ROUTE_DEFINE_DELETED = "routeDefineDeleted";
    String ROUTE_CLASS_ADDED = "routeClassAdded";   //java类型的路由添加
    String ROUTE_CLASS_CHANGED = "routeClassChanged";//java类型的路由修改
    String PROCESSOR_CLASS_ADDED = "processorClassAdded"; //java类型的处理器添加
    String PROCESSOR_CLASS_CHANGED = "processorClassChanged"; //java类型的处理器修改
}

+ 5 - 0
src/main/java/com/yihu/hos/common/constants/ContextAttributes.java

@ -5,4 +5,9 @@ package com.yihu.hos.common.constants;
 */
public interface ContextAttributes {
    String SCHEMA = "schema";
    String USER_INFO = "userInfo";
    String TENANT_SESSION = "tenantSession";
    String GLOBAL_DB = "global_db";//平台管理中心库
}

+ 1 - 1
src/main/java/com/yihu/hos/config/WebMvcConfig.java

@ -1,7 +1,7 @@
package com.yihu.hos.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.common.ApplicationStart;
import com.yihu.hos.listeners.ApplicationStart;
import com.yihu.hos.filter.HibernateFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

+ 14 - 1
src/main/java/com/yihu/hos/interceptor/AuditInterceptor.java

@ -3,10 +3,12 @@ package com.yihu.hos.interceptor;
import com.yihu.hos.common.constants.ContextAttributes;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Iterator;
/**
@ -28,10 +30,21 @@ public class AuditInterceptor extends EmptyInterceptor {
            String myCatAnnotation = "/*#mycat:schema=" + schemaName + "*/ ";
            completeSql = myCatAnnotation + sql;
        }
        logger.info("prepare " + completeSql);
//        logger.info("prepare " + completeSql);
        return super.onPrepareStatement(completeSql);
    }
    @Override
    public void onDelete(
            Object entity,
            Serializable id,
            Object[] state,
            String[] propertyNames,
            Type[] types) {
        System.out.println("33333333333333");
        super.onDelete(entity,id,state,propertyNames,types);
    }
    @Override
    public void preFlush(Iterator entities) {

+ 1 - 1
src/main/java/com/yihu/hos/interceptor/LocalContext.java

@ -12,7 +12,7 @@ public class LocalContext {
            return new LocalContext();
        }
    };
    private final Map<String, String> attachments = new HashMap<>();
    private static final Map<String, String> attachments = new HashMap<>();
    public static LocalContext getContext() {
        return LOCAL.get();

+ 54 - 0
src/main/java/com/yihu/hos/listeners/ApplicationStart.java

@ -0,0 +1,54 @@
package com.yihu.hos.listeners;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.services.ServiceFlowEventService;
import com.yihu.hos.system.model.bo.ServiceFlow;
import com.yihu.hos.system.service.FlowManager;
import com.yihu.hos.web.framework.constrant.DateConvert;
import org.apache.commons.beanutils.ConvertUtils;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.Date;
import java.util.List;
/**
 * 项目启动执行
 * add by hzp at 2016-01-25
 */
public class ApplicationStart implements ServletContextListener {
    static private final Logger logger = LoggerFactory.getLogger(ApplicationStart.class);
    @Autowired
    private ServiceFlowEventService serviceFlowEventService;
    @Autowired
    private FlowManager flowManager;
    @Override
    public void contextInitialized(ServletContextEvent context) {
        //使用自定义转化器转化时间格式
        ConvertUtils.register(new DateConvert(), Date.class);
        this.flowRefresh();
    }
    @Override
    public void contextDestroyed(ServletContextEvent context) {
    }
    /**
     * admin启动时,触发一次所有流程更新事件,用于重启整个服务的情况。
     * 同时解决Broker中启动多个采集任务的问题。
     */
    private void flowRefresh() {
        try {
            List<ServiceFlow> serviceFlowList = flowManager.getServiceFlowList();
            serviceFlowList.forEach(serviceFlow -> serviceFlowEventService.flowRefresh(serviceFlow));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

+ 0 - 25
src/main/java/com/yihu/hos/services/DatacollectJob.java

@ -1,25 +0,0 @@
package com.yihu.hos.services;
import com.yihu.hos.common.Services;
import com.yihu.hos.datacollect.service.intf.IDatacollectService;
import com.yihu.hos.web.framework.constrant.DateConvert;
import com.yihu.hos.web.framework.util.springutil.SpringBeanUtil;
import java.util.Date;
/**
 * Created by hzp on 2016/2/2.
 */
public class DatacollectJob implements IBaseJob {
    @Override
    public void execute(String jobId) throws Exception{
        IDatacollectService service = SpringBeanUtil.getService(Services.DatacollectService);
        service.executeJob(jobId);
        System.out.println(DateConvert.toString(new Date()) + " 采集任务:" + jobId);
        return;
    }
}

+ 0 - 13
src/main/java/com/yihu/hos/services/IBaseJob.java

@ -1,13 +0,0 @@
package com.yihu.hos.services;
/**
 * 任务类接口类
 * Created by hzp on 2016/2/2.
 */
public interface IBaseJob {
    /**
     * 类处理任务统一调用方法
     */
    void execute(String jobId) throws Exception;
}

+ 0 - 10
src/main/java/com/yihu/hos/services/IBaseManager.java

@ -1,10 +0,0 @@
package com.yihu.hos.services;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/8/25.
 */
public interface IBaseManager {
}

+ 109 - 41
src/main/java/com/yihu/hos/services/ServiceFlowEventService.java

@ -2,18 +2,24 @@ package com.yihu.hos.services;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.hos.common.constants.Constants;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.system.model.bo.ServiceFlow;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
import java.util.HashMap;
import java.util.Map;
/**
 * @created Airhead 2016/8/2.
 */
@Component
public class ServiceFlowEventService {
    static final Logger logger = LoggerFactory.getLogger(ServiceFlowEventService.class);
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;
@ -23,6 +29,14 @@ public class ServiceFlowEventService {
    @Autowired
    private ObjectMapper objectMapper;
    /**
     * admin启动时,触发一次所有流程更新事件,用于重启整个服务的情况。
     * 同时解决Broker中启动多个采集任务的问题。
     */
    public void flowRefresh(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.FlOW_REFRESH, serviceFlow);
    }
    /**
     * 当外界组件通知一个新的processor处理器被定义时,该事件被触发。
     *
@ -32,81 +46,135 @@ public class ServiceFlowEventService {
     * @param path        processor处理器定义涉及的class内容,如果zookeeper数据结构中class分片存储,在业务级接口层面上也进行了合并
     */
    public void processorAdded(String serviceFlow, String packageName, String className, String path) {
        sendMsg("processorAdded", serviceFlow, packageName, className, path);
        sendMsg(Constants.PROCESSOR_ADDED, serviceFlow, packageName, className, path);
    }
    public void processorAdded(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.PROCESSOR_ADDED, serviceFlow);
    }
    /**
     * 当外界组件通知一个已有的processor处理器data部分发生变化时,该事件被触发。
     */
    public void processorDataChanged(String serviceFlow, String packageName, String className, String path) {
        this.sendMsg("processorDataChanged", serviceFlow, packageName, className, path);
    public void processorDataChanged(String routeCode, String packageName, String className, String path) {
        this.sendMsg(Constants.PROCESSOR_DATA_CHANGED, routeCode, packageName, className, path);
    }
    public void processorDataChanged(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.PROCESSOR_DATA_CHANGED, serviceFlow);
    }
    public void processorDataDeleted(String serviceFlow, String packageName, String className) {
        this.sendMsg("processorDataDeleted", serviceFlow, packageName, className, null);
    public void processorDataDeleted(String routeCode, String packageName, String className) {
        this.sendMsg(Constants.PROCESSOR_DATA_DELETED, routeCode, packageName, className, null);
    }
    public void processorDataDeleted(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.PROCESSOR_DATA_DELETED, serviceFlow);
    }
    /**
     * 当外界组件通知一个新的RouteDefine路由被定义时,该事件被触发
     */
    public void routeDefineAdded(String serviceFlow, String packageName, String className, String path) {
        this.sendMsg("routeDefineAdded", serviceFlow, packageName, className, path);
    public void routeDefineAdded(String routeCode, String packageName, String className, String path) {
        this.sendMsg(Constants.ROUTE_DEFINE_ADDED, routeCode, packageName, className, path);
    }
    public void routeDefineAdded(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.ROUTE_DEFINE_ADDED, serviceFlow);
    }
    /**
     * 当外界组件通知一个已有的RouteDefine路由定义被改变时,主要就是路由定义内容被改变时,该事件被触发。
     */
    public void routeDefineChanged(String serviceFlow, String packageName, String className, String path) {
        this.sendMsg("routeDefineChanged", serviceFlow, packageName, className, path);
    public void routeDefineChanged(String routeCode, String packageName, String className, String path) {
        this.sendMsg(Constants.ROUTE_DEFINE_CHANGED, routeCode, packageName, className, path);
    }
    public void routeDefineChanged(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.ROUTE_DEFINE_CHANGED, serviceFlow);
    }
    /**
     * 当外界组件通知一个已有的RouteDefine路由定义被删除时,该事件被触发。
     */
    public void routeDefineDelete(String serviceFlow, String packageName, String className) {
        this.sendMsg("routeDefineDelete", serviceFlow, packageName, className, null);
    public void routeDefineDelete(String routeCode, String packageName, String className) {
        this.sendMsg(Constants.ROUTE_DEFINE_DELETED, routeCode, packageName, className, null);
    }
    public void routeClassAdded(String serviceFlow, String packageName, String className, String path,String cron) {
        this.sendGenMsg("routeClassAdded", serviceFlow, packageName, className, path, cron);
    public void routeDefineDelete(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.ROUTE_DEFINE_DELETED, serviceFlow);
    }
    public void routeClassChanged(String serviceFlow, String packageName, String className, String path,String cron) {
        this.sendGenMsg("routeClassChanged", serviceFlow, packageName, className, path, cron);
    public void routeClassAdded(String routeCode, String packageName, String className, String path, String cron) {
        this.sendGenMsg(Constants.ROUTE_CLASS_ADDED, routeCode, packageName, className, path, cron);
    }
    public void processorClassAdded(String serviceFlow, String packageName, String className, String path) {
        this.sendMsg("processorClassAdded", serviceFlow, packageName, className, path);
    public void routeClassAdded(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.ROUTE_CLASS_ADDED, serviceFlow);
    }
    private void sendMsg(String event, String serviceFlow, String packageName, String className, String path) {
        ObjectNode objectNode = objectMapper.createObjectNode();
        objectNode.put("event", event);
        objectNode.put("serviceFlow", serviceFlow);
        objectNode.put("packageName", packageName);
        objectNode.put("className", className);
        objectNode.put("path", path);
        try {
            String msg = objectMapper.writeValueAsString(objectNode);
            this.jmsMessagingTemplate.convertAndSend(this.queue, msg);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    public void routeClassChanged(String routeCode, String packageName, String className, String path, String cron) {
        this.sendGenMsg(Constants.ROUTE_CLASS_CHANGED, routeCode, packageName, className, path, cron);
    }
    public void routeClassChanged(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.ROUTE_CLASS_CHANGED, serviceFlow);
    }
    public void processorClassAdded(String routeCode, String packageName, String className, String path) {
        this.sendMsg(Constants.PROCESSOR_CLASS_ADDED, routeCode, packageName, className, path);
    }
    public void processorClassAdded(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.PROCESSOR_CLASS_ADDED, serviceFlow);
    }
    public void processorClassChanged(String routeCode, String packageName, String className, String path) {
        this.sendMsg(Constants.PROCESSOR_CLASS_CHANGED, routeCode, packageName, className, path);
    }
    public void processorClassChanged(ServiceFlow serviceFlow) {
        this.sendMsg(Constants.PROCESSOR_CLASS_CHANGED, serviceFlow);
    }
    private void sendMsg(String event, String routeCode, String packageName, String className, String path) {
        ServiceFlow flow = new ServiceFlow();
        flow.setRouteCode(routeCode);
        ServiceFlow.HandleFile handleFile = flow.new HandleFile();
//        handleFile.setUsage(Constants.FLOW_TYPE_ROUTE);
        handleFile.setPackageName(packageName);
        handleFile.setClassName(className);
        handleFile.setFilePath(path);
        handleFile.setFileType(Constants.CLASS);
        flow.addHandleFile(handleFile);
        this.sendMsg(event, flow);
    }
    private void sendGenMsg(String event, String routeCode, String packageName, String className, String path, String cron) {
        ServiceFlow flow = new ServiceFlow();
        flow.setRouteCode(routeCode);
        ServiceFlow.HandleFile handleFile = flow.new HandleFile();
//        handleFile.setUsage(Constants.FLOW_TYPE_ROUTE);
        handleFile.setPackageName(packageName);
        handleFile.setClassName(className);
        handleFile.setFilePath(path);
        handleFile.setFileType(Constants.JAVA);
        flow.addHandleFile(handleFile);
        flow.setCron(cron);
        this.sendMsg(event, flow);
    }
    private void sendGenMsg(String event, String serviceFlow, String packageName, String className, String path,String cron) {
        ObjectNode objectNode = objectMapper.createObjectNode();
        objectNode.put("event", event);
        objectNode.put("serviceFlow", serviceFlow);
        objectNode.put("packageName", packageName);
        objectNode.put("className", className);
        objectNode.put("path", path);
        objectNode.put("cron", cron);
    private void sendMsg(String event, ServiceFlow serviceFlow) {
        try {
            String msg = objectMapper.writeValueAsString(objectNode);
            this.jmsMessagingTemplate.convertAndSend(this.queue, msg);
            String msg = objectMapper.writeValueAsString(serviceFlow);
            Map<String, Object> header = new HashMap<>();
            header.put("event", event);
            this.jmsMessagingTemplate.convertAndSend(this.queue, msg, header);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }
}

+ 0 - 25
src/main/java/com/yihu/hos/services/TestJob.java

@ -1,25 +0,0 @@
package com.yihu.hos.services;
import com.yihu.hos.common.Services;
import com.yihu.hos.datacollect.service.intf.IDatacollectService;
import com.yihu.hos.web.framework.constrant.DateConvert;
import javax.annotation.Resource;
import java.util.Date;
/**
 * Created by hzp on 2016/2/2.
 */
public class TestJob implements IBaseJob {
    @Resource(name = Services.DatacollectService)
    IDatacollectService service;
    @Override
    public void execute(String jobId) throws Exception{
        System.out.println("测试quartz:"+DateConvert.toString(new Date()) + ":"+jobId);
        return;
    }
}

+ 20 - 4
src/main/java/com/yihu/hos/system/controller/SystemController.java

@ -1,7 +1,11 @@
package com.yihu.hos.system.controller;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.system.service.intf.ISystemManager;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.tenant.service.AuthenticateService;
import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.model.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@ -23,6 +27,9 @@ public class SystemController {
    @Autowired
    private ISystemManager ehr;
    @Autowired
    private AuthenticateService authenticateService;
    /**
     * 判断是否登录
     * @return
@ -59,6 +66,7 @@ public class SystemController {
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            return Result.error(ex.getMessage());
        }
    }
@ -68,15 +76,23 @@ public class SystemController {
        */
    @RequestMapping("logoutAction")
    @ResponseBody
    public Result logoutAction(HttpServletRequest request) {
    public ActionResult logoutAction(HttpServletRequest request) {
        try {
            HttpSession session = request.getSession();
            String userCode = "";
            TenantSession tenantSession = (TenantSession)session.getAttribute(ContextAttributes.TENANT_SESSION);
            if (tenantSession !=null){
                userCode = tenantSession.getUserCode();
                authenticateService.logout(session);
            }
            session.removeAttribute("userInfo");
            return Result.success("退出登录");
            ActionResult re = new ActionResult(true, "登出成功!");
            re.setData(userCode);
            return re;
        }
        catch (Exception ex)
        {
            return Result.error(ex.getMessage());
            return new ActionResult(false, "登出异常!");
        }
    }

+ 3 - 9
src/main/java/com/yihu/hos/system/dao/FlowClassDao.java

@ -1,6 +1,5 @@
package com.yihu.hos.system.dao;
import com.yihu.hos.system.dao.intf.IFlowClassDao;
import com.yihu.hos.system.model.SystemServiceFlowClass;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import org.hibernate.Query;
@ -16,12 +15,10 @@ import java.util.List;
 * Created at 2016/8/19.
 */
@Repository("flowClassDao")
public class FlowClassDao extends SQLGeneralDAO implements IFlowClassDao {
public class FlowClassDao extends SQLGeneralDAO {
    public static final String BEAN_ID = "flowClassDao";
    @Override
    public List<SystemServiceFlowClass> getFlowClassByFlowId(Integer flowId) throws Exception {
        List<SystemServiceFlowClass> flowClasses = (List<SystemServiceFlowClass>) super.hibernateTemplate.find("from SystemServiceFlowClass s where s.flowId=? ", flowId);
        if (flowClasses != null && flowClasses.size() > 0) {
@ -30,16 +27,14 @@ public class FlowClassDao extends SQLGeneralDAO implements IFlowClassDao {
        return new ArrayList<>();
    }
    @Override
    public List<SystemServiceFlowClass> getFlowClass(Integer flowId, String type) throws Exception {
        List<SystemServiceFlowClass> flowClasses = (List<SystemServiceFlowClass>) super.hibernateTemplate.find("from SystemServiceFlowClass s where s.flowId=? and type=? ", flowId,type);
        List<SystemServiceFlowClass> flowClasses = (List<SystemServiceFlowClass>) super.hibernateTemplate.find("from SystemServiceFlowClass s where s.flowId=? and type=? ", flowId, type);
        if (flowClasses != null && flowClasses.size() > 0) {
            return flowClasses;
        }
        return new ArrayList<>();
    }
    @Override
    public boolean deleteFlowClassByFlowId(Integer flowId) {
        try {
            Session session = getCurrentSession();
@ -48,14 +43,13 @@ public class FlowClassDao extends SQLGeneralDAO implements IFlowClassDao {
            query.setInteger("flowId", flowId);
            query.executeUpdate();
            return true;
        }catch (Exception e){
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    @Override
    public List<Integer> getFlowClassIds(Integer flowId) {
        Session session = getCurrentSession();
        String sql = "SELECT id from system_service_flow_class where flow_id = :flowId";

+ 3 - 6
src/main/java/com/yihu/hos/system/dao/FlowDao.java

@ -1,6 +1,5 @@
package com.yihu.hos.system.dao;
import com.yihu.hos.system.dao.intf.IFlowDao;
import com.yihu.hos.system.model.SystemServiceFlow;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import com.yihu.hos.web.framework.model.Result;
@ -16,8 +15,7 @@ import java.util.Map;
 * Created at 2016/8/19.
 */
@Repository("flowDao")
public class FlowDao  extends SQLGeneralDAO implements IFlowDao {
    @Override
public class FlowDao extends SQLGeneralDAO {
    public Result getFlowList(Map<String, Object> params) throws Exception {
        StringBuilder sb = new StringBuilder("from SystemServiceFlow t where 1=1 ");
        if (!StringUtils.isEmpty(params.get("valid"))) //是否有效
@ -32,10 +30,9 @@ public class FlowDao  extends SQLGeneralDAO implements IFlowDao {
        return super.getDataGridResult(sb.toString(), Integer.valueOf(params.get("page").toString()), Integer.valueOf(params.get("rows").toString()));
    }
    @Override
    public List<SystemServiceFlow> getFlowList(String type) throws Exception {
        String sql = "select * from system_service_flow where valid = 1 and file_type= '"+type+"' order by create_date";
        List<SystemServiceFlow> list = super.queryListBySql(sql,SystemServiceFlow.class);
        String sql = "select * from system_service_flow where valid = 1 and file_type= '" + type + "' order by create_date";
        List<SystemServiceFlow> list = super.queryListBySql(sql, SystemServiceFlow.class);
        return list;
    }

+ 1 - 5
src/main/java/com/yihu/hos/system/dao/FlowTempDao.java

@ -1,6 +1,5 @@
package com.yihu.hos.system.dao;
import com.yihu.hos.system.dao.intf.IFlowTempDao;
import com.yihu.hos.system.model.SystemServiceFlowTemp;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import org.hibernate.Query;
@ -16,11 +15,10 @@ import java.util.List;
 * Created at 2016/8/19.
 */
@Repository("flowTempDao")
public class FlowTempDao extends SQLGeneralDAO implements IFlowTempDao {
public class FlowTempDao extends SQLGeneralDAO {
    public static final String BEAN_ID = "flowTempDao";
    @Override
    public List<SystemServiceFlowTemp> getFlowTempByFlowId(Integer flowId) throws Exception {
        List<SystemServiceFlowTemp> flowTemps = (List<SystemServiceFlowTemp>) super.hibernateTemplate.find("from SystemServiceFlowTemp s where s.flowId=? ", flowId);
        if (flowTemps != null && flowTemps.size() > 0) {
@ -29,7 +27,6 @@ public class FlowTempDao extends SQLGeneralDAO implements IFlowTempDao {
        return new ArrayList<>();
    }
    @Override
    public List<SystemServiceFlowTemp> getFlowTemps(Integer flowId, String type) throws Exception {
        List<SystemServiceFlowTemp> flowTemps = (List<SystemServiceFlowTemp>) super.hibernateTemplate.find("from SystemServiceFlowTemp s where s.flowId=? and type=? ", flowId,type);
        if (flowTemps != null && flowTemps.size() > 0) {
@ -38,7 +35,6 @@ public class FlowTempDao extends SQLGeneralDAO implements IFlowTempDao {
        return new ArrayList<>();
    }
    @Override
    public boolean deleteFlowTempByFlowId(Integer flowId) {
        try {
            Session session = getCurrentSession();

+ 0 - 18
src/main/java/com/yihu/hos/system/dao/intf/IFlowClassDao.java

@ -1,18 +0,0 @@
package com.yihu.hos.system.dao.intf;
import com.yihu.hos.system.model.SystemServiceFlowClass;
import com.yihu.hos.web.framework.dao.XSQLGeneralDAO;
import java.util.List;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/8/19.
 */
public interface IFlowClassDao extends XSQLGeneralDAO {
    List<SystemServiceFlowClass> getFlowClassByFlowId(Integer flowId) throws Exception;
    List<SystemServiceFlowClass> getFlowClass(Integer flowId,String type) throws Exception;
    boolean deleteFlowClassByFlowId(Integer flowId);
    List<Integer> getFlowClassIds(Integer flowId);
}

+ 0 - 20
src/main/java/com/yihu/hos/system/dao/intf/IFlowDao.java

@ -1,20 +0,0 @@
package com.yihu.hos.system.dao.intf;
import com.yihu.hos.system.model.SystemServiceFlow;
import com.yihu.hos.web.framework.dao.XSQLGeneralDAO;
import com.yihu.hos.web.framework.model.Result;
import java.util.List;
import java.util.Map;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/8/19.
 */
public interface IFlowDao extends XSQLGeneralDAO {
    Result getFlowList(Map<String, Object> params) throws Exception;
    List<SystemServiceFlow> getFlowList(String type) throws Exception;
}

+ 0 - 19
src/main/java/com/yihu/hos/system/dao/intf/IFlowTempDao.java

@ -1,19 +0,0 @@
package com.yihu.hos.system.dao.intf;
import com.yihu.hos.system.model.SystemServiceFlowTemp;
import com.yihu.hos.web.framework.dao.XSQLGeneralDAO;
import java.util.List;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/8/19.
 */
public interface IFlowTempDao extends XSQLGeneralDAO {
    List<SystemServiceFlowTemp> getFlowTempByFlowId(Integer flowId) throws Exception;
    List<SystemServiceFlowTemp> getFlowTemps(Integer flowId,String type) throws Exception;
    boolean deleteFlowTempByFlowId(Integer flowId);
}

+ 115 - 0
src/main/java/com/yihu/hos/system/model/bo/ServiceFlow.java

@ -0,0 +1,115 @@
package com.yihu.hos.system.model.bo;
import java.util.ArrayList;
import java.util.Date;
/**
 * @author Airhead
 * @since 2016/8/4.
 */
public class ServiceFlow {
    private String routeCode;
    private ArrayList<HandleFile> handleFiles;
    private Date updated;
    private String flowType;    //pull or push?
    private String cron;    //采集任务时使用
    public String getCron() {
        return cron;
    }
    public void setCron(String cron) {
        this.cron = cron;
    }
    public String getRouteCode() {
        return routeCode;
    }
    public void setRouteCode(String routeCode) {
        this.routeCode = routeCode;
    }
    public Date getUpdated() {
        return updated;
    }
    public void setUpdated(Date updated) {
        this.updated = updated;
    }
    public ArrayList<HandleFile> getHandleFiles() {
        return handleFiles;
    }
    public void setHandleFiles(ArrayList<HandleFile> handleFiles) {
        this.handleFiles = handleFiles;
    }
    public void addHandleFile(HandleFile handleFile) {
        if (handleFiles == null) {
            handleFiles = new ArrayList<>();
        }
        handleFiles.add(handleFile);
    }
    public String getFlowType() {
        return flowType;
    }
    public void setFlowType(String flowType) {
        this.flowType = flowType;
    }
    public class HandleFile {
        private String usage;   //router or processor
        private String packageName;
        private String className;
        private String filePath;
        private String fileType;    //java or class
        public HandleFile() {
        }
        public String getPackageName() {
            return packageName;
        }
        public void setPackageName(String packageName) {
            this.packageName = packageName;
        }
        public String getClassName() {
            return className;
        }
        public void setClassName(String className) {
            this.className = className;
        }
        public String getFilePath() {
            return filePath;
        }
        public void setFilePath(String filePath) {
            this.filePath = filePath;
        }
        public String getFileType() {
            return fileType;
        }
        public void setFileType(String fileType) {
            this.fileType = fileType;
        }
        public String getUsage() {
            return usage;
        }
        public void setUsage(String usage) {
            this.usage = usage;
        }
    }
}

+ 167 - 36
src/main/java/com/yihu/hos/system/service/FlowManager.java

@ -4,15 +4,15 @@ import com.yihu.hos.common.constants.Constants;
import com.yihu.hos.config.MongoConfig;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.core.encrypt.DES;
import com.yihu.hos.core.file.FileUtil;
import com.yihu.hos.services.ServiceFlowEventService;
import com.yihu.hos.system.dao.FlowClassDao;
import com.yihu.hos.system.dao.FlowDao;
import com.yihu.hos.system.dao.FlowTempDao;
import com.yihu.hos.system.dao.intf.IFlowClassDao;
import com.yihu.hos.system.dao.intf.IFlowDao;
import com.yihu.hos.system.dao.intf.IFlowTempDao;
import com.yihu.hos.system.model.SystemServiceFlow;
import com.yihu.hos.system.model.SystemServiceFlowClass;
import com.yihu.hos.system.model.SystemServiceFlowTemp;
import com.yihu.hos.system.model.bo.ServiceFlow;
import com.yihu.hos.system.service.intf.IFlowManage;
import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.model.DictItem;
@ -41,17 +41,16 @@ import java.util.Map;
public class FlowManager implements IFlowManage {
    public static final String BEAN_ID = "flowManager";
    @Autowired
    ServiceFlowEventService serviceFlowEventService;
    @Resource(name = "flowDao")
    private IFlowDao flowDao;
    private FlowDao flowDao;
    @Resource(name = FlowClassDao.BEAN_ID)
    private IFlowClassDao flowClassDao;
    private FlowClassDao flowClassDao;
    @Resource(name = FlowTempDao.BEAN_ID)
    private IFlowTempDao flowTempDao;
    @Autowired
    ServiceFlowEventService serviceFlowEventService;
    private FlowTempDao flowTempDao;
    @Autowired
    private MongoConfig mongoConfig;
    @Override
@ -59,6 +58,61 @@ public class FlowManager implements IFlowManage {
        return flowDao.getFlowList(params);
    }
    /**
     * @return List<ServiceFlow> 返回所有可运行流程
     * @throws Exception ...
     */
    public List<ServiceFlow> getServiceFlowList() throws Exception {
        List<ServiceFlow> serviceFlowList = new ArrayList<>();
        List<SystemServiceFlow> classFlowList = flowDao.getFlowList(Constants.CLASS);
        for (SystemServiceFlow systemServiceFlow : classFlowList) {
            ServiceFlow serviceFlow = new ServiceFlow();
            serviceFlow.setRouteCode(systemServiceFlow.getCode());
            serviceFlow.setFlowType(systemServiceFlow.getFileType());
            List<SystemServiceFlowClass> classList = flowClassDao.getFlowClassByFlowId(systemServiceFlow.getId());
            ArrayList<ServiceFlow.HandleFile> handleFileList = new ArrayList<>();
            for (SystemServiceFlowClass flowClass : classList) {
                ServiceFlow.HandleFile handleFile = serviceFlow.new HandleFile();
                handleFile.setFileType(Constants.CLASS);
                handleFile.setClassName(flowClass.getClassName());
                handleFile.setPackageName(flowClass.getPackageName());
                handleFile.setFilePath(flowClass.getClassPath());
                handleFile.setUsage(flowClass.getType());
                handleFileList.add(handleFile);
            }
            serviceFlow.setHandleFiles(handleFileList);
            serviceFlowList.add(serviceFlow);
        }
        List<SystemServiceFlow> javaFlowList = flowDao.getFlowList(Constants.JAVA);
        for (SystemServiceFlow systemServiceFlow : javaFlowList) {
            ServiceFlow serviceFlow = new ServiceFlow();
            serviceFlow.setRouteCode(systemServiceFlow.getCode());
            List<SystemServiceFlowTemp> tempList = flowTempDao.getFlowTempByFlowId(systemServiceFlow.getId());
            ArrayList<ServiceFlow.HandleFile> handleFileList = new ArrayList<>();
            for (SystemServiceFlowTemp flowTemp : tempList) {
                ServiceFlow.HandleFile handleFile = serviceFlow.new HandleFile();
                handleFile.setFileType(Constants.JAVA);
                handleFile.setClassName(flowTemp.getClassName());
                handleFile.setPackageName(flowTemp.getPackageName());
                handleFile.setFilePath(flowTemp.getClassPath());
                handleFile.setUsage(flowTemp.getType());
                handleFileList.add(handleFile);
            }
            serviceFlow.setHandleFiles(handleFileList);
            serviceFlowList.add(serviceFlow);
        }
        return serviceFlowList;
    }
    @Override
    public SystemServiceFlow getFlowById(Integer id) throws Exception {
        return flowDao.getEntity(SystemServiceFlow.class, id);
@ -69,17 +123,17 @@ public class FlowManager implements IFlowManage {
        obj.setCreateDate(new Date());
        flowDao.saveEntity(obj);
        if (Constants.CLASS.equals(obj.getFileType())){
        if (Constants.CLASS.equals(obj.getFileType())) {
            List<SystemServiceFlowClass> flowClassList = obj.getFlowClassArray();
            for (SystemServiceFlowClass flowClass:flowClassList){
            for (SystemServiceFlowClass flowClass : flowClassList) {
                flowClass.setFlowId(obj.getId());
                flowDao.saveEntity(flowClass);
                //发送消息到MQ对列
                sendUpdateMessage(obj.getCode(), flowClass, Constants.FLOW_OP_ADD);
            }
        }else if (Constants.JAVA.equals(obj.getFileType())){
        } else if (Constants.JAVA.equals(obj.getFileType())) {
            List<SystemServiceFlowTemp> flowTempList = obj.getFlowTempArray();
            for (SystemServiceFlowTemp flowTemp:flowTempList){
            for (SystemServiceFlowTemp flowTemp : flowTempList) {
                flowTemp.setFlowId(obj.getId());
                flowDao.saveEntity(flowTemp);
            }
@ -99,21 +153,21 @@ public class FlowManager implements IFlowManage {
        flow.setFileType(obj.getFileType());
        if (Constants.JAVA.equals(flow.getFileType())){
        if (Constants.JAVA.equals(flow.getFileType())) {
            List<SystemServiceFlowTemp> flowTempList = obj.getFlowTempArray();
            boolean succ = flowTempDao.deleteFlowTempByFlowId(obj.getId());
            if (succ){
                for (SystemServiceFlowTemp flowTemp:flowTempList){
            if (succ) {
                for (SystemServiceFlowTemp flowTemp : flowTempList) {
                    flowTempDao.saveEntity(flowTemp);
                }
            }
        }else if (Constants.CLASS.equals(flow.getFileType())){
        } else if (Constants.CLASS.equals(flow.getFileType())) {
            List<Integer> classIds = flowClassDao.getFlowClassIds(obj.getId());//原flowclass集合
            List<SystemServiceFlowClass> flowClassList = obj.getFlowClassArray();
            SystemServiceFlowClass flowClassRoute = null;
            String oper = "";
            for (SystemServiceFlowClass flowClass:flowClassList){
                if (flowClass.getId()!=null) {
            for (SystemServiceFlowClass flowClass : flowClassList) {
                if (flowClass.getId() != null) {
                    classIds.remove(flowClass.getId());
                    flowClassDao.updateEntity(flowClass);
                    if (!flowClass.getType().equals(Constants.FLOW_TYPE_ROUTE)) {
@ -122,7 +176,7 @@ public class FlowManager implements IFlowManage {
                        flowClassRoute = flowClass;
                        oper = Constants.FLOW_OP_UPDATE;
                    }
                }else {
                } else {
                    if (!flowClass.getType().equals(Constants.FLOW_TYPE_ROUTE)) {
                        flowClassDao.saveEntity(flowClass);
                        sendUpdateMessage(flow.getCode(), flowClass, Constants.FLOW_OP_ADD);
@ -133,8 +187,8 @@ public class FlowManager implements IFlowManage {
                }
            }
            //删除判断
            if (classIds !=null && classIds.size()>0){
                for (Integer id:classIds){
            if (classIds != null && classIds.size() > 0) {
                for (Integer id : classIds) {
                    SystemServiceFlowClass flowClass = getFlowClassById(id);
                    flowClassDao.deleteEntity(flowClass);
                    if (!flowClass.getType().equals(Constants.FLOW_TYPE_ROUTE)) {
@ -154,7 +208,6 @@ public class FlowManager implements IFlowManage {
        flowDao.updateEntity(flow);
        return Result.success("更新成功");
    }
@ -216,7 +269,7 @@ public class FlowManager implements IFlowManage {
    @Transactional
    public boolean deleteFlowClassByFlowId(Integer flowId) {
        boolean succ =flowClassDao.deleteFlowClassByFlowId(flowId);
        boolean succ = flowClassDao.deleteFlowClassByFlowId(flowId);
        return succ;
    }
@ -297,13 +350,12 @@ public class FlowManager implements IFlowManage {
     * @throws Exception
     */
    @Override
    public  ActionResult getFlowList(String type) throws Exception {
    public ActionResult getFlowList(String type) throws Exception {
        List<SystemServiceFlow> flowList = flowDao.getFlowList(type);
        ActionResult re = new ActionResult();
        if(flowList!=null&&flowList.size()>0)
        {
        if (flowList != null && flowList.size() > 0) {
            List<DictItem> dictList = new ArrayList<>();
            for(SystemServiceFlow item:flowList){
            for (SystemServiceFlow item : flowList) {
                DictItem dict = new DictItem();
                dict.setCode(item.getId().toString());
                dict.setValue(item.getName());
@ -400,9 +452,15 @@ public class FlowManager implements IFlowManage {
            newFlowClass.setType(Constants.FLOW_TYPE_ROUTE);
            flowClassDao.saveEntity(newFlowClass);
            newFlowClass.setIsUpdate("1");
            serviceFlowEventService.routeClassAdded(newFlow.getCode(), basePath.toString(),  flowTemp.getClassName(), deName,newCron);
            return newFlow.getId();
            //生成新的route文件
            String  newFileName = genRouteJavaFile(newFlow.getCode(),flowTemp.getClassName(),deName,newCron);
            if (newFileName!=null){
                serviceFlowEventService.routeClassAdded(newFlow.getCode(), basePath.toString(),  flowTemp.getClassName(), deName,newCron);
                return newFlow.getId();
            }else {
                System.out.println("生成route的java文件过程出错");
                return null;
            }
        }
        return null;
@ -448,15 +506,88 @@ public class FlowManager implements IFlowManage {
                processClass.setFlowId(newFlow.getId());
                processClass.setType(Constants.FLOW_TYPE_PROCESSOR);
                processClass.setIsUpdate("1");
                //发送消息
                serviceFlowEventService.processorClassAdded(newFlow.getCode(),proPath.toString(), processClass.getClassName(), deName);
                //生成新的java文件
                String newFileName = genProcessorJavaFile(newFlow.getCode(),deName,processClass.getClassName());
                if (newFileName!=null){
                    //发送消息
                    serviceFlowEventService.processorClassAdded(newFlow.getCode(),proPath.toString(), processClass.getClassName(), deName);
                    flowClassDao.saveEntity(processClass);
                }else {
                    System.out.println("生成processor的java文件过程出错");
                    return null;
                }
            }
            return newFlow.getId();
        }
        return null;
    }
                flowClassDao.saveEntity(processClass);
    /**
     * 生成Route流程的java文件
     * @param routeId       流程Id
     * @param className     模板类名
     * @param tempFilePath      模板文件路径
     * @param newCron       cron表达式
     * @return
     */
    public static String genRouteJavaFile(String routeId,String className,String tempFilePath,String newCron) {
        try {
            String newFileName = className+routeId+".java";
            String newFilePath = "/temp/"+newFileName;
            String text = GridFSUtil.readFile("upload",tempFilePath);
            if (text.contains("?cron=")) {
                String oldStr = text.substring(text.indexOf("?cron=") + 6);
                String cron = oldStr.substring(0, oldStr.indexOf("\""));
                text = text.replace(cron,newCron);
            }
            return newFlow.getId();
            //修改java类名
            if (text.contains(className)) {
                text = text.replace(className, className+routeId);//新类名规则=旧类名+routeId
            }
            //修改routeId;模板规则 routeId("routeId")
            text = text.replace("routeId(\"routeId\")", "routeId(\"" + routeId + "\")");
            boolean succ = FileUtil.writeFile(newFilePath,text,"UTF-8");
            //TODO 上传到GridFS
            if (succ){
                newFileName = GridFSUtil.uploadFile("upload", newFilePath, newFileName);
            }else {
                return null;
            }
            return newFileName;
        } catch (Exception e) {
            System.out.println("修改Route的java文件操作出错");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 生成processor的java文件
     * @param routeId       流程Code
     * @param tempFilePath      模板文件名
     * @param className     模板类名
     * @return
     */
    public static String genProcessorJavaFile(String routeId ,String tempFilePath, String className) {
        try {
            String newFileName = className+routeId+".java";
            String newFilePath = "/temp/"+className;
            String text = GridFSUtil.readFile("upload",tempFilePath);
            boolean succ = FileUtil.writeFile(newFilePath,text,"UTF-8");
            //TODO 上传到GridFS
            if (succ){
                newFileName = GridFSUtil.uploadFile("upload", newFilePath, newFileName);
                return newFileName;
            }
        } catch (Exception e) {
            System.out.println("生成processor的java文件操作出错");
            e.printStackTrace();
        }
        return null;
    }

+ 1 - 2
src/main/java/com/yihu/hos/system/service/intf/IAppManager.java

@ -1,6 +1,5 @@
package com.yihu.hos.system.service.intf;
import com.yihu.hos.services.IBaseManager;
import com.yihu.hos.system.model.SystemApp;
import com.yihu.hos.system.model.SystemServiceEndpoint;
import com.yihu.hos.web.framework.model.Result;
@ -14,7 +13,7 @@ import java.util.Map;
/**
 * Created by chenweida on 2016/1/21.
 */
public interface IAppManager extends IBaseManager{
public interface IAppManager {
    Result getAppList(Map<String, Object> params) throws Exception;
    SystemApp getAppById(String id) throws Exception;

+ 13 - 8
src/main/java/com/yihu/hos/system/service/intf/IFlowManage.java

@ -1,10 +1,10 @@
package com.yihu.hos.system.service.intf;
import com.yihu.hos.services.IBaseManager;
import com.yihu.hos.system.model.SystemServiceFlow;
import com.yihu.hos.system.model.SystemServiceFlowClass;
import com.yihu.hos.system.model.SystemServiceFlowTemp;
import com.yihu.hos.web.framework.model.Result;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.File;
@ -17,8 +17,9 @@ import java.util.Map;
 * @vsrsion 1.0
 * Created at 2016/8/19.
 */
public interface IFlowManage extends IBaseManager {
public interface IFlowManage {
    Result getFlowList(Map<String, Object> params) throws Exception;
    Result getFlowList(String type) throws Exception;
    SystemServiceFlow getFlowById(Integer id) throws Exception;
@ -40,7 +41,7 @@ public interface IFlowManage extends IBaseManager {
    Result updateFlowClass(SystemServiceFlowClass obj) throws Exception;
    boolean deleteFlowClassByFlowId(Integer flowId) ;
    boolean deleteFlowClassByFlowId(Integer flowId);
    /* ==========================flowTemp================================*/
@ -49,6 +50,7 @@ public interface IFlowManage extends IBaseManager {
    /**
     * 根据流程模板Id生成新流程
     *
     * @param flowTempId
     * @return
     */
@ -56,22 +58,25 @@ public interface IFlowManage extends IBaseManager {
    /**
     * 根据流程模板Id生成新流程
     *
     * @param flowTempId 流程模板ID
     * @param newCron 新cron表达式
     * @param newCron    新cron表达式
     * @return
     * @throws Exception
     */
    Integer genCamelFile(Integer flowTempId, String newCron) throws Exception;
    /**
     *  修改流程文件
     * 修改流程文件
     *
     * @param flowTempId 流程模板ID
     * @param flowId 流程ID
     * @param newCron  新cron
     * @param flowId     流程ID
     * @param newCron    新cron
     * @return
     * @throws Exception
     */
    Integer updateCamelFile(Integer flowTempId,Integer flowId, String newCron) throws Exception;
    Integer updateCamelFile(Integer flowTempId, Integer flowId, String newCron) throws Exception;
    Result uploadFile(CommonsMultipartFile file) throws Exception;
    Result readFile(OutputStream os, String fileName) throws Exception;
}

+ 24 - 0
src/main/java/com/yihu/hos/tenant/dao/TenantDao.java

@ -0,0 +1,24 @@
package com.yihu.hos.tenant.dao;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Repository("tenantDao")
public class TenantDao extends SQLGeneralDAO {
    public static final String BEAN_ID = "tenantDao";
    public List<TenantModel> getTenantList(String name) throws Exception {
        List<TenantModel> list = (List<TenantModel>) super.hibernateTemplate.find("from TenantModel s where s.name=? and s.valid = 1", name);
        return list;
    }
}

+ 2 - 1
hos-saas/src/main/java/com/yihu/hos/saas/models/common/IdModel.java

@ -3,7 +3,7 @@
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/
package com.yihu.hos.saas.models.common;
package com.yihu.hos.tenant.model;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@ -12,6 +12,7 @@ import javax.persistence.MappedSuperclass;
import java.io.Serializable;
/**
 *  //TODO 之后需要移动到公共目录
 * 统一定义id的entity基类.
 * 
 * 基类统一定义id的属性名称、数据类型、列名映射及生成策略.

+ 109 - 0
src/main/java/com/yihu/hos/tenant/model/TenantModel.java

@ -0,0 +1,109 @@
package com.yihu.hos.tenant.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.util.Date;
/**
 *  租户表
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Entity
@Table(name = "tenant")
public class TenantModel extends IdModel{
    private String code;
    private String name;
    private String password;
    private String schema;
    private Date created;
    private Integer createdUnix;
    private Date updated;
    private Integer updatedUnix;
    private Integer valid;
    @Column(name="code")
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    @Column(name="name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Column(name="password")
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Column(name="schema")
    public String getSchema() {
        return schema;
    }
    public void setSchema(String schema) {
        this.schema = schema;
    }
    @Column(name="created")
    public Date getCreated() {
        return created;
    }
    public void setCreated(Date created) {
        this.created = created;
    }
    @Column(name="created_unix")
    public Integer getCreatedUnix() {
        return createdUnix;
    }
    public void setCreatedUnix(Integer createdUnix) {
        this.createdUnix = createdUnix;
    }
    @Column(name="updated")
    public Date getUpdated() {
        return updated;
    }
    public void setUpdated(Date updated) {
        this.updated = updated;
    }
    @Column(name="updated_unix")
    public Integer getUpdatedUnix() {
        return updatedUnix;
    }
    public void setUpdatedUnix(Integer updatedUnix) {
        this.updatedUnix = updatedUnix;
    }
    @Column(name="valid")
    public Integer getValid() {
        return valid;
    }
    public void setValid(Integer valid) {
        this.valid = valid;
    }
}

+ 51 - 0
src/main/java/com/yihu/hos/tenant/model/TenantSession.java

@ -0,0 +1,51 @@
package com.yihu.hos.tenant.model;
import java.util.UUID;
/**
 * @created Airhead 2016/11/16.
 */
public class TenantSession {
    private String userCode;
    private String token;
    private String schema;
    public TenantSession() {
    }
    public TenantSession(String userCode, String schema) {
        this.userCode = userCode;
        this.schema = schema;
        token = UUID.randomUUID().toString();
    }
    public TenantSession(String userCode, String schema,String token) {
        this.userCode = userCode;
        this.schema = schema;
        this.token = token;
    }
    public String getSchema() {
        return schema;
    }
    public void setSchema(String schema) {
        this.schema = schema;
    }
    public String getUserCode() {
        return userCode;
    }
    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }
}

+ 78 - 0
src/main/java/com/yihu/hos/tenant/service/AuthenticateService.java

@ -0,0 +1,78 @@
package com.yihu.hos.tenant.service;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.interceptor.LocalContext;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.system.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
 * @created Airhead 2016/11/16.
 */
@Service
public class AuthenticateService {
    @Autowired
    private UserDao userDao;
    @Resource(name = TenatService.BEAN_ID)
    private TenatService tenatService;
    public boolean isAuth(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpSession session = request.getSession();
        TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
        if (tenantSession == null) {
            return false;
        }
        LocalContext.getContext().setAttachment(ContextAttributes.SCHEMA, tenantSession.getSchema());
        return true;
    }
    /**
     *  //TODO 需要进一步完善逻辑
     *  租户登录授权
     * @param httpSession
     * @param tenantName
     * @return
     * @throws Exception
     */
    public boolean auth(HttpSession httpSession, String tenantName) throws Exception {
        //授权租户,切换到指定数据库,需要先清除原先的数据库指定,切回global_db表,获取租户信息
        LocalContext.getContext().removeAttachment(ContextAttributes.SCHEMA);
        TenantModel tenantModel = tenatService.findTenantByName(tenantName);
        //TODO:现在只是简单逻辑,需要修改成安全逻辑
        if (tenantModel == null ) {
            return false;
        }
        //切换Schema
        LocalContext.getContext().setAttachment(ContextAttributes.SCHEMA, tenantModel.getSchema());
//        UserModel userModel = userDao.findOne(user);
//        //TODO:现在只是简单逻辑,需要修改成安全逻辑
//        if (userModel == null || !password.equals(userModel.getPassword())) {
//            return "User Auth Failed";
//        }
        httpSession.setAttribute(ContextAttributes.TENANT_SESSION, new TenantSession(tenantModel.getName(), tenantModel.getSchema()));
        return true;
    }
    /**
     * 登出 - 移除租户授权信息
     * @param httpSession
     * @return
     * @throws Exception
     */
    public String logout(HttpSession httpSession) throws Exception {
        //移除Schema
        LocalContext.getContext().removeAttachment(ContextAttributes.SCHEMA);
        httpSession.removeAttribute(ContextAttributes.TENANT_SESSION);
        return "Tenan Logout Success";
    }
}

+ 31 - 0
src/main/java/com/yihu/hos/tenant/service/TenatService.java

@ -0,0 +1,31 @@
package com.yihu.hos.tenant.service;
import com.yihu.hos.tenant.dao.TenantDao;
import com.yihu.hos.tenant.model.TenantModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/12/2.
 */
@Service("TenatService")
public class TenatService {
    public static final String BEAN_ID = "TenatService";
    @Autowired
    private TenantDao tenantDao;
    public TenantModel findTenantByName(String name) throws Exception {
        List<TenantModel> list = tenantDao.getTenantList(name);
        if (list!=null && !list.isEmpty()){
            return list.get(0);
        }
        return null;
    }
}

+ 6 - 0
src/main/resources/application.yml

@ -20,6 +20,8 @@ spring:
---
spring:
  profiles: dev
  #SAAS管理员账号,暂时配置在此处
  administrators: jkzl
#  datasource:
#      driverClassName: com.mysql.jdbc.Driver
#      url: jdbc:mysql://192.168.1.220:3306/esb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
@ -53,6 +55,8 @@ spring:
---
spring:
  profiles: test
  #SAAS管理员账号,暂时配置在此处
  administrators: jkzl
  data:
    mongodb:
      host: 172.19.103.86
@ -76,6 +80,8 @@ spring:
---
spring:
  #SAAS管理员账号,暂时配置在此处
  administrators: jkzl
  profiles: lfq
  data:
    mongodb:

+ 5 - 5
src/main/resources/spring/applicationContext.xml

@ -37,9 +37,9 @@
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://192.168.1.220:3306/esb?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="hos2"/>
        <property name="password" value="hos2"/>
        <property name="url" value="jdbc:mysql://192.168.1.220:8066/global_db?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="hos"/>
        <property name="password" value="123456"/>
        <property name="initialSize" value="1"/>
        <property name="maxTotal" value="100"/>
        <property name="maxIdle" value="50"/>
@ -61,13 +61,13 @@
        <property name="packagesToScan">
            <list>
                <!-- 可以加多个包 -->
                <value>com.yihu.hos.standard.model</value>
                <value>com.yihu.hos.*.model</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
                hibernate.show_sql=false
                hibernate.show_sql=true
                hibernate.format_sql=true
            </value>
        </property>

+ 38 - 1
src/main/webapp/WEB-INF/ehr/jsp/common/indexJs.jsp

@ -149,7 +149,8 @@
                            cache: false,
                            success: function (data) {
                                if (data.successFlg) {
                                    location.href = "${contextRoot}/loginPage";
                                    debugger
                                    location.href = "${contextRoot}/"+data.data+"/loginPage";
                                }
                                else {
                                    $.ligerDialog.error(data.message);
@ -384,6 +385,42 @@
    $(function () {
        if (window.history && window.history.pushState) {
            $(window).on('popstate', function () {
                var hashLocation = location.hash;
                var hashSplit = hashLocation.split("#!/");
                var hashName = hashSplit[1];
                if (hashName !== '') {
                    var hash = window.location.hash;
                    if (hash === '') {
                        $.ligerDialog.confirm('是否确认后退登出系统!', function (yes) {
                            if (yes) {
                                $.ajax({ //获取表的字段列表
                                    type: "POST",
                                    url: "${contextRoot}/system/logoutAction",
                                    dataType: "json",
                                    cache: false,
                                    success: function (data) {
                                        if (data.successFlg) {
                                            debugger
                                            location.href = "${contextRoot}/"+data.data+"/loginPage";
                                        }
                                        else {
                                            $.ligerDialog.error(data.message);
                                        }
                                    },
                                    error: function (data) {
                                        $.ligerDialog.error("Status:" + data.status + "(" + data.statusText + ")");
                                    }
                                });
                            }
                        });
                    }
                }
            });
            window.history.pushState('forward', null, './indexPage');
        }
        isLogin();
        indexPage.init();
    });

+ 12 - 1
src/test/java/com/yihu/hos/HosAdminApplicationTests.java

@ -1,17 +1,28 @@
package com.yihu.hos;
import com.yihu.hos.core.file.FileUtil;
import com.yihu.hos.web.framework.util.GridFSUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.io.IOException;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ESBApplication.class)
@WebAppConfiguration
public class HosAdminApplicationTests {
	@Test
	public void contextLoads() {
	public void contextLoads() throws IOException {
		String newName = "text"+System.currentTimeMillis()+".java";
		String newFilePath = "/upload/"+newName;
		String  content = GridFSUtil.readFile("upload", "955569af-43fb-422f-bded-d88f99cad1f9QuartzRoute.java");
		boolean succ = FileUtil.writeFile(newFilePath, content, "UTF-8");
		newName = GridFSUtil.uploadFile("upload", newFilePath, newName);
		System.out.println(content);
	}
}