/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.netmgt.scriptd.helper;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import org.opennms.core.utils.BeanUtils;
import org.opennms.netmgt.dao.AlarmDao;
import org.opennms.netmgt.model.OnmsAlarm;
import org.opennms.netmgt.xml.event.AlarmData;
import org.opennms.netmgt.xml.event.Event;
import org.opennms.netmgt.xml.event.Logmsg;
import org.springframework.beans.factory.access.BeanFactoryReference;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;
public class AlarmEventSynchronization implements EventSynchronization {
List<EventForwarder> m_forwarders = new ArrayList<EventForwarder>();
public AlarmEventSynchronization() {
super();
}
public void addEventForwarder(EventForwarder forwarder) {
if (forwarder != null)
m_forwarders.add(forwarder);
}
public void sync() {
for (EventForwarder forwarder: m_forwarders) {
forwarder.sendStartSync();
for (Event event: getEvents()) {
forwarder.flushSyncEvent(event);
}
forwarder.sendEndSync();
}
}
private Event getXMLEvent(OnmsAlarm alarm) {
Event event = new Event();
event.setDbid(alarm.getLastEvent().getId());
//UEI
if (alarm.getUei() != null ) {
event.setUei(alarm.getUei());
} else {
return null;
}
// Source
if (alarm.getLastEvent().getEventSource() != null ) {
event.setSource(alarm.getLastEvent().getEventSource());
}
//nodeid
if (alarm.getNode() != null) {
event.setNodeid(alarm.getNode().getId().longValue());
}
// alarm creation time
if (alarm.getFirstEventTime() != null) {
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
event.setCreationTime(dateFormat.format(alarm.getFirstEventTime()));
}
// last event timestamp
if (alarm.getLastEventTime() != null) {
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
event.setTime(dateFormat.format(alarm.getLastEventTime()));
}
// host
if (alarm.getLastEvent().getEventHost() != null) {
event.setHost(alarm.getLastEvent().getEventHost());
}
// interface
if (alarm.getIpAddr() != null) {
event.setInterfaceAddress(alarm.getIpAddr());
}
// Service Name
if (alarm.getServiceType() != null) {
event.setService(alarm.getServiceType().getName());
}
// Description
if (alarm.getDescription() != null ) {
event.setDescr(alarm.getDescription());
}
// Log message
if (alarm.getLogMsg() != null) {
Logmsg msg = new Logmsg();
msg.setContent(alarm.getLogMsg());
event.setLogmsg(msg);
}
// severity
if (alarm.getSeverity() != null) {
event.setSeverity((alarm.getSeverity()).getLabel());
}
// operator Instruction
if (alarm.getOperInstruct() != null) {
event.setOperinstruct(alarm.getOperInstruct());
}
AlarmData ad = new AlarmData();
ad.setReductionKey(alarm.getReductionKey());
ad.setAlarmType(alarm.getAlarmType());
if (alarm.getClearKey() != null)
ad.setClearKey(alarm.getClearKey());
event.setAlarmData(ad);
return event;
}
public List<Event> getEvents() {
BeanFactoryReference bf = BeanUtils.getBeanFactory("daoContext");
final AlarmDao alarmDao = BeanUtils.getBean(bf,"alarmDao", AlarmDao.class);
final List<Event> xmlevents = new ArrayList<Event>();
TransactionTemplate transTemplate = BeanUtils.getBean(bf, "transactionTemplate",TransactionTemplate.class);
try {
transTemplate.execute(new TransactionCallback<Object>() {
public Object doInTransaction(final TransactionStatus status) {
Map<String, OnmsAlarm> forwardAlarms = new HashMap<String, OnmsAlarm>();
for (OnmsAlarm alarm : alarmDao.findAll()) {
// Got Clear alarm
if (alarm.getAlarmType() == 2) {
if (forwardAlarms.containsKey(alarm.getClearKey())) {
OnmsAlarm raise = forwardAlarms.get(alarm.getClearKey());
if (raise.getLastEventTime().before(alarm.getLastEventTime())) {
forwardAlarms.remove(alarm.getClearKey());
}
} else {
forwardAlarms.put(alarm.getClearKey(), alarm);
}
} else if (alarm.getAlarmType() == 1){
if (forwardAlarms.containsKey(alarm.getReductionKey())) {
OnmsAlarm clear = forwardAlarms.get(alarm.getReductionKey());
if (clear.getLastEventTime().before(alarm.getLastEventTime())) {
forwardAlarms.put(alarm.getReductionKey(),alarm);
}
} else {
forwardAlarms.put(alarm.getReductionKey(), alarm);
}
} else {
forwardAlarms.put(alarm.getReductionKey(), alarm);
}
}
for (OnmsAlarm alarm : forwardAlarms.values()) {
if (alarm.getAlarmType() != 2) {
Event xmlEvent = getXMLEvent(alarm);
if (xmlEvent != null) xmlevents.add(xmlEvent);
}
}
return new Object();
}
});
} catch (final RuntimeException e) {
}
return xmlevents;
}
}