package org.infosec.ismp.manager.domains; import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.infosec.ismp.manager.agent.AgentComponent; import org.infosec.ismp.manager.agent.AgentTaskNode; import org.infosec.ismp.manager.agent.servicecheck.ServiceCheckNode; import org.infosec.ismp.manager.agent.sitecheck.SiteCheckNode; import org.infosec.ismp.manager.agent.task.AgentTodoTask.AgentTodoType; import org.infosec.ismp.manager.db.task.DatabaseNode; import org.infosec.ismp.manager.model.PingResultEntity; import org.infosec.ismp.manager.model.ServiceCheckResultEntity; import org.infosec.ismp.manager.model.SiteCheckResultEntity; import org.infosec.ismp.manager.model.db.DatabaseResultEntity; import org.infosec.ismp.manager.ping.PingNode; import org.infosec.ismp.manager.rmi.db.model.DatabaseResultStatus; import org.infosec.ismp.manager.rmi.snmp.model.SnmpDeviceStatus; import org.infosec.ismp.manager.rmi.snmp.model.cisco.CiscoDeviceStatus; import org.infosec.ismp.manager.rmi.snmp.model.host.HostDeviceStatus; import org.infosec.ismp.manager.rmi.snmp.model.weblogic.WeblogicDeviceStatus; import org.infosec.ismp.manager.snmp.task.SnmpDeviceNode; import org.infosec.ismp.manager.snmpTrap.SnmpTrapNode; import org.infosec.ismp.manager.syslog.task.SyslogNode; /** * 代表一个域对象,管理域中的设备、应用程序等被管理对象的状态, 决定域本身是否有告警信息等,不使用Spring管理 * * @author lianglin * */ public class DomainComponent { /** * 域唯一标识 */ private final String m_domainId; /** * 该域对应的Agent */ private Set<AgentComponent> m_agentComps = new HashSet<AgentComponent>(); /** * 存放nodeid和AgentComponent之间的映射关系 */ private Map<NodeIdAndTypePair, AgentComponent> agentMaps = new HashMap<NodeIdAndTypePair, AgentComponent>(); /** * 存放所有的Ping的结果 */ private StatusComponent<PingResultEntity> m_pingResult = new StatusComponent<PingResultEntity>(); /** * 存放所有的database的结果 */ private StatusComponent<DatabaseResultStatus> m_databaseResult = new StatusComponent<DatabaseResultStatus>(); /** * 存放所有的ServiceCheck的结果 */ private StatusComponent<ServiceCheckResultEntity> m_serviceCheckResult = new StatusComponent<ServiceCheckResultEntity>(); /** * 存放所有的SiteCheck的结果 */ private StatusComponent<SiteCheckResultEntity> m_siteCheckResult = new StatusComponent<SiteCheckResultEntity>(); /** * put all status */ private StatusComponent<Serializable> m_statusResults = new StatusComponent<Serializable>(); private Set<AgentTaskNode> m_taskNodes = new HashSet<AgentTaskNode>(); /** * 存放所有的SnmpDeviceStatus的结果 */ private StatusComponent<SnmpDeviceStatus> m_snmpDeviceResult = new StatusComponent<SnmpDeviceStatus>(); public DomainComponent(String domainId) { m_domainId = domainId; } public void removeSyslogSourceNode(String nodeId) { NodeIdAndTypePair key = new NodeIdAndTypePair(nodeId, AgentTodoType.SYSLOG); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.removeSyslogNode(nodeId); agentMaps.remove(key); } } /** * 添加Syslog节点 * @param node */ public void addSyslogNode(SyslogNode node){ addTaskNode(node); } public void removePingNode(String nodeid) { NodeIdAndTypePair key = new NodeIdAndTypePair(nodeid, AgentTodoType.PING); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.removePingNode(nodeid); agentMaps.remove(key); } } public void addPingNode(PingNode node) { addTaskNode(node); } private void addTaskNode(AgentTaskNode node) { // m_taskNodes.add(node); AgentComponent agent = findRightAgentComp(); agentMaps.put(new NodeIdAndTypePair(node.getNodeid(), node.getType()), agent); //TODO Check agent whether is null. if (agent != null) { agent.addAgentTaskNode(node); } } /** * 添加网页检测节点 * @param node */ public void addSiteCheckNode(SiteCheckNode node){ addTaskNode(node); } /** * 重置网页检测节点 * @param node */ public void resetSiteCheckNode(String nodeid){ NodeIdAndTypePair key = new NodeIdAndTypePair(nodeid, AgentTodoType.SITECHECK); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.resetSiteCheck(nodeid); } } /** * 添加服务检测节点 * @param node */ public void addServiceCheckNode(ServiceCheckNode node) { addTaskNode(node); } /** * 添加JDBc采集节点 * @param node */ public void addJdbcNode(DatabaseNode node){ addTaskNode(node); } /** * 添加Snmp采集节点 * @param node */ public void addSnmpCollectdNode(SnmpDeviceNode node){ addTaskNode(node); } /** * 删除服务检测节点 * @param nodeid */ public void removeServiceCheckNode(String nodeid) { NodeIdAndTypePair key = new NodeIdAndTypePair(nodeid, AgentTodoType.SERVICECHECK); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.removeServiceCheckNode(nodeid); agentMaps.remove(key); } } /** * 删除网页检测节点 * @param nodeid */ public void removeSiteCheckNode(String nodeid){ NodeIdAndTypePair key = new NodeIdAndTypePair(nodeid, AgentTodoType.SITECHECK); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.removeSiteCheckNode(nodeid); agentMaps.remove(key); } } /** * 删除一个jdbc节点 * @param nodeid */ public void removeDatabaseCollectionNode(String nodeid){ NodeIdAndTypePair key = new NodeIdAndTypePair(nodeid, AgentTodoType.JDBC); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.removeJdbcCollectdNode(nodeid); agentMaps.remove(key); } } /** * 删除一个Snmp采集节点 * @param nodeid */ public void removeSnmpCollectdNode(String nodeid){ NodeIdAndTypePair key = new NodeIdAndTypePair(nodeid, AgentTodoType.SNMP); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.removeSnmpCollectdNode(nodeid); agentMaps.remove(key); } } /** * 设置该domain对应的Agent * * @param agentComponents */ public void setAgentComponents(List<AgentComponent> agentComponents) { m_agentComps.addAll(agentComponents); } /** * 找到一个负载最小的Agent * * @return */ protected AgentComponent findRightAgentComp() { AgentComponent reAgent = null; int max = Integer.MAX_VALUE; Iterator<AgentComponent> agentIt = m_agentComps.iterator(); while (agentIt.hasNext()) { AgentComponent agent = agentIt.next(); if (agent.getAllNodeCount() < max) { max = agent.getAllNodeCount(); reAgent = agent; } } return reAgent; } private static class NodeIdAndTypePair { String nodeid; AgentTodoType type; public NodeIdAndTypePair(final String nodeid, final AgentTodoType type) { this.nodeid = nodeid; this.type = type; } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(obj, this); } } public static void main(String[] args) { Map<NodeIdAndTypePair,String> testMap = new HashMap<NodeIdAndTypePair,String>(); String nodeid="123"; testMap.put(new NodeIdAndTypePair(nodeid, AgentTodoType.SERVICECHECK) , "test1"); String pp=testMap.get(new NodeIdAndTypePair(nodeid, AgentTodoType.SERVICECHECK)); System.out.println(pp); } /** * 设置ping的状态 * @param nodeid * @param entity */ public void putPingResult(String nodeid, PingResultEntity entity) { m_pingResult.setStatus(nodeid,StatusType.PING, entity); } public PingResultEntity getPingResult(String nodeid) { return m_pingResult.getStatus(nodeid,StatusType.PING); } /** * 删除ping的状态 * @param nodeid */ public void RemovePingResult(String nodeid){ m_pingResult.removeStatus(nodeid,StatusType.PING); } /** * 设置ping的状态 * @param nodeid * @param entity */ public void putDatabaseResult(String nodeid, DatabaseResultStatus status) { m_databaseResult.setStatus(nodeid,StatusType.DATABASE, status); } /** * 获取数据库状态信息 */ public DatabaseResultStatus getDatabaseResult(String nodeid) { return m_databaseResult.getStatus(nodeid,StatusType.DATABASE); } /** * 设置serviceCheck的状态 * @param nodeid * @param entity */ public void putServiceCheckResult(String nodeid, ServiceCheckResultEntity entity) { m_serviceCheckResult.setStatus(nodeid, StatusType.SERVICE_CHECK,entity); } /** * 获取serviceCheck的状态 * @param nodeid * @param entity */ public ServiceCheckResultEntity getServiceCheckResult(String nodeid) { return m_serviceCheckResult.getStatus(nodeid,StatusType.SERVICE_CHECK); } /** * 删除servicecheck的状态 * @param nodeid */ public void RemoveServiceCheckResult(String nodeid){ m_serviceCheckResult.removeStatus(nodeid,StatusType.SERVICE_CHECK); } /** * 设置siteCheck的状态 * @param nodeid * @param entity */ public void putSiteCheckResult(String nodeid, SiteCheckResultEntity entity) { m_siteCheckResult.setStatus(nodeid,StatusType.SITE_CHECK, entity); } /** * 获取siteCheck的状态 * @param nodeid * @param entity */ public SiteCheckResultEntity getSiteCheckResult(String nodeid) { return m_siteCheckResult.getStatus(nodeid,StatusType.SITE_CHECK); } /** * 删除sitecheck的状态 * @param nodeid */ public void RemoveSiteCheckResult(String nodeid){ m_siteCheckResult.removeStatus(nodeid,StatusType.SITE_CHECK); } public String getDomainId() { return this.m_domainId; } /** * set status * @param nodeid * @param type * @param status */ public void putStatus(String nodeid,StatusType type,Serializable status){ m_statusResults.setStatus(nodeid,type, status); } /** * get status * @param nodeid * @param type * @return */ public Serializable getStatus(String nodeid,StatusType type){ return m_statusResults.getStatus(nodeid,type); } /** * remove status * @param nodeid * @param type */ public void removeStatus(String nodeid,StatusType type){ m_statusResults.removeStatus(nodeid, type); } public AgentComponent getRightAgent() { return findRightAgentComp(); } /** * 存储SNMP设备信息 */ public void cacheSnmpDeviceResult(String nodeid, SnmpDeviceStatus status) { m_snmpDeviceResult.setStatus(nodeid, StatusType.SNMP, status); } /** * 获取SNMP设备信息 */ public SnmpDeviceStatus getSnmpDeviceStatus(String nodeid){ return m_snmpDeviceResult.getStatus(nodeid, StatusType.SNMP); } /** * 添加SnmpTrap节点任务 * @param node */ public void addSnmpTrapNode(SnmpTrapNode node) { addTaskNode(node); } /** * 删除snmpTrap任务节点 * @param nodeid */ public void removeSnmpTrapNodeByNodeId(String nodeid) { NodeIdAndTypePair key = new NodeIdAndTypePair(nodeid, AgentTodoType.SNMPTRAP); AgentComponent agent = agentMaps.get(key); if (agent != null) { agent.removeSnmpTrapNode(nodeid); agentMaps.remove(key); } } }