package org.infosec.ismp.manager.db;
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.db.dao.DatabaseNodeEntityService;
import org.infosec.ismp.manager.db.task.DatabaseNode;
import org.infosec.ismp.manager.domains.DomainComponent;
import org.infosec.ismp.manager.domains.DomainLocator;
import org.infosec.ismp.manager.model.DatabaseNodeEntity;
import org.infosec.ismp.manager.model.db.DatabaseResultEntity;
import org.infosec.ismp.manager.rmi.db.model.DatabaseResultStatus;
import org.infosec.ismp.manager.rmi.db.model.DbCollectionRmiBean;
import org.infosec.ismp.util.ThreadCategory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
/**
* 是添加Database任务的入口类
* @author lianglin
*
*/
@Component
public class DatabaseLocator implements ComponentLocator{
/**
* nodeid<->domain
*/
private Map<String, DomainComponent> nodeidMaps = new HashMap<String, DomainComponent>();
private DatabaseNodeEntityService m_databaseNodeEntityService;
private DomainLocator m_domainLocator;
@Autowired(required = true)
public void setDatabaseNodeEntityService(DatabaseNodeEntityService databaseNodeEntityService) {
m_databaseNodeEntityService = databaseNodeEntityService;
}
@Autowired(required = true)
public void setDomainLocator(DomainLocator domainLocator) {
m_domainLocator = domainLocator;
}
public DatabaseLocator() {
}
@PostConstruct
public void init() {
System.out.println("Database Locator 开始初始化");
Assert.state(m_databaseNodeEntityService != null, "m_DatabaseDao不能为空,请检查");
Assert.state(m_domainLocator != null, "m_domainLocator不能为空,请检查");
distruteAllDatabaseNode();
}
public List<DatabaseNodeEntity> getAllDatabaseNode() {
List<DatabaseNodeEntity> entites = m_databaseNodeEntityService.getAll();
return entites;
}
public void distruteAllDatabaseNode() {
List<DatabaseNodeEntity> entities = getAllDatabaseNode();
for (DatabaseNodeEntity entity : entities) {
addDatabaseNodeToDomain(entity);
}
}
public void addDatabaseNode(DbCollectionRmiBean rmibean) {
DatabaseNodeEntity entity = new DatabaseNodeEntity();
copyDatabaseNodeProperties(entity, rmibean);
addDatabaseNodeToDb(entity);
addDatabaseNodeToDomain(entity);
}
/**
* 将Database任务添加到domainComponent
* @param DatabaseNodeEntity
*/
private void addDatabaseNodeToDomain(DatabaseNodeEntity entity) {
DomainComponent domainComp = m_domainLocator
.createDomainIfNessary(entity.getDomain());
log().info("wait for put dbcollect task into domain.");
nodeidMaps.put(entity.getNodeid(), domainComp);
log().info("put dbcollect task into domain success");
DatabaseNode node = createDatabaseNode(entity);
log().info("wait for send dbcollect task to remote agent");
domainComp.addJdbcNode(node);
log().info("send dbcollect task to remote agent success");
}
protected DatabaseNode createDatabaseNode(DatabaseNodeEntity entity){
DatabaseNode node = new DatabaseNode();
copyDatabaseNodeProperties(node, entity);
return node;
}
private void addDatabaseNodeToDb(DatabaseNodeEntity entity ) {
m_databaseNodeEntityService.save(entity);
}
public void removeDatabaseNode(String nodeid) {
removeDatabaseNodeFromDb(nodeid);
removeDatabaseNodeFromDomain(nodeid);
}
private void removeDatabaseNodeFromDomain(String nodeid) {
DomainComponent domainComp = nodeidMaps.get(nodeid);
if (domainComp != null) {
domainComp.removeDatabaseCollectionNode(nodeid);
} else {
if (log().isDebugEnabled()) {
log().debug("removeDatabaseNode没有找到该nodeId:" + nodeid + "对应的域 ");
}
}
}
//bean属性值拷贝
private void copyDatabaseNodeProperties(Object dest, Object orig) {
try {
org.apache.commons.beanutils.PropertyUtils.copyProperties(dest,
orig);
} catch (Exception e) {
log().debug("DatabaseLocator : the caller does not have access to the property accessor method",
e);
}
}
/**
* 用nodeid做索引存储database采集结果到内存域中。
* @param nodeid
* @param entity
*/
public void setDatabaseResult(String nodeid, DatabaseResultStatus status) {
DomainComponent domainComp = nodeidMaps.get(nodeid);
if (domainComp != null) {
domainComp.putDatabaseResult(nodeid,status);
}
}
public DatabaseResultStatus getDatabaseResult(String nodeid) {
DomainComponent domainComp = nodeidMaps.get(nodeid);
if (domainComp != null) {
return domainComp.getDatabaseResult(nodeid);
}
return null;
}
private void removeDatabaseNodeFromDb(String nodeid) {
m_databaseNodeEntityService.removeDatabaseNodeByNodeId(nodeid);
}
ThreadCategory log() {
return ThreadCategory.getInstance(getClass());
}
}