modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java | 12 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractNotificationSenderForm.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java | 10 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SimpleNotificationSenderForm.java | 19 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SystemUsersNotificationSenderForm.java | 203 ++++++++++ modules/enterprise/server/plugins/alert-subject/pom.xml | 21 - modules/enterprise/server/plugins/alert-subject/src/main/java/org/rhq/enterprise/server/plugins/alertSubject/SubjectsBackingBean.java | 84 ---- modules/enterprise/server/plugins/alert-subject/src/main/resources/META-INF/rhq-serverplugin.xml | 14 modules/enterprise/server/plugins/alert-subject/src/main/resources/subjects.xhtml | 22 - 9 files changed, 241 insertions(+), 146 deletions(-)
New commits: commit 51ddbfc1c712a4e7cad1812007e77ef17de3e3ba Author: John Mazzitelli mazz@redhat.com Date: Mon Oct 4 15:25:22 2010 -0400
implement the new alert-subject server plugin notification editor. this needs to be tested to make sure the sender still works. but the notification configuration is consistent with how it was before so it should work
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java index 4e9418c..af0882f 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/SubjectCriteria.java @@ -22,10 +22,13 @@ */ package org.rhq.core.domain.criteria;
+import java.util.List; + import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType;
import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.util.CriteriaUtils; import org.rhq.core.domain.util.PageOrdering;
/** @@ -45,7 +48,8 @@ public class SubjectCriteria extends Criteria { private String filterPhoneNumber; private String filterDepartment; private Boolean filterFactive; - private Integer filterRoleId; + private Integer filterRoleId; // needs overrides + private List<Integer> filterIds; // needs overrides
private boolean fetchConfiguration; private boolean fetchRoles; @@ -64,6 +68,8 @@ public class SubjectCriteria extends Criteria { + " FROM Subject innerSubject " // + " JOIN innerSubject.roles innerRole " // + " WHERE innerRole.id = ? )"); + + filterOverrides.put("ids", "id IN ( ? )"); }
@Override @@ -111,6 +117,10 @@ public class SubjectCriteria extends Criteria { this.filterRoleId = filterRoleId; }
+ public void addFilterIds(Integer... filterIds) { + this.filterIds = CriteriaUtils.getListIgnoringNulls(filterIds); + } + public void fetchConfiguration(boolean fetchConfiguration) { this.fetchConfiguration = fetchConfiguration; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractNotificationSenderForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractNotificationSenderForm.java index 5b8b0b4..0dabe26 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractNotificationSenderForm.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/AbstractNotificationSenderForm.java @@ -99,4 +99,6 @@ public abstract class AbstractNotificationSenderForm extends LocatableVLayout { public void setExtraConfiguration(Configuration extraConfiguration) { this.extraConfiguration = extraConfiguration; } + + public abstract boolean validate(); } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java index 390357c..7d8745d 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewNotificationEditor.java @@ -147,8 +147,12 @@ public class NewNotificationEditor extends LocatableDynamicForm { @Override public void onClick(ClickEvent event) { if (validate(false)) { - saveNewNotification(); - closeFunction.run(); + AbstractNotificationSenderForm senderForm = (AbstractNotificationSenderForm) senderCanvasItem + .getCanvas(); + if (senderForm.validate()) { + saveNewNotification(); + closeFunction.run(); + } } } }); @@ -214,7 +218,7 @@ public class NewNotificationEditor extends LocatableDynamicForm { // For those that want to write their own custom alert plugins, you are restricted to // using configuration definitions as the only way to configure the sender. if ("System Users".equals(sender)) { - newCanvas = null; // TODO + newCanvas = new SystemUsersNotificationSenderForm(newLocatorId, notificationToEdit, sender); } else if ("System Roles".equals(sender)) { newCanvas = null; // TODO } else if ("Resource Operations".equals(sender)) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SimpleNotificationSenderForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SimpleNotificationSenderForm.java index 4a16380..65ddcd9 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SimpleNotificationSenderForm.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SimpleNotificationSenderForm.java @@ -41,6 +41,8 @@ import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; */ public class SimpleNotificationSenderForm extends AbstractNotificationSenderForm {
+ private ConfigurationEditor configEditor; + public SimpleNotificationSenderForm(String locatorId, AlertNotification notif, String sender) { super(locatorId, notif, sender); } @@ -53,10 +55,10 @@ public class SimpleNotificationSenderForm extends AbstractNotificationSenderForm new AsyncCallback<ConfigurationDefinition>() { @Override public void onSuccess(ConfigurationDefinition configDef) { - ConfigurationEditor configEditor = new ConfigurationEditor(extendLocatorId("configEditor"), - configDef, getConfiguration()); - configEditor.setHeight(500); - configEditor.setWidth(500); + configEditor = new ConfigurationEditor(extendLocatorId("configEditor"), configDef, + getConfiguration()); + configEditor.setHeight(400); + configEditor.setWidth(600); addMember(configEditor); markForRedraw(); } @@ -72,4 +74,13 @@ public class SimpleNotificationSenderForm extends AbstractNotificationSenderForm } }); } + + @Override + public boolean validate() { + if (configEditor != null) { + return configEditor.validate(); + } + return true; + } + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SystemUsersNotificationSenderForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SystemUsersNotificationSenderForm.java new file mode 100644 index 0000000..cdbaedf --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/SystemUsersNotificationSenderForm.java @@ -0,0 +1,203 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2010 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, version 2, as + * published by the Free Software Foundation, and/or the GNU Lesser + * General Public License, version 2.1, also as published by the Free + * Software Foundation. + * + * 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 and the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * and the GNU Lesser General Public License along with this program; + * if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.rhq.enterprise.gui.coregui.client.alert.definitions; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.Criteria; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.grid.ListGridRecord; + +import org.rhq.core.domain.alert.notification.AlertNotification; +import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.configuration.PropertySimple; +import org.rhq.core.domain.criteria.SubjectCriteria; +import org.rhq.core.domain.util.PageList; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource; +import org.rhq.enterprise.gui.coregui.client.components.selector.AbstractSelector; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; + +/** + * This notification form will be used for the System Users sender. This form lets + * you pick users that the sender will send notifications to. + * + * @author John Mazzitelli + */ +public class SystemUsersNotificationSenderForm extends AbstractNotificationSenderForm { + + // the alert configuration property name where the IDs are stored in |-separated form + private static final String PROPNAME = "subjectId"; + + private SubjectSelector selector; + + public SystemUsersNotificationSenderForm(String locatorId, AlertNotification notif, String sender) { + super(locatorId, notif, sender); + } + + @Override + protected void onInit() { + super.onInit(); + + String subjectIds = getConfiguration().getSimpleValue(PROPNAME, ""); // we know the subject plugin defines this + if (subjectIds != null && subjectIds.length() > 0) { + try { + List<Integer> ids = unfence(subjectIds, Integer.class); + SubjectCriteria criteria = new SubjectCriteria(); + criteria.addFilterIds(ids.toArray(new Integer[ids.size()])); + GWTServiceLookup.getSubjectService().findSubjectsByCriteria(criteria, + new AsyncCallback<PageList<Subject>>() { + @Override + public void onSuccess(PageList<Subject> result) { + createNewSelector(result); + } + + @Override + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Cannot determine current users - starting empty", + caught); + createNewSelector(null); + } + }); + } catch (Exception e) { + CoreGUI.getErrorHandler().handleError("Cannot use current users - starting empty", e); + createNewSelector(null); + } + } else { + createNewSelector(null); + } + } + + private void createNewSelector(Collection<Subject> preselectedSubjects) { + String selectorLocatorId = extendLocatorId("userSelector"); + selector = new SubjectSelector(selectorLocatorId, preselectedSubjects); + selector.setWidth(400); + selector.setHeight(300); + addMember(selector); + markForRedraw(); + } + + @Override + public boolean validate() { + if (selector != null) { + try { + HashSet<Integer> selectedIds = selector.getSelection(); + String newPropValue = fence(selectedIds); + getConfiguration().put(new PropertySimple(PROPNAME, newPropValue)); + return true; + } catch (Exception e) { + CoreGUI.getErrorHandler().handleError("Cannot save the selected users", e); + return false; + } + } + return true; + } + + @SuppressWarnings("unchecked") + private <T> List<T> unfence(String fencedData, Class<T> type) { + String delimiter = "\|"; + String[] elements = fencedData.split(delimiter); + List<T> results = new ArrayList<T>(elements.length); + + if (Integer.class.equals(type)) { + for (String next : elements) { + if (next.length() != 0) { + results.add((T) Integer.valueOf(next)); + } + } + } else if (String.class.equals(type)) { + for (String next : elements) { + if (next.length() != 0) { + results.add((T) next); + } + } + } else { + throw new IllegalArgumentException("No support for unfencing data of type " + type); + } + return results; + } + + /** + * Takes the list of elements e1, e2, e3 and fences + * them with '|' delimiters such that the result looks + * like "|e1|e2|e3|" + */ + private String fence(Collection<?> elements) { + if (elements.size() == 0) { + return ""; + } + StringBuilder builder = new StringBuilder(); + builder.append('|'); + for (Object next : elements) { + builder.append(String.valueOf(next)).append('|'); + } + return builder.toString(); + } + + private class SubjectSelector extends AbstractSelector<Subject> { + + public SubjectSelector(String id, Collection<Subject> subjects) { + super(id); + if (subjects != null) { + ListGridRecord[] data = (new UsersDataSource()).buildRecords(subjects); + setAssigned(data); + } + } + + @Override + protected RPCDataSource<Subject> getDataSource() { + return new SelectedSubjectsDataSource(); + } + + @Override + protected DynamicForm getAvailableFilterForm() { + return null; // No Filters Currently + } + + @Override + protected Criteria getLatestCriteria(DynamicForm availableFilterForm) { + return null; // No Filters Currently + } + + public class SelectedSubjectsDataSource extends UsersDataSource { + + @Override + public ListGridRecord[] buildRecords(Collection<Subject> subjects) { + ListGridRecord[] records = super.buildRecords(subjects); + for (ListGridRecord record : records) { + if (selection.contains(record.getAttributeAsInt("id"))) { + record.setEnabled(false); + } + } + return records; + } + } + + } +} diff --git a/modules/enterprise/server/plugins/alert-subject/pom.xml b/modules/enterprise/server/plugins/alert-subject/pom.xml index 09f2ddc..03e4631 100644 --- a/modules/enterprise/server/plugins/alert-subject/pom.xml +++ b/modules/enterprise/server/plugins/alert-subject/pom.xml @@ -23,31 +23,10 @@
<properties> <scm.module.path>modules/enterprise/server/plugins/alert-subject/</scm.module.path> - <seam.version>2.1.0.SP1</seam.version> </properties>
<dependencies>
- <dependency> - <groupId>org.jboss.seam</groupId> - <artifactId>jboss-seam</artifactId> - <version>${seam.version}</version> - <exclusions> - <exclusion> - <groupId>xml-apis</groupId> - <artifactId>xml-apis</artifactId> - </exclusion> - </exclusions> - </dependency> - - - <dependency> - <groupId>jboss.jboss-embeddable-ejb3</groupId> - <artifactId>jboss-ejb3-all</artifactId> - <version>1.0.0.Alpha9</version> - <scope>compile</scope> - </dependency> - </dependencies>
<build> diff --git a/modules/enterprise/server/plugins/alert-subject/src/main/java/org/rhq/enterprise/server/plugins/alertSubject/SubjectsBackingBean.java b/modules/enterprise/server/plugins/alert-subject/src/main/java/org/rhq/enterprise/server/plugins/alertSubject/SubjectsBackingBean.java deleted file mode 100644 index b98bb1b..0000000 --- a/modules/enterprise/server/plugins/alert-subject/src/main/java/org/rhq/enterprise/server/plugins/alertSubject/SubjectsBackingBean.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * 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.server.plugins.alertSubject; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.rhq.core.domain.auth.Subject; -import org.rhq.core.domain.configuration.PropertySimple; -import org.rhq.core.domain.util.PageControl; -import org.rhq.enterprise.server.plugin.pc.alert.AlertSender; -import org.rhq.enterprise.server.plugin.pc.alert.CustomAlertSenderBackingBean; -import org.rhq.enterprise.server.util.LookupUtil; - -/** - * Backing Bean for the subjects sender alert sender plugin custom UI - * @author Joseph Marques - */ -public class SubjectsBackingBean extends CustomAlertSenderBackingBean { - - private Map<String, String> available; - private List<String> currentSubjects; - private static final String SUBJECT_ID = "subjectId"; - - @Override - public void loadView() { - // get available/all subjects - List<Subject> allSubjects = LookupUtil.getSubjectManager().findAllSubjects(new PageControl()); - available = new HashMap<String, String>(); - for (Subject subject : allSubjects) { - String subjectId = String.valueOf(subject.getId()); - available.put(subject.getName(), subjectId); - } - - // get current subjects - String subjectString = alertParameters.getSimpleValue(SUBJECT_ID, ""); - currentSubjects = AlertSender.unfence(subjectString, String.class); - } - - @Override - public void saveView() { - String subjectIds = AlertSender.fence(currentSubjects); - - PropertySimple p = alertParameters.getSimple(SUBJECT_ID); - if (p == null) { - p = new PropertySimple(SUBJECT_ID, subjectIds); - alertParameters.put(p); - } else { - p.setStringValue(subjectIds); - } - - alertParameters = persistConfiguration(alertParameters); - } - - public List<String> getCurrentSubjects() { - return currentSubjects; - } - - public void setCurrentSubjects(List<String> currentSubjects) { - this.currentSubjects = currentSubjects; - } - - public Map<String, String> getAvailableSubjectsMap() { - return available; - } - -} diff --git a/modules/enterprise/server/plugins/alert-subject/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/alert-subject/src/main/resources/META-INF/rhq-serverplugin.xml index 6260aa4..277df97 100644 --- a/modules/enterprise/server/plugins/alert-subject/src/main/resources/META-INF/rhq-serverplugin.xml +++ b/modules/enterprise/server/plugins/alert-subject/src/main/resources/META-INF/rhq-serverplugin.xml @@ -15,21 +15,13 @@ Used to send notifications to registered users in the system. </serverplugin:help>
- <!-- startup & tear down listener, + scheduled jobs - <serverplugin:plugin-component class="Foo" /> - --> - - - <!-- How does this sender show up in drop downs etc --> <short-name>System Users</short-name>
<!-- Class that does the actual sending --> <plugin-class>SubjectsSender</plugin-class>
- <custom-ui> - <ui-snippet-name>subjects.xhtml</ui-snippet-name> - <backing-bean-class>SubjectsBackingBean</backing-bean-class> - <backing-bean-name>subjectsBean</backing-bean-name> - </custom-ui> + <alert-configuration> + <c:simple-property name="subjectId" type="string" required="true" description="The subjects (ids are |-separated) to be notified"/> + </alert-configuration> </alert-plugin> \ No newline at end of file diff --git a/modules/enterprise/server/plugins/alert-subject/src/main/resources/subjects.xhtml b/modules/enterprise/server/plugins/alert-subject/src/main/resources/subjects.xhtml deleted file mode 100644 index 39d86e8..0000000 --- a/modules/enterprise/server/plugins/alert-subject/src/main/resources/subjects.xhtml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<html xmlns="http://www.w3.org/1999/xhtml" - xmlns:h="http://java.sun.com/jsf/html" - xmlns:f="http://java.sun.com/jsf/core" - xmlns:ui="http://java.sun.com/jsf/facelets" - xmlns:c="http://java.sun.com/jstl/core" - xmlns:a4j="https://richfaces.org/a4j" - xmlns:rich="http://richfaces.ajax4jsf.org/rich%22%3E - -<body> - <rich:pickList fastMoveControlsVisible="false" - sourceListWidth="200px" - targetListWidth="200px" - copyControlLabel="Add Subjects" - removeControlLabel="Remove Subjects" - value="#{subjectsBean.currentSubjects}"> - <f:selectItems value="#{subjectsBean.availableSubjectsMap}" /> - </rich:pickList> -</body> - -</html> \ No newline at end of file
rhq-commits@lists.fedorahosted.org