package org.opennms.netmgt.correlation.ncs;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.opennms.netmgt.dao.NodeDao;
import org.opennms.netmgt.model.events.EventUtils;
import org.opennms.netmgt.model.ncs.NCSComponent;
import org.opennms.netmgt.model.ncs.NCSComponentRepository;
import org.opennms.netmgt.xml.event.Event;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class DefaultNCSCorrelationService implements NCSCorrelationService {
@Autowired
NCSComponentRepository m_componentRepo;
@Autowired
NodeDao m_nodeDao;
@Override
public List<NCSComponent> findComponentsThatDependOn(Long componentId) {
NCSComponent comp = m_componentRepo.get(componentId);
List<NCSComponent> parents = m_componentRepo.findComponentsThatDependOn(comp);
for(NCSComponent parent : parents) {
m_componentRepo.initialize(parent);
}
return parents;
}
@Override
public List<NCSComponent> findComponentsByNodeIdAndEventParameters(Event e, String... parameterNames) {
assert e.getNodeid() != null;
assert e.getNodeid() != 0;
List<NCSComponent> components = m_componentRepo.findComponentsByNodeId(e.getNodeid().intValue());
List<NCSComponent> matching = new LinkedList<NCSComponent>();
for(NCSComponent component : components)
{
if (matches(component, e, parameterNames)) {
matching.add(component);
}
}
return matching;
}
private boolean matches(NCSComponent component, Event e, String... parameters) {
for(String key : parameters) {
if (!component.getAttributes().containsKey(key)) {
return false;
}
String val = component.getAttributes().get(key);
if (!val.equals(EventUtils.getParm(e, key))) {
return false;
}
}
return true;
}
@Override
public List<NCSComponent> findSubComponents(Long componentId) {
NCSComponent comp = m_componentRepo.get(componentId);
Set<NCSComponent> subcomponents = comp.getSubcomponents();
for(NCSComponent subcomponent : subcomponents) {
m_componentRepo.initialize(subcomponent);
}
return new ArrayList<NCSComponent>(subcomponents);
}
@Override
public List<NCSComponent> findComponentsByNodeIdAndAttrParmMaps(Event e, AttrParmMap... parameterMap) {
assert e.getNodeid() != null;
assert e.getNodeid() != 0;
List<NCSComponent> components = m_componentRepo.findComponentsByNodeId(e.getNodeid().intValue());
List<NCSComponent> matching = new LinkedList<NCSComponent>();
for(NCSComponent component : components)
{
if (matches(component, e, parameterMap)) {
matching.add(component);
}
}
return matching;
}
private boolean matches(NCSComponent component, Event e, AttrParmMap[] parameterMap) {
for(AttrParmMap map : parameterMap) {
if (!map.matches(component, e)) {
return false;
}
}
return true;
}
}