package org.infosec.ismp.manager.syslog;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.infosec.ismp.manager.domains.DomainComponent;
import org.infosec.ismp.manager.domains.DomainLocator;
import org.infosec.ismp.manager.model.syslog.SyslogNodeEntity;
import org.infosec.ismp.manager.syslog.task.SyslogNode;
import org.infosec.ismp.util.ThreadCategory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
/**
* 管理所有的syslog节点,初始化时从数据库中加载
*
* @author lianglin
*
*/
@Component
public class SyslogLocator {
private SyslogNodeService m_syslogService;
private DomainLocator m_domainLocator;
private final static String UNKNOWN_SYSLOG_TYPE = "unknown_syslog_type";
/**
* nodeid<->domainComponent
*/
private Map<String, DomainComponent> m_syslogNodeMaps = new HashMap<String, DomainComponent>();
/**
* ip<->syslogType
*/
private Map<String, String> m_syslogTypes = new HashMap<String, String>();
/**
* 添加syslog node
*
* @param domain
* @param nodeId
* @param syslogType
* @param syslogAddress
*/
public void addSyslogNode(String domain, String nodeId, String syslogType,
String syslogAddress) {
boolean flag = findExistSyslogNode(nodeId);
if (flag) {
throw new RuntimeException("重复添加,该任务中nodeid:" + nodeId + "已经存在");
}
addSyslogToDb(domain, nodeId, syslogType, syslogAddress);
addSyslogToDomain(domain, nodeId, syslogAddress, syslogType);
}
private boolean findExistSyslogNode(String nodeId) {
return m_syslogService.findExistingNode(nodeId);
}
/**
* 删除syslog node
*
* @param nodeid
*/
public void removeSyslogNode(String nodeid) {
removeSyslogNodeFromDb(nodeid);
removeSyslogNodeFromDomain(nodeid);
}
private void removeSyslogNodeFromDb(String nodeid) {
m_syslogService.removeNodeByNodeId(nodeid);
}
public void removeSyslogNodeFromDomain(String nodeid) {
DomainComponent domainComp = m_syslogNodeMaps.get(nodeid);
if (domainComp != null) {
domainComp.removeSyslogSourceNode(nodeid);
} else {
if (log().isDebugEnabled()) {
log().debug("removeSyslogNode没有找到该nodeId:" + nodeid + "对应的域 ");
}
}
}
@Autowired(required = true)
public void setSyslogService(SyslogNodeService syslogService) {
m_syslogService = syslogService;
}
@Autowired(required = true)
public void setDomainLocator(DomainLocator domainLocator) {
m_domainLocator = domainLocator;
}
@PostConstruct
protected void onInit() {
log().info("SyslogLocator开始初始化");
Assert.state(m_syslogService != null, "m_syslogService不能为空,请检查");
Assert.state(m_domainLocator != null, "m_domainLocator不能为空,请检查");
distruteAllSyslogNode();
}
private void distruteAllSyslogNode() {
List<SyslogNodeEntity> entities = m_syslogService.getAll();
for (SyslogNodeEntity entity : entities) {
addSyslogToDomain(entity.getDomain(), entity.getNodeid(),
entity.getIpaddr(), entity.getSyslogType());
}
}
private void addSyslogToDomain(String domain, String nodeid, String ipaddr,
String syslogType) {
DomainComponent domainComp = m_domainLocator
.createDomainIfNessary(domain);
m_syslogNodeMaps.put(nodeid, domainComp);
SyslogNode node = createSyslogNode(nodeid, ipaddr, syslogType);
domainComp.addSyslogNode(node);
String oldType = m_syslogTypes.get(ipaddr);
if (oldType == null) {
m_syslogTypes.put(ipaddr, syslogType);
} else {
m_syslogTypes.put(ipaddr, UNKNOWN_SYSLOG_TYPE);
}
}
private SyslogNode createSyslogNode(String nodeid, String ipaddr,
String syslogType) {
SyslogNode node = new SyslogNode();
node.setNodeid(nodeid);
node.setIpaddr(ipaddr);
node.setSyslogType(syslogType);
// FIXME
return node;
}
/**
* save it to db
*
* @param domain
* @param nodeId
* @param syslogType
* @param syslogAddress
*/
@Transactional(readOnly = false)
public void addSyslogToDb(String domain, String nodeId, String syslogType,
String syslogAddress) {
SyslogNodeEntity entity = createSyslogEntity(domain, nodeId,
syslogType, syslogAddress);
m_syslogService.save(entity);
}
protected SyslogNodeEntity createSyslogEntity(String domain, String nodeId,
String syslogType, String syslogAddress) {
SyslogNodeEntity entity = new SyslogNodeEntity();
entity.setDomain(domain);
entity.setNodeid(nodeId);
entity.setSyslogType(syslogType);
entity.setIpaddr(syslogAddress);
return entity;
}
ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
public boolean existSyslogType(String ip) {
String type = m_syslogTypes.get(ip);
if (type == null) {
return false;
} else if (UNKNOWN_SYSLOG_TYPE.equals(type)) {
return false;
} else {
return true;
}
}
public String getSyslogType(String ip){
return m_syslogTypes.get(ip);
}
public String getSyslogDomain(String nodeid) {
DomainComponent domainComp = m_syslogNodeMaps.get(nodeid);
if(domainComp!=null){
return domainComp.getDomainId();
}
return null;
}
}