/******************************************************************************* * 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.outage; import static org.opennms.core.utils.InetAddressUtils.str; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; import org.opennms.core.utils.BeanUtils; import org.opennms.netmgt.dao.NodeDao; import org.opennms.netmgt.dao.OutageDao; import org.opennms.netmgt.model.OnmsCriteria; import org.opennms.netmgt.model.OnmsOutage; import org.opennms.netmgt.model.outage.OutageSummary; import org.opennms.web.filter.Filter; import org.opennms.web.outage.filter.OutageCriteria; import org.opennms.web.outage.filter.OutageCriteria.OutageCriteriaVisitor; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; /** * <p>DaoWebOutageRepository class.</p> * * @author brozow * @version $Id: $ * @since 1.8.1 */ public class DaoWebOutageRepository implements WebOutageRepository, InitializingBean { @Autowired private OutageDao m_outageDao; @Autowired private NodeDao m_nodeDao; @Override public void afterPropertiesSet() throws Exception { BeanUtils.assertAutowiring(this); } /* * NOTE: Criteria building for Outages must included the following aliases" * * monitoredService as monitoredService * monitoredService.ipInterface as ipInterface * monitoredService.ipInterface.node as node * monitoredService.serviceType as serviceType * */ private OnmsCriteria getOnmsCriteria(final OutageCriteria outageCriteria) { final OnmsCriteria criteria = new OnmsCriteria(OnmsOutage.class); criteria.createAlias("monitoredService", "monitoredService"); criteria.createAlias("monitoredService.ipInterface", "ipInterface"); criteria.createAlias("monitoredService.ipInterface.node", "node"); criteria.createAlias("monitoredService.serviceType", "serviceType"); outageCriteria.visit(new OutageCriteriaVisitor<RuntimeException>(){ public void visitOutageType(OutageType ackType) throws RuntimeException { if (ackType == OutageType.CURRENT) { criteria.add(Restrictions.isNull("ifRegainedService")); } else if (ackType == OutageType.RESOLVED) { criteria.add(Restrictions.isNotNull("ifRegainedService")); } } public void visitFilter(Filter filter) throws RuntimeException { criteria.add(filter.getCriterion()); } public void visitGroupBy() throws RuntimeException { } 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 NODE: criteria.addOrder(Order.desc("node.label")); break; case INTERFACE: criteria.addOrder(Order.desc("ipInterface.ipAddress")); break; case SERVICE: criteria.addOrder(Order.desc("serviceType.name")); break; case IFLOSTSERVICE: criteria.addOrder(Order.desc("ifLostService")); break; case IFREGAINEDSERVICE: criteria.addOrder(Order.desc("ifRegainedService")); break; case ID: criteria.addOrder(Order.desc("id")); break; case REVERSE_NODE: criteria.addOrder(Order.asc("node.label")); break; case REVERSE_INTERFACE: criteria.addOrder(Order.asc("ipInterface.ipAddress")); break; case REVERSE_SERVICE: criteria.addOrder(Order.asc("serviceType.name")); break; case REVERSE_IFLOSTSERVICE: criteria.addOrder(Order.asc("ifLostService")); break; case REVERSE_IFREGAINEDSERVICE: criteria.addOrder(Order.asc("ifRegainedService")); break; case REVERSE_ID: criteria.addOrder(Order.asc("id")); break; default: throw new IllegalArgumentException("Unknown SortStyle: " + sortStyle); } } }); return criteria; } private Outage mapOnmsOutageToOutage(OnmsOutage onmsOutage) { if(onmsOutage != null){ Outage outage = new Outage(); final String outageAddress = str(onmsOutage.getIpAddress()); outage.outageId = onmsOutage.getId(); outage.ipAddress = outageAddress; outage.hostname = outageAddress; outage.lostServiceEventId = onmsOutage.getServiceLostEvent() != null ? onmsOutage.getServiceLostEvent().getId() : 0; //outage.lostServiceNotificationAcknowledgedBy = outage.lostServiceTime = onmsOutage.getIfLostService(); outage.nodeId = onmsOutage.getNodeId(); outage.nodeLabel = m_nodeDao.get(onmsOutage.getNodeId()).getLabel(); outage.regainedServiceEventId = onmsOutage.getServiceRegainedEvent() != null ? onmsOutage.getServiceRegainedEvent().getId() : 0; outage.regainedServiceTime = onmsOutage.getIfRegainedService(); outage.serviceId = onmsOutage.getServiceId(); outage.serviceName = onmsOutage.getMonitoredService() != null ? onmsOutage.getMonitoredService().getServiceName() : ""; outage.suppressedBy = onmsOutage.getSuppressedBy(); outage.suppressTime = onmsOutage.getSuppressTime(); return outage; }else{ return null; } } private OutageSummary mapOnmsOutageToOutageSummary(final OnmsOutage onmsOutage) { return new OutageSummary( onmsOutage.getNodeId(), onmsOutage.getMonitoredService().getIpInterface().getNode().getLabel(), onmsOutage.getIfLostService(), onmsOutage.getIfRegainedService(), new Date() ); } /* (non-Javadoc) * @see org.opennms.web.outage.WebOutageRepository#countMatchingOutageSummaries(org.opennms.web.outage.filter.OutageCriteria) */ /** {@inheritDoc} */ @Transactional public int countMatchingOutageSummaries(final OutageCriteria criteria) { return getMatchingOutageSummaries(criteria).length; } /* (non-Javadoc) * @see org.opennms.web.outage.WebOutageRepository#countMatchingOutages(org.opennms.web.outage.filter.OutageCriteria) */ /** {@inheritDoc} */ @Transactional public int countMatchingOutages(OutageCriteria criteria) { return m_outageDao.countMatching(getOnmsCriteria(criteria)); } /* (non-Javadoc) * @see org.opennms.web.outage.WebOutageRepository#getMatchingOutageSummaries(org.opennms.web.outage.filter.OutageCriteria) */ /** {@inheritDoc} */ @Transactional public OutageSummary[] getMatchingOutageSummaries(final OutageCriteria criteria) { List<OnmsOutage> onmsOutages = m_outageDao.findMatching(getOnmsCriteria(criteria)); return getOutageSummary(onmsOutages).toArray(new OutageSummary[0]); } private List<OutageSummary> getOutageSummary(List<OnmsOutage> onmsOutages) { List<OutageSummary> outages = new ArrayList<OutageSummary>(); if(onmsOutages.size() > 0){ Iterator<OnmsOutage> outageIt = onmsOutages.iterator(); while(outageIt.hasNext()){ OnmsOutage outage = outageIt.next(); if(outage.getIfRegainedService() == null){ outages.add(mapOnmsOutageToOutageSummary(outage)); } } return elimenateDuplicates(outages); }else { return outages; } } private List<OutageSummary> elimenateDuplicates(final List<OutageSummary> outagesSummaries) { final Map<Integer,OutageSummary> uniqueSummaries = new HashMap<Integer,OutageSummary>(); for (final OutageSummary outageSum : outagesSummaries) { if (!uniqueSummaries.containsKey(outageSum.getNodeId())) { uniqueSummaries.put(outageSum.getNodeId(), outageSum); } } List<OutageSummary> uniqueList = new ArrayList<OutageSummary>(uniqueSummaries.values()); Collections.sort(uniqueList); return uniqueList; } /* (non-Javadoc) * @see org.opennms.web.outage.WebOutageRepository#getMatchingOutages(org.opennms.web.outage.filter.OutageCriteria) */ /** {@inheritDoc} */ @Transactional public Outage[] getMatchingOutages(final OutageCriteria criteria) { final List<Outage> outages = new ArrayList<Outage>(); final List<OnmsOutage> onmsOutages = m_outageDao.findMatching(getOnmsCriteria(criteria)); for (final OnmsOutage outage : onmsOutages) { outages.add(mapOnmsOutageToOutage(outage)); } return outages.toArray(new Outage[0]); } /* (non-Javadoc) * @see org.opennms.web.outage.WebOutageRepository#getOutage(int) */ /** {@inheritDoc} */ @Transactional public Outage getOutage(final int OutageId) { return mapOnmsOutageToOutage(m_outageDao.get(OutageId)); } @Transactional public int countCurrentOutages() { return m_outageDao.countOutagesByNode(); } @Transactional public OutageSummary[] getCurrentOutages(final int rows) { return m_outageDao.getNodeOutageSummaries(rows).toArray(new OutageSummary[0]); } }