/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2007-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.controller.admin.thresholds;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.opennms.core.utils.InetAddressUtils;
import org.opennms.core.utils.WebSecurityUtils;
import org.opennms.netmgt.EventConstants;
import org.opennms.netmgt.config.EventconfFactory;
import org.opennms.netmgt.config.ThresholdingConfigFactory;
import org.opennms.netmgt.config.threshd.Basethresholddef;
import org.opennms.netmgt.config.threshd.Expression;
import org.opennms.netmgt.config.threshd.Group;
import org.opennms.netmgt.config.threshd.ResourceFilter;
import org.opennms.netmgt.config.threshd.Threshold;
import org.opennms.netmgt.dao.ResourceDao;
import org.opennms.netmgt.dao.support.GenericIndexResourceType;
import org.opennms.netmgt.model.OnmsResourceType;
import org.opennms.netmgt.model.events.EventBuilder;
import org.opennms.netmgt.xml.event.Event;
import org.opennms.netmgt.xml.eventconf.Logmsg;
import org.opennms.web.api.Util;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap;
/**
* <p>ThresholdController class.</p>
*
* @author <a href="mailto:dj@opennms.org">DJ Gregor</a>
* @author <a href="mailto:jeffg@opennms.org">Jeff Gehlbach</a>
* @author <a href="mailto:cmiskell@opennms.org">Craig Miskell</a>
* @author <a href="mailto:agalue@opennms.org">Alejandro Galue</a>
* @author <a href="mailto:tarus@opennms.org">Tarus Balog</a>
*/
public class ThresholdController extends AbstractController implements InitializingBean {
private static final String SAVE_BUTTON_TITLE="Save";
private static final String CANCEL_BUTTON_TITLE="Cancel";
private static final String ADDFILTER_BUTTON_TITLE="Add";
private static final String EDIT_BUTTON_TITLE="Edit";
private static final String DELETE_BUTTON_TITLE="Delete";
private static final String UPDATE_BUTTON_TITLE="Update";
private static final String MOVEUP_BUTTON_TITLE="Up";
private static final String MOVEDOWN_BUTTON_TITLE="Down";
private ResourceDao m_resourceDao;
private boolean eventConfChanged=false;
/** {@inheritDoc} */
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView;
ThresholdingConfigFactory.init();
EventconfFactory.init();
String editGroup = request.getParameter("editGroup");
String deleteThreshold = request.getParameter("deleteThreshold");
String editThreshold = request.getParameter("editThreshold");
String newThreshold = request.getParameter("newThreshold");
String finishThresholdEdit = request.getParameter("finishThresholdEdit");
String deleteExpression = request.getParameter("deleteExpression");
String editExpression = request.getParameter("editExpression");
String newExpression = request.getParameter("newExpression");
String finishExpressionEdit = request.getParameter("finishExpressionEdit");
String groupName=request.getParameter("groupName");
String reloadThreshdConfig=request.getParameter("reloadThreshdConfig");
if(editGroup!=null) {
modelAndView=gotoGroupEdit(groupName);
} else if (newThreshold!=null) {
modelAndView=gotoNewThreshold(groupName);
} else if (editThreshold!=null) {
String thresholdIndexString=request.getParameter("thresholdIndex");
modelAndView=gotoEditThreshold(thresholdIndexString,groupName);
} else if (deleteThreshold!=null) {
String thresholdIndexString=request.getParameter("thresholdIndex");
modelAndView=deleteThreshold(thresholdIndexString, groupName);
} else if (finishThresholdEdit != null) {
modelAndView=finishThresholdEdit(request);
} else if (newExpression!=null) {
modelAndView=gotoNewExpression(groupName);
} else if (editExpression!=null) {
String expressionIndexString=request.getParameter("expressionIndex");
modelAndView=gotoEditExpression(expressionIndexString,groupName);
} else if (deleteExpression!=null) {
String expressionIndexString=request.getParameter("expressionIndex");
modelAndView=deleteExpression(expressionIndexString, groupName);
} else if (finishExpressionEdit != null) {
modelAndView=finishExpressionEdit(request);
} else if (reloadThreshdConfig != null) {
modelAndView=reloadThreshdConfig();
} else {
modelAndView=gotoGroupList();
}
return modelAndView;
}
private ModelAndView gotoGroupEdit(String groupName) {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView=new ModelAndView("admin/thresholds/editGroup");
modelAndView.addObject("group",configFactory.getGroup(groupName));
return modelAndView;
}
private void addStandardEditingBits(ModelAndView modelAndView) {
Map<String,String> dsTypes=new LinkedHashMap<String,String>();
dsTypes.put("node", "Node");
dsTypes.put("if", "Interface"); // "interface" is a wrong word
Collection<OnmsResourceType> resourceTypes = m_resourceDao.getResourceTypes();
Multimap<String,String> genericDsTypes = TreeMultimap.create();
for (OnmsResourceType resourceType : resourceTypes) {
if (resourceType instanceof GenericIndexResourceType)
// Put these in by label to sort them, we'll get them out in a moment
genericDsTypes.put(resourceType.getLabel(), resourceType.getName());
}
// Now get the resource types out of the TreeMultimap
for (String rtLabel : genericDsTypes.keys()) {
Collection<String> rtNames = genericDsTypes.get(rtLabel);
for (String rtName : rtNames) {
if (rtNames.size() > 1)
dsTypes.put(rtName, rtLabel + " [" + rtName + "]");
else
dsTypes.put(rtName, rtLabel);
}
}
// Finally, set the sorted resource types into the model
modelAndView.addObject("dsTypes",dsTypes);
Collection<String> thresholdTypes=new ArrayList<String>();
thresholdTypes.add("high");
thresholdTypes.add("low");
thresholdTypes.add("relativeChange");
thresholdTypes.add("absoluteChange");
thresholdTypes.add("rearmingAbsoluteChange");
modelAndView.addObject("thresholdTypes",thresholdTypes);
Collection<String> filterOperators=new ArrayList<String>();
filterOperators.add("and");
filterOperators.add("or");
modelAndView.addObject("filterOperators",filterOperators);
modelAndView.addObject("saveButtonTitle", SAVE_BUTTON_TITLE);
modelAndView.addObject("cancelButtonTitle", CANCEL_BUTTON_TITLE);
modelAndView.addObject("addFilterButtonTitle", ADDFILTER_BUTTON_TITLE);
modelAndView.addObject("editButtonTitle", EDIT_BUTTON_TITLE);
modelAndView.addObject("deleteButtonTitle", DELETE_BUTTON_TITLE);
modelAndView.addObject("updateButtonTitle", UPDATE_BUTTON_TITLE);
modelAndView.addObject("moveUpButtonTitle", MOVEUP_BUTTON_TITLE);
modelAndView.addObject("moveDownButtonTitle", MOVEDOWN_BUTTON_TITLE);
}
private ModelAndView gotoNewThreshold(String groupName) {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
Group group=configFactory.getGroup(groupName);
//We're assuming that adding a threshold puts it at the end of the current list (i.e. that the Group implementation
// uses a simple List structure, probably ArrayList). We can be a bit cleverer later on and check though, so we should
int thresholdIndex=group.getThresholdCount();
//Check if last threshold has dsName. If not, we assume that is a new definition (not saved yet on thresholds.xml)
Threshold threshold = null;
if (thresholdIndex > 0) {
threshold=group.getThreshold(thresholdIndex-1);
if (threshold.getDsName() == null || threshold.getDsName().equals("")) {
thresholdIndex--;
} else {
threshold = null;
}
}
// create a new threshold object
if (threshold == null) {
threshold=new Threshold();
//Set the two default values which need to be set for the UI to work properly
threshold.setDsType("node");
threshold.setType("high");
threshold.setTrigger(1); //Default to 1 - 0 will give an error, so we may as well be helpful
group.addThreshold(threshold);
}
//Double check the guess index, just in case:
if(threshold!=group.getThreshold(thresholdIndex)) {
//Ok, our guesses on indexing were completely wrong. Failover and check each threshold in the group
for(int i=0; i<group.getThresholdCount(); i++) {
if(threshold==group.getThreshold(i)) {
thresholdIndex=i;
break; //out of the for loop
}
}
}
ModelAndView modelAndView;
modelAndView=new ModelAndView("admin/thresholds/editThreshold");
modelAndView.addObject("threshold",threshold);
modelAndView.addObject("thresholdIndex", thresholdIndex );
modelAndView.addObject("groupName", groupName);
modelAndView.addObject("isNew", true);
addStandardEditingBits(modelAndView);
return modelAndView;
}
private ModelAndView gotoNewExpression(String groupName) {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
Group group=configFactory.getGroup(groupName);
//We're assuming that adding a expression puts it at the end of the current list (i.e. that the Group implementation
// uses a simple List structure, probably ArrayList). We can be a bit cleverer later on and check though, so we should
int expressionIndex=group.getExpressionCount();
//Check if last expression has expression def. If not, we assume that is a new definition (not saved yet on thresholds.xml)
Expression expression = null;
if (expressionIndex > 0) {
expression = group.getExpression(expressionIndex-1);
if (expression.getExpression() == null || expression.getExpression().equals("")) {
expressionIndex--;
} else {
expression = null;
}
}
// create a new expression object
if (expression == null) {
expression=new Expression();
//Set the two default values which need to be set for the UI to work properly
expression.setDsType("node");
expression.setType("high");
expression.setTrigger(1); //Default to 1 - 0 will give an error, so we may as well be helpful
group.addExpression(expression);
}
//Double check the guess index, just in case:
if(expression!=group.getExpression(expressionIndex)) {
//Ok, our guesses on indexing were completely wrong. Failover and check each threshold in the group
for(int i=0; i<group.getExpressionCount(); i++) {
if(expression==group.getExpression(i)) {
expressionIndex=i;
break; //out of the for loop
}
}
}
ModelAndView modelAndView;
modelAndView=new ModelAndView("admin/thresholds/editExpression");
modelAndView.addObject("expression",expression);
modelAndView.addObject("expressionIndex", expressionIndex );
modelAndView.addObject("groupName", groupName);
modelAndView.addObject("isNew", true);
addStandardEditingBits(modelAndView);
return modelAndView;
}
private ModelAndView gotoEditThreshold(String thresholdIndexString, String groupName) throws ServletException {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView;
if(thresholdIndexString==null) {
throw new ServletException("thresholdIndex parameter required to edit a threshold");
}
int thresholdIndex=WebSecurityUtils.safeParseInt(thresholdIndexString);
Threshold threshold=configFactory.getGroup(groupName).getThreshold(thresholdIndex);
modelAndView=new ModelAndView("admin/thresholds/editThreshold");
modelAndView.addObject("threshold", threshold);
modelAndView.addObject("thresholdIndex", thresholdIndex);
modelAndView.addObject("groupName", groupName);
modelAndView.addObject("isNew", false);
addStandardEditingBits(modelAndView);
return modelAndView;
}
private void moveThresholdFilter(Basethresholddef threshold, int oldPos, int newPos) {
if (newPos >= 0 && newPos < threshold.getResourceFilterCount()) {
ResourceFilter oldFilter = (ResourceFilter)threshold.getResourceFilterCollection().get(oldPos);
ResourceFilter newFilter = (ResourceFilter)threshold.getResourceFilterCollection().get(newPos);
threshold.getResourceFilterCollection().set(newPos, oldFilter);
threshold.getResourceFilterCollection().set(oldPos, newFilter);
}
}
@SuppressWarnings("unchecked")
private List<ResourceFilter> getFilterList(HttpServletRequest request, boolean create) {
return (List<ResourceFilter>)request.getSession(create).getAttribute("savedFilters");
}
private void setFilterList(HttpServletRequest request, List<ResourceFilter> filters) {
if (filters == null) {
request.getSession(false).removeAttribute("savedFilters");
} else {
request.getSession(false).setAttribute("savedFilters", filters);
}
}
private ModelAndView finishThresholdFilterEdit(HttpServletRequest request, Basethresholddef threshold) throws ServletException {
boolean isExpression = threshold instanceof Expression;
int thresholdIndex;
if (isExpression) {
thresholdIndex = WebSecurityUtils.safeParseInt(request.getParameter("expressionIndex"));
} else {
thresholdIndex = WebSecurityUtils.safeParseInt(request.getParameter("thresholdIndex"));
}
ModelAndView modelAndView;
if (isExpression) {
modelAndView = new ModelAndView("admin/thresholds/editExpression");
} else {
modelAndView = new ModelAndView("admin/thresholds/editThreshold");
}
List<ResourceFilter> saved = getFilterList(request, true);
if (saved == null || saved.size() == 0) {
saved = new ArrayList<ResourceFilter>(threshold.getResourceFilterCollection());
setFilterList(request, saved);
}
String stringIndex = request.getParameter("filterSelected");
int filterIndex = stringIndex != null && !stringIndex.equals("") ? WebSecurityUtils.safeParseInt(stringIndex) - 1 : 0;
/*
* Save Threshold Filters on HTTP Session in order to restore the original list if user clicks on "Cancel"
*/
String submitAction = request.getParameter("submitAction");
if (ADDFILTER_BUTTON_TITLE.equals(submitAction)) {
String field = request.getParameter("filterField");
String content = request.getParameter("filterRegexp");
if (field != null && !field.equals("") && content != null && !content.equals("")) {
ResourceFilter filter = new ResourceFilter();
filter.setField(field);
filter.setContent(content);
threshold.addResourceFilter(filter);
}
} else if (DELETE_BUTTON_TITLE.equals(submitAction)) {
threshold.getResourceFilterCollection().remove(filterIndex);
} else if (EDIT_BUTTON_TITLE.equals(submitAction)) {
modelAndView.addObject("filterSelected", request.getParameter("filterSelected"));
} else if (UPDATE_BUTTON_TITLE.equals(submitAction)) {
ResourceFilter filter = (ResourceFilter)threshold.getResourceFilterCollection().get(filterIndex);
filter.setField(request.getParameter("updateFilterField"));
filter.setContent(request.getParameter("updateFilterRegexp"));
} else if (MOVEUP_BUTTON_TITLE.equals(submitAction)) {
moveThresholdFilter(threshold, filterIndex, filterIndex - 1);
} else if (MOVEDOWN_BUTTON_TITLE.equals(submitAction)) {
moveThresholdFilter(threshold, filterIndex, filterIndex + 1);
}
commonFinishEdit(request, threshold);
if (isExpression) {
((Expression)threshold).setExpression(request.getParameter("expression"));
} else {
((Threshold)threshold).setDsName(request.getParameter("dsName"));
}
String isNew=request.getParameter("isNew");
if("true".equals(isNew))
modelAndView.addObject("isNew", true);
if (isExpression) {
modelAndView.addObject("expression", threshold);
modelAndView.addObject("expressionIndex", thresholdIndex);
} else {
modelAndView.addObject("threshold", threshold);
modelAndView.addObject("thresholdIndex", thresholdIndex);
}
modelAndView.addObject("groupName", request.getParameter("groupName"));
addStandardEditingBits(modelAndView);
return modelAndView;
}
private ModelAndView gotoEditExpression(String expressionIndexString, String groupName) throws ServletException {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView;
if(expressionIndexString==null) {
throw new ServletException("expressionIndex parameter required to edit a threshold");
}
int expressionIndex=WebSecurityUtils.safeParseInt(expressionIndexString);
Expression expression=configFactory.getGroup(groupName).getExpression(expressionIndex);
modelAndView=new ModelAndView("admin/thresholds/editExpression");
modelAndView.addObject("expression", expression);
modelAndView.addObject("expressionIndex", expressionIndex);
modelAndView.addObject("groupName", groupName);
modelAndView.addObject("isNew", false);
addStandardEditingBits(modelAndView);
return modelAndView;
}
private EventBuilder createEventBuilder(String uei) {
EventBuilder ebldr = new EventBuilder(uei, "Web UI");
ebldr.setHost(InetAddressUtils.getLocalHostName());
return ebldr;
}
private void sendNotifEvent(Event event) throws ServletException {
try {
Util.createEventProxy().send(event);
} catch (Throwable e) {
throw new ServletException("Could not send event " + event.getUei(), e);
}
}
private void saveChanges() throws ServletException {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
try {
configFactory.saveCurrent();
EventBuilder ebldr = createEventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_UEI);
ebldr.addParam(EventConstants.PARM_DAEMON_NAME, "Threshd");
ebldr.addParam(EventConstants.PARM_CONFIG_FILE_NAME, "thresholds.xml");
sendNotifEvent(ebldr.getEvent());
} catch (Throwable e) {
throw new ServletException("Could not save the changes to the threshold because "+e.getMessage(),e);
}
if(eventConfChanged) {
try {
EventconfFactory.getInstance().saveCurrent();
sendNotifEvent(createEventBuilder(EventConstants.EVENTSCONFIG_CHANGED_EVENT_UEI).getEvent());
} catch (Throwable e) {
throw new ServletException("Could not save the changes to the event configuration because "+e.getMessage(),e);
}
eventConfChanged=false;
}
}
private ModelAndView deleteThreshold(String thresholdIndexString, String groupName) throws ServletException {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView;
if(thresholdIndexString==null) {
throw new ServletException("thresholdIndex parameter required to delete a threshold");
}
int thresholdIndex=WebSecurityUtils.safeParseInt(thresholdIndexString);
Group group=configFactory.getGroup(groupName);
group.removeThreshold(group.getThreshold(thresholdIndex));
//and setup the group view again
modelAndView=new ModelAndView("admin/thresholds/editGroup");
modelAndView.addObject("group",configFactory.getGroup(groupName));
saveChanges();
return modelAndView;
}
private ModelAndView reloadThreshdConfig() throws ServletException {
try {
EventBuilder ebldr = createEventBuilder(EventConstants.RELOAD_DAEMON_CONFIG_UEI);
ebldr.addParam(EventConstants.PARM_DAEMON_NAME, "Threshd");
ebldr.addParam(EventConstants.PARM_CONFIG_FILE_NAME, "threshd-configuration.xml");
sendNotifEvent(ebldr.getEvent());
} catch (Throwable e) {
throw new ServletException("Could not reload threshd-configuration.xml because "+e.getMessage(),e);
}
return gotoGroupList();
}
private ModelAndView deleteExpression(String expressionIndexString, String groupName) throws ServletException {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView;
if(expressionIndexString==null) {
throw new ServletException("expressionIndex parameter required to delete a threshold expression");
}
int expressionIndex=WebSecurityUtils.safeParseInt(expressionIndexString);
Group group=configFactory.getGroup(groupName);
group.removeExpression(group.getExpression(expressionIndex));
saveChanges();
//and setup the group view again
modelAndView=new ModelAndView("admin/thresholds/editGroup");
modelAndView.addObject("group",configFactory.getGroup(groupName));
return modelAndView;
}
private void commonFinishEdit(HttpServletRequest request, Basethresholddef baseDef) {
String dsLabel=request.getParameter("dsLabel");
if(dsLabel==null || "".equals(dsLabel)) {
baseDef.setDsLabel(null); //Must set null in correct circumstances - empty string isn't quite the same thing
} else {
baseDef.setDsLabel(dsLabel);
}
String description=request.getParameter("description");
if(description==null || "".equals(description)) {
baseDef.setDescription(null);
} else {
baseDef.setDescription(description);
}
String triggeredUEI=request.getParameter("triggeredUEI");
if(triggeredUEI==null || "".equals(triggeredUEI)) {
baseDef.setTriggeredUEI(null); //Must set null in correct circumstances - empty string isn't quite the same thing
} else {
baseDef.setTriggeredUEI(triggeredUEI);
this.ensureUEIInEventConf(triggeredUEI, "exceeded");
}
String rearmedUEI=request.getParameter("rearmedUEI");
if(rearmedUEI==null || "".equals(rearmedUEI)) {
baseDef.setRearmedUEI(null); //Must set null in correct circumstances - empty string isn't quite the same thing
} else {
baseDef.setRearmedUEI(rearmedUEI);
this.ensureUEIInEventConf(rearmedUEI, "rearmed");
}
baseDef.setDsType(request.getParameter("dsType"));
baseDef.setType(request.getParameter("type"));
baseDef.setRearm(WebSecurityUtils.safeParseDouble(request.getParameter("rearm")));
baseDef.setTrigger(WebSecurityUtils.safeParseInt(request.getParameter("trigger")));
baseDef.setValue(WebSecurityUtils.safeParseDouble(request.getParameter("value")));
}
private void ensureUEIInEventConf(String uei, String typeDesc) {
List<org.opennms.netmgt.xml.eventconf.Event> eventsForUEI=EventconfFactory.getInstance().getEvents(uei);
if(eventsForUEI==null || eventsForUEI.size()==0) {
//UEI doesn't exist. Add it
org.opennms.netmgt.xml.eventconf.Event event=new org.opennms.netmgt.xml.eventconf.Event();
event.setUei(uei);
event.setEventLabel("User-defined threshold event "+uei);
event.setDescr("Threshold "+typeDesc+" for %service% datasource " +
"%parm[ds]% on interface %interface%, parms: %parm[all]%");
Logmsg logmsg=new Logmsg();
logmsg.setDest("logndisplay");
logmsg.setContent("Threshold "+typeDesc+" for %service% datasource %parm[ds]% on interface %interface%, parms: %parm[all]%");
event.setLogmsg(logmsg);
event.setSeverity("Warning");
EventconfFactory.getInstance().addEventToProgrammaticStore(event);
eventConfChanged=true;
}
}
private ModelAndView finishThresholdEdit(HttpServletRequest request) throws ServletException {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView;
String groupName=request.getParameter("groupName");
String submitAction=request.getParameter("submitAction");
Group group=configFactory.getGroup(groupName);
String thresholdIndexString=request.getParameter("thresholdIndex");
if(thresholdIndexString==null) {
throw new ServletException("thresholdIndex parameter required to modify or delete a threshold");
}
int thresholdIndex=WebSecurityUtils.safeParseInt(thresholdIndexString);
Threshold threshold=group.getThreshold(thresholdIndex); // TODO: NMS-4249, maybe a try/catch and add default on exception?
if(SAVE_BUTTON_TITLE.equals(submitAction)) {
this.commonFinishEdit(request, threshold);
String dsName = request.getParameter("dsName");
if (dsName == null || dsName.equals("")) {
throw new ServletException("ds-name cannot be null or empty string");
}
threshold.setDsName(dsName);
threshold.setFilterOperator(request.getParameter("filterOperator"));
saveChanges();
} else if (CANCEL_BUTTON_TITLE.equals(submitAction)) {
String isNew=request.getParameter("isNew");
if("true".equals(isNew)) {
//It was a new Threshold, but the user hit cancel. Remove the new threshold from the group
group.removeThreshold(threshold);
} else {
List<ResourceFilter> filters = getFilterList(request, false);
if (filters != null)
threshold.setResourceFilter(filters);
}
} else {
return finishThresholdFilterEdit(request, threshold);
}
// Remove Filters from Session
setFilterList(request, null);
//and got back to the editGroup page
modelAndView=new ModelAndView("admin/thresholds/editGroup");
modelAndView.addObject("group",group);
return modelAndView;
}
private ModelAndView finishExpressionEdit(HttpServletRequest request) throws ServletException {
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView;
String groupName=request.getParameter("groupName");
String submitAction=request.getParameter("submitAction");
Group group=configFactory.getGroup(groupName);
String expressionIndexString=request.getParameter("expressionIndex");
if(expressionIndexString==null) {
throw new ServletException("expressionIndex parameter required to modify or delete a threshold expression");
}
int expressionIndex=WebSecurityUtils.safeParseInt(expressionIndexString);
Expression expression=group.getExpression(expressionIndex);
if(SAVE_BUTTON_TITLE.equals(submitAction)) {
this.commonFinishEdit(request, expression);
String expDef = request.getParameter("expression");
if (expDef == null || expDef.equals("")) {
throw new ServletException("expression content cannot be null or empty string");
}
expression.setExpression(expDef);
expression.setFilterOperator(request.getParameter("filterOperator"));
saveChanges();
} else if (CANCEL_BUTTON_TITLE.equals(submitAction)) {
String isNew=request.getParameter("isNew");
if("true".equals(isNew)) {
//It was a new Threshold, but the user hit cancel. Remove the new threshold from the group
group.removeExpression(expression);
} else {
List<ResourceFilter> filters = getFilterList(request, false);
if (filters != null)
expression.setResourceFilter(filters);
}
} else {
return finishThresholdFilterEdit(request, expression);
}
// Remove Filters from Session
setFilterList(request, null);
//and got back to the editGroup page
modelAndView=new ModelAndView("admin/thresholds/editGroup");
modelAndView.addObject("group",configFactory.getGroup(groupName));
return modelAndView;
}
private ModelAndView gotoGroupList() throws ServletException {
//Always reload to get a consistent view of the thresholds before we start editing.
//Otherwise we'll be dealing with questions on the mailing lists for the rest of our lives
try {
ThresholdingConfigFactory.reload();
} catch (Throwable e) {
throw new ServletException("Could not reload ThresholdingConfigFactory because "+e.getMessage(), e);
}
ThresholdingConfigFactory configFactory=ThresholdingConfigFactory.getInstance();
ModelAndView modelAndView= new ModelAndView("admin/thresholds/list");
Map<String, Group> groupMap=new HashMap<String,Group>();
for(String aName:configFactory.getGroupNames()) {
groupMap.put(aName, configFactory.getGroup(aName));
}
modelAndView.addObject("groupMap", groupMap);
return modelAndView;
}
/**
* <p>afterPropertiesSet</p>
*
* @throws java.lang.Exception if any.
*/
@Override
public void afterPropertiesSet() throws Exception {
//Check all properties set (see example if needed)
/*if (m_resourceService == null) {
throw new IllegalStateException(
"property resourceService must be set");
}*/
}
/**
* <p>setResourceDao</p>
*
* @param resourceDao a {@link org.opennms.netmgt.dao.ResourceDao} object.
*/
public void setResourceDao(ResourceDao resourceDao) {
m_resourceDao = resourceDao;
}
}