/*
* RHQ Management Platform
* Copyright (C) 2005-2009 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.alert.common;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import javax.faces.application.FacesMessage;
import org.rhq.core.domain.alert.notification.AlertNotification;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.gui.util.FacesContextUtility;
import org.rhq.enterprise.gui.alert.converter.AlertNotificationConverter;
import org.rhq.enterprise.gui.common.framework.EnterpriseFacesContextUIBean;
import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal;
/**
* Backing bean for Alert Sender Plugins configuration
*
* @author Justin Harris
*/
//@Scope(ScopeType.EVENT)
//@Name("alertNotificationsUIBean")
public class AlertNotificationsUIBean extends EnterpriseFacesContextUIBean {
// @RequestParameter("nid")
private Integer notificationId;
// @RequestParameter("context")
private String context;
// @RequestParameter("contextId")
private Integer contextId;
// @In
private AlertNotificationManagerLocal alertNotificationManager;
private List<AlertNotification> alertNotifications;
private Set<AlertNotification> selectedNotifications;
private String selectedNewSender;
private AlertNotification activeNotification;
private ConfigurationDefinition activeConfigDefinition;
private AlertNotificationConverter notificationConverter;
private Map<String, String> alertSenders;
public List<AlertNotification> getAlertNotifications() {
return alertNotifications;
}
public void setAlertNotifications(List<AlertNotification> alertNotifications) {
this.alertNotifications = alertNotifications;
}
public Set<AlertNotification> getSelectedNotifications() {
return selectedNotifications;
}
public void setSelectedNotifications(Set<AlertNotification> selectedNotifications) {
this.selectedNotifications = selectedNotifications;
}
public String getSelectedNewSender() {
return selectedNewSender;
}
public void setSelectedNewSender(String selectedNewSender) {
this.selectedNewSender = selectedNewSender;
}
public AlertNotification getActiveNotification() {
return activeNotification;
}
public void setActiveNotification(AlertNotification activeNotification) {
this.activeNotification = activeNotification;
lookupActiveConfigDefinition();
}
public ConfigurationDefinition getActiveConfigDefinition() {
return activeConfigDefinition;
}
public AlertNotificationConverter getNotificationConverter() {
return notificationConverter;
}
public Map<String, String> getAlertSenders() {
return this.alertSenders;
}
private void lookupActiveConfigDefinition() {
if (this.activeNotification != null) {
String senderName = this.activeNotification.getSenderName();
this.activeConfigDefinition = this.alertNotificationManager.getConfigurationDefinitionForSender(senderName);
}
}
// @Create
public void initNotifications() {
reloadAlertNotifications();
this.selectedNotifications = new HashSet<AlertNotification>();
this.notificationConverter = new AlertNotificationConverter();
this.notificationConverter.setAlertNotifications(alertNotifications);
this.alertSenders = lookupAlertSenders();
selectActiveNotification();
}
public void reloadAlertNotifications() {
this.alertNotifications = this.alertNotificationManager.getNotificationsForAlertDefinition(getSubject(),
contextId);
}
// Sets the initial state of the bean given the requrest parameters, this allows
// us to maintain the selected item across requests.
private void selectActiveNotification() {
if (this.notificationId != null) {
for (AlertNotification notification : this.alertNotifications) {
if (notification.getId() == this.notificationId) {
setActiveNotification(notification);
this.selectedNotifications.add(notification);
return;
}
}
}
}
private Map<String, String> lookupAlertSenders() {
Map<String, String> result = new TreeMap<String, String>();
for (String sender : this.alertNotificationManager.listAllAlertSenders()) {
result.put(sender, sender);
}
return result;
}
public String addAlertSender() {
try {
Configuration newSenderConfig = null;
ConfigurationDefinition configDefinition = this.alertNotificationManager
.getConfigurationDefinitionForSender(this.selectedNewSender);
if (configDefinition != null) {
newSenderConfig = configDefinition.getDefaultTemplate().createConfiguration();
} else {
newSenderConfig = new Configuration();
}
AlertNotification newNotification = new AlertNotification(this.selectedNewSender, newSenderConfig);
AlertNotification newlyCreated = this.alertNotificationManager.addAlertNotification(getSubject(),
this.contextId, newNotification);
reloadAlertNotifications();
this.activeNotification = newlyCreated;
this.selectedNotifications.clear();
this.selectedNotifications.add(this.activeNotification);
} catch (Throwable t) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to create alert notification", t);
}
return OUTCOME_SUCCESS;
}
public String saveConfiguration() {
try {
if (this.activeNotification != null) {
this.alertNotificationManager.updateAlertNotification(getSubject(), this.contextId,
this.activeNotification);
reselectActiveNotificationUsingDataComparison(this.activeNotification);
}
} catch (Throwable t) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to save alert notification", t);
}
return OUTCOME_SUCCESS;
}
public void reselectActiveNotificationUsingDataComparison(AlertNotification notificationWithLatestData) {
/*
* figure out which one should be selected from the backing store. this method should be called after
* executing save() from either the AlertNotificationUIBean or CustomContentUIBean. the effect of updating
* an alert notification will overwrite all existing notifications with the latest data. since the ids
* of the alert notifications are difference after a save-action, but since we know what the new data should
* be based off of the last known state of the activeNotification from above, we can select the correct one
* by testing for data equality.
*/
reloadAlertNotifications();
for (AlertNotification nextNotification : this.alertNotifications) {
if (nextNotification.equalsData(notificationWithLatestData)) {
this.activeNotification = nextNotification;
this.selectedNotifications.clear();
this.selectedNotifications.add(this.activeNotification);
}
}
}
public String removeSelected() {
try {
this.alertNotificationManager.removeNotifications(getSubject(), this.contextId, getSelectedIds());
this.alertNotifications.removeAll(this.selectedNotifications); // only remove if no errors
this.activeNotification = null;
} catch (Throwable t) {
FacesContextUtility.addMessage(FacesMessage.SEVERITY_ERROR, "Failed to save remove notifications", t);
}
return OUTCOME_SUCCESS;
}
private Integer[] getSelectedIds() {
Integer[] results = new Integer[this.selectedNotifications.size()];
int i = 0;
for (AlertNotification nextNotification : selectedNotifications) {
results[i++] = nextNotification.getId();
}
return results;
}
}