package org.infosec.ismp.manager.agent.sitecheck;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.infosec.ismp.manager.ComponentLocator;
import org.infosec.ismp.manager.domains.DomainComponent;
import org.infosec.ismp.manager.domains.DomainLocator;
import org.infosec.ismp.manager.model.SiteCheckNodeEntity;
import org.infosec.ismp.manager.model.SiteCheckResultEntity;
import org.infosec.ismp.util.ThreadCategory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
/**
* 页面检测Locator
* @author jiel
*
*/
@Component
public class SiteCheckLocator implements ComponentLocator {
/**
* nodeid<->domain
*/
private Map<String, DomainComponent> nodeidMaps = new HashMap<String, DomainComponent>();
private DomainLocator m_domainLocator;
private SiteCheckNodeEntityService m_siteCheckService;
private boolean isReset = false;
@Autowired(required=true)
public void setSiteCheckService(SiteCheckNodeEntityService siteCheckService) {
m_siteCheckService = siteCheckService;
}
@Autowired(required = true)
public void setDomainLocator(DomainLocator domainLocator) {
m_domainLocator = domainLocator;
}
@PostConstruct
public void init() {
System.out.println("SiteCheck Locator 开始初始化");
Assert.state(m_siteCheckService != null, "m_siteCheckService不能为空,请检查");
Assert.state(m_domainLocator != null, "m_domainLocator不能为空,请检查");
distruteAllSiteCheckNode();
}
/**
* 初始化SiteCheckNode任务
*/
public void distruteAllSiteCheckNode() {
List<SiteCheckNodeEntity> entities = getAllSiteCheckNode();
for (SiteCheckNodeEntity entity : entities) {
String domain = entity.getDomain();
addSiteCheckNodeToDomain(domain, entity.getNodeid(), entity.getUrl(),
entity.getInterval());
}
}
/**
* 新增siteCheck服务
* @param domain
* @param nodeid
* @param url
* @param interval
*/
public void addSiteCheckNode(String domain, String nodeid,
String url, long interval){
addSiteCheckNodeToDb(domain,nodeid,url,interval*1000);
addSiteCheckNodeToDomain(domain,nodeid,url,interval*1000);
}
/**
* 删除sitecheck服务
* @param nodeid
*/
public void removeSiteCheckNode(String nodeid){
removeSiteCheckNodeFromDb(nodeid);
removeSiteCheckNodeFromDomain(nodeid);
nodeidMaps.remove(nodeid);
}
/**
* 重置sitecheck服务
* @param nodeid
*/
public void resetSiteCheckNode(String nodeid){
resetSiteCheckNodeFromDomain(nodeid);
DomainComponent domainComp = nodeidMaps.get(nodeid);
if (domainComp != null) {// 立刻改变检测的返回结果为正常
SiteCheckResultEntity entity= domainComp.getSiteCheckResult(nodeid);
if("Up".equalsIgnoreCase(entity.getPingStatus())){
entity.setSiteCheckStatus("NORMAL");
}
}
isReset = true;
}
/**
* 获取DB中所有sitecheckNode任务Entity
* @return
*/
public List<SiteCheckNodeEntity> getAllSiteCheckNode() {
return m_siteCheckService.getAll();
}
/**
* 将siteCheck任务添加到domainComponent
* @param domain
* @param nodeid
* @param ipaddr
* @param interval
* @param halfFlag
*/
private void addSiteCheckNodeToDomain(String domain, String nodeid,
String url, long interval) {
DomainComponent domainComp = m_domainLocator
.createDomainIfNessary(domain);
nodeidMaps.put(nodeid, domainComp);
SiteCheckNode node = createSiteCheckNode(nodeid, url, interval);
domainComp.addSiteCheckNode(node);
}
/**
* 将sitecheck任务添加到数据库中
* @param domain
* @param nodeid
* @param url
* @param interval
*/
private void addSiteCheckNodeToDb(String domain, String nodeid,
String url, long interval){
SiteCheckNodeEntity entity = new SiteCheckNodeEntity();
entity.setDomain(domain);
entity.setNodeid(nodeid);
entity.setUrl(url);
entity.setInterval(interval);
m_siteCheckService.save(entity);
}
/**
* 创建一个SiteCheckNode
* @param nodeid
* @param url
* @param interval
* @return
*/
private SiteCheckNode createSiteCheckNode(String nodeid,String url,long interval){
SiteCheckNode node = new SiteCheckNode();
node.setNodeid(nodeid);
node.setUrl(url);
node.setInterval(interval);
return node;
}
/**
* 从domainComponent中删除一个siteCheckNode任务
* @param nodeid
*/
private void removeSiteCheckNodeFromDomain(String nodeid){
DomainComponent domainComp =nodeidMaps.get(nodeid);
if (domainComp != null) {
domainComp.removeSiteCheckNode(nodeid);
domainComp.RemoveSiteCheckResult(nodeid);
} else {
if (log().isDebugEnabled()) {
log().debug("removeSiteCheckNode没有找到该nodeId:" + nodeid + "对应的域 ");
}
}
}
/**
* 从DB中删除一个siteCheckNode
* @param nodeid
*/
private void removeSiteCheckNodeFromDb(String nodeid){
m_siteCheckService.removeSiteCheckNodeByNodeId(nodeid);
}
/**
* 从domainComponent中重置一个siteCheckNode任务
* @param nodeid
*/
private void resetSiteCheckNodeFromDomain(String nodeid){
DomainComponent domainComp =nodeidMaps.get(nodeid);
if (domainComp != null) {
domainComp.resetSiteCheckNode(nodeid);
} else {
if (log().isDebugEnabled()) {
log().debug("resetSiteCheckNode没有找到该nodeId:" + nodeid + "对应的域 ");
}
}
}
ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
/**
* 根据nodeid获取相应的域ID
* @param nodeid
* @return
*/
public String getDomainByNodeid(String nodeid) {
DomainComponent domainComp =nodeidMaps.get(nodeid);
log().debug("nodeidMaps.size():"+nodeidMaps.size());
if (domainComp != null) {
return domainComp.getDomainId();
} else {
if (log().isDebugEnabled()) {
log().debug("SiteCheckLocator.getDomainByNodeid没有找到该nodeId:" + nodeid + "对应的域 ");
}
return null;
}
}
/**
* 用于设置某个nodeid的状态
* @param nodeid
* @param entity
*/
public void setSiteCheckResult(String nodeid, SiteCheckResultEntity entity) {
if(isReset){//如果做重置操作,则将返回的状态结果更改为:正常-NORMAL,直到后台程序重置后的真实结果返回时
if("Up".equalsIgnoreCase(entity.getPingStatus())){
entity.setSiteCheckStatus("NORMAL");
}
if(true==entity.isReset()){
isReset=false;
}
}
DomainComponent domainComp = nodeidMaps.get(nodeid);
if (domainComp != null) {
domainComp.putSiteCheckResult(nodeid,entity);
}
}
/**
* 获得某个nodeid的状态
* @param nodeid
* @return
*/
public SiteCheckResultEntity getSiteCheckResult(String nodeid){
DomainComponent domainComp = nodeidMaps.get(nodeid);
if (domainComp != null) {
return domainComp.getSiteCheckResult(nodeid);
}
return null;
}
}