/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program 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 version 2 of the License.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.enterprise.gui.legacy.action.resource.common.monitor.alerts.config;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.tiles.ComponentContext;
import org.apache.struts.tiles.actions.TilesAction;
import org.apache.struts.util.LabelValueBean;
import org.rhq.core.domain.alert.AlertDampening;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.ResourceFacets;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.gui.legacy.Constants;
import org.rhq.enterprise.gui.legacy.action.resource.ResourceForm.FormContext;
import org.rhq.enterprise.gui.legacy.beans.OptionItem;
import org.rhq.enterprise.gui.legacy.beans.RelatedOptionBean;
import org.rhq.enterprise.gui.legacy.util.RequestUtils;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.legacy.measurement.MeasurementConstants;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
import org.rhq.enterprise.server.measurement.util.MeasurementFormatter;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* Prepare the alert definition form for new / edit.
*/
public abstract class DefinitionFormPrepareAction extends TilesAction {
protected Log log = LogFactory.getLog(DefinitionFormPrepareAction.class);
/**
* Prepare the form for a new alert definition.
*/
@Override
public ActionForward execute(ComponentContext context, ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
DefinitionForm defForm = (DefinitionForm) form;
setupForm(defForm, request);
if (!defForm.isOkClicked()) {
// setting up form for the first time
setupConditions(request, defForm);
}
// respond to an add or remove click- we do this here
// rather than in the edit Action because in between these
// two actions, struts repopulates the form bean and
// resets numConditions to whatever value was submitted in
// the request.
if (defForm.isAddClicked()) {
defForm.setNumConditions(defForm.getNumConditions() + 1);
} else if (defForm.isRemoveClicked()) {
int ri = Integer.parseInt(defForm.getRemove().getX());
log.trace("deleting condition # " + ri);
defForm.deleteCondition(ri);
}
log.trace("defForm.numConditions=" + defForm.getNumConditions());
request.setAttribute("numConditions", defForm.getNumConditions());
// process data types from bottom to top and set the initialise
// the top-most "trigger" radio button
boolean triggerNotSet = defForm.getCondition(0).getTrigger() == null;
ResourceType type = null;
Subject overlord = LookupUtil.getSubjectManager().getOverlord();
FormContext formContext = defForm.getContext();
if (formContext == FormContext.Type) {
type = LookupUtil.getResourceTypeManager().getResourceTypeById(overlord, defForm.getType());
} else if (formContext == FormContext.Resource) {
type = LookupUtil.getResourceManager().getResourceById(overlord, defForm.getId()).getResourceType();
} else if (formContext == FormContext.Group) {
type = LookupUtil.getResourceGroupManager().getResourceGroup(overlord, defForm.getGroupId())
.getResourceType();
} else {
throw new IllegalArgumentException("Unsupported context: " + formContext);
}
ResourceFacets facets = LookupUtil.getResourceTypeManager().getResourceFacets(type.getId());
request.setAttribute("showEvents", facets.isEvent());
if (facets.isEvent() && triggerNotSet)
defForm.getCondition(0).setTrigger("onEvent");
request.setAttribute("showOperations", defForm.getControlActions().size() > 0);
if (defForm.getControlActions().size() > 0 && triggerNotSet)
defForm.getCondition(0).setTrigger("onOperation");
request.setAttribute("showAvailability", defForm.getAvailabilityOptions().length > 0);
if (defForm.getAvailabilityOptions().length > 0 && triggerNotSet)
defForm.getCondition(0).setTrigger("onAvailability");
request.setAttribute("showResourceConfiguration", defForm.isResourceConfigurationSupported());
if (defForm.isResourceConfigurationSupported() && triggerNotSet)
defForm.getCondition(0).setTrigger("onResourceConfiguration");
request.setAttribute("showTraits", defForm.getTraits().size() > 0);
if (defForm.getTraits().size() > 0 && triggerNotSet)
defForm.getCondition(0).setTrigger("onTrait");
boolean isExperimental = LookupUtil.getSystemManager().isExperimentalFeaturesEnabled();
request.setAttribute("showCalltimeMetrics", isExperimental && defForm.getCalltimeMetrics().size() > 0);
if (defForm.getCalltimeMetrics().size() > 0 && triggerNotSet)
defForm.getCondition(0).setTrigger("onCallTime");
request.setAttribute("showMetrics", defForm.getMetrics().size() > 0);
if (defForm.getMetrics().size() > 0 && triggerNotSet)
defForm.getCondition(0).setTrigger("onMeasurement");
return null;
}
@SuppressWarnings("deprecation")
protected void setupForm(DefinitionForm defForm, HttpServletRequest request) throws Exception {
request.setAttribute("dampenNone", AlertDampening.Category.NONE.ordinal());
request.setAttribute("dampenConsecutiveCount", AlertDampening.Category.CONSECUTIVE_COUNT.ordinal());
request.setAttribute("dampenPartialCount", AlertDampening.Category.PARTIAL_COUNT.ordinal());
request.setAttribute("dampenInverseCount", AlertDampening.Category.INVERSE_COUNT.ordinal());
request.setAttribute("dampenDurationCount", AlertDampening.Category.DURATION_COUNT.ordinal());
request.setAttribute("noneDeleted", Constants.ALERT_CONDITION_NONE_DELETED);
MeasurementScheduleManagerLocal scheduleManager = LookupUtil.getMeasurementScheduleManager();
MeasurementDefinitionManagerLocal definitionManager = LookupUtil.getMeasurementDefinitionManager();
ConfigurationManagerLocal configurationManager = LookupUtil.getConfigurationManager();
Subject subject = RequestUtils.getSubject(request);
Resource resource = RequestUtils.getResource(request);
ResourceGroup group = RequestUtils.getResourceGroupIfExists(request);
ResourceType type = null;
if (resource != null) {
// resource alert definition
type = resource.getResourceType();
} else if (group != null) {
// group alert definition
type = group.getResourceType();
} else {
// template alert definition
type = RequestUtils.getResourceType(request);
}
defForm.setResourceType(type.getId());
List<MeasurementDefinition> dataDefinitions = definitionManager.findMeasurementDefinitionsByResourceType(
subject, type.getId(), DataType.MEASUREMENT, null);
List<MeasurementDefinition> calltimeDefinitions = definitionManager.findMeasurementDefinitionsByResourceType(
subject, type.getId(), DataType.CALLTIME, null);
List<MeasurementDefinition> traitDefinitions = definitionManager.findMeasurementDefinitionsByResourceType(
subject, type.getId(), DataType.TRAIT, null);
List<RelatedOptionBean> baselines = new ArrayList<RelatedOptionBean>();
if (resource != null) {
for (MeasurementDefinition definition : dataDefinitions) {
MeasurementSchedule schedule = scheduleManager.getSchedule(subject, resource.getId(), definition
.getId(), false);
RelatedOptionBean rob = new RelatedOptionBean(definition.getName(), String.valueOf(definition.getId()),
getBaselineList(schedule));
baselines.add(rob);
setDisabledName(schedule, definition);
}
for (MeasurementDefinition definition : traitDefinitions) {
MeasurementSchedule schedule = scheduleManager.getSchedule(subject, resource.getId(), definition
.getId(), false);
setDisabledName(schedule, definition);
}
} else {
List<LabelValueBean> defaultBaselineLabels = getBaselineList(null);
for (MeasurementDefinition definition : dataDefinitions) {
RelatedOptionBean rob = new RelatedOptionBean(definition.getName(), String.valueOf(definition.getId()),
defaultBaselineLabels);
baselines.add(rob);
}
}
defForm.setMetrics(dataDefinitions);
defForm.setCalltimeMetrics(calltimeDefinitions);
defForm.setTraits(traitDefinitions);
defForm.setBaselines(baselines);
request.setAttribute("baselines", baselines); // need to duplicate this for the JavaScript on the page
List<OptionItem> controlActions = new ArrayList<OptionItem>();
OperationManagerLocal operationManager = LookupUtil.getOperationManager();
// do not need to eagerly load the definitions because only name and displayName are needed
for (OperationDefinition action : operationManager.findSupportedResourceTypeOperations(subject, type.getId(),
false)) {
OptionItem actionItem = new OptionItem(action.getDisplayName(), action.getName());
controlActions.add(actionItem);
}
defForm.setControlActions(controlActions);
ConfigurationDefinition configurationDefinition = configurationManager
.getResourceConfigurationDefinitionForResourceType(subject, type.getId());
defForm.setResourceConfigurationSupported(configurationDefinition != null);
}
private void setDisabledName(MeasurementSchedule schedule, MeasurementDefinition definition) {
if (schedule == null) {
return;
}
if (schedule.isEnabled() == false) {
String definitionName = definition.getDisplayName();
definition.setDisplayName(definitionName + " (disabled)");
}
}
protected abstract void setupConditions(HttpServletRequest request, DefinitionForm defForm) throws Exception;
@SuppressWarnings("deprecation")
private List<LabelValueBean> getBaselineList(MeasurementSchedule schedule) {
List<LabelValueBean> list = new ArrayList<LabelValueBean>(3);
String minLabel = MeasurementFormatter.getBaselineText(MeasurementConstants.BASELINE_OPT_MIN, schedule);
list.add(new LabelValueBean(minLabel, MeasurementConstants.BASELINE_OPT_MIN));
String meanLabel = MeasurementFormatter.getBaselineText(MeasurementConstants.BASELINE_OPT_MEAN, schedule);
list.add(new LabelValueBean(meanLabel, MeasurementConstants.BASELINE_OPT_MEAN));
String maxLabel = MeasurementFormatter.getBaselineText(MeasurementConstants.BASELINE_OPT_MAX, schedule);
list.add(new LabelValueBean(maxLabel, MeasurementConstants.BASELINE_OPT_MAX));
return list;
}
}