[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java | 46 ++++++++--
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 1
2 files changed, 42 insertions(+), 5 deletions(-)
New commits:
commit 7bfc0df946d81db13879a7d6cc043f9e5ce3de5f
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Wed Dec 1 18:57:19 2010 -0500
get the group list columns laid out better. i18n category column
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
index 6787f55..acdbf2c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupListView.java
@@ -27,12 +27,14 @@ import static org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGro
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.AutoFitWidthApproach;
import com.smartgwt.client.widgets.grid.CellFormatter;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.grid.events.CellDoubleClickEvent;
import com.smartgwt.client.widgets.grid.events.CellDoubleClickHandler;
+import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
@@ -85,7 +87,12 @@ public class ResourceGroupListView extends Table {
@Override
protected void configureTable() {
- ListGridField nameField = new ListGridField(NAME.propertyName(), NAME.title(), 250);
+ ListGridField idField = new ListGridField("id", MSG.common_title_id());
+ idField.setWidth("10");
+
+ ListGridField nameField = new ListGridField(NAME.propertyName(), NAME.title());
+ nameField.setWidth("10%");
+
nameField.setCellFormatter(new CellFormatter() {
public String format(Object value, ListGridRecord record, int i, int i1) {
String groupId = record.getAttribute("id");
@@ -95,9 +102,38 @@ public class ResourceGroupListView extends Table {
});
ListGridField descriptionField = new ListGridField(DESCRIPTION.propertyName(), DESCRIPTION.title());
- ListGridField typeNameField = new ListGridField(TYPE.propertyName(), TYPE.title(), 130);
- ListGridField pluginNameField = new ListGridField(PLUGIN.propertyName(), PLUGIN.title(), 100);
- ListGridField categoryField = new ListGridField(CATEGORY.propertyName(), CATEGORY.title(), 60);
+ descriptionField.setWidth("10%");
+
+ ListGridField typeNameField = new ListGridField(TYPE.propertyName(), TYPE.title());
+ typeNameField.setWidth("1");
+ typeNameField.setAutoFitWidth(true);
+ typeNameField.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
+
+ ListGridField pluginNameField = new ListGridField(PLUGIN.propertyName(), PLUGIN.title());
+ pluginNameField.setWidth("1");
+ pluginNameField.setAutoFitWidth(true);
+ pluginNameField.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
+
+ ListGridField categoryField = new ListGridField(CATEGORY.propertyName(), CATEGORY.title());
+ categoryField.setWidth("1");
+ categoryField.setAutoFitWidth(true);
+ categoryField.setAutoFitWidthApproach(AutoFitWidthApproach.BOTH);
+ categoryField.setCellFormatter(new CellFormatter() {
+ public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
+ String categoryName = (String) value;
+ GroupCategory category = GroupCategory.valueOf(categoryName);
+ String displayName = "";
+ switch (category) {
+ case COMPATIBLE:
+ displayName = MSG.view_group_summary_compatible();
+ break;
+ case MIXED:
+ displayName = MSG.view_group_summary_mixed();
+ break;
+ }
+ return displayName;
+ }
+ });
ListGridField availabilityChildrenField = new ListGridField("availabilityChildren", MSG
.view_inventory_groups_children(), 120); // 120 due to the html in ResourceGroupCompositeDataSource.getAlignedAvailabilityResults
@@ -109,7 +145,7 @@ public class ResourceGroupListView extends Table {
availabilityDescendantsField.setWrap(false);
availabilityDescendantsField.setAlign(Alignment.CENTER);
- setListGridFields(false, nameField, descriptionField, typeNameField, pluginNameField, categoryField,
+ setListGridFields(nameField, descriptionField, typeNameField, pluginNameField, categoryField,
availabilityChildrenField, availabilityDescendantsField);
if (this.showDeleteButton) {
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 4739ba6..7090485 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -1320,6 +1320,7 @@ view_group_summary_dynamic=Dynamic~
view_group_summary_recursive=Recursive~
view_group_summary_groupDefinition=Group Definition~
view_group_summary_mixed=Mixed~
+view_group_summary_compatible=Compatible~
view_group_summary_descUpdateFailure=Failed to change the description of the resource group with ID [{0}]~
view_group_summary_descUpdateSuccessful=You have changed the description of this resource group~
view_group_summary_dynamicNote=Dynamic group names and descriptions are managed, and therefore are not editable~
13 years, 6 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java | 433 +++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java | 464 ----------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 161 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java | 31
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 5
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 1
6 files changed, 569 insertions(+), 526 deletions(-)
New commits:
commit 3168c20c6d7bb0126ab5a83102c77e251ffb6410
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Dec 1 17:07:00 2010 -0500
role editor now has four tabs - Permissions, Resource Groups, Subjects, and LDAP Groups
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java
new file mode 100644
index 0000000..9cfdb6f
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java
@@ -0,0 +1,433 @@
+/*
+ * 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 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.coregui.client.admin.roles;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.smartgwt.client.core.RefDataClass;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.Autofit;
+import com.smartgwt.client.types.ListGridEditEvent;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.util.JSOHelper;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.form.fields.CheckboxItem;
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.ChangedEvent;
+import com.smartgwt.client.widgets.grid.events.ChangedHandler;
+import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
+import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.authz.Role;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.Messages;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVStack;
+
+/**
+ * An editor for editing the set of RHQ {@link Permission permission}s associated with an RHQ {@link Role
+ * role}.
+ *
+ * @author Ian Springer
+ */
+// TODO: i18n
+public class PermissionsEditor extends LocatableVStack {
+
+ private static Messages MSG = CoreGUI.getMessages();
+
+ private ListGrid globalPermissionsGrid;
+ private ListGrid resourcePermissionsGrid;
+ private Set<Permission> selectedPermissions;
+ private RoleEditView roleEditView;
+ private boolean isReadOnly;
+ private Object originalValue;
+
+ public PermissionsEditor(RoleEditView roleEditView, boolean isReadOnly) {
+ super(roleEditView.extendLocatorId("Permissions"));
+
+ this.roleEditView = roleEditView;
+ this.isReadOnly = isReadOnly;
+ this.selectedPermissions = new HashSet<Permission>();
+
+ setWidth100();
+ setHeight(500);
+
+ VLayout spacer = createVerticalSpacer(13);
+ addMember(spacer);
+
+ Label globalPermissionsHeader = new Label("<h4>Global Permissions</h4>");
+ globalPermissionsHeader.setHeight(17);
+ addMember(globalPermissionsHeader);
+
+ this.globalPermissionsGrid = createGlobalPermissionsGrid();
+ addMember(this.globalPermissionsGrid);
+
+ spacer = createVerticalSpacer(13);
+ addMember(spacer);
+
+ Label resourcePermissionsHeader = new Label("<h4>Resource Permissions</h4>");
+ resourcePermissionsHeader.setHeight(17);
+ addMember(resourcePermissionsHeader);
+
+ this.resourcePermissionsGrid = createResourcePermissionsGrid();
+ addMember(this.resourcePermissionsGrid);
+ }
+
+ public void reset() {
+ //setValue(this.originalValue);
+ redraw();
+ }
+
+ @Override
+ public void redraw() {
+ this.selectedPermissions = getValueAsPermissionSet();
+
+ // Update the value of the authorized fields in each row of the grids.
+
+ ListGridRecord[] globalPermissionRecords = this.globalPermissionsGrid.getRecords();
+ for (ListGridRecord record : globalPermissionRecords) {
+ String permissionName = record.getAttribute("name");
+ Permission permission = Permission.valueOf(permissionName);
+ record.setAttribute("authorized", this.selectedPermissions.contains(permission));
+ }
+
+ ListGridRecord[] resourcePermissionRecords = this.resourcePermissionsGrid.getRecords();
+ for (ListGridRecord record : resourcePermissionRecords) {
+ String readPermissionName = record.getAttribute("readName");
+ Permission readPermission = Permission.valueOf(readPermissionName);
+ record.setAttribute("readAuthorized", this.selectedPermissions.contains(readPermission));
+
+ String writePermissionName = record.getAttribute("writeName");
+ Permission writePermission = Permission.valueOf(writePermissionName);
+ record.setAttribute("writeAuthorized", this.selectedPermissions.contains(writePermission));
+ }
+
+ markForRedraw();
+ }
+
+ private Set<Permission> getValueAsPermissionSet() {
+ Object nativeArray = this.roleEditView.getForm().getValue(RolesDataSource.Field.PERMISSIONS);
+ if (this.originalValue == null) {
+ this.originalValue = nativeArray;
+ }
+ ListGridRecord[] permissionRecords = convertToListGridRecordArray((JavaScriptObject)nativeArray);
+ return RolesDataSource.toPermissionSet(permissionRecords);
+ }
+
+ private ListGrid createGlobalPermissionsGrid() {
+ ListGrid grid = createPermissionsGrid();
+
+ // TODO: Add table title.
+
+ ListGridField iconField = createIconField();
+
+ ListGridField nameField = new ListGridField("name");
+ nameField.setHidden(true);
+
+ ListGridField displayNameField = new ListGridField("displayName", "Name", 120);
+
+ ListGridField descriptionField = new ListGridField("description", "Description", 450);
+ descriptionField.setWrap(true);
+
+ final ListGridField authorizedField = createAuthorizedField("authorized", "Authorized?", "name", grid);
+
+ grid.setFields(iconField, nameField, displayNameField, descriptionField, authorizedField);
+
+ List<ListGridRecord> records = new ArrayList<ListGridRecord>();
+ ListGridRecord record = createGlobalPermissionRecord("Manage Security", "global/Locked", Permission.MANAGE_SECURITY,
+ "can create, update, or delete users and roles (viewing is implied for everyone)");
+ records.add(record);
+ record = createGlobalPermissionRecord("Manage Inventory", "subsystems/inventory/Inventory", Permission.MANAGE_INVENTORY,
+ "has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; " +
+ "and can import auto-discovered or manually discovered Resources");
+ records.add(record);
+ record = createGlobalPermissionRecord("Manage Settings", "subsystems/configure/Configure", Permission.MANAGE_SETTINGS,
+ "can modify the RHQ Server configuration and perform any Server-related functionality");
+ records.add(record);
+ record = createGlobalPermissionRecord("Manage Bundles", "subsystems/bundle/Bundle", Permission.MANAGE_BUNDLE,
+ "can create, update, or delete provisioning bundles (viewing is implied for everyone)");
+ records.add(record);
+
+ grid.setData(records.toArray(new ListGridRecord[records.size()]));
+
+ return grid;
+ }
+
+ private ListGrid createResourcePermissionsGrid() {
+ ListGrid grid = createPermissionsGrid();
+ // TODO: Add table title.
+
+ ListGridField iconField = createIconField();
+
+ ListGridField readNameField = new ListGridField("readName");
+ readNameField.setHidden(true);
+
+ ListGridField writeNameField = new ListGridField("writeName");
+ writeNameField.setHidden(true);
+
+ ListGridField displayNameField = new ListGridField("displayName", "Name", 120);
+
+ ListGridField descriptionField = new ListGridField("description", "Description", 450);
+ descriptionField.setWrap(true);
+
+ ListGridField readField = createAuthorizedField("readAuthorized", "Read?", "readName", grid);
+ ListGridField writeField = createAuthorizedField("writeAuthorized", "Write?", "writeName", grid);
+
+ grid.setFields(iconField, readNameField, displayNameField, descriptionField, readField, writeField);
+
+ List<ListGridRecord> records = new ArrayList<ListGridRecord>();
+
+ ListGridRecord record = createResourcePermissionRecord("Inventory", "subsystems/inventory/Inventory",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history",
+ Permission.MODIFY_RESOURCE,
+ "update Resource name, version, description, and connection settings; delete connection settings history items");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Manage Measurements", "subsystems/monitor/Monitor",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view metric data and collection schedules",
+ Permission.MANAGE_MEASUREMENTS,
+ "update metric collection schedules");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Manage Alerts", "subsystems/alert/Alerts",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view alert definitions and alert history",
+ Permission.MANAGE_ALERTS,
+ "create, update, and delete alert definitions; acknowledge and delete alert history items");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Configure", "subsystems/configure/Configure",
+ Permission.CONFIGURE_READ,
+ "view Resource configuration and Resource configuration revision history",
+ Permission.CONFIGURE_WRITE,
+ "update Resource configuration; delete Resource configuration revision history items");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Control", "subsystems/control/Operation",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view available operations and operation execution history",
+ Permission.CONTROL,
+ "execute operations; delete operation execution history items");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Manage Events", "subsystems/event/Events",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view events",
+ Permission.MANAGE_EVENTS,
+ "delete events");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Manage Content", "subsystems/content/Content",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view installed and available packages; view package installation history",
+ Permission.MANAGE_CONTENT,
+ "subscribe to content sources; install and uninstall packages");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Create Child Resources", "subsystems/inventory/Inventory",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view child creation history",
+ Permission.CREATE_CHILD_RESOURCES,
+ "create new child Resources (for child Resources of types that are creatable)");
+ records.add(record);
+
+ record = createResourcePermissionRecord("Delete Child Resources", "subsystems/inventory/Inventory",
+ Permission.VIEW_RESOURCE,
+ "(IMPLIED) view child deletion history",
+ Permission.DELETE_RESOURCE,
+ "delete child Resources (for child Resources of types that are deletable)");
+ records.add(record);
+
+ grid.setData(records.toArray(new ListGridRecord[records.size()]));
+
+ return grid;
+ }
+
+ private ListGridField createIconField() {
+ ListGridField iconField = new ListGridField("icon", " ", 28);
+ iconField.setShowDefaultContextMenu(false);
+ iconField.setCanSort(false);
+ iconField.setAlign(Alignment.CENTER);
+ iconField.setType(ListGridFieldType.IMAGE);
+ iconField.setImageURLSuffix("_16.png");
+ iconField.setImageWidth(16);
+ iconField.setImageHeight(16);
+ return iconField;
+ }
+
+ private ListGrid createPermissionsGrid() {
+ ListGrid grid = new ListGrid();
+
+ grid.setAutoFitData(Autofit.BOTH);
+ grid.setWrapCells(true);
+ grid.setFixedRecordHeights(false);
+
+ return grid;
+ }
+
+ private ListGridField createAuthorizedField(String name, String title, final String nameField, final ListGrid grid) {
+ final ListGridField authorizedField = new ListGridField(name, title, 65);
+
+ // Show yes/no rather than true/false.
+ LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
+ valueMap.put(Boolean.TRUE.toString(), MSG.common_val_yes_lower());
+ valueMap.put(Boolean.FALSE.toString(), MSG.common_val_no_lower());
+ authorizedField.setValueMap(valueMap);
+
+ if (!this.isReadOnly) {
+ authorizedField.setCanEdit(true);
+ grid.setEditEvent(ListGridEditEvent.CLICK);
+ CheckboxItem editor = new CheckboxItem();
+ authorizedField.setEditorType(editor);
+ final Record[] recordBeingEdited = {null};
+ authorizedField.addRecordClickHandler(new RecordClickHandler() {
+ public void onRecordClick(RecordClickEvent event) {
+ recordBeingEdited[0] = event.getRecord();
+ }
+ });
+ authorizedField.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ Boolean authorized = (Boolean)event.getValue();
+ int recordNum = event.getRowNum();
+ ListGridRecord record = grid.getRecord(recordNum);
+ String permissionName = record.getAttribute(nameField);
+ Permission permission = Permission.valueOf(permissionName);
+ if (permission == Permission.VIEW_RESOURCE) {
+ event.getItem().setValue(true);
+ event.getItem().disable();
+ String permissionDisplayName = record.getAttribute("displayName");
+ Message message = new Message("Read access for the " + permissionDisplayName
+ + " permission is implied and cannot be disabled.", Message.Severity.Warning);
+ CoreGUI.getMessageCenter().notify(message);
+ } else {
+ updatePermissions(authorized, permission);
+
+ // Let our parent role editor know the permissions have been changed, so it can update the
+ // enablement of its Save and Reset buttons.
+ org.rhq.enterprise.gui.coregui.client.admin.roles.PermissionsEditor.this.roleEditView.onItemChanged();
+ }
+ }
+ });
+ }
+
+ return authorizedField;
+ }
+
+ private void updatePermissions(Boolean authorized, Permission permission) {
+ boolean redrawRequired = false;
+ if (authorized) {
+ this.selectedPermissions.add(permission);
+ if (permission == Permission.MANAGE_SECURITY) {
+ // MANAGE_SECURITY implies all other perms.
+ this.selectedPermissions.addAll(EnumSet.allOf(Permission.class));
+ redrawRequired = true;
+ } else if (permission == Permission.MANAGE_INVENTORY) {
+ // MANAGE_INVENTORY implies all Resource perms.
+ this.selectedPermissions.addAll(Permission.RESOURCE_ALL);
+ redrawRequired = true;
+ } else if (permission == Permission.CONFIGURE_WRITE) {
+ // CONFIGURE_WRITE implies CONFIGURE_READ.
+ this.selectedPermissions.add(Permission.CONFIGURE_READ);
+ redrawRequired = true;
+ }
+ } else {
+ this.selectedPermissions.remove(permission);
+ if (permission == Permission.CONFIGURE_READ) {
+ // Lack of CONFIGURE_READ implies lack of CONFIGURE_WRITE.
+ this.selectedPermissions.remove(Permission.CONFIGURE_WRITE);
+ redrawRequired = true;
+ }
+ }
+
+ ListGridRecord[] permissionRecords = RolesDataSource.toRecordArray(this.selectedPermissions);
+ this.roleEditView.getForm().setValue(RolesDataSource.Field.PERMISSIONS, permissionRecords);
+
+ if (redrawRequired) {
+ redraw();
+ }
+ }
+
+ private ListGridRecord createGlobalPermissionRecord(String displayName, String icon, Permission globalPermission,
+ String description) {
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute("displayName", displayName);
+ record.setAttribute("icon", icon);
+ record.setAttribute("name", globalPermission.name());
+ record.setAttribute("description", description);
+ record.setAttribute("authorized", this.selectedPermissions.contains(globalPermission));
+
+ return record;
+ }
+
+ private ListGridRecord createResourcePermissionRecord(String displayName, String icon, Permission readPermission,
+ String readDescription, Permission writePermission,
+ String writeDescription) {
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute("displayName", displayName);
+ record.setAttribute("icon", icon);
+ record.setAttribute("readName", readPermission.name());
+ record.setAttribute("readAuthorized", this.selectedPermissions.contains(readPermission));
+ record.setAttribute("description", "<b>Read:</b> " + readDescription + "<br/><b>Write:</b> " + writeDescription);
+ record.setAttribute("writeName", writePermission.name());
+ record.setAttribute("writeAuthorized", this.selectedPermissions.contains(writePermission));
+
+ return record;
+ }
+
+ public Set<Permission> getPermissions() {
+ return this.selectedPermissions;
+ }
+
+ private static ListGridRecord[] convertToListGridRecordArray(JavaScriptObject jsObject) {
+ if (jsObject == null) {
+ return new ListGridRecord[0];
+ }
+ JavaScriptObject[] jsArray = JSOHelper.toArray(jsObject);
+ ListGridRecord[] records = new ListGridRecord[jsArray.length];
+ for (int i = 0; i < jsArray.length; i++) {
+ JavaScriptObject jsArrayItem = jsArray[i];
+ ListGridRecord record = (ListGridRecord) RefDataClass.getRef(jsArrayItem);
+ if (record == null) {
+ record = new ListGridRecord(jsArrayItem);
+ }
+ records[i] = record;
+ }
+ return records;
+ }
+
+ private VLayout createVerticalSpacer(int height) {
+ VLayout spacer = new VLayout();
+ spacer.setHeight(height);
+ return spacer;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java
deleted file mode 100644
index bedccff..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- * 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 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.coregui.client.admin.roles;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Set;
-
-import com.google.gwt.core.client.JavaScriptObject;
-import com.smartgwt.client.core.RefDataClass;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.types.Autofit;
-import com.smartgwt.client.types.ListGridEditEvent;
-import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.util.JSOHelper;
-import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.form.fields.CanvasItem;
-import com.smartgwt.client.widgets.form.fields.CheckboxItem;
-import com.smartgwt.client.widgets.grid.ListGrid;
-import com.smartgwt.client.widgets.grid.ListGridField;
-
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-import com.smartgwt.client.widgets.grid.events.ChangedEvent;
-import com.smartgwt.client.widgets.grid.events.ChangedHandler;
-import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
-import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
-import com.smartgwt.client.widgets.layout.VLayout;
-
-import org.rhq.core.domain.authz.Permission;
-import org.rhq.core.domain.authz.Role;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.Messages;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVStack;
-
-/**
- * A complex form item for editing the set of RHQ {@link Permission permission}s associated with an RHQ {@link Role
- * role}.
- *
- * @author Ian Springer
- */
-// TODO: i18n
-public class PermissionsItem extends CanvasItem {
-
- private static Messages MSG = CoreGUI.getMessages();
-
- private Set<Permission> selectedPermissions;
- private RoleEditView roleEditView;
- private boolean isReadOnly;
- private Object originalValue;
-
- public PermissionsItem(RoleEditView roleEditView) {
- super(RolesDataSource.Field.PERMISSIONS, "Permissions");
-
- this.selectedPermissions = new HashSet<Permission>();
- this.roleEditView = roleEditView;
- this.isReadOnly = this.roleEditView.isReadOnly();
- }
-
- @Override
- protected PermissionsEditor createCanvas() {
- return new PermissionsEditor();
- }
-
- @Override
- public PermissionsEditor getCanvas() {
- PermissionsEditor permissionsEditor = (PermissionsEditor)super.getCanvas();
- if (permissionsEditor == null) {
- permissionsEditor = createCanvas();
- setCanvas(permissionsEditor);
- }
- return permissionsEditor;
- }
-
- public void reset() {
- //setValue(this.originalValue);
- redraw();
- }
-
- @Override
- public void redraw() {
- this.selectedPermissions = getValueAsPermissionSet();
-
- // Update the value of the authorized fields in each row of the grids.
-
- ListGridRecord[] globalPermissionRecords = getCanvas().getGlobalPermissionsGrid().getRecords();
- for (ListGridRecord record : globalPermissionRecords) {
- String permissionName = record.getAttribute("name");
- Permission permission = Permission.valueOf(permissionName);
- record.setAttribute("authorized", this.selectedPermissions.contains(permission));
- }
-
- ListGridRecord[] resourcePermissionRecords = getCanvas().getResourcePermissionsGrid().getRecords();
- for (ListGridRecord record : resourcePermissionRecords) {
- String readPermissionName = record.getAttribute("readName");
- Permission readPermission = Permission.valueOf(readPermissionName);
- record.setAttribute("readAuthorized", this.selectedPermissions.contains(readPermission));
-
- String writePermissionName = record.getAttribute("writeName");
- Permission writePermission = Permission.valueOf(writePermissionName);
- record.setAttribute("writeAuthorized", this.selectedPermissions.contains(writePermission));
- }
-
- getCanvas().markForRedraw();
- }
-
- private Set<Permission> getValueAsPermissionSet() {
- Object nativeArray = getValue();
- if (this.originalValue == null) {
- this.originalValue = nativeArray;
- }
- ListGridRecord[] permissionRecords = convertToListGridRecordArray((JavaScriptObject)nativeArray);
- return RolesDataSource.toPermissionSet(permissionRecords);
- }
-
- private ListGrid createGlobalPermissionsGrid() {
- ListGrid grid = createPermissionsGrid();
-
- // TODO: Add table title.
-
- ListGridField iconField = createIconField();
-
- ListGridField nameField = new ListGridField("name");
- nameField.setHidden(true);
-
- ListGridField displayNameField = new ListGridField("displayName", "Name", 120);
-
- ListGridField descriptionField = new ListGridField("description", "Description", 450);
- descriptionField.setWrap(true);
-
- final ListGridField authorizedField = createAuthorizedField("authorized", "Authorized?", "name", grid);
-
- grid.setFields(iconField, nameField, displayNameField, descriptionField, authorizedField);
-
- List<ListGridRecord> records = new ArrayList<ListGridRecord>();
- ListGridRecord record = createGlobalPermissionRecord("Manage Security", "global/Locked", Permission.MANAGE_SECURITY,
- "can create, update, or delete users and roles (viewing is implied for everyone)");
- records.add(record);
- record = createGlobalPermissionRecord("Manage Inventory", "subsystems/inventory/Inventory", Permission.MANAGE_INVENTORY,
- "has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; " +
- "and can import auto-discovered or manually discovered Resources");
- records.add(record);
- record = createGlobalPermissionRecord("Manage Settings", "subsystems/configure/Configure", Permission.MANAGE_SETTINGS,
- "can modify the RHQ Server configuration and perform any Server-related functionality");
- records.add(record);
- record = createGlobalPermissionRecord("Manage Bundles", "subsystems/bundle/Bundle", Permission.MANAGE_BUNDLE,
- "can create, update, or delete provisioning bundles (viewing is implied for everyone)");
- records.add(record);
-
- grid.setData(records.toArray(new ListGridRecord[records.size()]));
-
- return grid;
- }
-
- private ListGrid createResourcePermissionsGrid() {
- ListGrid grid = createPermissionsGrid();
- // TODO: Add table title.
-
- ListGridField iconField = createIconField();
-
- ListGridField readNameField = new ListGridField("readName");
- readNameField.setHidden(true);
-
- ListGridField writeNameField = new ListGridField("writeName");
- writeNameField.setHidden(true);
-
- ListGridField displayNameField = new ListGridField("displayName", "Name", 120);
-
- ListGridField descriptionField = new ListGridField("description", "Description", 450);
- descriptionField.setWrap(true);
-
- ListGridField readField = createAuthorizedField("readAuthorized", "Read?", "readName", grid);
- ListGridField writeField = createAuthorizedField("writeAuthorized", "Write?", "writeName", grid);
-
- grid.setFields(iconField, readNameField, displayNameField, descriptionField, readField, writeField);
-
- List<ListGridRecord> records = new ArrayList<ListGridRecord>();
-
- ListGridRecord record = createResourcePermissionRecord("Inventory", "subsystems/inventory/Inventory",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view Resource properties (name, description, version, etc.), connection settings, and connection settings history",
- Permission.MODIFY_RESOURCE,
- "update Resource name, version, description, and connection settings; delete connection settings history items");
- records.add(record);
-
- record = createResourcePermissionRecord("Manage Measurements", "subsystems/monitor/Monitor",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view metric data and collection schedules",
- Permission.MANAGE_MEASUREMENTS,
- "update metric collection schedules");
- records.add(record);
-
- record = createResourcePermissionRecord("Manage Alerts", "subsystems/alert/Alerts",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view alert definitions and alert history",
- Permission.MANAGE_ALERTS,
- "create, update, and delete alert definitions; acknowledge and delete alert history items");
- records.add(record);
-
- record = createResourcePermissionRecord("Configure", "subsystems/configure/Configure",
- Permission.CONFIGURE_READ,
- "view Resource configuration and Resource configuration revision history",
- Permission.CONFIGURE_WRITE,
- "update Resource configuration; delete Resource configuration revision history items");
- records.add(record);
-
- record = createResourcePermissionRecord("Control", "subsystems/control/Operation",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view available operations and operation execution history",
- Permission.CONTROL,
- "execute operations; delete operation execution history items");
- records.add(record);
-
- record = createResourcePermissionRecord("Manage Events", "subsystems/event/Events",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view events",
- Permission.MANAGE_EVENTS,
- "delete events");
- records.add(record);
-
- record = createResourcePermissionRecord("Manage Content", "subsystems/content/Content",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view installed and available packages; view package installation history",
- Permission.MANAGE_CONTENT,
- "subscribe to content sources; install and uninstall packages");
- records.add(record);
-
- record = createResourcePermissionRecord("Create Child Resources", "subsystems/inventory/Inventory",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view child creation history",
- Permission.CREATE_CHILD_RESOURCES,
- "create new child Resources (for child Resources of types that are creatable)");
- records.add(record);
-
- record = createResourcePermissionRecord("Delete Child Resources", "subsystems/inventory/Inventory",
- Permission.VIEW_RESOURCE,
- "(IMPLIED) view child deletion history",
- Permission.DELETE_RESOURCE,
- "delete child Resources (for child Resources of types that are deletable)");
- records.add(record);
-
- grid.setData(records.toArray(new ListGridRecord[records.size()]));
-
- return grid;
- }
-
- private ListGridField createIconField() {
- ListGridField iconField = new ListGridField("icon", " ", 28);
- iconField.setShowDefaultContextMenu(false);
- iconField.setCanSort(false);
- iconField.setAlign(Alignment.CENTER);
- iconField.setType(ListGridFieldType.IMAGE);
- iconField.setImageURLSuffix("_16.png");
- iconField.setImageWidth(16);
- iconField.setImageHeight(16);
- return iconField;
- }
-
- private ListGrid createPermissionsGrid() {
- ListGrid grid = new ListGrid();
-
- grid.setAutoFitData(Autofit.BOTH);
- grid.setWrapCells(true);
- grid.setFixedRecordHeights(false);
-
- return grid;
- }
-
- private ListGridField createAuthorizedField(String name, String title, final String nameField, final ListGrid grid) {
- final ListGridField authorizedField = new ListGridField(name, title, 65);
-
- // Show yes/no rather than true/false.
- LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
- valueMap.put(Boolean.TRUE.toString(), MSG.common_val_yes_lower());
- valueMap.put(Boolean.FALSE.toString(), MSG.common_val_no_lower());
- authorizedField.setValueMap(valueMap);
-
- if (!this.isReadOnly) {
- authorizedField.setCanEdit(true);
- grid.setEditEvent(ListGridEditEvent.CLICK);
- CheckboxItem editor = new CheckboxItem();
- authorizedField.setEditorType(editor);
- final Record[] recordBeingEdited = {null};
- authorizedField.addRecordClickHandler(new RecordClickHandler() {
- public void onRecordClick(RecordClickEvent event) {
- recordBeingEdited[0] = event.getRecord();
- }
- });
- authorizedField.addChangedHandler(new ChangedHandler() {
- public void onChanged(ChangedEvent event) {
- Boolean authorized = (Boolean)event.getValue();
- int recordNum = event.getRowNum();
- ListGridRecord record = grid.getRecord(recordNum);
- String permissionName = record.getAttribute(nameField);
- Permission permission = Permission.valueOf(permissionName);
- if (permission == Permission.VIEW_RESOURCE) {
- event.getItem().setValue(true);
- event.getItem().disable();
- String permissionDisplayName = record.getAttribute("displayName");
- Message message = new Message("Read access for the " + permissionDisplayName
- + " permission is implied and cannot be disabled.", Message.Severity.Warning);
- CoreGUI.getMessageCenter().notify(message);
- } else {
- updatePermissions(authorized, permission);
-
- // Let our parent role editor know the permissions have been changed, so it can update the
- // enablement of its Save and Reset buttons.
- PermissionsItem.this.roleEditView.onItemChanged();
- }
- }
- });
- }
-
- return authorizedField;
- }
-
- private void updatePermissions(Boolean authorized, Permission permission) {
- boolean redrawRequired = false;
- if (authorized) {
- this.selectedPermissions.add(permission);
- if (permission == Permission.MANAGE_SECURITY) {
- // MANAGE_SECURITY implies all other perms.
- this.selectedPermissions.addAll(EnumSet.allOf(Permission.class));
- redrawRequired = true;
- } else if (permission == Permission.MANAGE_INVENTORY) {
- // MANAGE_INVENTORY implies all Resource perms.
- this.selectedPermissions.addAll(Permission.RESOURCE_ALL);
- redrawRequired = true;
- } else if (permission == Permission.CONFIGURE_WRITE) {
- // CONFIGURE_WRITE implies CONFIGURE_READ.
- this.selectedPermissions.add(Permission.CONFIGURE_READ);
- redrawRequired = true;
- }
- } else {
- this.selectedPermissions.remove(permission);
- if (permission == Permission.CONFIGURE_READ) {
- // Lack of CONFIGURE_READ implies lack of CONFIGURE_WRITE.
- this.selectedPermissions.remove(Permission.CONFIGURE_WRITE);
- redrawRequired = true;
- }
- }
-
- ListGridRecord[] permissionRecords = RolesDataSource.toRecordArray(this.selectedPermissions);
- getForm().setValue(getName(), permissionRecords);
-
- if (redrawRequired) {
- redraw();
- }
- }
-
- private ListGridRecord createGlobalPermissionRecord(String displayName, String icon, Permission globalPermission,
- String description) {
- ListGridRecord record = new ListGridRecord();
- record.setAttribute("displayName", displayName);
- record.setAttribute("icon", icon);
- record.setAttribute("name", globalPermission.name());
- record.setAttribute("description", description);
- record.setAttribute("authorized", this.selectedPermissions.contains(globalPermission));
-
- return record;
- }
-
- private ListGridRecord createResourcePermissionRecord(String displayName, String icon, Permission readPermission,
- String readDescription, Permission writePermission,
- String writeDescription) {
- ListGridRecord record = new ListGridRecord();
- record.setAttribute("displayName", displayName);
- record.setAttribute("icon", icon);
- record.setAttribute("readName", readPermission.name());
- record.setAttribute("readAuthorized", this.selectedPermissions.contains(readPermission));
- record.setAttribute("description", "<b>Read:</b> " + readDescription + "<br/><b>Write:</b> " + writeDescription);
- record.setAttribute("writeName", writePermission.name());
- record.setAttribute("writeAuthorized", this.selectedPermissions.contains(writePermission));
-
- return record;
- }
-
- public Set<Permission> getPermissions() {
- return this.selectedPermissions;
- }
-
- private static ListGridRecord[] convertToListGridRecordArray(JavaScriptObject jsObject) {
- if (jsObject == null) {
- return new ListGridRecord[0];
- }
- JavaScriptObject[] jsArray = JSOHelper.toArray(jsObject);
- ListGridRecord[] records = new ListGridRecord[jsArray.length];
- for (int i = 0; i < jsArray.length; i++) {
- JavaScriptObject jsArrayItem = jsArray[i];
- ListGridRecord record = (ListGridRecord) RefDataClass.getRef(jsArrayItem);
- if (record == null) {
- record = new ListGridRecord(jsArrayItem);
- }
- records[i] = record;
- }
- return records;
- }
-
- class PermissionsEditor extends LocatableVStack {
- private ListGrid globalPermissionsGrid;
- private ListGrid resourcePermissionsGrid;
-
- PermissionsEditor() {
- super(roleEditView.extendLocatorId("Permissions"));
- setWidth100();
- setHeight(500);
-
- VLayout spacer = createVerticalSpacer(13);
- addMember(spacer);
-
- Label globalPermissionsHeader = new Label("<h4>Global Permissions</h4>");
- globalPermissionsHeader.setHeight(17);
- addMember(globalPermissionsHeader);
-
- this.globalPermissionsGrid = createGlobalPermissionsGrid();
- addMember(this.globalPermissionsGrid);
-
- spacer = createVerticalSpacer(13);
- addMember(spacer);
-
- Label resourcePermissionsHeader = new Label("<h4>Resource Permissions</h4>");
- resourcePermissionsHeader.setHeight(17);
- addMember(resourcePermissionsHeader);
-
- this.resourcePermissionsGrid = createResourcePermissionsGrid();
- addMember(this.resourcePermissionsGrid);
- }
-
- private VLayout createVerticalSpacer(int height) {
- VLayout spacer = new VLayout();
- spacer.setHeight(height);
- return spacer;
- }
-
- public ListGrid getGlobalPermissionsGrid() {
- return this.globalPermissionsGrid;
- }
-
- public ListGrid getResourcePermissionsGrid() {
- return this.resourcePermissionsGrid;
- }
- }
-
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
index 6bd1bfe..4e26acc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
@@ -25,10 +25,9 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
-import com.smartgwt.client.types.TitleOrientation;
+import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGridRecord;
@@ -36,8 +35,10 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource;
@@ -48,6 +49,9 @@ import org.rhq.enterprise.gui.coregui.client.components.selector.AssignedItemsCh
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceGroupSelector;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTab;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTabSet;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* A form for viewing and/or editing an RHQ {@link Role role}.
@@ -56,17 +60,19 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message;
*/
public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implements BookmarkableView {
+ // TODO: Get 24x24 Role icon.
private static final String HEADER_ICON = "global/Role_16.png";
- private PermissionsItem permissionsItem;
+ private LocatableTab permissionsTab;
+ private PermissionsEditor permissionsEditor;
- private CanvasItem resourceGroupsItem;
- private ResourceGroupSelector groupSelector;
+ private LocatableTab resourceGroupsTab;
+ private ResourceGroupSelector resourceGroupSelector;
- private CanvasItem subjectsItem;
+ private LocatableTab subjectsTab;
private RoleSubjectSelector subjectSelector;
- private CanvasItem ldapGroupsItem;
+ private LocatableTab ldapGroupsTab;
private RoleLdapGroupSelector ldapGroupSelector;
private boolean hasManageSecurityPermission;
@@ -125,6 +131,87 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
}
@Override
+ protected LocatableVLayout buildContentPane() {
+ LocatableVLayout contentPane = new LocatableVLayout(extendLocatorId("Content"));
+ contentPane.setWidth100();
+ contentPane.setHeight100();
+ contentPane.setOverflow(Overflow.AUTO);
+
+ EnhancedDynamicForm form = buildForm();
+ setForm(form);
+
+ LocatableVLayout topPane = new LocatableVLayout(extendLocatorId("Top"));
+ topPane.setWidth100();
+ topPane.setHeight(80);
+ topPane.addMember(form);
+
+ contentPane.addMember(topPane);
+
+ LocatableTabSet tabSet = new LocatableTabSet(contentPane.extendLocatorId("TabSet"));
+ tabSet.setWidth100();
+ tabSet.setHeight100();
+
+ // TODO: Also add these tabs if the session subject is a member of the Role being viewed.
+ if (this.hasManageSecurityPermission) {
+ this.permissionsTab = buildPermissionsTab(tabSet);
+ tabSet.addTab(permissionsTab);
+
+ if (!this.isSystemRole) {
+ this.resourceGroupsTab = buildResourceGroupsTab(tabSet);
+ tabSet.addTab(resourceGroupsTab);
+ }
+
+ this.subjectsTab = buildSubjectsTab(tabSet);
+ tabSet.addTab(subjectsTab);
+
+ if (this.isLdapConfigured) {
+ this.ldapGroupsTab = buildLdapGroupsTab(tabSet);
+ tabSet.addTab(ldapGroupsTab);
+ }
+ }
+
+ contentPane.addMember(tabSet);
+
+ return contentPane;
+ }
+
+ private LocatableTab buildPermissionsTab(LocatableTabSet tabSet) {
+ LocatableTab tab = new LocatableTab(tabSet.extendLocatorId("Permissions"), MSG.common_title_permissions(),
+ "global/Locked_16.png");
+ // NOTE: We will overwrite the canvas with the permissions editor later after the Role has been fetched.
+ tab.setPane(new Canvas());
+
+ return tab;
+ }
+
+ private LocatableTab buildResourceGroupsTab(LocatableTabSet tabSet) {
+ LocatableTab tab = new LocatableTab(tabSet.extendLocatorId("ResourceGroups"),
+ MSG.common_title_resourceGroups(), ImageManager.getGroupIcon(GroupCategory.MIXED));
+ // NOTE: We will overwrite the canvas with a Selector later after the Role has been fetched.
+ tab.setPane(new Canvas());
+
+ return tab;
+ }
+
+ private LocatableTab buildSubjectsTab(LocatableTabSet tabSet) {
+ LocatableTab tab = new LocatableTab(tabSet.extendLocatorId("Users"), MSG.common_title_users(),
+ "global/User_16.png");
+ // NOTE: We will overwrite the canvas with a Selector later after the Role has been fetched.
+ tab.setPane(new Canvas());
+
+ return tab;
+ }
+
+ private LocatableTab buildLdapGroupsTab(LocatableTabSet tabSet) {
+ LocatableTab tab = new LocatableTab(tabSet.extendLocatorId("LdapGroups"), MSG.common_title_ldapGroups(),
+ "global/Role_16.png");
+ // NOTE: We will overwrite the canvas with a Selector later after the Role has been fetched.
+ tab.setPane(new Canvas());
+
+ return tab;
+ }
+
+ @Override
protected Record createNewRecord() {
Role role = new Role();
@SuppressWarnings( { "UnnecessaryLocalVariable" })
@@ -149,19 +236,23 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
}
if (this.hasManageSecurityPermission || isMemberOfRole) {
- // Create the selectors and add them to the corresponding canvas items on the form.
+ // Create the permission editor and selectors and add them to the corresponding tabs.
+
+ this.permissionsEditor = new PermissionsEditor(this, !hasManageSecurityPermission ||
+ this.isSystemRole);
+ this.permissionsTab.setPane(permissionsEditor);
if (!this.isSystemRole) {
Record[] groupRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.RESOURCE_GROUPS);
ListGridRecord[] groupListGridRecords = toListGridRecordArray(groupRecords);
- this.groupSelector = new RoleResourceGroupSelector(this.extendLocatorId("Groups"), groupListGridRecords,
+ this.resourceGroupSelector = new RoleResourceGroupSelector(this.extendLocatorId("Groups"), groupListGridRecords,
!this.hasManageSecurityPermission);
- this.groupSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
+ this.resourceGroupSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
public void onSelectionChanged(AssignedItemsChangedEvent event) {
onItemChanged();
}
});
- this.resourceGroupsItem.setCanvas(this.groupSelector);
+ this.resourceGroupsTab.setPane(this.resourceGroupSelector);
}
ListGridRecord[] subjectListGridRecords = toListGridRecordArray(subjectRecords);
@@ -187,7 +278,7 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
onItemChanged();
}
});
- this.subjectsItem.setCanvas(this.subjectSelector);
+ this.subjectsTab.setPane(this.subjectSelector);
if (this.isLdapConfigured) {
Record[] ldapGroupRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.LDAP_GROUPS);
@@ -199,7 +290,7 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
onItemChanged();
}
});
- this.ldapGroupsItem.setCanvas(this.ldapGroupSelector);
+ this.ldapGroupsTab.setPane(this.ldapGroupSelector);
} else {
Label label = new Label("<b>"
+ MSG.common_msg_emphasizedNotePrefix()
@@ -209,11 +300,11 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
label.setWidth100();
label.setHeight(20);
label.setPadding(5);
- this.ldapGroupsItem.setCanvas(label);
+ this.ldapGroupsTab.setPane(label);
}
}
- this.permissionsItem.redraw();
+ this.permissionsEditor.redraw();
}
@Override
@@ -227,32 +318,6 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
descriptionItem.setColSpan(form.getNumCols());
items.add(descriptionItem);
- permissionsItem = new PermissionsItem(this);
- permissionsItem.setShowTitle(false);
- permissionsItem.setColSpan(form.getNumCols());
- items.add(permissionsItem);
-
- resourceGroupsItem = new CanvasItem(RolesDataSource.Field.RESOURCE_GROUPS, MSG.view_adminRoles_assignedGroups());
- resourceGroupsItem.setShowTitle(false);
- resourceGroupsItem.setTitleOrientation(TitleOrientation.TOP);
- resourceGroupsItem.setColSpan(form.getNumCols());
- resourceGroupsItem.setCanvas(new Canvas());
- items.add(resourceGroupsItem);
-
- subjectsItem = new CanvasItem(RolesDataSource.Field.SUBJECTS, MSG.view_adminRoles_assignedSubjects());
- subjectsItem.setShowTitle(false);
- subjectsItem.setTitleOrientation(TitleOrientation.TOP);
- subjectsItem.setColSpan(form.getNumCols());
- subjectsItem.setCanvas(new Canvas());
- items.add(subjectsItem);
-
- ldapGroupsItem = new CanvasItem(RolesDataSource.Field.LDAP_GROUPS, MSG.view_adminRoles_ldapGroups());
- ldapGroupsItem.setShowTitle(false);
- ldapGroupsItem.setTitleOrientation(TitleOrientation.TOP);
- ldapGroupsItem.setColSpan(form.getNumCols());
- ldapGroupsItem.setCanvas(new Canvas());
- items.add(ldapGroupsItem);
-
return items;
}
@@ -261,9 +326,9 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
// Grab the currently assigned sets from each of the selectors and stick them into the corresponding canvas
// items on the form, so when the form is saved, they'll get submitted along with the rest of the simple fields
// to the datasource's add or update methods.
- if (this.groupSelector != null) {
- ListGridRecord[] groupRecords = this.groupSelector.getSelectedRecords();
- getForm().setValue(RolesDataSource.Field.RESOURCE_GROUPS, groupRecords);
+ if (this.resourceGroupSelector != null) {
+ ListGridRecord[] resourceGroupRecords = this.resourceGroupSelector.getSelectedRecords();
+ getForm().setValue(RolesDataSource.Field.RESOURCE_GROUPS, resourceGroupRecords);
}
if (this.subjectSelector != null) {
@@ -284,10 +349,12 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
protected void reset() {
super.reset();
- this.permissionsItem.reset();
+ if (this.permissionsEditor != null) {
+ this.permissionsEditor.reset();
+ }
- if (this.groupSelector != null) {
- this.groupSelector.reset();
+ if (this.resourceGroupSelector != null) {
+ this.resourceGroupSelector.reset();
}
if (this.subjectSelector != null) {
this.subjectSelector.reset();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
index ea8f243..9b8e850 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
@@ -151,14 +151,14 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
}
}
- protected VLayout buildContentPane() {
- VLayout contentPane = new VLayout();
+ protected LocatableVLayout buildContentPane() {
+ LocatableVLayout contentPane = new LocatableVLayout(extendLocatorId("Content"));
contentPane.setWidth100();
contentPane.setHeight100();
contentPane.setOverflow(Overflow.AUTO);
//contentPane.setPadding(7);
- this.form = buildForm();
+ this.form = buildForm();
contentPane.addMember(this.form);
return contentPane;
@@ -174,43 +174,48 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
protected EnhancedDynamicForm buildForm() {
boolean isNewRecord = (this.recordId == ID_NEW);
- EnhancedDynamicForm form = new EnhancedDynamicForm(this.getLocatorId(), isFormReadOnly(), isNewRecord);
+ EnhancedDynamicForm form = new EnhancedDynamicForm(this.getLocatorId(), isFormReadOnly(), isNewRecord);
form.setDataSource(this.dataSource);
List<FormItem> items = createFormItems(form);
- form.setItems(items.toArray(new FormItem[items.size()]));
+ form.setFields(items.toArray(new FormItem[items.size()]));
form.addItemChangedHandler(new ItemChangedHandler() {
public void onItemChanged(ItemChangedEvent event) {
AbstractRecordEditor.this.onItemChanged();
}
});
-
+
return form;
}
+
protected boolean isFormReadOnly() {
return this.isReadOnly;
}
+ public void setForm(EnhancedDynamicForm form) {
+ this.form = form;
+ }
+
public EnhancedDynamicForm getForm() {
- return form;
+ return this.form;
}
public DS getDataSource() {
- return dataSource;
+ return this.dataSource;
}
public boolean isReadOnly() {
- return isReadOnly;
+ return this.isReadOnly;
}
public int getRecordId() {
- return recordId;
+ return this.recordId;
}
public String getListViewPath() {
- return listViewPath;
+ return this.listViewPath;
}
protected abstract List<FormItem> createFormItems(EnhancedDynamicForm form);
@@ -220,8 +225,8 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
* and update the Save button's enablement based on whether or not all items on the form are valid.
*/
public void onItemChanged() {
- // TODO: We also need to validate complex fields - selectors, etc.
boolean isValid = this.form.valuesAreValid(false);
+ //boolean isValid = this.valuesManager.validate();
// If we're in editable mode, update the button enablement.
if (!this.isReadOnly) {
@@ -257,7 +262,7 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
}
protected void reset() {
- this.form.reset();
+ this.form.resetValues();
}
protected void save() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
index 95f430c..5afd91b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
@@ -397,8 +397,9 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
assignedGrid.setData(initialSelection);
}
- if (!this.isReadOnly) {
- // Add event handlers.
+ if (this.isReadOnly) {
+ assignedGrid.setDisabled(true);
+ } else {
assignedGrid.addDoubleClickHandler(new DoubleClickHandler() {
public void onDoubleClick(DoubleClickEvent event) {
removeSelectedRows();
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 742362f..4739ba6 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -125,6 +125,7 @@ common_title_operations_range=Operation Range~
common_title_over=Over~
common_title_password = Password~
common_title_path = Path~
+common_title_permissions = Permissions~
common_title_platform=Platform~
common_title_platform_total=Platform Total~
common_title_plugin = Plugin~
13 years, 6 months
[rhq] modules/enterprise
by lkrejci
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java | 12 ++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
New commits:
commit 62588ff3b85660ccfd6b218ca7e57fd0f723849c
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Dec 1 21:23:18 2010 +0100
do not fail the whole upgrade on the server-side if a single resource upgrade fails. This should be extremely rare but can happen if resource upgrade and resource deletion happen concurrently.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
index 89e445a..5f6d08a 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/discovery/DiscoveryBossBean.java
@@ -426,10 +426,14 @@ public class DiscoveryBossBean implements DiscoveryBossLocal, DiscoveryBossRemot
for (ResourceUpgradeRequest request : upgradeRequests) {
Resource existingResource = this.entityManager.find(Resource.class, request.getResourceId());
if (existingResource != null) {
- ResourceUpgradeResponse upgradedData = upgradeResource(existingResource, request,
- allowGenericPropertiesUpgrade);
- if (upgradedData != null) {
- result.add(upgradedData);
+ try {
+ ResourceUpgradeResponse upgradedData = upgradeResource(existingResource, request,
+ allowGenericPropertiesUpgrade);
+ if (upgradedData != null) {
+ result.add(upgradedData);
+ }
+ } catch (Exception e) {
+ log.error("Failed to process upgrade request for resource " + existingResource + ".", e);
}
}
}
13 years, 6 months
[rhq] 4 commits - modules/enterprise
by Joseph Marques
modules/enterprise/gui/coregui/src/main/java/com/google/gwt/user/rebind/rpc/TrackingProxyCreator.java | 44 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java | 33 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java | 156 +++++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingProxyCreator.java | 46 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingServiceInterfaceProxyGenerator.java | 2
6 files changed, 148 insertions(+), 139 deletions(-)
New commits:
commit d7a8aebb5710b5a11bb70ee24ca34cfe6f29681c
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Nov 29 16:45:03 2010 -0500
update local variable name to match class type
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java
index 1c2bbe0..0697489 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java
@@ -89,11 +89,11 @@ public class TrackingRemoteServiceProxy extends RemoteServiceProxy {
int invocationCount, AsyncCallback<T> callback) {
RequestCallback original = super.doCreateRequestCallback(responseReader, methodName, invocationCount, callback);
- TrackingRequestCallback monitoringCallback = new TrackingRequestCallback(invocationCount, methodName, original);
+ TrackingRequestCallback trackingCallback = new TrackingRequestCallback(invocationCount, methodName, original);
- RPCTracker.getInstance().register(monitoringCallback);
+ RPCTracker.getInstance().register(trackingCallback);
- return monitoringCallback;
+ return trackingCallback;
}
@Override
commit 4d7fc5bd8b4d47f085decbcca720e3852a379f1e
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Nov 29 15:19:31 2010 -0500
move TrackingProxyCreator to our own package structure
diff --git a/modules/enterprise/gui/coregui/src/main/java/com/google/gwt/user/rebind/rpc/TrackingProxyCreator.java b/modules/enterprise/gui/coregui/src/main/java/com/google/gwt/user/rebind/rpc/TrackingProxyCreator.java
deleted file mode 100644
index 32ee120..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/com/google/gwt/user/rebind/rpc/TrackingProxyCreator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 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 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 com.google.gwt.user.rebind.rpc;
-
-import com.google.gwt.core.ext.typeinfo.JClassType;
-import com.google.gwt.user.client.rpc.RemoteService;
-import com.google.gwt.user.client.rpc.impl.RemoteServiceProxy;
-
-import org.rhq.enterprise.gui.coregui.client.util.rpc.TrackingRemoteServiceProxy;
-
-/**
- * Creates a customized client-side proxy for a {@link RemoteService} interface.
- *
- * @see TrackingRemoteServiceProxy
- * @author Joseph Marques
- */
-public class TrackingProxyCreator extends ProxyCreator {
-
- public TrackingProxyCreator(JClassType type) {
- super(type);
- }
-
- @Override
- protected Class<? extends RemoteServiceProxy> getProxySupertype() {
- return TrackingRemoteServiceProxy.class;
- }
-
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingProxyCreator.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingProxyCreator.java
new file mode 100644
index 0000000..495aa4e
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingProxyCreator.java
@@ -0,0 +1,46 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 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 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.coregui.user.rebind.rpc;
+
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.user.client.rpc.RemoteService;
+import com.google.gwt.user.client.rpc.impl.RemoteServiceProxy;
+import com.google.gwt.user.rebind.rpc.ProxyCreator;
+
+import org.rhq.enterprise.gui.coregui.client.util.rpc.TrackingRemoteServiceProxy;
+
+
+/**
+ * Creates a customized client-side proxy for a {@link RemoteService} interface.
+ *
+ * @see TrackingRemoteServiceProxy
+ * @author Joseph Marques
+ */
+public class TrackingProxyCreator extends ProxyCreator {
+
+ public TrackingProxyCreator(JClassType type) {
+ super(type);
+ }
+
+ @Override
+ protected Class<? extends RemoteServiceProxy> getProxySupertype() {
+ return TrackingRemoteServiceProxy.class;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingServiceInterfaceProxyGenerator.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingServiceInterfaceProxyGenerator.java
index 9b1dda1..a98f2bc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingServiceInterfaceProxyGenerator.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/user/rebind/rpc/TrackingServiceInterfaceProxyGenerator.java
@@ -21,7 +21,7 @@ package org.rhq.enterprise.gui.coregui.user.rebind.rpc;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.user.rebind.rpc.ProxyCreator;
import com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator;
-import com.google.gwt.user.rebind.rpc.TrackingProxyCreator;
+
/**
* A generator used to create remote service proxy wrappers that will inject additional management and monitoring
commit c5bf1fc4e1135e615089b48df353ec5b29f04b7e
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Nov 29 14:16:49 2010 -0500
make RemoteServiceStatistics.Record.Summary immutable using 'public final'
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java
index 530ff60..57cb200 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java
@@ -73,13 +73,13 @@ public class TestRemoteServiceStatisticsView extends Table {
private ListGridRecord transform(Summary stat) {
ListGridRecord record = new ListGridRecord();
- record.setAttribute("serviceName", stat.getServiceName());
- record.setAttribute("methodName", stat.getMethodName());
- record.setAttribute("count", stat.getCount());
- record.setAttribute("slowest", stat.getSlowest());
- record.setAttribute("average", stat.getAverage());
- record.setAttribute("fastest", stat.getFastest());
- record.setAttribute("stddev", stat.getStddev());
+ record.setAttribute("serviceName", stat.serviceName);
+ record.setAttribute("methodName", stat.methodName);
+ record.setAttribute("count", stat.count);
+ record.setAttribute("slowest", stat.slowest);
+ record.setAttribute("average", stat.average);
+ record.setAttribute("fastest", stat.fastest);
+ record.setAttribute("stddev", stat.stddev);
return record;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java
index 039838e..204be10 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java
@@ -51,36 +51,36 @@ public class RemoteServiceStatistics {
}
public static class Summary {
- private String serviceName;
- private String methodName;
- private int count;
- private long slowest;
- private long average;
- private long fastest;
- private long stddev;
+ public final String serviceName;
+ public final String methodName;
+ public final int count;
+ public final long slowest;
+ public final long average;
+ public final long fastest;
+ public final long stddev;
private Summary(String serviceName, String methodName, List<Long> data) {
- // remoteService format "{ServiceName}_Proxy.{MethodName}"
this.serviceName = serviceName;
this.methodName = methodName;
-
this.count = data.size();
if (!data.isEmpty()) {
int i = 0;
- long total = 0;
+ long total = 0, slow = 0, fast = 0;
for (long next : data) {
if (i++ == 0) {
- total = slowest = fastest = next;
+ total = slow = fast = next;
} else {
total += next;
- if (next > slowest) {
- slowest = next;
- } else if (next < fastest) {
- fastest = next;
+ if (next > slow) {
+ slow = next;
+ } else if (next < fast) {
+ fast = next;
}
}
}
+ slowest = slow;
+ fastest = fast;
double avg = (total) / (double) count;
double sumOfSquares = 0;
@@ -89,40 +89,14 @@ public class RemoteServiceStatistics {
}
stddev = (long) Math.pow(sumOfSquares / count, 0.5);
average = (long) avg;
+ } else {
+ slowest = average = fastest = stddev = 0;
}
}
- public String getServiceName() {
- return serviceName;
- }
-
- public String getMethodName() {
- return methodName;
- }
-
- public int getCount() {
- return count;
- }
-
- public long getSlowest() {
- return slowest;
- }
-
- public long getAverage() {
- return average;
- }
-
- public long getFastest() {
- return fastest;
- }
-
- public long getStddev() {
- return stddev;
- }
-
public String toString() {
StringBuilder builder = new StringBuilder();
- builder.append("serviceName=").append(serviceName).append(',');
+ builder.append("serviceName=").append(serviceName).append('.');
builder.append("methodeName=").append(methodName).append(": ");
if (count < 1) {
builder.append("empty");
commit dcb3853d5c1f8df325e44f40c379d351bfd6f264
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Nov 29 13:30:09 2010 -0500
update gwt remote service statistics to include stddev
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java
index cbc5bda..530ff60 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java
@@ -28,7 +28,7 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.util.rpc.RemoteServiceStatistics;
-import org.rhq.enterprise.gui.coregui.client.util.rpc.RemoteServiceStatistics.Stat;
+import org.rhq.enterprise.gui.coregui.client.util.rpc.RemoteServiceStatistics.Record.Summary;
/**
* A view that gives a display of statistics for all remote services executed since the application was loaded.
@@ -50,22 +50,20 @@ public class TestRemoteServiceStatisticsView extends Table {
ListGridField methodName = new ListGridField("methodName", "Method Name");
ListGridField count = new ListGridField("count", "Count");
count.setAlign(Alignment.CENTER);
- ListGridField total = new ListGridField("total", "Total (ms)");
- total.setAlign(Alignment.RIGHT);
- ListGridField average = new ListGridField("average", "Average (ms)");
- average.setAlign(Alignment.RIGHT);
- ListGridField latest = new ListGridField("latest", "Latest (ms)");
- latest.setAlign(Alignment.RIGHT);
ListGridField slowest = new ListGridField("slowest", "Slowest (ms)");
slowest.setAlign(Alignment.RIGHT);
+ ListGridField average = new ListGridField("average", "Average (ms)");
+ average.setAlign(Alignment.RIGHT);
ListGridField fastest = new ListGridField("fastest", "Fastest (ms)");
fastest.setAlign(Alignment.RIGHT);
+ ListGridField stddev = new ListGridField("stddev", "Std Dev");
+ stddev.setAlign(Alignment.RIGHT);
- getListGrid().setFields(serviceName, methodName, count, total, average, latest, slowest, fastest);
+ getListGrid().setFields(serviceName, methodName, count, slowest, average, fastest, stddev);
getListGrid().setRecords(transform(RemoteServiceStatistics.getAll()));
}
- private ListGridRecord[] transform(List<Stat> stats) {
+ private ListGridRecord[] transform(List<Summary> stats) {
ListGridRecord[] results = new ListGridRecord[stats.size()];
for (int i = 0; i < stats.size(); i++) {
results[i] = transform(stats.get(i));
@@ -73,16 +71,15 @@ public class TestRemoteServiceStatisticsView extends Table {
return results;
}
- private ListGridRecord transform(Stat stat) {
+ private ListGridRecord transform(Summary stat) {
ListGridRecord record = new ListGridRecord();
record.setAttribute("serviceName", stat.getServiceName());
record.setAttribute("methodName", stat.getMethodName());
record.setAttribute("count", stat.getCount());
- record.setAttribute("total", stat.getTotal());
- record.setAttribute("average", stat.getTotal() / stat.getCount());
- record.setAttribute("latest", stat.getLatest());
record.setAttribute("slowest", stat.getSlowest());
+ record.setAttribute("average", stat.getAverage());
record.setAttribute("fastest", stat.getFastest());
+ record.setAttribute("stddev", stat.getStddev());
return record;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java
index eaea847..039838e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java
@@ -23,99 +23,135 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.rhq.enterprise.gui.coregui.client.util.rpc.RemoteServiceStatistics.Record.Summary;
+
/**
* @author Joseph Marques
*/
public class RemoteServiceStatistics {
- public static class Stat {
+ public static class Record {
private String serviceName;
private String methodName;
- private int count;
- private long total;
- private long latest;
- private long slowest;
- private long fastest;
+ private List<Long> data = new ArrayList<Long>();
- protected Stat(String remoteService, long millis) {
+ private Record(String remoteService, long millis) {
// remoteService format "{ServiceName}_Proxy.{MethodName}"
this.serviceName = remoteService.substring(0, remoteService.indexOf("_Proxy"));
this.methodName = remoteService.substring(remoteService.indexOf('.') + 1);
- count = 1;
- total = latest = slowest = fastest = millis;
+ this.data.add(millis);
}
private void record(long millis) {
- count++;
- total += millis;
- latest = millis;
- if (millis > slowest) {
- slowest = millis;
- } else if (millis < fastest) {
- fastest = millis;
- }
+ this.data.add(millis);
}
- public String getServiceName() {
- return serviceName;
+ public Summary getSummary() {
+ return new Summary(serviceName, methodName, data);
}
- public String getMethodName() {
- return methodName;
- }
+ public static class Summary {
+ private String serviceName;
+ private String methodName;
+ private int count;
+ private long slowest;
+ private long average;
+ private long fastest;
+ private long stddev;
+
+ private Summary(String serviceName, String methodName, List<Long> data) {
+ // remoteService format "{ServiceName}_Proxy.{MethodName}"
+ this.serviceName = serviceName;
+ this.methodName = methodName;
+
+ this.count = data.size();
+
+ if (!data.isEmpty()) {
+ int i = 0;
+ long total = 0;
+ for (long next : data) {
+ if (i++ == 0) {
+ total = slowest = fastest = next;
+ } else {
+ total += next;
+ if (next > slowest) {
+ slowest = next;
+ } else if (next < fastest) {
+ fastest = next;
+ }
+ }
+ }
+ double avg = (total) / (double) count;
+
+ double sumOfSquares = 0;
+ for (long next : data) {
+ sumOfSquares += Math.pow(next - avg, 2);
+ }
+ stddev = (long) Math.pow(sumOfSquares / count, 0.5);
+ average = (long) avg;
+ }
+ }
- public int getCount() {
- return count;
- }
+ public String getServiceName() {
+ return serviceName;
+ }
- public long getTotal() {
- return total;
- }
+ public String getMethodName() {
+ return methodName;
+ }
- public long getLatest() {
- return latest;
- }
+ public int getCount() {
+ return count;
+ }
- public long getSlowest() {
- return slowest;
- }
+ public long getSlowest() {
+ return slowest;
+ }
- public long getFastest() {
- return fastest;
- }
+ public long getAverage() {
+ return average;
+ }
+
+ public long getFastest() {
+ return fastest;
+ }
+
+ public long getStddev() {
+ return stddev;
+ }
- public String toString() {
- StringBuilder builder = new StringBuilder();
- builder.append("serviceName=").append(serviceName).append(',');
- builder.append("methodeName=").append(methodName).append(": ");
- if (count < 1) {
- builder.append("empty");
- } else {
- builder.append("count=").append(count).append(',');
- builder.append("total=").append(total).append(',');
- builder.append("avg=").append(total / count).append(',');
- builder.append("latest=").append(latest).append(',');
- builder.append("slowest=").append(slowest).append(',');
- builder.append("fastest=").append(fastest);
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("serviceName=").append(serviceName).append(',');
+ builder.append("methodeName=").append(methodName).append(": ");
+ if (count < 1) {
+ builder.append("empty");
+ } else {
+ builder.append("count=").append(count).append(',');
+ builder.append("slowest=").append(slowest).append(',');
+ builder.append("average=").append(average).append(',');
+ builder.append("fastest=").append(fastest).append(',');
+ builder.append("stddev=").append(stddev);
+ }
+ return builder.toString();
}
- return builder.toString();
}
}
- private static Map<String, Stat> statistics = new HashMap<String, Stat>();
+ private static Map<String, Record> statistics = new HashMap<String, Record>();
private RemoteServiceStatistics() {
// static access only
}
public static void record(String remoteService, long millis) {
- Stat stat = statistics.get(remoteService);
- if (stat == null) {
- stat = new Stat(remoteService, millis);
- statistics.put(remoteService, stat);
+ Record record = statistics.get(remoteService);
+ if (record == null) {
+ record = new Record(remoteService, millis);
+ statistics.put(remoteService, record);
} else {
- stat.record(millis);
+ record.record(millis);
}
}
@@ -125,11 +161,11 @@ public class RemoteServiceStatistics {
}
public static String print(String remoteService) {
- Stat stat = statistics.get(remoteService);
- if (stat == null) {
- stat = new Stat(remoteService, 0);
+ Record record = statistics.get(remoteService);
+ if (record == null) {
+ record = new Record(remoteService, 0);
}
- return "RemoteServiceStatistics: " + remoteService + ": " + stat.toString();
+ return "RemoteServiceStatistics: " + remoteService + ": " + record.getSummary();
}
public static List<String> printAll() {
@@ -142,19 +178,19 @@ public class RemoteServiceStatistics {
return stats;
}
- public static Stat get(String remoteService) {
- Stat stat = statistics.get(remoteService);
+ public static Summary get(String remoteService) {
+ Record stat = statistics.get(remoteService);
if (stat == null) {
- stat = new Stat(remoteService, 0);
+ stat = new Record(remoteService, 0);
}
- return stat;
+ return stat.getSummary();
}
- public static List<Stat> getAll() {
- List<Stat> stats = new ArrayList<Stat>();
+ public static List<Summary> getAll() {
+ List<Summary> stats = new ArrayList<Summary>();
for (String remoteService : statistics.keySet()) {
- stats.add(statistics.get(remoteService));
+ stats.add(get(remoteService));
}
return stats;
13 years, 6 months
[rhq] modules/core modules/enterprise
by ips
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 29
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java | 33
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java | 8
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java | 70 -
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java | 2
modules/enterprise/gui/coregui/pom.xml | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BookmarkableView.java | 41 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 102 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java | 398 ++--------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleSubjectSelector.java | 29
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java | 48 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java | 29
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java | 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 17
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/measurement/MeasurementOOBDataSource.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 18
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferences.java | 2
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 8
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 52 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java | 115 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java | 70 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java | 2
28 files changed, 573 insertions(+), 545 deletions(-)
New commits:
commit a65d2550a254c0c92cc8219032bfb6825898aadb
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Dec 1 10:54:47 2010 -0500
get updating of subjects, resource groups, and LDAP groups working in Role editor; other fixes and improvements to role and user editors; fix rhqadmin favorites bug
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 6358954..1fbab52 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -409,10 +409,6 @@ public class Subject implements Serializable {
}
public java.util.Set<Role> getRoles() {
- if (this.roles == null) {
- this.roles = new HashSet<Role>();
- }
-
return this.roles;
}
@@ -421,9 +417,16 @@ public class Subject implements Serializable {
}
public void addRole(Role role, boolean isLdap) {
- getRoles().add(role);
+ if (this.roles == null) {
+ this.roles = new HashSet<Role>();
+ }
+
+ this.roles.add(role);
if (isLdap) {
- getLdapRoles().add(role);
+ if (this.ldapRoles == null) {
+ this.ldapRoles = new HashSet<Role>();
+ }
+ this.ldapRoles.add(role);
}
}
@@ -432,14 +435,12 @@ public class Subject implements Serializable {
}
public void removeRole(Role role) {
- getRoles().remove(role);
+ if (this.roles != null) {
+ this.roles.remove(role);
+ }
}
public java.util.Set<Role> getLdapRoles() {
- if (this.ldapRoles == null) {
- this.ldapRoles = new HashSet<Role>();
- }
-
return this.ldapRoles;
}
@@ -448,11 +449,13 @@ public class Subject implements Serializable {
}
public void addLdapRole(Role role) {
- getLdapRoles().add(role);
+ addRole(role, true);
}
public void removeLdapRole(Role role) {
- getLdapRoles().remove(role);
+ if (this.ldapRoles != null) {
+ this.ldapRoles.remove(role);
+ }
}
public List<ResourceGroup> getOwnedGroups() {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
index 8bde98d..b9cb102 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Role.java
@@ -26,6 +26,7 @@ import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
+import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
@@ -42,18 +43,18 @@ import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
-import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.CollectionOfElements;
import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.resource.group.LdapGroup;
+import org.rhq.core.domain.resource.group.ResourceGroup;
/**
* A role has zero or more {@link org.rhq.core.domain.resource.group.ResourceGroup}s assigned to it. You can assign a
* role to zero or more {@link Subject}s. A role defines a set of {@link Permission}s that the assigned {@link Subject}s
- * are authorized for in order to operate on the given resources in the assigned
- * {@link org.rhq.core.domain.resource.group.ResourceGroup}s.
+ * are authorized for in order to operate on the Resources in the assigned {@link
+ * org.rhq.core.domain.resource.group.ResourceGroup}s.
*
* @author Greg Hinkle
*/
@@ -112,13 +113,13 @@ public class Role implements Serializable {
@ManyToMany(mappedBy = "ldapRoles")
private java.util.Set<Subject> ldapSubjects = new HashSet<Subject>();
- @OneToMany(mappedBy = "role", cascade = javax.persistence.CascadeType.ALL)
+ @OneToMany(mappedBy = "role", cascade = { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.REFRESH })
private Set<LdapGroup> ldapGroups = new HashSet<LdapGroup>();
@ManyToMany(mappedBy = "roles")
private java.util.Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups = new HashSet<org.rhq.core.domain.resource.group.ResourceGroup>();
- @Cascade( { CascadeType.ALL })
+ @Cascade( { org.hibernate.annotations.CascadeType.ALL })
@CollectionOfElements(fetch = FetchType.EAGER)
@Column(name = "operation")
@JoinTable(name = "RHQ_PERMISSION", joinColumns = @JoinColumn(name = "ROLE_ID"))
@@ -202,7 +203,7 @@ public class Role implements Serializable {
this.ldapGroups.add(ldapGroup);
}
- public boolean removeLdapGroup(LdapGroup ldapGroup) {
+ public boolean removeLdapGroup(LdapGroup ldapGroup) {
return this.ldapGroups.remove(ldapGroup);
}
@@ -211,7 +212,15 @@ public class Role implements Serializable {
}
public void setSubjects(Set<Subject> subjects) {
- this.subjects = subjects;
+ if (subjects == null) {
+ this.subjects = new HashSet<Subject>();
+ } else {
+ this.subjects = subjects;
+ for (Subject subject :subjects) {
+ subject.addRole(this);
+ this.subjects.add(subject);
+ }
+ }
}
public void addSubject(Subject subject) {
@@ -263,7 +272,15 @@ public class Role implements Serializable {
}
public void setResourceGroups(Set<org.rhq.core.domain.resource.group.ResourceGroup> resourceGroups) {
- this.resourceGroups = resourceGroups;
+ if (resourceGroups == null) {
+ this.resourceGroups = new HashSet<ResourceGroup>();
+ } else {
+ this.resourceGroups = resourceGroups;
+ for (ResourceGroup resourceGroup : this.resourceGroups) {
+ resourceGroup.addRole(this);
+ this.resourceGroups.add(resourceGroup);
+ }
+ }
}
public void addResourceGroup(org.rhq.core.domain.resource.group.ResourceGroup resourceGroup) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
index c43947d..4cbdf7c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/RoleCriteria.java
@@ -37,6 +37,7 @@ import org.rhq.core.domain.util.PageOrdering;
@XmlAccessorType(XmlAccessType.FIELD)
@SuppressWarnings("unused")
public class RoleCriteria extends Criteria {
+
private static final long serialVersionUID = 1L;
private Integer filterId;
@@ -101,6 +102,7 @@ public class RoleCriteria extends Criteria {
/**
* Requires MANAGE_SECURITY
+ *
* @param fetchSubjects
*/
public void fetchSubjects(boolean fetchSubjects) {
@@ -108,7 +110,7 @@ public class RoleCriteria extends Criteria {
}
/**
- * Specify whether or not LDAP groups should be fetched.
+ * Specify whether or not LDAP groups should be fetched. Requires MANAGE_SECURITY.
*
* @param fetchLdapGroups true if LDAP groups should be fetched
*/
@@ -118,6 +120,7 @@ public class RoleCriteria extends Criteria {
/**
* Requires MANAGE_SECURITY
+ *
* @param fetchResourceGroups
*/
public void fetchResourceGroups(boolean fetchResourceGroups) {
@@ -139,6 +142,7 @@ public class RoleCriteria extends Criteria {
/** subclasses should override as necessary */
public boolean isSecurityManagerRequired() {
- return (this.fetchSubjects || this.fetchResourceGroups);
+ return (this.fetchSubjects || this.fetchResourceGroups || this.fetchLdapGroups);
}
+
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
index 2a9c63f..f1a4ac6 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/LdapGroup.java
@@ -16,7 +16,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-
package org.rhq.core.domain.resource.group;
import java.io.Serializable;
@@ -51,14 +50,17 @@ import org.rhq.core.domain.authz.Role;
@SequenceGenerator(name = "id", sequenceName = "RHQ_ROLE_LDAP_GROUP_ID_SEQ", allocationSize = 100)
@XmlAccessorType(XmlAccessType.FIELD)
public class LdapGroup implements Serializable {
+
private static final long serialVersionUID = 1L;
+
public static final String DELETE_BY_ID = "LdapGroup.deleteById";
public static final String QUERY_FIND_ALL = "LdapGroup.findAll";
public static final String FIND_BY_ROLES_GROUP_NAMES = "LdapGroup.findRolesByGroupNames";
+
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "id")
- private Integer id;
+ private int id;
@ManyToOne
@JoinColumn(name = "ROLE_ID", referencedColumnName = "ID", nullable = false)
@@ -67,23 +69,15 @@ public class LdapGroup implements Serializable {
@Column(name = "LDAP_GROUP_NAME", nullable = false)
private String name;
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
@Transient
private String description = "";
- public String getName() {
- return name;
+ public int getId() {
+ return id;
}
- public void setName(String name) {
- this.name = name;
+ public void setId(int id) {
+ this.id = id;
}
public Role getRole() {
@@ -94,37 +88,47 @@ public class LdapGroup implements Serializable {
this.role = role;
}
- @Override
- public int hashCode() {
- return getName().hashCode() + 17 * ((role != null) ? role.hashCode() : 0);
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
}
@Override
- public boolean equals(Object o) {
- if (o == this) {
+ public boolean equals(Object obj) {
+ if (this == obj) {
return true;
}
- if (!(o instanceof LdapGroup)) {
- return false;
- }
- LdapGroup grp = (LdapGroup) o;
- if (!getName().equals(grp.getName())) {
+ if (obj == null || getClass() != obj.getClass()) {
return false;
}
+ LdapGroup that = (LdapGroup)obj;
- if (getRole() != null) {
- return getRole().equals(grp.getRole());
- }
-
- return grp.getRole() == null;
+ return !(this.name != null ? !this.name.equals(that.name) : that.name != null);
}
- public Integer getId() {
- return id;
+ @Override
+ public int hashCode() {
+ return (this.name != null) ? this.name.hashCode() : 0;
}
- public void setId(Integer id) {
- this.id = id;
+ @Override
+ public String toString() {
+ return "LdapGroup[" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ']';
}
+
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
index 5250c11..810c8df 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java
@@ -552,7 +552,7 @@ public class ResourceGroup extends Group {
this.roles.add(role);
}
- public void removeRole(Role role) {
+ public void removeRole(Role role) {
this.roles.remove(role);
}
diff --git a/modules/enterprise/gui/coregui/pom.xml b/modules/enterprise/gui/coregui/pom.xml
index 3dbbcae..b1f6683 100644
--- a/modules/enterprise/gui/coregui/pom.xml
+++ b/modules/enterprise/gui/coregui/pom.xml
@@ -278,6 +278,7 @@
<servicePattern>**/gwt/*GWTService.java</servicePattern>
<i18nMessagesBundle>org.rhq.enterprise.gui.coregui.client.Messages</i18nMessagesBundle>
<compileSourcesArtifacts>org.rhq:rhq-core-domain</compileSourcesArtifacts>
+ <style>DETAILED</style>
</configuration>
<executions>
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BookmarkableView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BookmarkableView.java
index 7abaaf9..73eeceb 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BookmarkableView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/BookmarkableView.java
@@ -19,12 +19,51 @@
package org.rhq.enterprise.gui.coregui.client;
/**
- * Renders the specified descendant view.
+ * A view that is responsible for rendering the remaining view IDs in the view path (aka history item, aka bookmark)
+ * being rendered. For example, for the view path "Administration/Security/Users/10001", the UsersView class represents
+ * the "Administration/Security/Users" portion of the view. UsersView implements BookmarkableView, since it is
+ * responsible for rendering the remaining ID(s) in the view path (in this example, just "10001"). The BookmarkableView
+ * whose renderView() method rendered UsersView (i.e. UsersView's parent view) is responsible for advancing the
+ * ViewPath's current view ID pointer to point at the ID following "Users" (the ID corresponding to UsersView) -
+ * "10001". For example, UsersView's parent view's renderView() implementation would look something like this:
+ *
+ * <code>
+ * public void renderView(ViewPath viewPath) {
+ * // passed-in view path is "Administration/Security/Users/10001"
+ * // and current view ID is here --------------------^
+ *
+ * // the current view ID is the view we're being asked to render.
+ * // create the view and render it.
+ * String viewId = viewPath.getCurrent().getPath();
+ * Canvas view;
+ * if (viewId.equals("Users")) {
+ * view = new UsersView();
+ * } else {
+ * // handle other recognized view IDs
+ * }
+ * ourView.addMember(view);
+ *
+ * // check if UsersView implements BookmarkableView, and
+ * // if so, advance the view ID pointer to "10001" and then call
+ * // its renderView() method so it can render that view ID.
+ * if (view instanceof BookmarkableView) {
+ * viewPath.next();
+ * // "Administration/Security/Users/10001"
+ * // current view ID now points here ---^
+ * ((BookmarkableView)view).renderView(viewPath);
+ * }
+ * }
+ * </code>
*
* @author Ian Springer
*/
public interface BookmarkableView {
+ /**
+ * Render the current view ID of the specified view path.
+ *
+ * @param viewPath the view path whose current view ID is to be rendered
+ */
void renderView(ViewPath viewPath);
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
index ed9216b..6bd1bfe 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
@@ -19,10 +19,8 @@
package org.rhq.enterprise.gui.coregui.client.admin.roles;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -38,11 +36,11 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
-import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource;
import org.rhq.enterprise.gui.coregui.client.components.form.AbstractRecordEditor;
import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm;
import org.rhq.enterprise.gui.coregui.client.components.selector.AssignedItemsChangedEvent;
@@ -73,6 +71,7 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
private boolean hasManageSecurityPermission;
private boolean isLdapConfigured;
+ private boolean isSystemRole;
public RoleEditView(String locatorId, int roleId) {
super(locatorId, new RolesDataSource(), roleId, MSG.common_label_role(), HEADER_ICON);
@@ -81,6 +80,9 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
@Override
public void renderView(ViewPath viewPath) {
super.renderView(viewPath);
+
+ this.isSystemRole = RolesDataSource.isSystemRoleId(getRecordId());
+
GWTServiceLookup.getAuthorizationService().getExplicitGlobalPermissions(new AsyncCallback<Set<Permission>>() {
@Override
public void onSuccess(Set<Permission> result) {
@@ -97,15 +99,16 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
});
}
+ @Override
+ protected boolean isFormReadOnly() {
+ return (isReadOnly() || this.isSystemRole);
+ }
+
private void checkIfLdapConfigured() {
GWTServiceLookup.getLdapService().checkLdapConfiguredStatus(new AsyncCallback<Boolean>() {
public void onSuccess(Boolean isLdapConfigured) {
RoleEditView.this.isLdapConfigured = isLdapConfigured;
- if (RoleEditView.this.isLdapConfigured) {
- fetchAvailableLdapGroups();
- } else {
- init();
- }
+ init();
}
public void onFailure(Throwable caught) {
@@ -116,28 +119,8 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
});
}
- private void fetchAvailableLdapGroups() {
- final Set<LdapGroup> availableLdapGroups = null;
- GWTServiceLookup.getLdapService().findAvailableGroups(new AsyncCallback<Set<Map<String, String>>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_adminRoles_failLdapGroups(), caught);
- Set<LdapGroup> availableLdapGroups = Collections.emptySet();
- init();
- }
-
- public void onSuccess(Set<Map<String, String>> result) {
- // Get assigned LDAP groups.
- Set<LdapGroup> availableLdapGroups = RoleLdapGroupSelector.convertToCollection(result);
- // Update record with both objects.
- //record.setAttribute("ldapGroupsAvailable", availableGroups);
- init();
- }
- });
- }
-
private void init() {
- final boolean isReadOnly = (!this.hasManageSecurityPermission
- || (getRecordId() == RolesDataSource.ID_SUPERUSER) || (getRecordId() == RolesDataSource.ID_ALL_RESOURCES));
+ final boolean isReadOnly = (!this.hasManageSecurityPermission);
init(isReadOnly);
}
@@ -154,27 +137,51 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
// A user can always view their own assigned roles, but only users with MANAGE_SECURITY can view or update
// other users' assigned roles.
- Subject whoami = UserSessionManager.getSessionSubject();
- // TODO: Make call to Server to see if logged in user is a member of this role.
+ Subject sessionSubject = UserSessionManager.getSessionSubject();
+ int sessionSubjectId = sessionSubject.getId();
+ Record[] subjectRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.SUBJECTS);
+ boolean isMemberOfRole = false;
+ for (Record subjectRecord : subjectRecords) {
+ int subjectId = subjectRecord.getAttributeAsInt(RolesDataSource.Field.ID);
+ if (subjectId == sessionSubjectId) {
+ isMemberOfRole = true;
+ }
+ }
- if (this.hasManageSecurityPermission) {
+ if (this.hasManageSecurityPermission || isMemberOfRole) {
// Create the selectors and add them to the corresponding canvas items on the form.
- Record[] groupRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.RESOURCE_GROUPS);
- ListGridRecord[] groupListGridRecords = toListGridRecordArray(groupRecords);
- //boolean areGroupsReadOnly = areGroupsReadOnly(record); // TODO
- this.groupSelector = new RoleResourceGroupSelector(this.extendLocatorId("Groups"), groupListGridRecords);
- this.groupSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
- public void onSelectionChanged(AssignedItemsChangedEvent event) {
- onItemChanged();
- }
- });
- this.resourceGroupsItem.setCanvas(this.groupSelector);
+ if (!this.isSystemRole) {
+ Record[] groupRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.RESOURCE_GROUPS);
+ ListGridRecord[] groupListGridRecords = toListGridRecordArray(groupRecords);
+ this.groupSelector = new RoleResourceGroupSelector(this.extendLocatorId("Groups"), groupListGridRecords,
+ !this.hasManageSecurityPermission);
+ this.groupSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
+ public void onSelectionChanged(AssignedItemsChangedEvent event) {
+ onItemChanged();
+ }
+ });
+ this.resourceGroupsItem.setCanvas(this.groupSelector);
+ }
- Record[] subjectRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.SUBJECTS);
ListGridRecord[] subjectListGridRecords = toListGridRecordArray(subjectRecords);
- //boolean areSubjectsReadOnly = areSubjectsReadOnly(record); // TODO
- this.subjectSelector = new RoleSubjectSelector(this.extendLocatorId("Subjects"), subjectListGridRecords);
+ if (getRecordId() == RolesDataSource.ID_SUPERUSER) {
+ // If this is the superuser role, make sure the rhqadmin record is disabled, so it cannot be removed
+ // from the role, and filter the overlord record out, so users don't even know it exists.
+ List<ListGridRecord> filteredSubjectRecords = new ArrayList<ListGridRecord>();
+ for (ListGridRecord subjectListGridRecord : subjectListGridRecords) {
+ int subjectId = subjectListGridRecord.getAttributeAsInt(UsersDataSource.Field.ID);
+ if (subjectId == UsersDataSource.ID_RHQADMIN) {
+ subjectListGridRecord.setEnabled(false);
+ }
+ if (subjectId != UsersDataSource.ID_OVERLORD) {
+ filteredSubjectRecords.add(subjectListGridRecord);
+ }
+ }
+ subjectListGridRecords = filteredSubjectRecords.toArray(new ListGridRecord[filteredSubjectRecords.size()]);
+ }
+ this.subjectSelector = new RoleSubjectSelector(this.extendLocatorId("Subjects"), subjectListGridRecords,
+ !this.hasManageSecurityPermission);
this.subjectSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
public void onSelectionChanged(AssignedItemsChangedEvent event) {
onItemChanged();
@@ -185,9 +192,8 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
if (this.isLdapConfigured) {
Record[] ldapGroupRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.LDAP_GROUPS);
ListGridRecord[] ldapGroupListGridRecords = toListGridRecordArray(ldapGroupRecords);
- Integer roleId = record.getAttributeAsInt(RolesDataSource.Field.ID);
- //boolean areLdapGroupsReadOnly = areLdapGroupsReadOnly(record); // TODO
- this.ldapGroupSelector = new RoleLdapGroupSelector(this.extendLocatorId("LdapGroups"), roleId);
+ this.ldapGroupSelector = new RoleLdapGroupSelector(this.extendLocatorId("LdapGroups"),
+ ldapGroupListGridRecords, !this.hasManageSecurityPermission);
this.ldapGroupSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
public void onSelectionChanged(AssignedItemsChangedEvent event) {
onItemChanged();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
index df60177..39c2e67 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleLdapGroupSelector.java
@@ -22,10 +22,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.admin.roles;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.Map;
import java.util.Set;
@@ -35,16 +33,14 @@ import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
-import com.smartgwt.client.data.RecordList;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.grid.ListGridRecord;
-import com.smartgwt.client.widgets.grid.events.DataArrivedEvent;
-import com.smartgwt.client.widgets.grid.events.DataArrivedHandler;
import org.rhq.core.domain.resource.group.LdapGroup;
+import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.selector.AbstractSelector;
@@ -55,29 +51,21 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/**
* @author Simeon Pinder
*/
-public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>> {
-
- public static final String id = "id";
- public static final String name = "name";
- public static final String description = "description";
- private LdapGroupsDataSource availableDatasource;
- protected Set<String> selection = new HashSet<String>();
- private int currentRoleId = -1;
- private boolean initialLdapSelectionsLoad = true;
- //cache ldap group data from external server
- private Set<Map<String, String>> cachedLdapGroupsAvailable;
- private Map<String, Map<String, String>> cachedNameKeyedMap;
+public class RoleLdapGroupSelector extends AbstractSelector<LdapGroup> {
+
+ public static final String FIELD_ID = "id";
+ public static final String FIELD_NAME = "name";
+ public static final String FIELD_DESCRIPTION = "description";
//override the selector key for ldap group selection.
protected String getSelectorKey() {
return "name";
}
- public RoleLdapGroupSelector(String locatorId, Integer integer) {
- super(locatorId);
- if (integer != null) {
- this.currentRoleId = integer.intValue();
- }
+ public RoleLdapGroupSelector(String locatorId, ListGridRecord[] assignedRecords, boolean isReadOnly) {
+ super(locatorId, isReadOnly);
+
+ setAssigned(assignedRecords);
}
/** Define search for case insensitive filtering on ldap name.
@@ -95,62 +83,8 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
}
@Override
- protected RPCDataSource<PageList<LdapGroup>> getDataSource() {
- if (availableDatasource == null) {
- availableDatasource = new LdapGroupsDataSource();
- //add subsequent listener
- int currentRoleId = getCurrentRoleId();
- if (currentRoleId > -1) {
-
- //add listener to AvailableGrid, to act after successfully populated.
- this.availableGrid.addDataArrivedHandler(new DataArrivedHandler() {
- @Override
- public void onDataArrived(DataArrivedEvent event) {
- int currentRoleId = getCurrentRoleId();
- if (currentRoleId > -1) {
- if (initialLdapSelectionsLoad) {
- GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- new AsyncCallback<PageList<LdapGroup>>() {
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_adminRoles_failLdapGroupsRole(), throwable);
- }
-
- public void onSuccess(PageList<LdapGroup> currentlyAssignedLdapGroups) {
- //translate groups into records for grid
- //instead of setting the data, find which ones are shared and transfer as before. eliminate stale
- if ((currentlyAssignedLdapGroups != null)
- && (!currentlyAssignedLdapGroups.isEmpty())) {
- RecordList loaded = availableGrid.getDataAsRecordList();
- if (loaded != null) {
- ArrayList<Integer> located = new ArrayList<Integer>();
- for (LdapGroup group : currentlyAssignedLdapGroups) {
- int index = loaded.findIndex(name, group.getName());
- if (index > -1) {
- group.setId(index);//overwrite RHQ Resource ID to match ldap fabricated id.
- located.add(Integer.valueOf(index));
- }
- }
- int[] records = new int[located.size()];
- int i = 0;
- for (Integer index : located) {
- records[i++] = index.intValue();
- }
- availableGrid.selectRecords(records);
- //now simulate button push
- initialLdapSelectionsLoad = false;
- addSelectedRows();
- }
- }
- }
- });
- }
- }
- }
- });
- }
- }
- return availableDatasource;
+ protected RPCDataSource<LdapGroup> getDataSource() {
+ return new LdapGroupsDataSource();
}
/** Retrieve latest search string entered by the user.
@@ -167,269 +101,123 @@ public class RoleLdapGroupSelector extends AbstractSelector<PageList<LdapGroup>>
@Override
protected String getItemTitle() {
- return MSG.common_title_groups();
+ return MSG.common_title_ldapGroups();
}
- public class LdapGroupsDataSource extends RPCDataSource<PageList<LdapGroup>> {
+ public static class LdapGroupsDataSource extends RPCDataSource<LdapGroup> {
+
+ //cache ldap group data from external server
+ private Set<Map<String, String>> cachedLdapGroupsAvailable;
+ private Map<String, Map<String, String>> cachedNameKeyedMap;
public LdapGroupsDataSource() {
- DataSourceTextField nameField = new DataSourceTextField(name, name);
+ DataSourceTextField nameField = new DataSourceTextField(FIELD_NAME, FIELD_NAME);
nameField.setPrimaryKey(true);
- DataSourceTextField descriptionField = new DataSourceTextField(description, description);
+ DataSourceTextField descriptionField = new DataSourceTextField(FIELD_DESCRIPTION, FIELD_DESCRIPTION);
setFields(nameField, descriptionField);
}
- public ListGridRecord[] buildRecords(Set<LdapGroup> locatedGroups) {
- ListGridRecord[] records = new ListGridRecord[0];
- int indx = 0;
- if ((locatedGroups != null) && (!locatedGroups.isEmpty())) {
- //load groupsData
- records = new ListGridRecord[locatedGroups.size()];
- int index = 0;
- //for each Map returned then iterate over to retrieve the values
- for (LdapGroup group : locatedGroups) {
- //iterate over the group data to translate into records
- ListGridRecord record = new ListGridRecord();
- //load identifier
- record.setAttribute(id, index++);
- record.setAttribute(name, group.getName());
- record.setAttribute(description, group.getDescription());
- records[indx++] = record;
- }
+ @Override
+ public LdapGroup copyValues(Record from) {
+ LdapGroup to = new LdapGroup();
- for (ListGridRecord record : records) {
- if (selection.contains(record.getAttributeAsInt("id"))) {
- record.setEnabled(false);
- }
- }
- }
- return records;
- }
+ to.setId(from.getAttributeAsInt(FIELD_ID));
+ to.setName(from.getAttributeAsString(FIELD_NAME));
+ to.setDescription(from.getAttributeAsString(FIELD_DESCRIPTION));
- @Override
- public PageList<LdapGroup> copyValues(Record from) {
- throw new UnsupportedOperationException(MSG.view_adminRoles_ldapGroupsReadOnly());
+ return to;
}
@Override
- public ListGridRecord copyValues(PageList<LdapGroup> from) {
- return null;
+ public ListGridRecord copyValues(LdapGroup from) {
+ ListGridRecord to = new ListGridRecord();
+
+ to.setAttribute(FIELD_ID, from.getId());
+ to.setAttribute(FIELD_NAME, from.getName());
+ to.setAttribute(FIELD_DESCRIPTION, from.getDescription());
+
+ return to;
}
@Override
protected void executeFetch(final DSRequest request, final DSResponse response) {
//if not null then go through to initialize
if (cachedLdapGroupsAvailable == null) {
- //determine if ldap enabled, if so then chain and proceed with finding groups
- GWTServiceLookup.getLdapService().checkLdapConfiguredStatus(new AsyncCallback<Boolean>() {
- @Override
- public void onSuccess(Boolean ldapConfigured) {
- if (ldapConfigured) {
- availableGrid.setEmptyMessage(MSG.view_adminRoles_noItems());
- GWTServiceLookup.getLdapService().findAvailableGroups(
- new AsyncCallback<Set<Map<String, String>>>() {
-
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError(MSG.view_adminRoles_failLdapGroupsRole(),
- throwable);
- }
-
- public void onSuccess(Set<Map<String, String>> locatedGroups) {
- Log.trace("Successfully located " + locatedGroups.size()
- + " LDAP available groups.");
- if (cachedLdapGroupsAvailable == null) {
- cachedLdapGroupsAvailable = locatedGroups;
- }
- //all groups displayed initially
- response.setData(buildRecords(convertToCollection(locatedGroups)));
- //entry count
- if (null != locatedGroups) {
- response.setTotalRows(locatedGroups.size());
- } else {
- response.setTotalRows(0);
- }
- //pass off for processing
- processResponse(request.getRequestId(), response);
- }
- });//end of findAvailableGroups
- } else {//ldap not configured
- Log.debug("(LDAP not currently enabled. " + MSG.view_adminRoles_noItems());
- response.setTotalRows(0);
- String message = "("
- + MSG.view_adminRoles_noLdap("href='#Administration/Configuration/SystemSettings'", MSG
- .view_adminConfig_systemSettings()) + ")";
- availableGrid.setEmptyMessage(message);
- processResponse(request.getRequestId(), response);
- }
- }//end onSuccess
-
- @Override
- public void onFailure(Throwable caught) {
- Log.error("Unable to determine whether ldap configured - check server logs.");
- }
- });//end of checkLdapConfigured status
+ fetchLdapGroupsFromServerAsync(request, response);
} else {//use cached data and return correct response
//process cachedLdapGroupsAvailable based on criteria
- Criteria criteria = getLatestCriteria(availableFilterForm);
- String search = (String) criteria.getValues().get("name");
- //empty group
- Set<Map<String, String>> locatedGroups = new HashSet<Map<String, String>>();
-
- //populate the indexed map
- if (cachedNameKeyedMap == null) {
- cachedNameKeyedMap = new HashMap<String, Map<String, String>>();
- Iterator<Map<String, String>> iterator = cachedLdapGroupsAvailable.iterator();
- while (iterator.hasNext()) {
- Map<String, String> map = iterator.next();
- String id = map.get("name");
- cachedNameKeyedMap.put(id, map);
- }
- }
- //if search non empty
- if ((search != null) && (!search.trim().isEmpty())) {
- //now iterate over keys to find matches
- Set<String> keySet = cachedNameKeyedMap.keySet();
- for (String key : keySet) {
- //do case insensitive match to entered string.
- if (key.toLowerCase().contains(search.trim().toLowerCase())) {
- locatedGroups.add(cachedNameKeyedMap.get(key));
- }
- }
- } else {//return full list .. as no filtering done.
- locatedGroups = cachedLdapGroupsAvailable;
- }
- //then convert.
- response.setData(buildRecords(convertToCollection(locatedGroups)));
- //entry count
- if (null != locatedGroups) {
- response.setTotalRows(locatedGroups.size());
- } else {
- response.setTotalRows(0);
- }
-
- //pass off for processing
- processResponse(request.getRequestId(), response);
+ PageList<LdapGroup> ldapGroups = filterCachedLdapGroups(request);
+ sendSuccessResponse(request, response, ldapGroups);
}
}
- }
- public static Set<LdapGroup> convertToCollection(Set<Map<String, String>> locatedGroups) {
- Set<LdapGroup> converted = new HashSet<LdapGroup>();
- if (locatedGroups != null) {
- Iterator<Map<String, String>> iterator = locatedGroups.iterator();
- int index = 0;
- while (iterator.hasNext()) {
- Map<String, String> map = iterator.next();
- LdapGroup group = new LdapGroup();
- group.setDescription(map.get("description"));
- group.setName(map.get("name"));
- group.setId(index++);
- converted.add(group);
- }
- }
- return converted;
- }
-
- public class LdapAssignedGroupsDatasource extends RPCDataSource<Set<String>> {
- private Integer currentRoleId = Integer.valueOf(-1);
-
- public LdapAssignedGroupsDatasource(Integer integer) {
- if (integer != null) {
- this.currentRoleId = integer;
+ private PageList<LdapGroup> filterCachedLdapGroups(DSRequest request) {
+ //populate the indexed map
+ if (cachedNameKeyedMap == null) {
+ cachedNameKeyedMap = new HashMap<String, Map<String, String>>();
+ for (Map<String, String> map : cachedLdapGroupsAvailable) {
+ String id = map.get("name");
+ cachedNameKeyedMap.put(id, map);
+ }
}
- getAssignedGrid().invalidateCache();
- getAssignedGrid().markForRedraw();
- }
-
- @Override
- public Set<String> copyValues(Record from) {
- return null;
- }
- @Override
- public ListGridRecord copyValues(Set<String> from) {
- return null;
- }
-
- @Override
- protected void executeFetch(final DSRequest request, final DSResponse response) {
- int currentRoleId = -1;
- if ((getCurrentRoleId() != null) && (getCurrentRoleId().intValue() > -1)) {
- currentRoleId = getCurrentRoleId().intValue();
+ Set<Map<String, String>> locatedGroupMaps;
+
+ Criteria criteria = request.getCriteria();
+ String nameFilter = (String) criteria.getValues().get("name");
+ if ((nameFilter != null) && (!nameFilter.trim().isEmpty())) {
+ // filter the cached list by the user-specified name filter
+ locatedGroupMaps = new HashSet<Map<String, String>>();
+ //now iterate over keys to find matches
+ Set<String> keySet = cachedNameKeyedMap.keySet();
+ for (String key : keySet) {
+ //do case insensitive match to entered string.
+ if (key.toLowerCase().contains(nameFilter.trim().toLowerCase())) {
+ locatedGroupMaps.add(cachedNameKeyedMap.get(key));
+ }
+ }
+ } else {//return full list .. as no filtering done.
+ locatedGroupMaps = cachedLdapGroupsAvailable;
}
-
- GWTServiceLookup.getLdapService().findLdapGroupsAssignedToRole(currentRoleId,
- new AsyncCallback<PageList<LdapGroup>>() {
-
- public void onFailure(Throwable throwable) {
- CoreGUI.getErrorHandler().handleError(MSG.view_adminRoles_failLdapGroupsRole(), throwable);
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ PageList<LdapGroup> ldapGroups = convertToPageList(locatedGroupMaps);
+ return ldapGroups;
+ }
+
+ private void fetchLdapGroupsFromServerAsync(final DSRequest request, final DSResponse response) {
+ GWTServiceLookup.getLdapService().findAvailableGroups(
+ new AsyncCallback<Set<Map<String, String>>>() {
+ public void onSuccess(Set<Map<String, String>> locatedGroupMaps) {
+ Log.debug("Successfully located " + locatedGroupMaps.size() + " available LDAP groups.");
+ cachedLdapGroupsAvailable = locatedGroupMaps;
+ //all groups displayed initially
+ PageList<LdapGroup> ldapGroups = convertToPageList(locatedGroupMaps);
+ sendSuccessResponse(request, response, ldapGroups);
}
- public void onSuccess(PageList<LdapGroup> currentlyAssignedLdapGroups) {
- //instead of setting the data, find which ones are shared and transfer as before
- RecordList loaded = getAssignedGrid().getDataAsRecordList();
- ArrayList<Integer> located = new ArrayList<Integer>();
- for (LdapGroup groupMap : currentlyAssignedLdapGroups) {
- int index = loaded.findIndex(id, groupMap.getId());
- if (index > -1) {
- located.add(Integer.valueOf(index));
- }
- }
- int[] records = new int[located.size()];
- int i = 0;
- for (Integer index : located) {
- records[i++] = index.intValue();
- }
- getAssignedGrid().selectRecords(records);
- //now simulate button push
- addSelectedRows();
-
- //entry count
- if (null != currentlyAssignedLdapGroups) {
- response.setTotalRows(currentlyAssignedLdapGroups.size());
- } else {
- response.setTotalRows(0);
- }
- //pass off for processing
- processResponse(request.getRequestId(), response);
+ public void onFailure(Throwable throwable) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_adminRoles_failLdapGroupsRole(),
+ throwable);
}
- });
+ });//end of findAvailableGroups
}
+ }
- public ListGridRecord[] buildAssignedRecords(Set<LdapGroup> currentlyAssignedLdapGroups) {
- ListGridRecord[] records = new ListGridRecord[0];
- int index = 0;
- if ((currentlyAssignedLdapGroups != null) && (!currentlyAssignedLdapGroups.isEmpty())) {
- //load groupsData
- records = new ListGridRecord[currentlyAssignedLdapGroups.size()];
- for (LdapGroup group : currentlyAssignedLdapGroups) {
- ListGridRecord record = new ListGridRecord();
- // record.setAttribute(id, group.getName());
- record.setAttribute(id, group.getId());
- //load name
- record.setAttribute(name, group.getName());
- //load description
- record.setAttribute(description, group.getDescription());
-
- records[index++] = record;
- }
+ public static PageList<LdapGroup> convertToPageList(Set<Map<String, String>> locatedGroupMaps) {
+ PageList<LdapGroup> converted = new PageList<LdapGroup>();
+ converted.setPageControl(PageControl.getUnlimitedInstance());
+ if (locatedGroupMaps != null) {
+ for (Map<String, String> locatedGroupMap : locatedGroupMaps) {
+ LdapGroup group = new LdapGroup();
+ group.setDescription(locatedGroupMap.get("description"));
+ group.setName(locatedGroupMap.get("name"));
+ //group.setId(0);
+ converted.add(group);
}
- return records;
- }
-
- public Integer getCurrentRoleId() {
- return currentRoleId;
- }
-
- public void setCurrentRoleId(Integer currentRoleId) {
- this.currentRoleId = currentRoleId;
}
+ return converted;
}
- public int getCurrentRoleId() {
- return currentRoleId;
- }
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
index 4e9dc5b..4983868 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
@@ -31,8 +31,9 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.Resour
*/
public class RoleResourceGroupSelector extends ResourceGroupSelector {
- public RoleResourceGroupSelector(String locatorId, ListGridRecord[] groupRecords) {
- super(locatorId);
+ public RoleResourceGroupSelector(String locatorId, ListGridRecord[] groupRecords, boolean isReadOnly) {
+ super(locatorId, isReadOnly);
+
setAssigned(groupRecords);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleSubjectSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleSubjectSelector.java
index 4e898e1..a7653e2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleSubjectSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleSubjectSelector.java
@@ -23,10 +23,14 @@
package org.rhq.enterprise.gui.coregui.client.admin.roles;
import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.util.PageList;
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.util.RPCDataSource;
@@ -35,16 +39,18 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
* @author Greg Hinkle
*/
public class RoleSubjectSelector extends AbstractSelector<Subject> {
+
private static final String ITEM_ICON = "global/User_16.png";
- public RoleSubjectSelector(String id, ListGridRecord[] subjectRecords) {
- super(id);
+ public RoleSubjectSelector(String id, ListGridRecord[] subjectRecords, boolean isReadOnly) {
+ super(id, isReadOnly);
+
setAssigned(subjectRecords);
}
@Override
protected RPCDataSource<Subject> getDataSource() {
- return new UsersDataSource();
+ return new RoleUsersDataSource();
}
@Override
@@ -67,4 +73,21 @@ public class RoleSubjectSelector extends AbstractSelector<Subject> {
return ITEM_ICON;
}
+ class RoleUsersDataSource extends UsersDataSource {
+ @Override
+ protected void sendSuccessResponseRecords(DSRequest request, DSResponse response, PageList<Record> records) {
+ Record rhqAdminRecord = null;
+ for (Record record : records) {
+ Integer id = record.getAttributeAsInt(Field.ID);
+ if (id.equals(ID_RHQADMIN)) {
+ rhqAdminRecord = record;
+ }
+ }
+ if (rhqAdminRecord != null) {
+ records.remove(rhqAdminRecord);
+ }
+ super.sendSuccessResponseRecords(request, response, records);
+ }
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
index 95090ba..70df1ce 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
@@ -38,6 +38,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.RoleCriteria;
+import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource;
@@ -83,6 +84,10 @@ public class RolesDataSource extends RPCDataSource<Role> {
return INSTANCE;
}
+ public static boolean isSystemRoleId(int roleId) {
+ return (roleId == ID_SUPERUSER || roleId == ID_ALL_RESOURCES);
+ }
+
public RolesDataSource() {
super();
List<DataSourceField> fields = addDataSourceFields();
@@ -110,6 +115,7 @@ public class RolesDataSource extends RPCDataSource<Role> {
fields.add(resourceGroupsField);
DataSourceField permissionsField = new DataSourceField(Field.PERMISSIONS, FieldType.ANY, "Permissions");
+ // TODO (ips): add this back?
//fields.add(permissionsField);
DataSourceField subjectsField = new DataSourceField(Field.SUBJECTS, FieldType.ANY, "Subjects");
@@ -148,10 +154,9 @@ public class RolesDataSource extends RPCDataSource<Role> {
}
public void onSuccess(Role addedRole) {
- sendSuccessResponse(request, response, addedRole, new Message(MSG.view_adminRoles_roleAdded(rolename)));
+ sendSuccessResponse(request, response, addedRole);
}
});
-
}
@Override
@@ -166,8 +171,7 @@ public class RolesDataSource extends RPCDataSource<Role> {
}
public void onSuccess(Role updatedRole) {
- sendSuccessResponse(request, response, updatedRole, new Message(MSG
- .view_adminRoles_roleUpdated(rolename)));
+ sendSuccessResponse(request, response, updatedRole);
}
});
}
@@ -212,13 +216,18 @@ public class RolesDataSource extends RPCDataSource<Role> {
to.setSubjects(subjects);
Record[] ldapGroupRecords = from.getAttributeAsRecordArray(Field.LDAP_GROUPS);
- // TODO
- to.setLdapGroups(null);
+ Set<LdapGroup> ldapGroups = new RoleLdapGroupSelector.LdapGroupsDataSource().buildDataObjects(ldapGroupRecords);
+ to.setLdapGroups(ldapGroups);
return to;
}
public ListGridRecord copyValues(Role sourceRole) {
+ return copyValues(sourceRole, true);
+ }
+
+ @Override
+ public ListGridRecord copyValues(Role sourceRole, boolean cascade) {
ListGridRecord targetRecord = new ListGridRecord();
targetRecord.setAttribute(Field.ID, sourceRole.getId());
@@ -229,16 +238,21 @@ public class RolesDataSource extends RPCDataSource<Role> {
ListGridRecord[] permissionRecords = toRecordArray(permissions);
targetRecord.setAttribute(Field.PERMISSIONS, permissionRecords);
- ListGridRecord[] resourceGroupRecords = ResourceGroupsDataSource.getInstance().buildRecords(
- sourceRole.getResourceGroups());
- targetRecord.setAttribute(Field.RESOURCE_GROUPS, resourceGroupRecords);
+ if (cascade) {
+ Set<ResourceGroup> resourceGroups = sourceRole.getResourceGroups();
+ ListGridRecord[] resourceGroupRecords = ResourceGroupsDataSource.getInstance().buildRecords(
+ resourceGroups, false);
+ targetRecord.setAttribute(Field.RESOURCE_GROUPS, resourceGroupRecords);
- ListGridRecord[] subjectRecords = UsersDataSource.getInstance().buildRecords(sourceRole.getSubjects());
- targetRecord.setAttribute(Field.SUBJECTS, subjectRecords);
+ Set<Subject> subjects = sourceRole.getSubjects();
+ ListGridRecord[] subjectRecords = UsersDataSource.getInstance().buildRecords(subjects, false);
+ targetRecord.setAttribute(Field.SUBJECTS, subjectRecords);
- // TODO
- ListGridRecord[] ldapGroupRecords = null;
- targetRecord.setAttribute(Field.LDAP_GROUPS, ldapGroupRecords);
+ Set<LdapGroup> ldapGroups = sourceRole.getLdapGroups();
+ ListGridRecord[] ldapGroupRecords = new RoleLdapGroupSelector.LdapGroupsDataSource().buildRecords(
+ ldapGroups);
+ targetRecord.setAttribute(Field.LDAP_GROUPS, ldapGroupRecords);
+ }
return targetRecord;
}
@@ -281,6 +295,12 @@ public class RolesDataSource extends RPCDataSource<Role> {
// Fetching
criteria.fetchPermissions(true);
+ if (id != null) {
+ // If we're fetching a single Role, then fetch all the related Sets.
+ criteria.fetchSubjects(true);
+ criteria.fetchResourceGroups(true);
+ criteria.fetchLdapGroups(true);
+ }
// TODO: instead of fetching subjects and resource groups, use a composite object that will pull the subject
// and resource group count across the wire. these counts will not required permission checks at all.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java
index b54c5f4..08b7835 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java
@@ -98,7 +98,7 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
Subject subject = new Subject();
subject.setFactive(true);
@SuppressWarnings( { "UnnecessaryLocalVariable" })
- Record userRecord = UsersDataSource.getInstance().copyValues(subject, false);
+ Record userRecord = UsersDataSource.getInstance().copyUserValues(subject, false);
return userRecord;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
index 0634e91..f165dd4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java
@@ -188,7 +188,7 @@ public class UsersDataSource extends RPCDataSource<Subject> {
public void onSuccess(Boolean hasPrincipal) {
boolean isLdap = (!hasPrincipal);
- Record userRecord = copyValues(fetchedSubject, isLdap);
+ Record userRecord = copyUserValues(fetchedSubject, isLdap);
userRecordsPageList.add(userRecord);
if (userRecordsPageList.size() == fetchedSubjects.size()) {
sendSuccessResponseRecords(request, response, userRecordsPageList);
@@ -214,7 +214,7 @@ public class UsersDataSource extends RPCDataSource<Subject> {
}
public void onSuccess(final Subject createdSubject) {
- Record createdUserRecord = copyValues(createdSubject, false);
+ Record createdUserRecord = copyUserValues(createdSubject, false);
sendSuccessResponse(request, response, createdUserRecord);
}
});
@@ -281,7 +281,7 @@ public class UsersDataSource extends RPCDataSource<Subject> {
return to;
}
- public Record copyValues(Subject subject, boolean isLdap) {
+ public Record copyUserValues(Subject subject, boolean isLdap) {
ListGridRecord targetRecord = copyValues(subject);
targetRecord.setAttribute(Field.LDAP, isLdap);
@@ -296,6 +296,11 @@ public class UsersDataSource extends RPCDataSource<Subject> {
}
public ListGridRecord copyValues(Subject from) {
+ return copyValues(from, true);
+ }
+
+ @Override
+ public ListGridRecord copyValues(Subject from, boolean cascade) {
ListGridRecord to = new ListGridRecord();
to.setAttribute(Field.ID, from.getId());
@@ -308,8 +313,10 @@ public class UsersDataSource extends RPCDataSource<Subject> {
to.setAttribute(Field.PHONE_NUMBER, from.getPhoneNumber());
to.setAttribute(Field.EMAIL_ADDRESS, from.getEmailAddress());
- ListGridRecord[] roleRecords = RolesDataSource.getInstance().buildRecords(from.getRoles());
- to.setAttribute(Field.ROLES, roleRecords);
+ if (cascade) {
+ ListGridRecord[] roleRecords = RolesDataSource.getInstance().buildRecords(from.getRoles(), false);
+ to.setAttribute(Field.ROLES, roleRecords);
+ }
return to;
}
@@ -321,13 +328,19 @@ public class UsersDataSource extends RPCDataSource<Subject> {
criteria.setPageControl(getPageControl(request));
// Filtering
- criteria.addFilterId(getFilter(request, Field.ID, Integer.class));
+ Integer subjectId = getFilter(request, Field.ID, Integer.class);
+ criteria.addFilterId(subjectId);
// Always filter out the overlord - mortal users need not know the overlord even exists.
criteria.addFilterFsystem(false);
// Fetching
- // Always fetch roles - even for the list view, we'll use them to display the role count.
- criteria.fetchRoles(true);
+ if (subjectId != null) {
+ // If we're fetching a single Subject, then fetch the related Set of Roles.
+ criteria.fetchRoles(true);
+ }
+
+ // TODO: For the list view, use a composite object that will pull the role
+ // count across the wire. this count will not require permission checks at all.
return criteria;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
index e105374..7dd1e65 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
@@ -166,14 +166,14 @@ public class BundleTreeDataSource extends RPCDataSource {
}
@Override
- public ListGridRecord[] buildRecords(Collection list) {
- if (list == null) {
+ public ListGridRecord[] buildRecords(Collection dataObjects) {
+ if (dataObjects == null) {
return null;
}
List<ListGridRecord> records = new ArrayList<ListGridRecord>();
- for (Object item : list) {
+ for (Object item : dataObjects) {
records.add(copyValues(item));
if (item instanceof Bundle) {
Bundle bundle = (Bundle) item;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
index 277d773..ea8f243 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
@@ -103,6 +103,9 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
@Override
public void renderView(ViewPath viewPath) {
+ // TODO: The below line is temporary until TableSection.renderView() advances the view id pointer as it should.
+ viewPath.next();
+
String parentViewPath = viewPath.getParentViewPath();
if (!viewPath.isEnd()) {
CoreGUI.getErrorHandler().handleError(MSG.widget_recordEditor_error_invalidViewPath(viewPath.toString()));
@@ -171,7 +174,7 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
protected EnhancedDynamicForm buildForm() {
boolean isNewRecord = (this.recordId == ID_NEW);
- EnhancedDynamicForm form = new EnhancedDynamicForm(this.getLocatorId(), this.isReadOnly, isNewRecord);
+ EnhancedDynamicForm form = new EnhancedDynamicForm(this.getLocatorId(), isFormReadOnly(), isNewRecord);
form.setDataSource(this.dataSource);
List<FormItem> items = createFormItems(form);
@@ -186,6 +189,10 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
return form;
}
+ protected boolean isFormReadOnly() {
+ return this.isReadOnly;
+ }
+
public EnhancedDynamicForm getForm() {
return form;
}
@@ -300,7 +307,7 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
Message.Severity.Error);
CoreGUI.getMessageCenter().notify(message);
} else {
- // assume failure
+ // assume failure
Message message = new Message("Operation failed - an error occurred.", Message.Severity.Error);
CoreGUI.getMessageCenter().notify(message);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java
index 350c2d4..0d20334 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java
@@ -81,12 +81,12 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
}
// Layout Settings
- setWidth(640);
+ //setWidth(640);
//setWidth100();
//setPadding(13);
// Default to 4 columns, i.e.: itemOneTitle | itemOneValue | itemTwoTitle | itemTwoValue
setNumCols(4);
- setColWidths(100, 200, 100, 200);
+ setColWidths(75, 200, 75, 200);
//setTitleWidth(100);
setWrapItemTitles(false);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
index 68671e7..95f430c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
@@ -225,7 +225,7 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
iconField.setShowDefaultContextMenu(false);
availableFields.add(iconField);
}
- ListGridField nameField = new ListGridField(getItemName(), capitalize(getItemTitle()));
+ ListGridField nameField = new ListGridField(getNameField(), MSG.common_title_name());
availableFields.add(nameField);
availableGrid.setFields(availableFields.toArray(new ListGridField[availableFields.size()]));
@@ -291,14 +291,15 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
public void execute(DSResponse response, Object rawData, DSRequest request) {
availableRecords = new ArrayList<Record>();
Record[] allRecords = response.getData();
- if (initialSelection != null) {
- Set<Integer> selectedRecordIds = new HashSet<Integer>(initialSelection.length);
- for (Record record : initialSelection) {
- Integer id = record.getAttributeAsInt(getSelectorKey());
+ ListGridRecord[] assignedRecords = assignedGrid.getRecords();
+ if (assignedRecords != null && assignedRecords.length != 0) {
+ Set<String> selectedRecordIds = new HashSet<String>(assignedRecords.length);
+ for (Record record : assignedRecords) {
+ String id = record.getAttribute(getSelectorKey());
selectedRecordIds.add(id);
}
for (Record record : allRecords) {
- int id = record.getAttributeAsInt(getSelectorKey());
+ String id = record.getAttribute(getSelectorKey());
if (!selectedRecordIds.contains(id)) {
availableRecords.add(record);
}
@@ -384,7 +385,7 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
iconField.setShowDefaultContextMenu(false);
assignedFields.add(iconField);
}
- ListGridField nameField = new ListGridField(getItemName(), capitalize(getItemTitle()));
+ ListGridField nameField = new ListGridField(getNameField(), MSG.common_title_name());
assignedFields.add(nameField);
assignedGrid.setFields(assignedFields.toArray(new ListGridField[assignedFields.size()]));
@@ -472,7 +473,7 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
sourceGrid.removeSelectedData();
}
- protected String getItemName() {
+ protected String getNameField() {
return "name";
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
index aaee31e..9424d59 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
@@ -38,7 +38,11 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
public class ResourceGroupSelector extends AbstractSelector<ResourceGroup> {
public ResourceGroupSelector(String locatorId) {
- super(locatorId);
+ this(locatorId, false);
+ }
+
+ public ResourceGroupSelector(String locatorId, boolean isReadOnly) {
+ super(locatorId, isReadOnly);
}
protected DynamicForm getAvailableFilterForm() {
@@ -79,7 +83,7 @@ public class ResourceGroupSelector extends AbstractSelector<ResourceGroup> {
@Override
protected String getItemTitle() {
- return MSG.common_title_groups();
+ return MSG.common_title_resourceGroups();
}
// protected Criteria getLatestCriteria(DynamicForm availableFilterForm) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/measurement/MeasurementOOBDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/measurement/MeasurementOOBDataSource.java
index e90e605..4e93b45 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/measurement/MeasurementOOBDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/measurement/MeasurementOOBDataSource.java
@@ -106,14 +106,14 @@ public class MeasurementOOBDataSource extends RPCDataSource<MeasurementOOBCompos
}
@Override
- public ListGridRecord[] buildRecords(Collection<MeasurementOOBComposite> list) {
- for (MeasurementOOBComposite oob : list) {
+ public ListGridRecord[] buildRecords(Collection<MeasurementOOBComposite> dataObjects) {
+ for (MeasurementOOBComposite oob : dataObjects) {
if (oob.getFactor() > maximumFactor) {
maximumFactor = oob.getFactor();
}
}
- return super.buildRecords(list);
+ return super.buildRecords(dataObjects);
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
index f40a5df..c0e8695 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
@@ -269,15 +269,19 @@ public abstract class RPCDataSource<T> extends DataSource {
response.setTotalRows(totalRows);
}
- public ListGridRecord[] buildRecords(Collection<T> list) {
- if (list == null) {
+ public ListGridRecord[] buildRecords(Collection<T> dataObjects) {
+ return buildRecords(dataObjects, true);
+ }
+
+ public ListGridRecord[] buildRecords(Collection<T> dataObjects, boolean cascade) {
+ if (dataObjects == null) {
return null;
}
- ListGridRecord[] records = new ListGridRecord[list.size()];
+ ListGridRecord[] records = new ListGridRecord[dataObjects.size()];
int i = 0;
- for (T item : list) {
- records[i++] = copyValues(item);
+ for (T item : dataObjects) {
+ records[i++] = copyValues(item, cascade);
}
return records;
}
@@ -348,6 +352,10 @@ public abstract class RPCDataSource<T> extends DataSource {
// ListGrids, but that will require a lot of refactoring at this point...
public abstract ListGridRecord copyValues(T from);
+ public ListGridRecord copyValues(T from, boolean cascade) {
+ return copyValues(from);
+ }
+
/**
* Executed on <code>REMOVE</code> operation. <code>processResponse (requestId, response)</code>
* should be called when operation completes (either successful or failure).
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferences.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferences.java
index 839d5e6..031de46 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferences.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/preferences/UserPreferences.java
@@ -106,6 +106,8 @@ public class UserPreferences {
}
public void store(AsyncCallback<Subject> callback) {
+ this.subject.setRoles(null);
+ this.subject.setLdapRoles(null);
this.subjectService.updateSubject(this.subject, null, callback);
}
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 2ac336e..742362f 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -111,11 +111,12 @@ common_title_inventory = Inventory~
common_title_inventorySummary = Inventory Summary~
common_title_lastUpdated=Last Updated~
common_title_lastUpdatedBy=Last Updated By~
-common_title_mashup=Mashup~
-common_title_message=Message~
+common_title_ldapGroups = LDAP Groups~
+common_title_mashup = Mashup~
+common_title_message = Message~
common_title_metric = Metric~
common_title_mixedGroups = Mixed Groups~
-common_title_mixedGroups_total=Mixed Group Total~
+common_title_mixedGroups_total = Mixed Group Total~
common_title_name = Name~
common_title_new_dashboard=New Dashboard~
common_title_numeric_type=Numeric Type~
@@ -137,6 +138,7 @@ common_title_repositories=Repositories~
common_title_resource = Resource~
common_title_resources = Resources~
common_title_resource_group = Resource Group~
+common_title_resourceGroups = Resource Groups~
common_title_resource_inventory=Resource Inventory~
common_title_resource_id=Resource ID~
common_title_resource_name=Resource Name~
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
index 84c6835..2db5828 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/RHQConstants.java
@@ -78,7 +78,7 @@ public class RHQConstants {
// How long do we keep data compressed in 1 day intervals?
public static final String DataPurge1Day = "CAM_DATA_PURGE_1D";
- // How often to perform database maintainence
+ // How often to perform database maintenance
public static final String DataMaintenance = "CAM_DATA_MAINTENANCE";
// Whether or not to reindex nightly
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index aff5bf1..bb242fa 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -217,47 +217,41 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
+ "].");
}
- RoleCriteria subjectRolesCriteria = new RoleCriteria();
- subjectRolesCriteria.addFilterSubjectId(subjectToModify.getId());
- PageList<Role> currentRoles = roleManager.findRolesByCriteria(whoami, subjectRolesCriteria);
Set<Role> newRoles = subjectToModify.getRoles();
- if (newRoles == null) {
- newRoles = Collections.emptySet();
+ if (newRoles != null) {
+ int[] newRoleIds = new int[newRoles.size()];
+ int i = 0;
+ for (Role role : newRoles) {
+ newRoleIds[i] = role.getId();
+ }
+ roleManager.setAssignedSubjectRoles(whoami, subjectToModify.getId(), newRoleIds);
}
- boolean rolesModified = !(currentRoles.containsAll(newRoles) && newRoles.containsAll(currentRoles));
- RoleCriteria subjectLdapRolesCriteria = new RoleCriteria();
- subjectLdapRolesCriteria.addFilterLdapSubjectId(subjectToModify.getId());
- PageList<Role> currentLdapRoles = roleManager.findRolesByCriteria(whoami, subjectLdapRolesCriteria);
+ boolean ldapRolesModified = false;
Set<Role> newLdapRoles = subjectToModify.getLdapRoles();
if (newLdapRoles == null) {
newLdapRoles = Collections.emptySet();
}
- boolean ldapRolesModified =
- !(currentLdapRoles.containsAll(newLdapRoles) && newLdapRoles.containsAll(currentLdapRoles));
-
- if (isSecurityManager) {
- if (subjectToModifyIsSystemSuperuser) {
- if (rolesModified) {
- throw new PermissionException("You cannot alter the roles for user [" + subjectToModify.getName()
- + "] - roles are fixed for this user");
- }
+ if (newLdapRoles != null) {
+ RoleCriteria subjectLdapRolesCriteria = new RoleCriteria();
+ subjectLdapRolesCriteria.addFilterLdapSubjectId(subjectToModify.getId());
+ PageList<Role> currentLdapRoles = roleManager.findRolesByCriteria(whoami, subjectLdapRolesCriteria);
- if (ldapRolesModified) {
- throw new PermissionException("You cannot alter the LDAP roles for user [" + subjectToModify.getName()
- + "] - LDAP roles are fixed for this user");
- }
- }
- } else {
- if (rolesModified) {
- throw new PermissionException("You cannot change the roles assigned to [" + subjectToModify.getName()
- + "] - only a user with the MANAGE_SECURITY permission can do so.");
- }
+ ldapRolesModified =
+ !(currentLdapRoles.containsAll(newLdapRoles) && newLdapRoles.containsAll(currentLdapRoles));
+ }
- if (ldapRolesModified) {
+ boolean isUserWithPrincipal = isUserWithPrincipal(subjectToModify.getName());
+ if (ldapRolesModified) {
+ if (!isSecurityManager) {
throw new PermissionException("You cannot change the LDAP roles assigned to [" + subjectToModify.getName()
+ "] - only a user with the MANAGE_SECURITY permission can do so.");
+ } else if (isUserWithPrincipal) {
+ throw new PermissionException("You cannot set LDAP roles on non-LDAP user [" + subjectToModify.getName()
+ + "].");
}
+
+ // TODO: Update LDAP roles.
}
if (newPassword != null) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
index b636004..b33da9c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
@@ -41,6 +41,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.criteria.RoleCriteria;
+import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -49,6 +50,7 @@ import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
+import org.rhq.enterprise.server.resource.group.LdapGroupManagerLocal;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
@@ -79,6 +81,10 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
@IgnoreDependency
private AlertNotificationManagerLocal alertNotificationManager;
+ @EJB
+ @IgnoreDependency
+ private LdapGroupManagerLocal ldapGroupManager;
+
/**
* @see org.rhq.enterprise.server.authz.RoleManagerLocal#findRolesBySubject(int subjectId,PageControl pageControl)
*/
@@ -333,12 +339,81 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
* @see org.rhq.enterprise.server.authz.RoleManagerLocal#updateRole(Subject, Role)
*/
@RequiredPermission(Permission.MANAGE_SECURITY)
- public Role updateRole(Subject subject, Role role) {
- processDependentPermissions(role);
- Role updatedRole = entityManager.merge(role);
- // Load the roles
- updatedRole.getResourceGroups().size();
- return updatedRole;
+ public Role updateRole(Subject whoami, Role role) {
+ Role attachedRole = entityManager.find(Role.class, role.getId());
+ if (attachedRole == null) {
+ throw new IllegalStateException("Cannot update " + role + ", since no role exists with that id.");
+ }
+
+ // First update the simple fields and the permissions.
+ attachedRole.setName(role.getName());
+ attachedRole.setDescription(role.getDescription());
+ attachedRole.setPermissions(role.getPermissions());
+ processDependentPermissions(attachedRole);
+
+ // Then update the subjects, resourceGroups, and/or ldapGroups, but only if those fields are non-null on the
+ // passed-in Role.
+ Set<Subject> newSubjects = role.getSubjects();
+ if (newSubjects != null) {
+ Set<Subject> currentSubjects = attachedRole.getSubjects();
+ // wrap in new HashSet to avoid ConcurrentModificationExceptions.
+ Set<Subject> subjectsToRemove = new HashSet<Subject>(currentSubjects);
+ for (Subject subject : currentSubjects) {
+ // Never remove a system user.
+ if (subject.getFsystem()) {
+ subjectsToRemove.remove(subject);
+ }
+ }
+ for (Subject subject : subjectsToRemove) {
+ attachedRole.removeSubject(subject);
+ }
+
+ for (Subject subject : newSubjects) {
+ Subject attachedSubject = entityManager.find(Subject.class, subject.getId());
+ attachedRole.addSubject(attachedSubject);
+ }
+ }
+
+ Set<ResourceGroup> newResourceGroups = role.getResourceGroups();
+ if (newResourceGroups != null) {
+ // wrap in new HashSet to avoid ConcurrentModificationExceptions.
+ Set<ResourceGroup> currentResourceGroups = new HashSet<ResourceGroup>(attachedRole.getResourceGroups());
+ for (ResourceGroup resourceGroup : currentResourceGroups) {
+ attachedRole.removeResourceGroup(resourceGroup);
+ }
+
+ for (ResourceGroup resourceGroup : newResourceGroups) {
+ ResourceGroup attachedResourceGroup = entityManager.find(ResourceGroup.class, resourceGroup.getId());
+ attachedRole.addResourceGroup(attachedResourceGroup);
+ }
+ }
+
+ Set<LdapGroup> newLdapGroups = role.getLdapGroups();
+ if (newLdapGroups != null) {
+ // wrap in new HashSet to avoid ConcurrentModificationExceptions.
+ Set<LdapGroup> currentLdapGroups = new HashSet<LdapGroup>(attachedRole.getLdapGroups());
+ for (LdapGroup ldapGroup : currentLdapGroups) {
+ attachedRole.removeLdapGroup(ldapGroup);
+ }
+
+ for (LdapGroup ldapGroup : newLdapGroups) {
+ LdapGroup attachedLdapGroup = (ldapGroup.getId() != 0) ?
+ entityManager.find(LdapGroup.class, ldapGroup.getId()) : null;
+ if (attachedLdapGroup == null) {
+ ldapGroup.setRole(attachedRole);
+ entityManager.persist(ldapGroup);
+ attachedLdapGroup = ldapGroup;
+ }
+ attachedRole.addLdapGroup(attachedLdapGroup);
+ }
+ }
+
+ // Fetch the lazy Sets on the Role to be returned.
+ attachedRole.getResourceGroups().size();
+ attachedRole.getSubjects().size();
+ attachedRole.getLdapGroups().size();
+
+ return attachedRole;
}
/**
@@ -490,7 +565,6 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
@RequiredPermission(Permission.MANAGE_SECURITY)
public void setAssignedResourceGroups(Subject subject, int roleId, int[] groupIds) {
-
Role role = getRole(subject, roleId);
List<Integer> currentGroups = new ArrayList<Integer>();
for (ResourceGroup group : role.getResourceGroups()) {
@@ -499,26 +573,13 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
List<Integer> newGroups = ArrayUtils.wrapInList(groupIds); // members needing addition
newGroups.removeAll(currentGroups);
- if (newGroups.size() > 0) {
- int[] newGroupIds = new int[newGroups.size()];
- int i = 0;
- for (Integer id : newGroups) {
- newGroupIds[i++] = id;
- }
- roleManager.addResourceGroupsToRole(subject, roleId, newGroupIds);
- }
+ int[] newGroupIds = ArrayUtils.unwrapCollection(newGroups);
+ roleManager.addResourceGroupsToRole(subject, roleId, newGroupIds);
List<Integer> removedGroups = new ArrayList<Integer>(currentGroups); // members needing removal
removedGroups.removeAll(ArrayUtils.wrapInList(groupIds));
- if (removedGroups.size() > 0) {
- int[] removedGroupIds = new int[removedGroups.size()];
- int i = 0;
- for (Integer id : removedGroups) {
- removedGroupIds[i++] = id;
- }
-
- roleManager.removeResourceGroupsFromRole(subject, roleId, removedGroupIds);
- }
+ int[] removedGroupIds = ArrayUtils.unwrapCollection(removedGroups);
+ roleManager.removeResourceGroupsFromRole(subject, roleId, removedGroupIds);
}
private void processDependentPermissions(Role role) {
@@ -671,9 +732,11 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
}
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
+ CriteriaQueryRunner<Role> queryRunner = new CriteriaQueryRunner<Role>(criteria, generator, entityManager);
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ PageList<Role> roles = queryRunner.execute();
- CriteriaQueryRunner<Role> queryRunner = new CriteriaQueryRunner(criteria, generator, entityManager);
- return queryRunner.execute();
+ return roles;
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
index 328150e..37d72e7 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerBean.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.resource.group;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -52,6 +53,7 @@ import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.util.collection.ArrayUtils;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.RequiredPermission;
@@ -64,6 +66,7 @@ import org.rhq.enterprise.server.util.security.UntrustedSSLSocketFactory;
* This bean provides functionality to manipulate the ldap auth/authz functionality.
* That is, adding/modifying/deleting ldap group/users and their
* associated subjects and permissions are performed by this manager.
+ *
* @author paji
* @author Simeon Pinder
*/
@@ -98,8 +101,8 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
public Set<String> findAvailableGroupsFor(String userName) {
Properties options = systemManager.getSystemConfiguration();
- String groupFilter = (String) options.getProperty(RHQConstants.LDAPGroupFilter, "");
- String groupMember = (String) options.getProperty(RHQConstants.LDAPGroupMember, "");
+ String groupFilter = options.getProperty(RHQConstants.LDAPGroupFilter, "");
+ String groupMember = options.getProperty(RHQConstants.LDAPGroupMember, "");
String userDN = getUserDN(options, userName);
//TODO: spinder 4/21/10 put in error/debug logging messages for badly formatted filter combinations
String filter = "";
@@ -119,40 +122,63 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
return ldapSet;
}
- /**
- * @see org.rhq.enterprise.server.authz.RoleManagerLocal#addResourceGroupsToRole(Subject, int, int[])
- */
@RequiredPermission(Permission.MANAGE_SECURITY)
- public void addLdapGroupsToRole(Subject subject, int roleId, List<String> groupIds) {
- if ((groupIds != null) && (groupIds.size() > 0)) {
+ public void setLdapGroupsOnRole(Subject subject, int roleId, Set<LdapGroup> groups) {
+ Role role = entityManager.find(Role.class, roleId);
+ if (role == null) {
+ throw new IllegalArgumentException("Role with id [" + roleId + "] does not exist.");
+ }
+
+ Set<LdapGroup> currentGroups = role.getLdapGroups();
+ List<String> currentGroupNames = new ArrayList<String>(currentGroups.size());
+ for (LdapGroup group : currentGroups) {
+ currentGroupNames.add(group.getName());
+ }
+
+ List<String> newGroupNames = new ArrayList<String>(groups.size());
+ for (LdapGroup group : groups) {
+ newGroupNames.add(group.getName());
+ }
+
+ List<String> namesOfGroupsToBeAdded = new ArrayList<String>(newGroupNames);
+ namesOfGroupsToBeAdded.removeAll(currentGroupNames);
+ addLdapGroupsToRole(subject, roleId, namesOfGroupsToBeAdded);
+
+ List<String> namesOfGroupsToBeRemoved = new ArrayList<String>(currentGroupNames);
+ namesOfGroupsToBeRemoved.removeAll(newGroupNames);
+ int[] idsOfGroupsToBeRemoved = new int[namesOfGroupsToBeRemoved.size()];
+ int i = 0;
+ for (LdapGroup group : currentGroups) {
+ if (namesOfGroupsToBeRemoved.contains(group.getName())) {
+ idsOfGroupsToBeRemoved[i++] = group.getId();
+ }
+ }
+ removeLdapGroupsFromRole(subject, roleId, idsOfGroupsToBeRemoved);
+ }
+
+ @RequiredPermission(Permission.MANAGE_SECURITY)
+ public void addLdapGroupsToRole(Subject subject, int roleId, List<String> groupNames) {
+ if ((groupNames != null) && (groupNames.size() > 0)) {
Role role = entityManager.find(Role.class, roleId);
if (role == null) {
- throw new IllegalArgumentException("Could not find role[" + roleId + "] to add resourceGroups to");
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to add LDAP groups to.");
}
role.getLdapGroups().size(); // load them in
- for (String groupId : groupIds) {
+ for (String groupId : groupNames) {
LdapGroup group = new LdapGroup();
group.setName(groupId);
- if (role == null) {
- throw new IllegalArgumentException("Tried to add ldapGroup[" + groupId + "] to role[" + roleId
- + "], but resourceGroup was not found");
- }
role.addLdapGroup(group);
}
}
}
- /**
- * @see org.rhq.enterprise.server.authz.RoleManagerLocal#removeLdapGroupsFromRole(Subject, int, int[])
- */
-
@RequiredPermission(Permission.MANAGE_SECURITY)
public void removeLdapGroupsFromRole(Subject subject, int roleId, int[] groupIds) {
if ((groupIds != null) && (groupIds.length > 0)) {
Role role = entityManager.find(Role.class, roleId);
if (role == null) {
- throw new IllegalArgumentException("Could not find role[" + roleId + "] to remove resourceGroups from");
+ throw new IllegalArgumentException("Could not find role[" + roleId + "] to remove LDAP groups from.");
}
role.getLdapGroups().size(); // load them in
@@ -276,7 +302,7 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
// each BaseDN, but for now the filter will apply to all.
String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
for (int x = 0; x < baseDNs.length; x++) {
- NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ NamingEnumeration<SearchResult> answer = ctx.search(baseDNs[x], filter, searchControls);
if (!answer.hasMoreElements()) { //BZ:582471- ldap api bug change
log.debug("User " + userName + " not found for BaseDN " + baseDNs[x]);
// Nothing found for this DN, move to the next one if we have one.
@@ -284,7 +310,7 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
}
// We use the first match
- SearchResult si = (SearchResult) answer.next();
+ SearchResult si = answer.next();
//generate the DN
String userDN = si.getName() + "," + baseDNs[x];
userDetails.put("dn", userDN);
@@ -344,13 +370,13 @@ public class LdapGroupManagerBean implements LdapGroupManagerLocal {
String[] baseDNs = baseDN.split(BASEDN_DELIMITER);
for (int x = 0; x < baseDNs.length; x++) {
- NamingEnumeration answer = ctx.search(baseDNs[x], filter, searchControls);
+ NamingEnumeration<SearchResult> answer = ctx.search(baseDNs[x], filter, searchControls);
boolean ldapApiEnumerationBugEncountered = false;
while ((!ldapApiEnumerationBugEncountered) && answer.hasMoreElements()) {//BZ:582471- ldap api bug change
// We use the first match
SearchResult si = null;
try {
- si = (SearchResult) answer.next();
+ si = answer.next();
} catch (NullPointerException npe) {
ldapApiEnumerationBugEncountered = true;
break;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java
index 17a008a..14945ce 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/LdapGroupManagerLocal.java
@@ -41,6 +41,8 @@ public interface LdapGroupManagerLocal {
PageList<LdapGroup> findLdapGroups(PageControl pc);
+ void setLdapGroupsOnRole(Subject subject, int roleId, Set<LdapGroup> groups);
+
void addLdapGroupsToRole(Subject subject, int roleId, List<String> groupIds);
void removeLdapGroupsFromRole(Subject subject, int roleId, int[] groupIds);
13 years, 6 months
[rhq] 2 commits - modules/enterprise
by Simeon Pinder
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java | 160 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewView.java | 114 -------
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java | 4
5 files changed, 173 insertions(+), 117 deletions(-)
New commits:
commit 7039d59a43670b360e9ab9369601ac46d7e1492b
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Dec 1 10:43:51 2010 -0500
protect agent information behind MANAGE_INVENTORY check.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java
index 79b7190..f47fba6 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/AgentManagerBean.java
@@ -362,9 +362,9 @@ public class AgentManagerBean implements AgentManagerLocal {
try {
//insert logged in check and view resources perm check as method calld from GWT*Service
if ((subject != null)
- && (!authorizationManager.hasResourcePermission(subject, Permission.VIEW_RESOURCE, resourceId))) {
+ && (!authorizationManager.hasResourcePermission(subject, Permission.MANAGE_INVENTORY, resourceId))) {
throw new PermissionException("Can not get agent details - " + subject + " lacks "
- + Permission.VIEW_RESOURCE + " for resource[id=" + resourceId + "]");
+ + Permission.MANAGE_INVENTORY + " for resource[id=" + resourceId + "]");
}
Query query = entityManager.createNamedQuery(Agent.QUERY_FIND_BY_RESOURCE_ID);
commit 8432b59098d2935514d42d59594019cc0451afff
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Dec 1 10:40:00 2010 -0500
i)move agent info from Inventory/Summary to Inventory/Agent subtab behind manageInventory check.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index 9f41ace..12646d2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -56,6 +56,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceComposit
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ConfigurationHistoryView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ResourceConfigurationEditView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.PluginConfigurationEditView;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.ResourceResourceAgentView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.ResourceResourceGroupsView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.schedules.SchedulesView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.traits.TraitsView;
@@ -102,6 +103,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
private SubTab inventoryConnHistory;
private SubTab inventoryGroups;
private SubTab inventoryGroupMembership;
+ private SubTab inventoryAgent;
private SubTab opHistory;
private SubTab opSched;
private SubTab alertHistory;
@@ -147,8 +149,10 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
.view_tabs_common_groups()), null);
inventoryGroupMembership = new SubTab(inventoryTab.extendLocatorId("GroupMembership"), new ViewName(
"GroupMembership", MSG.view_tabs_common_group_membership()), null);
+ inventoryAgent = new SubTab(inventoryTab.extendLocatorId("Agent"), new ViewName("Agent", MSG
+ .view_tabs_common_agent()), null);
inventoryTab.registerSubTabs(this.inventoryChildren, this.inventoryChildHistory, this.inventoryConn,
- this.inventoryConnHistory, this.inventoryGroups, this.inventoryGroupMembership);
+ this.inventoryConnHistory, this.inventoryGroups, this.inventoryGroupMembership, this.inventoryAgent);
tabs.add(inventoryTab);
alertsTab = new TwoLevelTab(getTabSet().extendLocatorId("Alerts"), new ViewName("Alerts", MSG
@@ -302,6 +306,11 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
resourceId) : null;
updateSubTab(this.inventoryTab, this.inventoryGroupMembership, canvas, true, enabled);
+ //Agent subtab
+ canvas = (enabled) ? new ResourceResourceAgentView(this.inventoryTab.extendLocatorId("AgentView"), resourceId)
+ : null;
+ updateSubTab(this.inventoryTab, this.inventoryAgent, canvas, true, enabled);
+
// Operations Tab
if (updateTab(this.operationsTab, facets.contains(ResourceTypeFacet.OPERATION), true)) {
// comment out GWT-based operation history until...
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java
new file mode 100644
index 0000000..1ebf586
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java
@@ -0,0 +1,160 @@
+/*
+ * 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 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.coregui.client.inventory.resource.detail.inventory;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.FormItemIcon;
+import com.smartgwt.client.widgets.form.fields.HeaderItem;
+import com.smartgwt.client.widgets.form.fields.SpacerItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+
+import org.rhq.core.domain.resource.Agent;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * @author Simeon Pinder
+ */
+public class ResourceResourceAgentView extends LocatableVLayout {
+
+ private int resourceId;
+ private StaticTextItem nameValue;
+ private StaticTextItem addressValue;
+ private StaticTextItem portValue;
+ private StaticTextItem agentStatus;
+ private FormItemIcon agentStatusIcon;
+ private StaticTextItem lastAvailReportValue;
+ private StaticTextItem endpointValue;
+
+ public ResourceResourceAgentView(String locatorId, int resourceId) {
+ super(locatorId);
+
+ this.resourceId = resourceId;
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+
+ build();
+ }
+
+ public void build() {
+ LocatableDynamicForm currentAgentInfo = new LocatableDynamicForm(extendLocatorId("Agent_Info"));
+ populateAgentInfo(this.resourceId, currentAgentInfo);
+ this.addMember(currentAgentInfo);
+ }
+
+ private void populateAgentInfo(final int id, final LocatableDynamicForm currentAgentInfo) {
+ if (currentAgentInfo != null) {
+ setLeft("10%");
+ setWidth("80%");
+ final List<FormItem> formItems = new ArrayList<FormItem>();
+ HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title());
+ headerItem.setValue(MSG.view_inventory_summary_agent_title());
+ formItems.add(headerItem);
+ formItems.add(new SpacerItem());
+ //populate remaining details
+ GWTServiceLookup.getAgentService().getAgentForResource(id, new AsyncCallback<Agent>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_inventory_summary_agent_error1() + id + ".", caught);
+ }
+
+ @Override
+ public void onSuccess(Agent agent) {
+ //name
+ String name = "name";
+ nameValue = new StaticTextItem(name, MSG.common_title_name());
+ nameValue.setValue(agent.getName());
+ formItems.add(nameValue);
+ //address
+ String address = "address";
+ addressValue = new StaticTextItem(address, MSG.common_title_address());
+ addressValue.setValue(agent.getAddress());
+ formItems.add(addressValue);
+ //port
+ String port = "port";
+ portValue = new StaticTextItem(port, MSG.common_title_port());
+ portValue.setValue(agent.getPort());
+ formItems.add(portValue);
+
+ //agent-comm-status
+ String agentComStatus = "agent-comm-status";
+ agentStatusIcon = new FormItemIcon();
+ agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null));
+ agentStatus = new StaticTextItem(agentComStatus, MSG.view_inventory_summary_agent_status_title());
+ agentStatus.setIcons(agentStatusIcon);
+ agentStatus.setWrapTitle(false);
+ formItems.add(agentStatus);
+ GWTServiceLookup.getAgentService().pingAgentForResource(id, new AsyncCallback<Boolean>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_inventory_summary_agent_error2() + id + ".",
+ caught);
+ }
+
+ @Override
+ public void onSuccess(Boolean result) {
+ //update icon with correct status
+ agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(result));
+ currentAgentInfo.markForRedraw();
+ }
+ });
+
+ //Last Received Avail report
+ String lastAvailReport = "last-avail-report";
+ lastAvailReportValue = new StaticTextItem(lastAvailReport, MSG
+ .view_inventory_summary_agent_last_title());
+ lastAvailReportValue.setWrapTitle(false);
+ lastAvailReportValue.setValue(new Date(agent.getLastAvailabilityReport()));
+ formItems.add(lastAvailReportValue);
+
+ //Full Endpoint
+ String fullEndpoint = "full-endpoint";
+ endpointValue = new StaticTextItem(fullEndpoint, MSG.view_inventory_summary_agent_fullEnpoint());
+ String remoteEndpoint = agent.getRemoteEndpoint();
+ if (remoteEndpoint != null) {
+ // some browsers (firefox in particular) won't wrap unless you put breaks in the string
+ remoteEndpoint = remoteEndpoint.replaceAll("&", " &");
+ } else {
+ remoteEndpoint = MSG.view_inventory_summary_agent_fullEnpoint_err1();
+ }
+ endpointValue.setValue(remoteEndpoint);
+ formItems.add(endpointValue);
+
+ currentAgentInfo.setItems(formItems.toArray(new FormItem[formItems.size()]));
+ currentAgentInfo.markForRedraw();
+ }
+ });
+
+ //final form population
+ currentAgentInfo.setItems(formItems.toArray(new FormItem[formItems.size()]));
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewView.java
index d113ae8..5470e92 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewView.java
@@ -18,23 +18,9 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.summary;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.HTMLFlow;
-import com.smartgwt.client.widgets.form.fields.FormItem;
-import com.smartgwt.client.widgets.form.fields.FormItemIcon;
-import com.smartgwt.client.widgets.form.fields.HeaderItem;
-import com.smartgwt.client.widgets.form.fields.StaticTextItem;
-import org.rhq.core.domain.resource.Agent;
import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -44,116 +30,16 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
*/
public class OverviewView extends LocatableVLayout {
- private StaticTextItem nameValue;
- private StaticTextItem addressValue;
- private StaticTextItem portValue;
- private StaticTextItem agentStatus;
- private FormItemIcon agentStatusIcon;
- private StaticTextItem lastAvailReportValue;
- private StaticTextItem endpointValue;
-
public OverviewView(String locatorId, ResourceComposite resourceComposite) {
super(locatorId);
OverviewForm form = new OverviewForm(extendLocatorId("form"), resourceComposite);
- LocatableDynamicForm currentAgentInfo = new LocatableDynamicForm(extendLocatorId("Agent_Info"));
- populateAgentInfo(resourceComposite.getResource().getId(), currentAgentInfo);
HTMLFlow separator = new HTMLFlow();
separator.setContents("<hr>");
form.setHeight("200");
- currentAgentInfo.setHeight(200);
setLeft("10%");
addMember(form);
- addMember(separator);
- addMember(currentAgentInfo);
- }
-
- private void populateAgentInfo(final int id, final LocatableDynamicForm currentAgentInfo) {
- if (currentAgentInfo != null) {
- setLeft("10%");
- setWidth("80%");
- final List<FormItem> formItems = new ArrayList<FormItem>();
- HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title());
- headerItem.setValue(MSG.view_inventory_summary_agent_title());
- formItems.add(headerItem);
- //populate remaining details
- GWTServiceLookup.getAgentService().getAgentForResource(id, new AsyncCallback<Agent>() {
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_inventory_summary_agent_error1() + id + ".", caught);
- }
-
- @Override
- public void onSuccess(Agent agent) {
- //name
- String name = "name";
- nameValue = new StaticTextItem(name, MSG.common_title_name());
- nameValue.setValue(agent.getName());
- formItems.add(nameValue);
- //address
- String address = "address";
- addressValue = new StaticTextItem(address, MSG.common_title_address());
- addressValue.setValue(agent.getAddress());
- formItems.add(addressValue);
- //port
- String port = "port";
- portValue = new StaticTextItem(port, MSG.common_title_port());
- portValue.setValue(agent.getPort());
- formItems.add(portValue);
-
- //agent-comm-status
- String agentComStatus = "agent-comm-status";
- agentStatusIcon = new FormItemIcon();
- agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null));
- agentStatus = new StaticTextItem(agentComStatus, MSG.view_inventory_summary_agent_status_title());
- agentStatus.setIcons(agentStatusIcon);
- agentStatus.setWrapTitle(false);
- formItems.add(agentStatus);
- GWTServiceLookup.getAgentService().pingAgentForResource(id, new AsyncCallback<Boolean>() {
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_inventory_summary_agent_error2() + id + ".",
- caught);
- }
-
- @Override
- public void onSuccess(Boolean result) {
- //update icon with correct status
- agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(result));
- currentAgentInfo.markForRedraw();
- }
- });
-
- //Last Received Avail report
- String lastAvailReport = "last-avail-report";
- lastAvailReportValue = new StaticTextItem(lastAvailReport, MSG
- .view_inventory_summary_agent_last_title());
- lastAvailReportValue.setWrapTitle(false);
- lastAvailReportValue.setValue(new Date(agent.getLastAvailabilityReport()));
- formItems.add(lastAvailReportValue);
-
- //Full Endpoint
- String fullEndpoint = "full-endpoint";
- endpointValue = new StaticTextItem(fullEndpoint, MSG.view_inventory_summary_agent_fullEnpoint());
- String remoteEndpoint = agent.getRemoteEndpoint();
- if (remoteEndpoint != null) {
- // some browsers (firefox in particular) won't wrap unless you put breaks in the string
- remoteEndpoint = remoteEndpoint.replaceAll("&", " &");
- } else {
- remoteEndpoint = MSG.view_inventory_summary_agent_fullEnpoint_err1();
- }
- endpointValue.setValue(remoteEndpoint);
- formItems.add(endpointValue);
-
- currentAgentInfo.setItems(formItems.toArray(new FormItem[formItems.size()]));
- currentAgentInfo.markForRedraw();
- }
- });
-
- //final form population
- currentAgentInfo.setItems(formItems.toArray(new FormItem[formItems.size()]));
- }
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index d181cef..2ac336e 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -1197,6 +1197,7 @@ view_tree_common_contextMenu_saveChartToDashboardSuccessful=You have saved dashb
view_tree_common_contextMenu_saveChartToDashboardFailure=Failed to save the dashboard~
view_tree_common_contextMenu_loadFailed_dashboard=Failed to load user dashboards
view_tree_common_contextMenu_loadFailed_manualAddChildren=Failed to load platform manual add children~
+view_tabs_common_agent=Agent~
view_tabs_common_summary=Summary~
view_tabs_common_overview=Overview~
view_tabs_common_dashboard=Dashboard~
13 years, 6 months
[rhq] 3 commits - modules/enterprise
by Simeon Pinder
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewForm.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsDataSource.java | 13 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsView.java | 70 +++++++++-
3 files changed, 76 insertions(+), 9 deletions(-)
New commits:
commit a92170b647a3fb88d82234f7b073c41526d28676
Merge: 131f90e... d19c483...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Dec 1 09:35:01 2010 -0500
Merge branch 'master' of ssh://spinder@git.fedorahosted.org/git/rhq/rhq into track-master
commit 131f90ef64185ec0b26dd6ab35c64d588c31c1b5
Merge: 3f0dd01... 904c60c...
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Dec 1 08:01:55 2010 -0500
Merge branch 'master' of ssh://spinder@git.fedorahosted.org/git/rhq/rhq into track-master
commit 3f0dd011c09b9eda5325363a73b127db385d5795
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Dec 1 08:00:12 2010 -0500
i)i18n msg fix
ii)add modal error message to plugin/resource errors table.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewForm.java
index 3cd120d..bdff290 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewForm.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/OverviewForm.java
@@ -296,7 +296,7 @@ public class OverviewForm extends EnhancedDynamicForm {
+ "</i>");
Resource parentResource = resource.getParentResource();
setValue("parent", parentResource != null ? ("<a href=\"#Resource/" + parentResource.getId() + "\">"
- + parentResource.getName() + "</a>") : "<i>none</i>");
+ + parentResource.getName() + "</a>") : "<i>" + MSG.common_label_none() + "</i>");
}
public boolean isHeaderEnabled() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsDataSource.java
index 7b55f56..d69b433 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsDataSource.java
@@ -29,6 +29,7 @@ import com.smartgwt.client.data.DataSourceField;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.fields.DataSourceDateTimeField;
import com.smartgwt.client.data.fields.DataSourceEnumField;
+import com.smartgwt.client.data.fields.DataSourceImageField;
import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.widgets.grid.ListGridRecord;
@@ -42,6 +43,7 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
/**
*
* @author Lukas Krejci
+ * @author Simeon Pinder
*/
public class ResourceErrorsDataSource extends RPCDataSource<ResourceError> {
@@ -50,8 +52,11 @@ public class ResourceErrorsDataSource extends RPCDataSource<ResourceError> {
public static final String DETAIL = "detail";
public static final String ERROR_TYPE = "errorType";
public static final String TIME_OCCURED = "timeOccured";
+ public static final String ICON = "icon";
}
+ private static final String ERROR_ICON = "[SKIN]/Dialog/warn.png";
+
ResourceGWTServiceAsync resourceService;
int resourceId;
@@ -69,7 +74,11 @@ public class ResourceErrorsDataSource extends RPCDataSource<ResourceError> {
fields.add(new DataSourceEnumField(Field.ERROR_TYPE, MSG.dataSource_resourceErrors_field_errorType()));
fields.add(new DataSourceDateTimeField(Field.TIME_OCCURED, MSG.dataSource_resourceErrors_field_timeOccured()));
fields.add(new DataSourceTextField(Field.SUMMARY, MSG.dataSource_resourceErrors_field_summary()));
- fields.add(new DataSourceTextField(Field.DETAIL, MSG.dataSource_resourceErrors_field_detail()));
+ DataSourceTextField details = new DataSourceTextField(Field.DETAIL, MSG
+ .dataSource_resourceErrors_field_detail());
+ details.setHidden(true);//won't be displaying this value directly in the listgrid
+ fields.add(details);
+ fields.add(new DataSourceImageField(Field.ICON, MSG.dataSource_resourceErrors_field_detail()));
return fields;
}
@@ -103,11 +112,11 @@ public class ResourceErrorsDataSource extends RPCDataSource<ResourceError> {
ListGridRecord record = new ListGridRecord();
record.setAttribute(Field.DETAIL, from.getDetail());
+ record.setAttribute(Field.ICON, ERROR_ICON);
record.setAttribute(Field.ERROR_TYPE, from.getErrorType().name());
record.setAttribute(Field.SUMMARY, from.getSummary());
record.setAttribute(Field.TIME_OCCURED, new Date(from.getTimeOccurred()));
return record;
}
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsView.java
index de0bf7f..f66839a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ResourceErrorsView.java
@@ -1,8 +1,19 @@
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.summary;
import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.Window;
+import com.smartgwt.client.widgets.events.CloseClickHandler;
+import com.smartgwt.client.widgets.events.CloseClientEvent;
+import com.smartgwt.client.widgets.grid.HoverCustomizer;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
+import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
public class ResourceErrorsView extends Table {
public ResourceErrorsView(String locatorId, String string, Criteria criteria, Object object, String[] strings) {
@@ -13,11 +24,58 @@ public class ResourceErrorsView extends Table {
*/
@Override
protected void configureTable() {
- getListGrid().getField(ResourceErrorsDataSource.Field.ERROR_TYPE).setWidth("10%");
- getListGrid().getField(ResourceErrorsDataSource.Field.TIME_OCCURED).setWidth("10%");
- getListGrid().getField(ResourceErrorsDataSource.Field.SUMMARY).setWidth("20%");
- getListGrid().getField(ResourceErrorsDataSource.Field.DETAIL).setWidth("60%");
- getListGrid().setWrapCells(true);
- getListGrid().setCellHeight(100);
+ getListGrid().getField(ResourceErrorsDataSource.Field.ERROR_TYPE).setWidth("20%");
+ getListGrid().getField(ResourceErrorsDataSource.Field.TIME_OCCURED).setWidth("15%");
+ getListGrid().getField(ResourceErrorsDataSource.Field.SUMMARY).setWidth("30%");
+ //modify icon display listgrid element
+ ListGridField iconField = getListGrid().getField(ResourceErrorsDataSource.Field.ICON);
+ iconField.setWidth("35%");
+ //add action on click of cell
+ iconField.addRecordClickHandler(new RecordClickHandler() {
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ final Window winModal = new LocatableWindow(extendLocatorId("errorDetailsWin"));
+ winModal.setTitle(MSG.common_title_component_errors());
+ winModal.setOverflow(Overflow.VISIBLE);
+ winModal.setShowMinimizeButton(false);
+ winModal.setShowMaximizeButton(true);
+ winModal.setIsModal(true);
+ winModal.setShowModalMask(true);
+ winModal.setAutoSize(true);
+ winModal.setAutoCenter(true);
+ winModal.setShowResizer(true);
+ winModal.setCanDragResize(true);
+ winModal.centerInPage();
+ winModal.addCloseClickHandler(new CloseClickHandler() {
+ @Override
+ public void onCloseClick(CloseClientEvent event) {
+ winModal.markForDestroy();
+ }
+ });
+
+ LocatableHTMLPane htmlPane = new LocatableHTMLPane(extendLocatorId("errorDetailsPane"));
+ htmlPane.setMargin(10);
+ htmlPane.setDefaultWidth(550);
+ htmlPane.setDefaultHeight(550);
+ htmlPane.setContents("<pre>" + (event.getRecord().getAttribute(ResourceErrorsDataSource.Field.DETAIL))
+ + "</pre>");
+ winModal.addItem(htmlPane);
+ winModal.show();
+ }
+ });
+ iconField.setShowHover(true);
+ //show some details in mouseOver
+ iconField.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
+ String html = record.getAttribute(ResourceErrorsDataSource.Field.DETAIL);
+ if (html.length() > 80) {
+ // this was probably an error stack trace, snip it so the tooltip isn't too big
+ html = "<pre>" + html.substring(0, 80) + "...</pre><p>"
+ + MSG.view_group_pluginConfig_table_clickStatusIcon() + "</p>";
+ }
+ return html;
+ }
+ });
}
}
13 years, 6 months
[rhq] Branch 'release-3.0.0' - modules/core
by lkrejci
modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java | 163 ++++++++++
1 file changed, 163 insertions(+)
New commits:
commit db5e575b035e1416d88a0c27169da46bf0cbee65
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Dec 1 15:06:31 2010 +0100
BZ 618214 - Create a temporary entry in RHQ_PLUGIN table for the snmp-alert plugin in case we need to add something to its configuration during db-upgrade.
Once the server starts up, the temporary entry will get overwritten by the "real stuff".
diff --git a/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java b/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java
index 7ddfad2..c80a559 100644
--- a/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java
+++ b/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java
@@ -71,6 +71,8 @@ public class CustomAlertSenderUpgradeTask implements DatabaseUpgradeTask {
upgradeEmailNotifications();
upgradeSNMPNotifications();
upgradeOperationNotifications();
+
+ upgradeSNMPPreferences();
}
private void upgradeSubjectNotificationLogs() throws SQLException {
@@ -281,6 +283,122 @@ public class CustomAlertSenderUpgradeTask implements DatabaseUpgradeTask {
}
}
+ /**
+ * Copy the system wide snmp preferences. This happens only on
+ * a fresh migration from pre RHQ3 and only if the user has
+ * actually changed the provided defaults.
+ */
+ private void upgradeSNMPPreferences() throws SQLException {
+ String oldPrefsSQL = "" //
+ + " SELECT property_key,property_value"
+ + " FROM RHQ_SYSTEM_CONFIG"
+ + " WHERE property_key LIKE 'SNMP%'";
+
+ String[] keyToProp = { //
+ "SNMP_AGENT_ADDRESS","agentAddress", //
+ "SNMP_AUTH_PASSPHRASE","authPassphrase", //
+ "SNMP_AUTH_PROTOCOL","authProtocol", //
+ "SNMP_COMMUNITY","community",//
+ "SNMP_CONTEXT_NAME","targetContext",//
+ "SNMP_ENGINE_ID","engineId",//
+ "SNMP_ENTERPRISE_OID","enterpriseOid",//
+ "SNMP_GENERIC_ID","genericId",//
+ "SNMP_PRIVACY_PROTOCOL","privacyProtocol",//
+ "SNMP_PRIV_PASSPHRASE","privacyPassphrase",//
+ "SNMP_SECURITY_NAME","securityName",//
+ "SNMP_SPECIFIC_ID","specificId",//
+ "SNMP_TRAP_OID","trapOid",//
+ "SNMP_VERSION","snmpVersion"
+ };
+
+ /*
+ * Check if there is already a config present.
+ * Only run the copy on a fresh upgrade from a pre RHQ 3 version.
+ */
+ int configId = getPluginConfigurationId("alert-snmp");
+ if (configId!=0) {
+ System.out.println("Already found a snmp configuration, not copying the old one over.");
+ return;
+ }
+
+ // Get the properties from the database
+ List<Object[]> data = databaseType.executeSelectSql(connection, oldPrefsSQL);
+
+ // check if the user actually did set up the snmp settings in the older version
+ // If not, don't bother, as the plugin will set up its defaults later on.
+ for (Object[] next : data) {
+ String key = (String) next[0];
+ if (key.equals("SNMP_VERSION")) {
+ String val = (String) next[1];
+ if (val==null || val.equals("")) {
+ System.out.println("No SNMP config set in old db version, so not copying");
+ return;
+ }
+ }
+ }
+
+ // We have work to do ...
+ configId = databaseType.getNextSequenceValue(connection, "rhq_config", "id");
+ String insertConfigSQL = getInsertConfigSQL(configId);
+ databaseType.executeSql(connection, insertConfigSQL);
+
+ for (Object[] next : data) {
+ // find property
+ String propertyName = null;
+ for (int i = 0 ; i< keyToProp.length ; i++) {
+ if (keyToProp[i].equals(next[0])) {
+ propertyName = keyToProp[i+1];
+ break;
+ }
+ }
+ if (propertyName==null) {
+ System.err.println("Input property " + next[0] + " is not encoded");
+ System.err.println("Not copying the SNMP preferences");
+
+ }
+
+ String propertyValue = (String) next[1];
+
+ int propertyId = databaseType.getNextSequenceValue(connection, "rhq_config_property", "id");
+ String insertPropertySQL = getInsertPropertySQL(propertyId, configId, propertyName, propertyValue);
+ databaseType.executeSql(connection, insertPropertySQL);
+ }
+
+ //now we need to associate the plugin with its configuration
+ int pluginId = getPluginId("alert-snmp");
+ if (pluginId == 0) {
+ System.err.println("No 'alert-snmp' plugin found in the database. Creating a temporary one.");
+
+ String pluginName = "alert-snmp";
+ String displayName = "Alert:SNMP-invalid";
+ String description = "This is an automatically generated invalid plugin used to associate the SNMP "
+ + "configuration upgraded from the legacy tables. You should not really ever see this plugin "
+ + "deployed as it should be overwritten during the first server startup after the upgrade.";
+ String deploymentType = "SERVER";
+ String pluginDescriptorType =
+ "org.rhq.enterprise.server.xmlschema.generated.serverplugin.alert.AlertPluginDescriptorType";
+
+
+ pluginId = insertPluginEntry(pluginName, displayName, description, deploymentType, pluginDescriptorType);
+ }
+ setPluginConfiguration(pluginId, configId);
+ }
+
+ int getPluginConfigurationId(String pluginName) throws SQLException {
+ String getConfigIdSQL = "" //
+ + " SELECT plugin_config_id " //
+ + " FROM rhq_plugin" //
+ + " WHERE name = '" + pluginName + "'";
+ List<Object[]> data = databaseType.executeSelectSql(connection, getConfigIdSQL);
+
+ if (data==null || data.size()==0)
+ return 0;
+ Object[] idos = data.get(0);
+ return (Integer)idos[0];
+
+ }
+
+
private void persist(List<Object[]> data, String propertyName, String sender, String delimiter,
boolean bufferWithDelimiter) throws SQLException {
int definitionId = -1;
@@ -354,5 +472,50 @@ public class CustomAlertSenderUpgradeTask implements DatabaseUpgradeTask {
return "INSERT INTO rhq_alert_notification ( id, alert_definition_id, sender_config_id, sender_name )" //
+ " VALUES ( " + id + ", " + definitionId + ", " + configId + ", '" + sender + "' ) ";
}
+
+ private int getPluginId(String pluginName) throws SQLException {
+ String sql = ""
+ + "SELECT id "
+ + "FROM rhq_plugin "
+ + "WHERE name = '" + pluginName + "'";
+
+ List<Object[]> data = databaseType.executeSelectSql(connection, sql);
+
+ if (data == null || data.isEmpty()) {
+ return 0;
+ } else {
+ return (Integer) data.get(0)[0];
+ }
+ }
+ private void setPluginConfiguration(int pluginId, int configurationId) throws SQLException {
+ databaseType.executeSql(connection,
+ "UPDATE rhq_plugin SET plugin_config_id = " + configurationId
+ + " WHERE id = " + pluginId);
+ }
+
+ private int insertPluginEntry(String pluginName, String displayName, String description, String deploymentType, String pluginDescriptorType) throws SQLException {
+ int pluginId = databaseType.getNextSequenceValue(connection, "rhq_plugin", "id");
+
+ String sql = ""
+ + "INSERT INTO rhq_plugin(id, name, display_name, description, enabled, status, path, md5, ctime, mtime, deployment, ptype) "
+ + "VALUES("
+ + pluginId + ", " //id
+ + "'" + pluginName + "', " //name
+ + "'" + displayName + "', " //display_name
+ + "'" + description + "', " //description
+ + databaseType.getBooleanValue(true) + ", " //enabled
+ + "'INSTALLED', " //status
+ + "'invalid-path.jar', " //path
+ + "'0', " //md5
+ + NOW + ", " //ctime
+ + NOW + ", " //mtime
+ + "'" + deploymentType + "', " //deployment
+ + "'" + pluginDescriptorType + "'" //ptype
+ + ")";
+
+ databaseType.executeSql(connection, sql);
+
+ return pluginId;
+ }
}
13 years, 6 months
[rhq] 2 commits - modules/core
by lkrejci
modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java | 64 ++++++++++
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 6
2 files changed, 69 insertions(+), 1 deletion(-)
New commits:
commit d19c483830aaed8ab154dcb494334ad1e5baab9e
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Dec 1 14:37:47 2010 +0100
BZ 618214 - Create a temporary entry in RHQ_PLUGIN table for the snmp-alert plugin in case we need to add something to its configuration during db-upgrade.
Once the server starts up, the temporary entry will get overwritten by the "real stuff".
diff --git a/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java b/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java
index 89ae85a..0986cf6 100644
--- a/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java
+++ b/modules/core/dbutils/src/main/java/org/rhq/core/db/upgrade/CustomAlertSenderUpgradeTask.java
@@ -363,6 +363,25 @@ public class CustomAlertSenderUpgradeTask implements DatabaseUpgradeTask {
String insertPropertySQL = getInsertPropertySQL(propertyId, configId, propertyName, propertyValue);
databaseType.executeSql(connection, insertPropertySQL);
}
+
+ //now we need to associate the plugin with its configuration
+ int pluginId = getPluginId("alert-snmp");
+ if (pluginId == 0) {
+ System.err.println("No 'alert-snmp' plugin found in the database. Creating a temporary one.");
+
+ String pluginName = "alert-snmp";
+ String displayName = "Alert:SNMP-invalid";
+ String description = "This is an automatically generated invalid plugin used to associate the SNMP "
+ + "configuration upgraded from the legacy tables. You should not really ever see this plugin "
+ + "deployed as it should be overwritten during the first server startup after the upgrade.";
+ String deploymentType = "SERVER";
+ String pluginDescriptorType =
+ "org.rhq.enterprise.server.xmlschema.generated.serverplugin.alert.AlertPluginDescriptorType";
+
+
+ pluginId = insertPluginEntry(pluginName, displayName, description, deploymentType, pluginDescriptorType);
+ }
+ setPluginConfiguration(pluginId, configId);
}
int getPluginConfigurationId(String pluginName) throws SQLException {
@@ -453,5 +472,50 @@ public class CustomAlertSenderUpgradeTask implements DatabaseUpgradeTask {
return "INSERT INTO rhq_alert_notification ( id, alert_definition_id, sender_config_id, sender_name )" //
+ " VALUES ( " + id + ", " + definitionId + ", " + configId + ", '" + sender + "' ) ";
}
+
+ private int getPluginId(String pluginName) throws SQLException {
+ String sql = ""
+ + "SELECT id "
+ + "FROM rhq_plugin "
+ + "WHERE name = '" + pluginName + "'";
+
+ List<Object[]> data = databaseType.executeSelectSql(connection, sql);
+
+ if (data == null || data.isEmpty()) {
+ return 0;
+ } else {
+ return (Integer) data.get(0)[0];
+ }
+ }
+ private void setPluginConfiguration(int pluginId, int configurationId) throws SQLException {
+ databaseType.executeSql(connection,
+ "UPDATE rhq_plugin SET plugin_config_id = " + configurationId
+ + " WHERE id = " + pluginId);
+ }
+
+ private int insertPluginEntry(String pluginName, String displayName, String description, String deploymentType, String pluginDescriptorType) throws SQLException {
+ int pluginId = databaseType.getNextSequenceValue(connection, "rhq_plugin", "id");
+
+ String sql = ""
+ + "INSERT INTO rhq_plugin(id, name, display_name, description, enabled, status, path, md5, ctime, mtime, deployment, ptype) "
+ + "VALUES("
+ + pluginId + ", " //id
+ + "'" + pluginName + "', " //name
+ + "'" + displayName + "', " //display_name
+ + "'" + description + "', " //description
+ + databaseType.getBooleanValue(true) + ", " //enabled
+ + "'INSTALLED', " //status
+ + "'invalid-path.jar', " //path
+ + "'0', " //md5
+ + NOW + ", " //ctime
+ + NOW + ", " //mtime
+ + "'" + deploymentType + "', " //deployment
+ + "'" + pluginDescriptorType + "'" //ptype
+ + ")";
+
+ databaseType.executeSql(connection, sql);
+
+ return pluginId;
+ }
}
commit 0dbc0da566f9ab9c51e417afb5a63c8548e4cc34
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Dec 1 14:32:54 2010 +0100
Make schemaSpec 2.101 succeed in oracle.
diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
index c1ca995..1483436 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3258,10 +3258,14 @@
<schemaSpec version="2.101">
<schema-addColumn table="RHQ_RESOURCE_TYPE" column="DELETED" columnType="BOOLEAN"/>
<schema-directSQL>
- <statement desc="Set deleted flag for existing resources types to false">
+ <statement targetDBVendor="postgresql" desc="Set deleted flag for existing resources types to false">
UPDATE RHQ_RESOURCE_TYPE
SET DELETED = false
</statement>
+ <statement targetDBVendor="oracle" desc="Set deleted flag for existing resources types to false">
+ UPDATE RHQ_RESOURCE_TYPE
+ SET DELETED = 0
+ </statement>
</schema-directSQL>
<schema-alterColumn table="RHQ_RESOURCE_TYPE" column="DELETED" nullable="FALSE" />
</schemaSpec>
13 years, 6 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java | 46 ++++------
1 file changed, 22 insertions(+), 24 deletions(-)
New commits:
commit 904c60c45399342004fa2b3cfd366d5dad5d61dd
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Nov 30 22:59:23 2010 -0500
all the group views show the table buttons in the order "Delete" then "New".
except for the dynagroups which had "new", "recalculate", "delete".
this commit reorders the buttons so they are consistent with the other group views, so it is now "delete", "new", "recalculate"
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
index 3ea5d49..ad52f97 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/definitions/GroupDefinitionListView.java
@@ -94,6 +94,28 @@ public class GroupDefinitionListView extends TableSection {
getListGrid().setFields(idField, nameField, descriptionField, expressionField, lastCalculationTimeField,
nextCalculationTimeField);
+ addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), null, new AbstractTableAction(
+ TableActionEnablement.ANY) {
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ final int[] groupDefinitionIds = TableUtility.getIds(selection);
+ ResourceGroupGWTServiceAsync groupManager = GWTServiceLookup.getResourceGroupService();
+ groupManager.deleteGroupDefinitions(groupDefinitionIds, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_dynagroup_deleteSuccessfulSelection(String
+ .valueOf(groupDefinitionIds.length)), Severity.Info));
+ GroupDefinitionListView.this.refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_dynagroup_deleteFailureSelection(), caught);
+ }
+ });
+ }
+ });
+
addTableAction(extendLocatorId("New"), MSG.common_button_new(), null, new AbstractTableAction() {
public void executeAction(ListGridRecord[] selection, Object actionValue) {
newDetails();
@@ -121,30 +143,6 @@ public class GroupDefinitionListView extends TableSection {
});
}
});
-
- addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), null, new AbstractTableAction(
- TableActionEnablement.ANY) {
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- final int[] groupDefinitionIds = TableUtility.getIds(selection);
- ResourceGroupGWTServiceAsync groupManager = GWTServiceLookup.getResourceGroupService();
- groupManager.deleteGroupDefinitions(groupDefinitionIds, new AsyncCallback<Void>() {
- @Override
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message(MSG.view_dynagroup_deleteSuccessfulSelection(String
- .valueOf(groupDefinitionIds.length)), Severity.Info));
- GroupDefinitionListView.this.refresh();
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_dynagroup_deleteFailureSelection(), caught);
- }
- });
- }
- });
-
-
}
@Override
13 years, 6 months