/**
* *****************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2009-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.web.alarm;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.opennms.core.utils.BeanUtils;
import org.opennms.core.utils.InetAddressUtils;
import org.opennms.netmgt.dao.AlarmDao;
import org.opennms.netmgt.dao.MemoDao;
import org.opennms.netmgt.model.*;
import org.opennms.netmgt.model.acknowledgments.AckService;
import org.opennms.web.alarm.filter.AlarmCriteria;
import org.opennms.web.alarm.filter.AlarmCriteria.AlarmCriteriaVisitor;
import org.opennms.web.alarm.filter.AlarmIdListFilter;
import org.opennms.web.filter.Filter;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>DaoWebAlarmRepository class.</p>
*
* @author ranger
* @version $Id: $
* @since 1.8.1
*/
public class DaoWebAlarmRepository implements WebAlarmRepository, InitializingBean {
@Autowired
AlarmDao m_alarmDao;
@Autowired
MemoDao m_memoDao;
@Autowired
AckService m_ackService;
@Override
public void afterPropertiesSet() throws Exception {
BeanUtils.assertAutowiring(this);
}
private OnmsCriteria getOnmsCriteria(final AlarmCriteria alarmCriteria) {
final OnmsCriteria criteria = new OnmsCriteria(OnmsAlarm.class);
criteria.createAlias("node", "node", OnmsCriteria.LEFT_JOIN);
criteria.createAlias("serviceType", "serviceType", OnmsCriteria.LEFT_JOIN);
alarmCriteria.visit(new AlarmCriteriaVisitor<RuntimeException>() {
public void visitAckType(AcknowledgeType ackType) throws RuntimeException {
if (ackType == AcknowledgeType.ACKNOWLEDGED) {
criteria.add(Restrictions.isNotNull("alarmAckUser"));
} else if (ackType == AcknowledgeType.UNACKNOWLEDGED) {
criteria.add(Restrictions.isNull("alarmAckUser"));
}
}
public void visitFilter(Filter filter) throws RuntimeException {
criteria.add(filter.getCriterion());
}
public void visitLimit(int limit, int offset) throws RuntimeException {
criteria.setMaxResults(limit);
criteria.setFirstResult(offset);
}
public void visitSortStyle(SortStyle sortStyle) throws RuntimeException {
switch (sortStyle) {
case COUNT:
criteria.addOrder(Order.desc("counter"));
break;
case FIRSTEVENTTIME:
criteria.addOrder(Order.desc("firstEventTime"));
break;
case ID:
criteria.addOrder(Order.desc("id"));
break;
case INTERFACE:
criteria.addOrder(Order.desc("ipAddr"));
break;
case LASTEVENTTIME:
criteria.addOrder(Order.desc("lastEventTime"));
break;
case NODE:
criteria.addOrder(Order.desc("node.label"));
break;
case POLLER:
criteria.addOrder(Order.desc("distPoller"));
break;
case SERVICE:
criteria.addOrder(Order.desc("serviceType.name"));
break;
case SEVERITY:
criteria.addOrder(Order.desc("severity"));
break;
case REVERSE_COUNT:
criteria.addOrder(Order.asc("counter"));
break;
case REVERSE_FIRSTEVENTTIME:
criteria.addOrder(Order.asc("firstEventTime"));
break;
case REVERSE_ID:
criteria.addOrder(Order.asc("id"));
break;
case REVERSE_INTERFACE:
criteria.addOrder(Order.asc("ipAddr"));
break;
case REVERSE_LASTEVENTTIME:
criteria.addOrder(Order.asc("lastEventTime"));
break;
case REVERSE_NODE:
criteria.addOrder(Order.asc("node.label"));
break;
case REVERSE_POLLER:
criteria.addOrder(Order.asc("distPoller"));
break;
case REVERSE_SERVICE:
criteria.addOrder(Order.asc("serviceType.name"));
break;
case REVERSE_SEVERITY:
criteria.addOrder(Order.asc("severity"));
break;
default:
break;
}
}
});
return criteria;
}
private Alarm mapOnmsAlarmToAlarm(OnmsAlarm onmsAlarm) {
if (onmsAlarm == null) {
return null;
}
Alarm alarm = new Alarm();
alarm.id = onmsAlarm.getId();
alarm.uei = onmsAlarm.getUei();
alarm.dpName = onmsAlarm.getDistPoller() != null ? onmsAlarm.getDistPoller().getName() : "";
// node id can be null, in which case nodeID will be 0
alarm.nodeID = onmsAlarm.getNode() != null ? onmsAlarm.getNode().getId() : 0;
alarm.ipAddr = onmsAlarm.getIpAddr() == null ? null : InetAddressUtils.toIpAddrString(onmsAlarm.getIpAddr());
// This causes serviceID to be null if the column in the database is null
alarm.serviceID = onmsAlarm.getServiceType() != null ? onmsAlarm.getServiceType().getId() : 0;
alarm.reductionKey = onmsAlarm.getReductionKey();
alarm.count = onmsAlarm.getCounter();
alarm.severity = onmsAlarm.getSeverity();
alarm.lastEventID = onmsAlarm.getLastEvent().getId();
alarm.firsteventtime = onmsAlarm.getFirstEventTime();
alarm.lasteventtime = onmsAlarm.getLastEventTime();
alarm.description = onmsAlarm.getDescription();
alarm.logMessage = onmsAlarm.getLogMsg();
alarm.operatorInstruction = onmsAlarm.getOperInstruct();
alarm.troubleTicket = onmsAlarm.getTTicketId();
alarm.troubleTicketState = onmsAlarm.getTTicketState();
alarm.mouseOverText = onmsAlarm.getMouseOverText();
alarm.suppressedUntil = onmsAlarm.getSuppressedUntil();
alarm.suppressedUser = onmsAlarm.getSuppressedUser();
alarm.suppressedTime = onmsAlarm.getSuppressedTime();
alarm.acknowledgeUser = onmsAlarm.getAckUser();
alarm.acknowledgeTime = onmsAlarm.getAckTime();
alarm.parms = onmsAlarm.getEventParms();
alarm.stickyMemo = mapOnmsMemoToMemo(onmsAlarm.getStickyMemo(), alarm.stickyMemo);
alarm.reductionKeyMemo = mapOnmsMemoToReductionKeyMemo(onmsAlarm.getReductionKeyMemo(), onmsAlarm.getReductionKey());
alarm.nodeLabel = onmsAlarm.getNode() != null ? onmsAlarm.getNode().getLabel() : "";
alarm.serviceName = onmsAlarm.getServiceType() != null ? onmsAlarm.getServiceType().getName() : "";
return alarm;
}
/**
* {@inheritDoc}
*/
@Transactional
public void acknowledgeAll(String user, Date timestamp) {
acknowledgeMatchingAlarms(user, timestamp, new AlarmCriteria());
}
@Transactional
public void acknowledgeAlarms(String user, Date timestamp, int[] alarmIds) {
acknowledgeMatchingAlarms(user, timestamp, new AlarmCriteria(new AlarmIdListFilter(alarmIds)));
}
/**
* {@inheritDoc}
*/
@Transactional
public void acknowledgeMatchingAlarms(String user, Date timestamp, AlarmCriteria criteria) {
List<OnmsAlarm> alarms = m_alarmDao.findMatching(getOnmsCriteria(criteria));
Iterator<OnmsAlarm> alarmsIt = alarms.iterator();
while (alarmsIt.hasNext()) {
OnmsAlarm alarm = alarmsIt.next();
OnmsAcknowledgment ack = new OnmsAcknowledgment(alarm, user);
ack.setAckTime(timestamp);
ack.setAckAction(AckAction.ACKNOWLEDGE);
m_ackService.processAck(ack);
}
}
/**
* {@inheritDoc}
*/
@Transactional
public void clearAlarms(int[] alarmIds, String user, Date timestamp) {
List<OnmsAlarm> alarms = m_alarmDao.findMatching(getOnmsCriteria(new AlarmCriteria(new AlarmIdListFilter(alarmIds))));
Iterator<OnmsAlarm> alarmsIt = alarms.iterator();
while (alarmsIt.hasNext()) {
OnmsAlarm alarm = alarmsIt.next();
OnmsAcknowledgment ack = new OnmsAcknowledgment(alarm, user);
ack.setAckTime(timestamp);
ack.setAckAction(AckAction.CLEAR);
m_ackService.processAck(ack);
m_alarmDao.update(alarm);
}
}
/**
* {@inheritDoc}
*/
@Transactional
public int countMatchingAlarms(AlarmCriteria criteria) {
return queryForInt(getOnmsCriteria(criteria));
}
/**
* {@inheritDoc}
*/
@Transactional
public int[] countMatchingAlarmsBySeverity(final AlarmCriteria criteria) {
final int[] alarmCounts = new int[8];
for (final OnmsSeverity value : OnmsSeverity.values()) {
alarmCounts[value.getId()] = m_alarmDao.countMatching(getOnmsCriteria(criteria).add(Restrictions.eq("severity", value)));
}
return alarmCounts;
}
/**
* {@inheritDoc}
*/
@Transactional
public void escalateAlarms(int[] alarmIds, String user, Date timestamp) {
List<OnmsAlarm> alarms = m_alarmDao.findMatching(getOnmsCriteria(new AlarmCriteria(new AlarmIdListFilter(alarmIds))));
Iterator<OnmsAlarm> alarmsIt = alarms.iterator();
while (alarmsIt.hasNext()) {
OnmsAlarm alarm = alarmsIt.next();
OnmsAcknowledgment ack = new OnmsAcknowledgment(alarm, user);
ack.setAckTime(timestamp);
ack.setAckAction(AckAction.ESCALATE);
m_ackService.processAck(ack);
}
}
/**
* {@inheritDoc}
*/
@Transactional
public Alarm getAlarm(int alarmId) {
return mapOnmsAlarmToAlarm(m_alarmDao.get(alarmId));
}
/**
* {@inheritDoc}
*/
@Transactional
public Alarm[] getMatchingAlarms(AlarmCriteria criteria) {
List<Alarm> alarms = new ArrayList<Alarm>();
List<OnmsAlarm> onmsAlarms = m_alarmDao.findMatching(getOnmsCriteria(criteria));
for (OnmsAlarm onmsAlarm : onmsAlarms) {
alarms.add(mapOnmsAlarmToAlarm(onmsAlarm));
}
return alarms.toArray(new Alarm[0]);
}
/**
* {@inheritDoc}
*/
@Transactional
public void unacknowledgeAll(String user) {
unacknowledgeMatchingAlarms(new AlarmCriteria(), user);
}
/**
* {@inheritDoc}
*/
@Transactional
public void unacknowledgeMatchingAlarms(AlarmCriteria criteria, String user) {
List<OnmsAlarm> alarms = m_alarmDao.findMatching(getOnmsCriteria(criteria));
for (OnmsAlarm alarm : alarms) {
OnmsAcknowledgment ack = new OnmsAcknowledgment(alarm, user);
ack.setAckAction(AckAction.UNACKNOWLEDGE);
m_ackService.processAck(ack);
}
}
private int queryForInt(OnmsCriteria onmsCriteria) {
return m_alarmDao.countMatching(onmsCriteria);
}
/**
* {@inheritDoc}
*/
@Transactional
public void acknowledgeAlarms(int[] alarmIds, String user, Date timestamp) {
acknowledgeMatchingAlarms(user, timestamp, new AlarmCriteria(new AlarmIdListFilter(alarmIds)));
}
/**
* {@inheritDoc}
*/
@Transactional
public void unacknowledgeAlarms(int[] alarmIds, String user) {
unacknowledgeMatchingAlarms(new AlarmCriteria(new AlarmIdListFilter(alarmIds)), user);
}
private ReductionKeyMemo mapOnmsMemoToReductionKeyMemo(OnmsMemo onmsMemo, String reductionKey) {
ReductionKeyMemo reductionKeyMemo = new ReductionKeyMemo();
mapOnmsMemoToMemo(onmsMemo, reductionKeyMemo);
reductionKeyMemo.setReductionKey(reductionKey);
return reductionKeyMemo;
}
private Memo mapOnmsMemoToMemo(OnmsMemo onmsMemo, Memo memo) {
if (onmsMemo != null && memo != null) {
memo.setId(onmsMemo.getId());
memo.setAuthor(onmsMemo.getAuthor() == null ? "" : onmsMemo.getAuthor());
memo.setBody(onmsMemo.getBody() == null ? "" : onmsMemo.getBody());
memo.setCreated(onmsMemo.getCreated());
memo.setUpdated(onmsMemo.getUpdated());
}
return memo;
}
@Override
@Transactional
public void updateStickyMemo(Integer alarmId, String body, String user) {
OnmsAlarm onmsAlarm = m_alarmDao.get(alarmId);
if (onmsAlarm != null) {
if (onmsAlarm.getStickyMemo() == null) {
onmsAlarm.setStickyMemo(new OnmsMemo());
onmsAlarm.getStickyMemo().setCreated(new Date());
}
onmsAlarm.getStickyMemo().setBody(body);
onmsAlarm.getStickyMemo().setAuthor(user);
onmsAlarm.getStickyMemo().setUpdated(new Date());
m_alarmDao.saveOrUpdate(onmsAlarm);
}
}
@Override
@Transactional
public void updateReductionKeyMemo(Integer alarmId, String body, String user) {
OnmsAlarm onmsAlarm = m_alarmDao.get(alarmId);
if (onmsAlarm != null) {
OnmsReductionKeyMemo memo = onmsAlarm.getReductionKeyMemo();
if(memo == null) {
memo = new OnmsReductionKeyMemo();
memo.setCreated(new Date());
}
memo.setBody(body);
memo.setAuthor(user);
memo.setReductionKey(onmsAlarm.getReductionKey());
memo.setUpdated(new Date());
m_memoDao.saveOrUpdate(memo);
onmsAlarm.setReductionKeyMemo(memo);
}
}
@Override
@Transactional
public void removeStickyMemo(Integer alarmId) {
OnmsAlarm onmsAlarm = m_alarmDao.get(alarmId);
if (onmsAlarm != null) {
m_memoDao.delete(onmsAlarm.getStickyMemo());
onmsAlarm.setStickyMemo(null);
}
}
@Override
@Transactional
public void removeReductionKeyMemo(int alarmId) {
OnmsAlarm onmsAlarm = m_alarmDao.get(alarmId);
if (onmsAlarm != null) {
m_memoDao.delete(onmsAlarm.getReductionKeyMemo());
onmsAlarm.setReductionKeyMemo(null);
}
}
}