From 60edb9c78155c6be598a73efce598e7a56f75f73 Mon Sep 17 00:00:00 2001 From: Ronald Roskens Date: Sun, 16 Sep 2012 21:46:38 -0500 Subject: [PATCH] NMS-632: Add additive search ability for exactUei filter. The filter builder in EventFilterController is an exclusive filter. The SQL statement it builds is an "AND"ed list of all filters listed via the web page. This is problematic, since you can only specify a single UEI to include, along with a large list of UEIs to exclude. If you start to filter down the events to show, you eventually run into the GET header size limit. We solve these problems by putting all exactUei filters into their own list, which we then add as an OrFilter to the filters list we pass through to EventCriteria. We still keep the list of all filters as a single list since the web UI page does not handle the an "OR" list. Add a form to the event list page to allow the user to select additional UEIs to add to the list of events to show. --- .../controller/event/EventFilterController.java | 20 ++- .../src/main/webapp/WEB-INF/jsp/event/list.jsp | 165 ++++++++++++++++----- 2 files changed, 144 insertions(+), 41 deletions(-) diff --git a/opennms-webapp/src/main/java/org/opennms/web/controller/event/EventFilterController.java b/opennms-webapp/src/main/java/org/opennms/web/controller/event/EventFilterController.java index 00582e6..2a57175 100644 --- a/opennms-webapp/src/main/java/org/opennms/web/controller/event/EventFilterController.java +++ b/opennms-webapp/src/main/java/org/opennms/web/controller/event/EventFilterController.java @@ -44,6 +44,7 @@ import org.opennms.web.event.WebEventRepository; import org.opennms.web.event.filter.EventCriteria; import org.opennms.web.event.filter.EventIdFilter; import org.opennms.web.filter.Filter; +import org.opennms.web.filter.OrFilter; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; import org.springframework.web.servlet.ModelAndView; @@ -100,7 +101,13 @@ public class EventFilterController extends AbstractController implements Initial */ @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + // filterList contains all filters from the user. List filterList = new ArrayList(); + // exactUEIList contains all exactUei filters. + List exactUEIList = new ArrayList(); + // sqlFilterList contains non exactUei filters, and an or filter for exactUeiList. + List sqlFilterList = new ArrayList(); + AcknowledgeType ackType = m_defaultEventType; String display = request.getParameter("display"); @@ -141,6 +148,7 @@ public class EventFilterController extends AbstractController implements Initial if (idString != null) { // asking for a specific ID; only filter should be event ID filterList.add(new EventIdFilter(WebSecurityUtils.safeParseInt(idString))); + sqlFilterList = filterList; ackType = null; } else { // otherwise, apply filters/acktype/etc. @@ -159,13 +167,23 @@ public class EventFilterController extends AbstractController implements Initial Filter filter = EventUtil.getFilter(filterString, getServletContext()); if (filter != null) { filterList.add(filter); + + if (filterString.startsWith("exactUei=")) { + exactUEIList.add(filter); + } else { + sqlFilterList.add(filter); + } + } } } + if (exactUEIList.size() > 0) { + sqlFilterList.add(new OrFilter(exactUEIList.toArray(new Filter[0]))); } } Filter[] filters = filterList.toArray(new Filter[0]); + Filter[] sqlFilters = sqlFilterList.toArray(new Filter[0]); EventQueryParms parms = new EventQueryParms(); parms.ackType = ackType; @@ -175,7 +193,7 @@ public class EventFilterController extends AbstractController implements Initial parms.multiple = multiple; parms.sortStyle = sortStyle; - EventCriteria queryCriteria = new EventCriteria(filters, sortStyle, ackType, limit, limit * multiple); + EventCriteria queryCriteria = new EventCriteria(sqlFilters, sortStyle, ackType, limit, limit * multiple); Event[] events = m_webEventRepository.getMatchingEvents(queryCriteria); diff --git a/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp b/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp index 24e31cb..3a98abb 100644 --- a/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp +++ b/opennms-webapp/src/main/webapp/WEB-INF/jsp/event/list.jsp @@ -29,39 +29,48 @@ --%> -<%@page language="java" contentType="text/html" session="true" %> - -<%@page import="java.util.List"%> -<%@page import="java.util.ArrayList"%> - -<%@page import="org.opennms.core.utils.WebSecurityUtils"%> -<%@page import="org.opennms.web.servlet.XssRequestWrapper"%> -<%@page import="org.opennms.web.springframework.security.Authentication"%> - -<%@page import="org.opennms.web.admin.notification.noticeWizard.NotificationWizardServlet"%> - -<%@page import="org.opennms.web.filter.Filter"%> - -<%@page import="org.opennms.web.event.Event"%> -<%@page import="org.opennms.web.event.EventQueryParms"%> -<%@page import="org.opennms.web.event.EventUtil"%> - -<%@page import="org.opennms.web.controller.event.AcknowledgeEventController"%> - -<%@page import="org.opennms.web.event.filter.SeverityFilter"%> -<%@page import="org.opennms.web.event.filter.NegativeSeverityFilter"%> -<%@page import="org.opennms.web.event.filter.AfterDateFilter"%> -<%@page import="org.opennms.web.event.filter.BeforeDateFilter"%> -<%@page import="org.opennms.web.event.filter.NodeFilter"%> -<%@page import="org.opennms.web.event.filter.NegativeNodeFilter"%> -<%@page import="org.opennms.web.event.filter.InterfaceFilter"%> -<%@page import="org.opennms.web.event.filter.NegativeInterfaceFilter"%> -<%@page import="org.opennms.web.event.filter.ServiceFilter"%> -<%@page import="org.opennms.web.event.filter.NegativeServiceFilter"%> -<%@page import="org.opennms.web.event.filter.AcknowledgedByFilter"%> -<%@page import="org.opennms.web.event.filter.NegativeAcknowledgedByFilter"%> -<%@page import="org.opennms.web.event.filter.ExactUEIFilter"%> -<%@page import="org.opennms.web.event.filter.NegativeExactUEIFilter"%> +<%@page language="java" contentType="text/html" session="true" + import="java.util.ArrayList, + java.util.List, + java.util.Map, + java.util.Map.Entry, + java.util.Properties, + java.util.TreeMap, + java.io.FileNotFoundException, + java.io.FileInputStream, + java.io.IOException, + org.opennms.core.utils.WebSecurityUtils, + org.opennms.web.admin.notification.noticeWizard.NotificationWizardServlet, + org.opennms.web.controller.event.AcknowledgeEventController, + org.opennms.web.filter.Filter, + org.opennms.web.event.AcknowledgeType, + org.opennms.web.event.Event, + org.opennms.web.event.EventQueryParms, + org.opennms.web.event.EventUtil, + org.opennms.web.event.filter.SeverityFilter, + org.opennms.web.event.filter.NegativeSeverityFilter, + org.opennms.web.event.filter.AfterDateFilter, + org.opennms.web.event.filter.BeforeDateFilter, + org.opennms.web.event.filter.NodeFilter, + org.opennms.web.event.filter.NegativeNodeFilter, + org.opennms.web.event.filter.InterfaceFilter, + org.opennms.web.event.filter.NegativeInterfaceFilter, + org.opennms.web.event.filter.ServiceFilter, + org.opennms.web.event.filter.NegativeServiceFilter, + org.opennms.web.event.filter.AcknowledgedByFilter, + org.opennms.web.event.filter.NegativeAcknowledgedByFilter, + org.opennms.web.event.filter.ExactUEIFilter, + org.opennms.web.event.filter.NegativeExactUEIFilter, + org.opennms.web.event.SortStyle, + org.opennms.web.servlet.XssRequestWrapper, + org.opennms.web.springframework.security.Authentication, + org.opennms.netmgt.config.*, + org.opennms.netmgt.config.notifications.*, + org.opennms.core.utils.BundleLists, + org.opennms.core.utils.ConfigFileConstants, + org.springframework.core.io.FileSystemResource + " +%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> @@ -76,6 +85,19 @@ parameters used to make this query --%> +<%! + private DefaultEventConfDao m_eventConfDao; + + public void init() throws ServletException { + try { + m_eventConfDao = new DefaultEventConfDao(); + m_eventConfDao.setConfigResource(new FileSystemResource(ConfigFileConstants.getFile(ConfigFileConstants.EVENT_CONF_FILE_NAME))); + m_eventConfDao.afterPropertiesSet(); + } catch (Throwable e) { + throw new ServletException("Cannot load configuration file", e); + } + } +%> <% XssRequestWrapper req = new XssRequestWrapper(request); @@ -99,19 +121,13 @@ pageContext.setAttribute("addBeforeFilter", "[>]"); pageContext.setAttribute("addAfterFilter", "[<]"); %> - - - - -<%@page import="org.opennms.web.event.AcknowledgeType"%> -<%@page import="org.opennms.web.event.SortStyle"%> + - @@ -259,6 +282,14 @@ <% Filter filter = (Filter)parms.filters.get(i); %>   <%= WebSecurityUtils.sanitizeString(filter.getTextDescription()) %>[-] <% } %> + +
+ + + +

<% } %> @@ -570,3 +601,57 @@ } %> +<%! + public String buildEventSelect() + throws IOException, FileNotFoundException + { + List events = m_eventConfDao.getEventsByLabel(); + StringBuffer buffer = new StringBuffer(); + + List excludeList = getExcludeList(); + TreeMap sortedMap = new TreeMap(); + + for(org.opennms.netmgt.xml.eventconf.Event e : events) { + String uei = e.getUei(); + String label = e.getEventLabel(); + String trimmedUei = stripUei(uei); + if (!excludeList.contains(trimmedUei)) { + sortedMap.put(label,uei); + System.out.println("sortedMap.put('"+label+"', '"+uei+"')"); + } + } + for(Map.Entry me : sortedMap.entrySet()) { + buffer.append(""); + } + + return buffer.toString(); + } + + public String stripUei(String uei) + { + String leftover = uei; + + for (int i = 0; i < 3; i++) + { + leftover = leftover.substring(leftover.indexOf('/')+1); + } + + return leftover; + } + + public List getExcludeList() throws IOException, FileNotFoundException + { + List excludes = new ArrayList(); + + Properties excludeProperties = new Properties(); + excludeProperties.load( new FileInputStream( ConfigFileConstants.getFile(ConfigFileConstants.EXCLUDE_UEI_FILE_NAME ))); + String[] ueis = BundleLists.parseBundleList( excludeProperties.getProperty( "excludes" )); + + for (int i = 0; i < ueis.length; i++) + { + excludes.add(ueis[i]); + } + + return excludes; + } +%> -- 1.7.11.4