/******************************************************************************* * This file is part of OpenNMS(R). * * Copyright (C) 2006-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 java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import org.opennms.core.resource.Vault; import org.opennms.netmgt.model.OnmsNode; import org.opennms.netmgt.model.outage.OutageSummary; import org.springframework.util.StringUtils; /** * As the nonvisual logic for the Services Down (Outage) servlet and JSPs, this * class queries the database for current outages and provides utility methods * for manipulating that list of outages. * * @author <A HREF="mailto:larry@opennms.org">Lawrence Karnowski </A> * @author <A HREF="http://www.opennms.org">OpenNMS </A> */ public class OutageModel extends Object { /** * Create a new <code>OutageModel</code>. */ public OutageModel() { } /** * Query the database to retrieve the current outages. * * @return An array of {@link Outage Outage}objects, or if there are none, * an empty array. * @throws java.sql.SQLException * If there is a problem getting a database connection or making * a query. */ public Outage[] getCurrentOutages() throws SQLException { Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select o.outageid, o.nodeId, n.nodeLabel, o.ipaddr, ip.iphostname, s.servicename, o.serviceId, o.iflostservice, o.svclosteventid, no.notifyId, no.answeredBy from outages o left outer join notifications no on (o.svclosteventid = no.eventid) join ifservices if on (if.id = o.ifserviceid) join ipinterface ip on (ip.id = if.ipinterfaceid) join node n on (n.nodeid = ip.nodeid) join service s on (s.serviceid = if.serviceid) where ifregainedservice is null and n.nodeType != 'D' and ip.isManaged != 'D' and if.status != 'D' and o.serviceid=s.serviceid and (o.suppresstime is null or o.suppresstime < now()) order by n.nodelabel, ip.ipaddr, s.serviceName"); outages = rs2Outages(rs, false, true); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * <p>getSuppressedOutages</p> * * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ public Outage[] getSuppressedOutages() throws SQLException { Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select o.outageid, o.nodeId, n.nodeLabel, o.ipaddr, ip.iphostname, s.servicename, o.serviceId, o.iflostservice, o.svclosteventid, no.notifyId, no.answeredBy from outages o left outer join notifications no on (o.svclosteventid = no.eventid) join ifservices if on (if.id = o.ifserviceid) join ipinterface ip on (ip.id = if.ipinterfaceid) join node n on (n.nodeid = ip.nodeid) join service s on (s.serviceid = if.serviceid) where ifregainedservice is null and n.nodeType != 'D' and ip.isManaged != 'D' and if.status != 'D' and o.serviceid=s.serviceid and o.suppresstime > now() order by n.nodelabel, ip.ipaddr, s.serviceName"); outages = rs2Outages(rs, false, true); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * <p>getCurrentOutageCount</p> * * @return a int. * @throws java.sql.SQLException if any. */ public int getCurrentOutageCount() throws SQLException { int count = 0; Connection conn = Vault.getDbConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select count(o.outageid) from outages o left outer join notifications no on (o.svclosteventid = no.eventid) join ifservices if on (if.id = o.ifserviceid) join ipinterface ip on (ip.id = if.ipinterfaceid) join node n on (n.nodeid = ip.nodeid) join service s on (s.serviceid = if.serviceid) where ifregainedservice is null and n.nodeType != 'D' and ip.isManaged != 'D' and if.status != 'D' and o.serviceid=s.serviceid and (o.suppresstime is null or o.suppresstime < now()) "); if (rs.next()) { count = rs.getInt("count"); } rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return count; } /** * <p>getSuppressedOutageCount</p> * * @return a int. * @throws java.sql.SQLException if any. */ public int getSuppressedOutageCount() throws SQLException { int count = 0; Connection conn = Vault.getDbConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select count(o.outageid) from outages o left outer join notifications no on (o.svclosteventid = no.eventid) join ifservices if on (if.id = o.ifserviceid) join ipinterface ip on (ip.id = if.ipinterfaceid) join node n on (n.nodeid = ip.nodeid) join service s on (s.serviceid = if.serviceid) where ifregainedservice is null and n.nodeType != 'D' and ip.isManaged != 'D' and if.status != 'D' and o.serviceid=s.serviceid and o.suppresstime > now() "); if (rs.next()) { count = rs.getInt("count"); } rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return count; } /** * <p>getCurrentOutagesForNode</p> * * @param nodeId a int. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ public Outage[] getCurrentOutagesForNode(int nodeId) throws SQLException { Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? " + "and node.nodeid=outages.nodeid and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr " + "and ifregainedservice is null " + " and suppresstime is null or suppresstime < now()" + "order by iflostservice desc"); stmt.setInt(1, nodeId); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs, false); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * <p>getCurrentOutagesIdsForNode</p> * * @param nodeId a int. * @return a {@link java.util.Collection} object. * @throws java.sql.SQLException if any. */ public Collection<Integer> getCurrentOutagesIdsForNode(int nodeId) throws SQLException { List<Integer> outageIds = new ArrayList<Integer>(); Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outageid from outages where nodeid=? and ifregainedservice is null and suppresstime is null or suppresstime < now();"); stmt.setInt(1, nodeId); ResultSet rs = stmt.executeQuery(); while (rs.next()) { outageIds.add(rs.getInt(1)); } rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outageIds; } /** * <p>filterNodesWithCurrentOutages</p> * * @param nodes an array of {@link org.opennms.web.element.Node} objects. * @return an array of {@link org.opennms.web.element.Node} objects. * @throws java.sql.SQLException if any. */ public OnmsNode[] filterNodesWithCurrentOutages(List<OnmsNode> nodes) throws SQLException { HashMap<Integer, OnmsNode> nodeMap = new HashMap<Integer, OnmsNode>(nodes.size()); for (OnmsNode n : nodes) { nodeMap.put(n.getId(), n); } String nodeList = StringUtils.collectionToDelimitedString(nodeMap.keySet(), ", "); List<OnmsNode> newNodes = new ArrayList<OnmsNode>(); Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT nodeid from outages where nodeid in ( " + nodeList + " ) and ifregainedservice is null and suppresstime is null or suppresstime < now();"); ResultSet rs = stmt.executeQuery(); while (rs.next()) { newNodes.add(nodeMap.get(rs.getInt(1))); } rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return newNodes.toArray(new OnmsNode[newNodes.size()]); } /** * <p>getNonCurrentOutagesForNode</p> * * @param nodeId a int. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ public Outage[] getNonCurrentOutagesForNode(int nodeId) throws SQLException { Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? " + "and node.nodeid=outages.nodeid and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr " + "and ifregainedservice is not null " + " and suppresstime is null or suppresstime < now() " + "order by iflostservice desc"); stmt.setInt(1, nodeId); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * Get all outages for a given node. * * @param nodeId a int. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ public Outage[] getOutagesForNode(int nodeId) throws SQLException { Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? and node.nodeid=outages.nodeid and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr o" + "rder by iflostservice desc"); stmt.setInt(1, nodeId); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * Get all current outages and any resolved outages since the given time for * the given node. * * @param nodeId * this is the node to query * @param time * no resolved outages older than this time will be returned * @return All current outages and resolved outages no older than * <code>time</code>. * @throws java.sql.SQLException if any. */ public Outage[] getOutagesForNode(int nodeId, Date time) throws SQLException { if (time == null) { throw new IllegalArgumentException("Cannot take null parameters."); } Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); long timeLong = time.getTime(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? and node.nodeid=outages.nodeid " + "and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr " + "and (ifregainedservice >= ? or ifregainedservice is null) order by iflostservice desc"); stmt.setInt(1, nodeId); stmt.setTimestamp(2, new Timestamp(timeLong)); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * <p>getOutagesForInterface</p> * * @param nodeId a int. * @param ipInterface a {@link java.lang.String} object. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ public Outage[] getOutagesForInterface(int nodeId, String ipInterface) throws SQLException { Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? and outages.ipaddr=? " + "and node.nodeid=outages.nodeid and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr " + "order by iflostservice desc"); stmt.setInt(1, nodeId); stmt.setString(2, ipInterface); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * Get all current outages and any resolved outages since the given time for * the given interface. * * @param nodeId * this is the node to query * @param ipAddr * this is the interface to query * @param time * no resolved outages older than this time will be returned * @return All current outages and resolved outages no older than * <code>time</code>. * @throws java.sql.SQLException if any. */ public Outage[] getOutagesForInterface(int nodeId, String ipAddr, Date time) throws SQLException { if (ipAddr == null || time == null) { throw new IllegalArgumentException("Cannot take null parameters."); } Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); long timeLong = time.getTime(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? and outages.ipaddr=? " + "and node.nodeid=outages.nodeid and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr " + "and (ifregainedservice >= ? or ifregainedservice is null) " + "order by iflostservice desc"); stmt.setInt(1, nodeId); stmt.setString(2, ipAddr); stmt.setTimestamp(3, new Timestamp(timeLong)); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * <p>getOutagesForService</p> * * @param nodeId a int. * @param ipInterface a {@link java.lang.String} object. * @param serviceId a int. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ public Outage[] getOutagesForService(int nodeId, String ipInterface, int serviceId) throws SQLException { Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? and outages.ipaddr=? and outages.serviceid=? " + "and node.nodeid=outages.nodeid and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr " + "order by iflostservice desc"); stmt.setInt(1, nodeId); stmt.setString(2, ipInterface); stmt.setInt(3, serviceId); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * Get all current outages and any resolved outages since the given time for * the given service. * * @param nodeId * this is the node to query * @param ipAddr * this is the interface to query * @param serviceId * this is the service to query * @param time * no resolved outages older than this time will be returned * @return All current outages and resolved outages no older than * <code>time</code>. * @throws java.sql.SQLException if any. */ public Outage[] getOutagesForService(int nodeId, String ipAddr, int serviceId, Date time) throws SQLException { if (ipAddr == null || time == null) { throw new IllegalArgumentException("Cannot take null parameters."); } Outage[] outages = new Outage[0]; Connection conn = Vault.getDbConnection(); long timeLong = time.getTime(); try { PreparedStatement stmt = conn.prepareStatement("SELECT DISTINCT outages.outageid, outages.iflostservice, outages.ifregainedservice, outages.nodeID, node.nodeLabel, outages.ipaddr, ipinterface.iphostname, service.servicename, outages.serviceId " + "from outages, node, ipinterface, service " + "where outages.nodeid=? " + "and outages.ipaddr=? and outages.serviceid=? " + "and node.nodeid=outages.nodeid and outages.serviceid=service.serviceid and ipinterface.ipaddr=outages.ipaddr " + "and (ifregainedservice >= ? or ifregainedservice is null) " + "order by iflostservice desc"); stmt.setInt(1, nodeId); stmt.setString(2, ipAddr); stmt.setInt(3, serviceId); stmt.setTimestamp(4, new Timestamp(timeLong)); ResultSet rs = stmt.executeQuery(); outages = rs2Outages(rs); rs.close(); stmt.close(); } finally { Vault.releaseDbConnection(conn); } return outages; } /** * Return a list of IP addresses, the number of services down on each IP * address, and the longest time a service has been down for each IP * address. The list will be sorted in ascending order from the service down * longest to the service down shortest. * * @return an array of {@link org.opennms.netmgt.model.outage.OutageSummary} objects. * @throws java.sql.SQLException if any. */ public OutageSummary[] getCurrentOutageSummaries() throws SQLException { OutageSummary[] summaries = new OutageSummary[0]; Connection conn = Vault.getDbConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select distinct outages.nodeid, max(outages.iflostservice) as timeDown, node.nodelabel, now() as timeNow " + "from outages, node, ipinterface, ifservices " + "where ifregainedservice is null " + "and node.nodeid=outages.nodeid and ipinterface.nodeid = outages.nodeid and ifservices.nodeid=outages.nodeid " + "and ipinterface.ipaddr = outages.ipaddr and ifservices.ipaddr = outages.ipaddr " + "and ifservices.serviceid = outages.serviceid " + "and node.nodeType != 'D' and ipinterface.ismanaged != 'D' and ifservices.status != 'D' " + "group by outages.nodeid, node.nodelabel " + "order by timeDown desc;"); List<OutageSummary> list = new ArrayList<OutageSummary>(); while (rs.next()) { int nodeId = rs.getInt("nodeID"); Timestamp timeDownTS = rs.getTimestamp("timeDown"); long timeDown = timeDownTS.getTime(); Date downDate = new Date(timeDown); String nodeLabel = rs.getString("nodelabel"); Date now = new Date(rs.getTimestamp("timeNow").getTime()); list.add(new OutageSummary(nodeId, nodeLabel, downDate, null, now)); } rs.close(); stmt.close(); summaries = list.toArray(new OutageSummary[list.size()]); } finally { Vault.releaseDbConnection(conn); } return summaries; } /** * Return a list of IP addresses, the number of services down on each IP * address, and the longest time a service has been down for each IP * address. The list will be sorted by the amount of time it has been down. * * @param date the starting date for the query * @return an array of {@link org.opennms.netmgt.model.outage.OutageSummary} objects. * @throws java.sql.SQLException if any. */ public OutageSummary[] getAllOutageSummaries(Date date) throws SQLException { OutageSummary[] summaries = new OutageSummary[0]; Connection conn = Vault.getDbConnection(); try { PreparedStatement stmt = conn.prepareStatement( "SELECT DISTINCT outages.nodeid, outages.iflostservice as timeDown, outages.ifregainedservice as timeUp, node.nodelabel " + "FROM outages, node, ipinterface, ifservices " + "WHERE node.nodeid=outages.nodeid AND ipinterface.nodeid=outages.nodeid AND ifservices.nodeid=outages.nodeid " + "AND ipinterface.ipaddr=outages.ipaddr AND ifservices.ipaddr=outages.ipaddr " + "AND ifservices.serviceid=outages.serviceid " + "AND node.nodeType != 'D' " + "AND ipinterface.ismanaged != 'D' " + "AND ifservices.status != 'D' " + "AND outages.iflostservice >= ? " + "ORDER BY timeDown DESC;" ); stmt.setTimestamp(1, new Timestamp(date.getTime())); ResultSet rs = stmt.executeQuery(); List<OutageSummary> list = new ArrayList<OutageSummary>(); while (rs.next()) { int nodeId = rs.getInt("nodeID"); Timestamp timeDown = rs.getTimestamp("timeDown"); Date downDate = new Date(timeDown.getTime()); Timestamp timeUp = rs.getTimestamp("timeUp"); Date upDate = null; if (timeUp != null) { upDate = new Date(timeUp.getTime()); } String nodeLabel = rs.getString("nodelabel"); list.add(new OutageSummary(nodeId, nodeLabel, downDate, upDate)); } rs.close(); stmt.close(); summaries = list.toArray(new OutageSummary[list.size()]); } finally { Vault.releaseDbConnection(conn); } return summaries; } /** * Return a list of IP addresses, the number of services down on each IP * address, and the longest time a service has been down for each IP * address. The list will be sorted in ascending order from the service down * longest to the service down shortest. This is a clone of * getCurrentOutageSummaries for Harrah's (special consideration). * * @return an array of {@link org.opennms.netmgt.model.outage.OutageSummary} objects. * @throws java.sql.SQLException if any. */ public OutageSummary[] getCurrentSDSOutageSummaries() throws SQLException { OutageSummary[] summaries = new OutageSummary[0]; Connection conn = Vault.getDbConnection(); try { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select distinct outages.nodeid, max(outages.iflostservice) as timeDown, node.nodelabel from outages, node, ipinterface, ifservices, assets " + "where ifregainedservice is null " + "and node.nodeid=outages.nodeid and ipinterface.nodeid = outages.nodeid and ifservices.nodeid=outages.nodeid " + "and ipinterface.ipaddr = outages.ipaddr and ifservices.ipaddr = outages.ipaddr " + "and ifservices.serviceid = outages.serviceid " + "and node.nodeType != 'D' and ipinterface.ismanaged != 'D' and ifservices.status != 'D' " + "and assets.nodeid=node.nodeid and assets.displaycategory != 'SDS-A-Side' and assets.displaycategory != 'SDS-B-Side' " + "group by outages.nodeid, node.nodelabel " + "order by timeDown desc;"); List<OutageSummary> list = new ArrayList<OutageSummary>(); while (rs.next()) { int nodeId = rs.getInt("nodeID"); Timestamp timeDownTS = rs.getTimestamp("timeDown"); long timeDown = timeDownTS.getTime(); Date downDate = new Date(timeDown); String nodeLabel = rs.getString("nodelabel"); list.add(new OutageSummary(nodeId, nodeLabel, downDate)); } rs.close(); stmt.close(); summaries = list.toArray(new OutageSummary[list.size()]); } finally { Vault.releaseDbConnection(conn); } return summaries; } /** * <p>rs2Outages</p> * * @param rs a {@link java.sql.ResultSet} object. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ protected static Outage[] rs2Outages(ResultSet rs) throws SQLException { return rs2Outages(rs, true); } /** * <p>rs2Outages</p> * * @param rs a {@link java.sql.ResultSet} object. * @param includesRegainedTime a boolean. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ protected static Outage[] rs2Outages(ResultSet rs, boolean includesRegainedTime) throws SQLException { return rs2Outages(rs, includesRegainedTime, false); } /* * LJK Feb 21, 2002: all these special case result set methods need to be * cleaned up */ /** * <p>rs2Outages</p> * * @param rs a {@link java.sql.ResultSet} object. * @param includesRegainedTime a boolean. * @param includesNotifications a boolean. * @return an array of {@link org.opennms.web.outage.Outage} objects. * @throws java.sql.SQLException if any. */ protected static Outage[] rs2Outages(ResultSet rs, boolean includesRegainedTime, boolean includesNotifications) throws SQLException { Outage[] outages = null; List<Outage> list = new ArrayList<Outage>(); while (rs.next()) { Outage outage = new Outage(); outage.nodeId = rs.getInt("nodeid"); outage.ipAddress = rs.getString("ipaddr"); outage.serviceId = rs.getInt("serviceid"); outage.nodeLabel = rs.getString("nodeLabel"); outage.hostname = rs.getString("iphostname"); outage.serviceName = rs.getString("servicename"); outage.outageId = rs.getInt("outageid"); Timestamp lostService = rs.getTimestamp("iflostservice"); if (!rs.wasNull()) { outage.lostServiceTime = new Date(lostService.getTime()); } if (includesRegainedTime) { Timestamp regainedService = rs.getTimestamp("ifregainedservice"); if (!rs.wasNull()) { outage.regainedServiceTime = new Date(regainedService.getTime()); } } if (includesNotifications) { int serviceLostEventId = rs.getInt("svclosteventid"); if (!rs.wasNull()) { outage.lostServiceEventId = new Integer(serviceLostEventId); } int notifyId = rs.getInt("notifyid"); if (!rs.wasNull()) { outage.lostServiceNotificationId = new Integer(notifyId); } outage.lostServiceNotificationAcknowledgedBy = rs.getString("answeredby"); } list.add(outage); } outages = list.toArray(new Outage[list.size()]); return outages; } }