package org.infosec.ismp.manager.agent;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.infosec.ismp.manager.GetAgentPropertiesByDomain;
import org.infosec.ismp.util.ThreadCategory;
import org.springframework.stereotype.Component;
/**
* Agent的管理、定位类,是Agent的入口类
*
* @author lianglin
*
*/
@Component
public class AgentLocator {
private AgentFileFactory agentFileFactory = AgentFileFactory.getInstance();
public final static long MAX_REGISTER_TIME_ELAPSE = 10 * 1000 * 3;
private Map<String, AgentComponent> m_agents = new HashMap<String, AgentComponent>();
private GetAgentPropertiesByDomain agentFinder = new GetAgentPropertiesByDomain();
/**
* 所有的AgentComponent
*/
private Map<String, AgentComponent> agentComps = new HashMap<String, AgentComponent>();
public List<AgentComponent> getAgentByDomain(String domain) {
List<AgentComponent> results = new ArrayList<AgentComponent>();
// if("testDomain".equals(domain)){
// String agentId= "agent1";
// AgentComponent agent =findAgentComponetByAgentId(agentId);
// results.add(agent);
// }
System.out.println("domain is : " + domain);
List<String> agentIds = agentFinder.getAgentNames(domain);
System.out.println("agentIds is : " + agentIds);
if (agentIds != null) {
for (String agentId : agentIds) {
AgentComponent agent = findAgentComponetByAgentId(agentId);
results.add(agent);
}
}
return results;
}
protected AgentComponent createAgentComponent(String agentId) {
AgentComponent agentComp = null;
File file = agentFileFactory.createAgentConfigFile(agentId);
agentComp = new AgentComponent(agentId);
agentComp.setTempFile(file);
return agentComp;
}
/**
* 对相应的Agent进行注册处理
*
* @param agentId
* @param uuid
* @param ipaddr
* @param port
*/
public void register(String agentId, String uuid, String ipaddr, int port) {
log().info("开始一次注册过程");
AgentComponent agent = findAgentComponetByAgentId(agentId);
agent.register(uuid, ipaddr, port);
}
/**
* 检查Agent的注册时间是否超过N倍时间间隔,如果超过,则认为该Agent不在线,或者网络异常
*/
public void check() {
List<AgentComponent> agents = getAllAgentComponent();
long nowTime = System.currentTimeMillis();
//FIXME for NPE bug
for (AgentComponent agent : agents) {
if (agent.isActive()) {
long registerTime = agent.getRegisterTime();
if (nowTime - registerTime > MAX_REGISTER_TIME_ELAPSE) {
agent.unactive();
}
}
}
}
private List<AgentComponent> getAllAgentComponent() {
List<AgentComponent> agents = new LinkedList<AgentComponent>();
agents.addAll(m_agents.values());
return agents;
}
public AgentComponent findAgentComponetByAgentId(String agentId) {
AgentComponent agentComp = m_agents.get(agentId);
if (agentComp == null) {
log().info("创建一个新的Agent对象,AgentId是: " + agentId);
agentComp = createAgentComponent(agentId);
m_agents.put(agentId, agentComp);
}
return agentComp;
}
protected void init() {
}
ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
}