modules/enterprise/gui/coregui/pom.xml | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java | 56 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 98 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java | 28 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java | 61 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersDataSource.java | 25
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java | 50 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java | 256 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java | 25
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java | 14
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/CanvasUtility.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java | 11
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 22
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java | 16
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java | 19
19 files changed, 477 insertions(+), 231 deletions(-)
New commits:
commit 5097b1982d4ac7c5c96c3f5869ba5e025b1a679d
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Tue Nov 23 12:59:56 2010 -0500
a whole bunch of tweaks to layout of user/role edit views; fix wrapping of permission grid rows; some refactoring of base record editor class for easier subclassing
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
index 28440fd..fbaf720 100644
--- 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
@@ -29,6 +29,7 @@ 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;
@@ -133,8 +134,8 @@ public class PermissionsItem extends CanvasItem {
}
private ListGrid createGlobalPermissionsGrid() {
- ListGrid grid = new ListGrid();
- grid.setHeight(115);
+ ListGrid grid = createPermissionsGrid();
+
// TODO: Add table title.
ListGridField iconField = new ListGridField("icon", " ", 40);
@@ -178,8 +179,7 @@ public class PermissionsItem extends CanvasItem {
}
private ListGrid createResourcePermissionsGrid() {
- ListGrid grid = new ListGrid();
- grid.setHeight(290);
+ ListGrid grid = createPermissionsGrid();
// TODO: Add table title.
ListGridField iconField = new ListGridField("icon", " ", 40);
@@ -276,6 +276,16 @@ public class PermissionsItem extends CanvasItem {
return grid;
}
+ 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);
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 934ee8c..df0035b 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
@@ -45,6 +45,7 @@ import org.rhq.enterprise.gui.coregui.client.UserPermissionsManager;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
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;
import org.rhq.enterprise.gui.coregui.client.components.selector.AssignedItemsChangedHandler;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
@@ -193,7 +194,8 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
+ MSG.view_adminRoles_noLdap("href='#Administration/Configuration/SystemSettings'", MSG
.view_adminConfig_systemSettings()));
label.setWidth100();
- label.setPadding(6);
+ label.setHeight(20);
+ label.setPadding(5);
this.ldapGroupsItem.setCanvas(label);
}
}
@@ -202,40 +204,40 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
}
@Override
- protected List<FormItem> createFormItems(boolean newRole) {
+ protected List<FormItem> createFormItems(EnhancedDynamicForm form) {
List<FormItem> items = new ArrayList<FormItem>();
TextItem nameItem = new TextItem(RolesDataSource.Field.NAME, MSG.common_title_name());
items.add(nameItem);
TextItem descriptionItem = new TextItem(RolesDataSource.Field.DESCRIPTION, MSG.common_title_description());
- descriptionItem.setColSpan(getForm().getNumCols());
+ descriptionItem.setColSpan(form.getNumCols());
descriptionItem.setWidth("*");
items.add(descriptionItem);
permissionsItem = new PermissionsItem(this);
permissionsItem.setShowTitle(false);
- permissionsItem.setColSpan(getForm().getNumCols());
+ 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(getForm().getNumCols());
+ 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(getForm().getNumCols());
+ 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(getForm().getNumCols());
+ ldapGroupsItem.setColSpan(form.getNumCols());
ldapGroupsItem.setCanvas(new Canvas());
items.add(ldapGroupsItem);
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 6a91645..cf4650d 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
@@ -24,8 +24,9 @@ import java.util.Set;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
-import com.smartgwt.client.widgets.form.fields.HiddenItem;
import com.smartgwt.client.widgets.form.fields.PasswordItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
@@ -41,6 +42,7 @@ import org.rhq.enterprise.gui.coregui.client.UserPermissionsManager;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
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;
import org.rhq.enterprise.gui.coregui.client.components.selector.AssignedItemsChangedHandler;
@@ -55,6 +57,7 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
private static final String HEADER_ICON = "global/User_24.png";
private static final int SUBJECT_ID_RHQADMIN = 2;
+ private CanvasItem rolesItem;
private SubjectRoleSelector roleSelector;
private boolean hasManageSecurityPermission;
@@ -112,7 +115,7 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
onItemChanged();
}
});
- getBottomLayout().addMember(roleSelector);
+ this.rolesItem.setCanvas(this.roleSelector);
}
}
@@ -129,11 +132,11 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
}
@Override
- protected List<FormItem> createFormItems(boolean newUser) {
+ protected List<FormItem> createFormItems(EnhancedDynamicForm form) {
List<FormItem> items = new ArrayList<FormItem>();
// Username field should be editable when creating a new user, but should be read-only for existing users.
- if (newUser) {
+ if (form.isNewRecord()) {
TextItem nameItem = new TextItem(UsersDataSource.Field.NAME);
items.add(nameItem);
} else {
@@ -185,8 +188,12 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
activeItem.setVertical(false);
items.add(activeItem);
- HiddenItem rolesItem = new HiddenItem(UsersDataSource.Field.ROLES);
- items.add(rolesItem);
+ this.rolesItem = new CanvasItem(UsersDataSource.Field.ROLES);
+ this.rolesItem.setShowTitle(false);
+ this.rolesItem.setColSpan(form.getNumCols());
+ this.rolesItem.setCanvas(new Canvas());
+ items.add(this.rolesItem);
+
return items;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
index 28fb10a..36cc9ee 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java
@@ -19,37 +19,55 @@
*/
package org.rhq.enterprise.gui.coregui.client.components;
+import com.google.gwt.user.client.Window;
+import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.layout.VLayout;
+
+import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableToolStrip;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* A title bar to be displayed at the top of a content view - contains a label and/or an icon.
*
* @author Ian Springer
*/
-public class TitleBar extends VLayout {
+public class TitleBar extends LocatableToolStrip {
private Label label;
- public TitleBar() {
- this(null, null);
+ public TitleBar(Locatable parent) {
+ this(parent, null, null);
}
- public TitleBar(String title) {
- this(title, null);
+ public TitleBar(Locatable parent, String title) {
+ this(parent, title, null);
}
- public TitleBar(String title, String icon) {
+ public TitleBar(Locatable parent, String title, String icon) {
+ super(parent.extendLocatorId("TitleBar"));
+
setWidth100();
setHeight(35);
+ LocatableVLayout vLayout = new LocatableVLayout(extendLocatorId("VLayout"));
+ vLayout.setAlign(VerticalAlignment.CENTER);
+ vLayout.setLayoutMargin(5);
+
+ LocatableHLayout hLayout = new LocatableHLayout(vLayout.extendLocatorId("HLayout"));
+ vLayout.addMember(hLayout);
+
this.label = new Label();
+ this.label.setWidth("*");
this.label.setIcon(icon);
this.label.setIconWidth(24);
this.label.setIconHeight(24);
this.label.setAutoHeight();
+ hLayout.addMember(this.label);
setVisible(false);
- addMember(this.label);
+ addMember(vLayout);
+
setTitle(title);
}
@@ -69,9 +87,19 @@ public class TitleBar extends VLayout {
}
private void refresh(String title) {
- String contents = "<span class='HeaderLabel'>" + title + "</span>";
- this.label.setContents(contents);
setVisible(title != null);
- //markForRedraw();
+
+ String contents;
+ String windowTitle;
+ if (title == null) {
+ contents = null;
+ windowTitle = "RHQ";
+ } else {
+ contents = "<span class='HeaderLabel'>" + title + "</span>";
+ windowTitle = "RHQ: " + title;
+ }
+ this.label.setContents(contents);
+ Window.setTitle(windowTitle);
}
+
}
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 19140df..277d773 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
@@ -32,6 +32,8 @@ import com.smartgwt.client.data.Record;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.ClickEvent;
@@ -40,7 +42,6 @@ import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.grid.ListGridRecord;
-import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
@@ -48,9 +49,12 @@ import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.DetailsView;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.components.TitleBar;
+import org.rhq.enterprise.gui.coregui.client.util.CanvasUtility;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableToolStrip;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -70,16 +74,13 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
private int recordId;
private TitleBar titleBar;
- private VLayout editCanvas;
private EnhancedDynamicForm form;
private DS dataSource;
- private IButton saveButton;
- private IButton resetButton;
private boolean isReadOnly;
- private VLayout bottomLayout;
private String dataTypeName;
private String listViewPath;
private boolean wasInvalid;
+ private ButtonBar buttonBar;
public AbstractRecordEditor(String locatorId, DS dataSource, int recordId, String dataTypeName,
String headerIcon) {
@@ -88,15 +89,14 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
this.recordId = recordId;
this.dataTypeName = capitalize(dataTypeName);
- // Set properties for this VLayout.
- setOverflow(Overflow.AUTO);
- setPadding(7);
+ setLayoutMargin(0);
+ setMembersMargin(16);
// Display a "Loading..." label at the top of the view to keep the user informed.
addMember(LOADING_LABEL);
// Add title bar. We'll set the actual title later.
- this.titleBar = new TitleBar(null, headerIcon);
+ this.titleBar = new TitleBar(this, null, headerIcon);
this.titleBar.hide();
addMember(this.titleBar);
}
@@ -126,9 +126,16 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
CoreGUI.goToView(getListViewPath(), message);
} else {
this.isReadOnly = isReadOnly;
- this.editCanvas = buildEditor();
- this.editCanvas.hide();
- addMember(this.editCanvas);
+
+ VLayout contentPane = buildContentPane();
+ contentPane.hide();
+ addMember(contentPane);
+
+ this.buttonBar = buildButtonBar();
+ if (buttonBar != null) {
+ buttonBar.hide();
+ addMember(buttonBar);
+ }
if (this.recordId == ID_NEW) {
editNewRecord();
@@ -141,75 +148,42 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
}
}
- private VLayout buildEditor() {
- VLayout editorVLayout = new VLayout();
-
- boolean isNewRecord = (this.recordId == ID_NEW);
- this.form = new EnhancedDynamicForm(this.getLocatorId(), this.isReadOnly, isNewRecord);
- this.form.setDataSource(this.dataSource);
-
- List<FormItem> items = createFormItems(isNewRecord);
- this.form.setItems(items.toArray(new FormItem[items.size()]));
-
- this.form.addItemChangedHandler(new ItemChangedHandler() {
- public void onItemChanged(ItemChangedEvent event) {
- AbstractRecordEditor.this.onItemChanged();
- }
- });
+ protected VLayout buildContentPane() {
+ VLayout contentPane = new VLayout();
+ contentPane.setWidth100();
+ contentPane.setHeight100();
+ contentPane.setOverflow(Overflow.AUTO);
+ //contentPane.setPadding(7);
- editorVLayout.addMember(this.form);
-
- this.bottomLayout = new VLayout();
- editorVLayout.addMember(this.bottomLayout);
-
- if (!this.isReadOnly) {
- VLayout verticalSpacer = new VLayout();
- verticalSpacer.setHeight(12);
- editorVLayout.addMember(verticalSpacer);
+ this.form = buildForm();
+ contentPane.addMember(this.form);
- HLayout buttonLayout = createButtons();
+ return contentPane;
+ }
- editorVLayout.addMember(buttonLayout);
+ protected ButtonBar buildButtonBar() {
+ if (this.isReadOnly) {
+ return null;
}
- return editorVLayout;
+ return new ButtonBar();
}
- private HLayout createButtons() {
- HLayout buttonLayout = new HLayout(10);
-
- saveButton = new LocatableIButton(this.extendLocatorId("Save"), MSG.common_button_save());
- saveButton.setDisabled(true);
- saveButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- save();
- }
- });
+ protected EnhancedDynamicForm buildForm() {
+ boolean isNewRecord = (this.recordId == ID_NEW);
+ EnhancedDynamicForm form = new EnhancedDynamicForm(this.getLocatorId(), this.isReadOnly, isNewRecord);
+ form.setDataSource(this.dataSource);
- resetButton = new LocatableIButton(this.extendLocatorId("Reset"), MSG.common_button_reset());
- resetButton.setDisabled(true);
- resetButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- reset();
- resetButton.disable();
- }
- });
+ List<FormItem> items = createFormItems(form);
+ form.setItems(items.toArray(new FormItem[items.size()]));
- IButton cancelButton = new LocatableIButton(this.extendLocatorId("Cancel"), MSG.common_button_cancel());
- cancelButton.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- History.back();
+ form.addItemChangedHandler(new ItemChangedHandler() {
+ public void onItemChanged(ItemChangedEvent event) {
+ AbstractRecordEditor.this.onItemChanged();
}
});
- buttonLayout.addMember(saveButton);
- buttonLayout.addMember(resetButton);
- buttonLayout.addMember(cancelButton);
- return buttonLayout;
- }
-
- public VLayout getBottomLayout() {
- return bottomLayout;
+ return form;
}
public EnhancedDynamicForm getForm() {
@@ -232,7 +206,7 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
return listViewPath;
}
- protected abstract List<FormItem> createFormItems(boolean newRecord);
+ protected abstract List<FormItem> createFormItems(EnhancedDynamicForm form);
/**
* This method should be called whenever any editable item on the page is changed. It will enable the Reset button
@@ -244,8 +218,19 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
// If we're in editable mode, update the button enablement.
if (!this.isReadOnly) {
- this.saveButton.setDisabled(!isValid);
- this.resetButton.setDisabled(false);
+ IButton saveButton = this.buttonBar.getSaveButton();
+ boolean saveButtonWasDisabled = saveButton.isDisabled();
+ saveButton.setDisabled(!isValid);
+ if (saveButtonWasDisabled != !saveButton.isDisabled()) {
+ CanvasUtility.blink(saveButton);
+ }
+
+ IButton resetButton = this.buttonBar.getResetButton();
+ if (resetButton.isDisabled()) {
+ resetButton.setDisabled(false);
+ CanvasUtility.blink(resetButton);
+ }
+
if (!isValid) {
this.wasInvalid = true;
Message message = new Message("One or more fields have invalid values. This " + this.dataTypeName
@@ -378,9 +363,13 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
}
private void displayForm() {
- LOADING_LABEL.hide();
- this.titleBar.show();
- this.editCanvas.show();
+ removeMember(LOADING_LABEL);
+ LOADING_LABEL.destroy();
+
+ for (Canvas member : getMembers()) {
+ member.show();
+ }
+
markForRedraw();
}
@@ -428,5 +417,68 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
private static String capitalize(String itemTitle) {
return Character.toUpperCase(itemTitle.charAt(ID_NEW)) + itemTitle.substring(1);
}
+
+ protected class ButtonBar extends LocatableToolStrip {
+
+ private IButton saveButton;
+ private IButton resetButton;
+ private IButton cancelButton;
+
+ ButtonBar() {
+ super(AbstractRecordEditor.this.extendLocatorId("ButtonBar"));
+
+ setWidth100();
+ setHeight(35);
+
+ LocatableVLayout vLayout = new LocatableVLayout(extendLocatorId("VLayout"));
+ vLayout.setAlign(VerticalAlignment.CENTER);
+ vLayout.setLayoutMargin(4);
+
+ LocatableHLayout hLayout = new LocatableHLayout(vLayout.extendLocatorId("HLayout"));
+ hLayout.setMembersMargin(10);
+ vLayout.addMember(hLayout);
+
+ saveButton = new LocatableIButton(extendLocatorId("Save"), MSG.common_button_save());
+ saveButton.setDisabled(true);
+ saveButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ save();
+ }
+ });
+ hLayout.addMember(saveButton);
+
+ resetButton = new LocatableIButton(extendLocatorId("Reset"), MSG.common_button_reset());
+ resetButton.setDisabled(true);
+ resetButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ reset();
+ resetButton.disable();
+ }
+ });
+ hLayout.addMember(resetButton);
+
+ cancelButton = new LocatableIButton(extendLocatorId("Cancel"), MSG.common_button_cancel());
+ cancelButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ History.back();
+ }
+ });
+ hLayout.addMember(cancelButton);
+
+ addMember(vLayout);
+ }
+
+ public IButton getCancelButton() {
+ return cancelButton;
+ }
+
+ public IButton getResetButton() {
+ return resetButton;
+ }
+
+ public IButton getSaveButton() {
+ return saveButton;
+ }
+ }
}
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 7eaa761..6d76f2c 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
@@ -27,6 +27,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import com.google.gwt.user.client.Timer;
+import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.FormItemIfFunction;
import com.smartgwt.client.widgets.form.fields.BooleanItem;
@@ -62,7 +63,6 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
private static final String FIELD_ID = "id";
private boolean isReadOnly;
- private boolean isNewRecord;
public EnhancedDynamicForm(String locatorId) {
this(locatorId, false);
@@ -76,14 +76,18 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
super(locatorId);
this.isReadOnly = readOnly;
- this.isNewRecord = isNewRecord;
+ if (isNewRecord) {
+ setSaveOperationType(DSOperationType.ADD);
+ }
// Layout Settings
- setWidth(800);
- setPadding(13);
+ setWidth(640);
+ //setWidth100();
+ //setPadding(13);
// Default to 4 columns, i.e.: itemOneTitle | itemOneValue | itemTwoTitle | itemTwoValue
setNumCols(4);
- setColWidths("20%", "30%", "20%", "30%");
+ setColWidths(100, 220, 100, 220);
+ //setTitleWidth(100);
setWrapItemTitles(false);
// Other Display Settings
@@ -192,6 +196,7 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
});
togglableTextItem.setShowIfCondition(new FormItemIfFunction() {
public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) {
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
boolean editing = staticTextItem.getAttributeAsBoolean("editing");
return editing;
}
@@ -205,7 +210,7 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
// If the dataSource has an "id" field, make sure the form does too.
if (!hasIdField && getDataSource() != null && getDataSource().getField(FIELD_ID) != null) {
FormItem idItem;
- if (this.isNewRecord || !CoreGUI.isDebugMode()) {
+ if (isNewRecord() != null && isNewRecord() || !CoreGUI.isDebugMode()) {
idItem = new HiddenItem(FIELD_ID);
} else {
idItem = new StaticTextItem(FIELD_ID, MSG.common_title_id());
@@ -214,12 +219,12 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
}
for (FormItem item : itemsList) {
- if (this.isNewRecord && !(item instanceof StaticTextItem)) {
+ if (isNewRecord() != null && isNewRecord() && !(item instanceof StaticTextItem)) {
item.setValidateOnChange(true);
}
//item.setWidth("*"); // this causes a JavaScript exception ... :-(
- item.setWidth(240);
+ item.setWidth(199);
}
super.setFields((FormItem[]) itemsList.toArray(new FormItem[itemsList.size()]));
@@ -233,6 +238,10 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
}
}
+ public boolean isReadOnly() {
+ return isReadOnly;
+ }
+
private String getStaticTextItemName(String togglableTextItemName) {
return "static" + togglableTextItemName;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
index 7a027ac..5bab96c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
@@ -245,9 +245,4 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
}
}
}
-
- protected static String addQueryStringParam(String url, String param) {
- char separatorChar = (url.indexOf('?') == -1) ? '?' : '&';
- return url + separatorChar + param;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/CanvasUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/CanvasUtility.java
index 0721562..ef37367 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/CanvasUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/CanvasUtility.java
@@ -27,7 +27,6 @@ import com.smartgwt.client.widgets.Canvas;
public class CanvasUtility {
public static void blink(Canvas canvas) {
-
canvas.animateFade(10, new FadeAnimationCallback(3,canvas,false));
}
commit 0dd71f1d16e603d3f14f46049e93683656cd9d7e
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Nov 22 19:37:26 2010 -0500
several fixes to user and role views; user creation now persists the specified roles; role subjects and resource groups are now updated when role is saved; added support for new gwt.locale prop to coregui pom (e.g. mvn ... -Dgwt.locale=de)
diff --git a/modules/enterprise/gui/coregui/pom.xml b/modules/enterprise/gui/coregui/pom.xml
index ff43e0d..3dbbcae 100644
--- a/modules/enterprise/gui/coregui/pom.xml
+++ b/modules/enterprise/gui/coregui/pom.xml
@@ -63,6 +63,10 @@
<!-- Change this to "true" via the mvn command line or your ~/.m2/settings.xml to speed
up gwt compilation. -->
<gwt.draftCompile>false</gwt.draftCompile>
+
+ <!-- Set the default locale for the GUI. Currently supported locales are "default" (for English) or "de" (for
+ German). -->
+ <gwt.locale>default</gwt.locale>
</properties>
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
index 830330a..28440fd 100644
--- 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
@@ -19,6 +19,7 @@
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;
@@ -63,9 +64,9 @@ 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");
@@ -90,6 +91,11 @@ public class PermissionsItem extends CanvasItem {
return permissionsEditor;
}
+ public void reset() {
+ //setValue(this.originalValue);
+ redraw();
+ }
+
@Override
public void redraw() {
this.selectedPermissions = getValueAsPermissionSet();
@@ -114,11 +120,14 @@ public class PermissionsItem extends CanvasItem {
record.setAttribute("writeAuthorized", this.selectedPermissions.contains(writePermission));
}
- super.redraw();
+ 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);
}
@@ -316,14 +325,37 @@ public class PermissionsItem extends CanvasItem {
}
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,
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 9fce069..934ee8c 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
@@ -92,48 +92,58 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
GWTServiceLookup.getLdapService().checkLdapConfiguredStatus(new AsyncCallback<Boolean>() {
public void onSuccess(Boolean isLdapConfigured) {
RoleEditView.this.isLdapConfigured = isLdapConfigured;
- fetchAvailableLdapGroups();
+ if (RoleEditView.this.isLdapConfigured) {
+ fetchAvailableLdapGroups();
+ } else {
+ init();
+ }
}
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_adminRoles_failLdap(), caught);
RoleEditView.this.isLdapConfigured = false;
- fetchAvailableLdapGroups();
+ init();
}
});
}
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_SUPERUSER) ||
(getRecordId() == RolesDataSource.ID_ALL_RESOURCES));
- if (this.isLdapConfigured) {
- 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(isReadOnly);
- }
-
- 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(isReadOnly);
- }
- });
- } else {
- // LDAP not configured - we won't display an LDAP group selector.
- // TODO: Should we display a message stating that LDAP is not configured with a link to Admin Settings view?
- Set<LdapGroup> availableLdapGroups = Collections.emptySet();
- init(isReadOnly);
- }
+ init(isReadOnly);
}
@Override
+ protected Record createNewRecord() {
+ Role role = new Role();
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ Record roleRecord = RolesDataSource.getInstance().copyValues(role);
+ return roleRecord;
+ }
+
protected void editRecord(Record record) {
+ super.editRecord(record);
+
// 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();
@@ -189,12 +199,10 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
}
this.permissionsItem.redraw();
-
- super.editRecord(record);
}
@Override
- protected List<FormItem> createFormItems(boolean newUser) {
+ protected List<FormItem> createFormItems(boolean newRole) {
List<FormItem> items = new ArrayList<FormItem>();
TextItem nameItem = new TextItem(RolesDataSource.Field.NAME, MSG.common_title_name());
@@ -239,27 +247,31 @@ 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 .
- // TODO: Uncomment and fix the below lines.
- /*ListGridRecord[] groupRecords = this.groupSelector.getAssignedGrid().getRecords();
+ ListGridRecord[] groupRecords = this.groupSelector.getAssignedGrid().getRecords();
getForm().setValue(RolesDataSource.Field.RESOURCE_GROUPS, groupRecords);
ListGridRecord[] subjectRecords = this.subjectSelector.getAssignedGrid().getRecords();
getForm().setValue(RolesDataSource.Field.SUBJECTS, subjectRecords);
- ListGridRecord[] ldapGroupRecords = this.ldapGroupSelector.getAssignedGrid().getRecords();
- getForm().setValue(RolesDataSource.Field.LDAP_GROUPS, ldapGroupRecords);*/
+ if (this.ldapGroupSelector != null) {
+ ListGridRecord[] ldapGroupRecords = this.ldapGroupSelector.getAssignedGrid().getRecords();
+ getForm().setValue(RolesDataSource.Field.LDAP_GROUPS, ldapGroupRecords);
+ }
- //permissionsItem.getPermissions();
// Submit the form values to the datasource.
super.save();
}
@Override
protected void reset() {
- super.reset();
+ super.reset();
+
+ this.permissionsItem.reset();
this.groupSelector.reset();
this.subjectSelector.reset();
- this.ldapGroupSelector.reset();
+ if (this.ldapGroupSelector != null) {
+ this.ldapGroupSelector.reset();
+ }
}
}
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 7f67926..8806a49 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
@@ -34,9 +34,11 @@ import com.smartgwt.client.data.fields.DataSourceTextField;
import com.smartgwt.client.types.FieldType;
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.criteria.RoleCriteria;
+import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
import org.rhq.enterprise.gui.coregui.client.UserPermissionsManager;
@@ -208,10 +210,18 @@ public class RolesDataSource extends RPCDataSource<Role> {
Set<Permission> permissions = toPermissionSet(permissionRecords);
to.setPermissions(permissions);
+ Record[] resourceGroupRecords = from.getAttributeAsRecordArray(Field.RESOURCE_GROUPS);
+ Set<ResourceGroup> resourceGroups =
+ ResourceGroupsDataSource.getInstance().buildDataObjects(resourceGroupRecords);
+ to.setResourceGroups(resourceGroups);
+
+ Record[] subjectRecords = from.getAttributeAsRecordArray(Field.SUBJECTS);
+ Set<Subject> subjects = UsersDataSource.getInstance().buildDataObjects(subjectRecords);
+ to.setSubjects(subjects);
+
+ Record[] ldapGroupRecords = from.getAttributeAsRecordArray(Field.LDAP_GROUPS);
// TODO
- /*to.setResourceGroups((Set<ResourceGroup>) from.getAttributeAsObject(Field.RESOURCE_GROUPS));
- to.setSubjects((Set<Subject>) from.getAttributeAsObject(Field.SUBJECTS));
- to.setSubjects((Set<Subject>) from.getAttributeAsObject(Field.LDAP_GROUPS));*/
+ to.setLdapGroups(null);
return to;
}
@@ -223,17 +233,21 @@ public class RolesDataSource extends RPCDataSource<Role> {
targetRecord.setAttribute(Field.NAME, sourceRole.getName());
targetRecord.setAttribute(Field.DESCRIPTION, sourceRole.getDescription());
- ListGridRecord[] resourceGroupRecords = ResourceGroupsDataSource.getInstance().buildRecords(
- sourceRole.getResourceGroups());
- targetRecord.setAttribute(Field.RESOURCE_GROUPS, resourceGroupRecords);
-
Set<Permission> permissions = sourceRole.getPermissions();
ListGridRecord[] permissionRecords = toRecordArray(permissions);
targetRecord.setAttribute(Field.PERMISSIONS, permissionRecords);
+ ListGridRecord[] resourceGroupRecords = ResourceGroupsDataSource.getInstance().buildRecords(
+ sourceRole.getResourceGroups());
+ targetRecord.setAttribute(Field.RESOURCE_GROUPS, resourceGroupRecords);
+
ListGridRecord[] subjectRecords = UsersDataSource.getInstance().buildRecords(sourceRole.getSubjects());
targetRecord.setAttribute(Field.SUBJECTS, subjectRecords);
+ // TODO
+ ListGridRecord[] ldapGroupRecords = null;
+ targetRecord.setAttribute(Field.LDAP_GROUPS, ldapGroupRecords);
+
return targetRecord;
}
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 8d40e67..6a91645 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
@@ -37,7 +37,6 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.auth.Principal;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
-import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
import org.rhq.enterprise.gui.coregui.client.UserPermissionsManager;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
@@ -67,20 +66,28 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
@Override
public void renderView(ViewPath viewPath) {
super.renderView(viewPath);
- UserPermissionsManager.getInstance().loadGlobalPermissions(
- new PermissionsLoadedListener() {
- public void onPermissionsLoaded(Set<Permission> globalPermissions) {
- Subject sessionSubject = UserSessionManager.getSessionSubject();
- boolean isEditingSelf = (sessionSubject.getId() == getRecordId());
- UserEditView.this.hasManageSecurityPermission = globalPermissions.contains(Permission.MANAGE_SECURITY);
- boolean isReadOnly = (!UserEditView.this.hasManageSecurityPermission && !isEditingSelf);
- init(isReadOnly);
- }
- });
+
+ Set<Permission> globalPermissions = UserPermissionsManager.getInstance().getGlobalPermissions();
+ UserEditView.this.hasManageSecurityPermission = globalPermissions.contains(Permission.MANAGE_SECURITY);
+ Subject sessionSubject = UserSessionManager.getSessionSubject();
+ boolean isEditingSelf = (sessionSubject.getId() == getRecordId());
+ boolean isReadOnly = (!UserEditView.this.hasManageSecurityPermission && !isEditingSelf);
+ init(isReadOnly);
+ }
+
+ @Override
+ protected Record createNewRecord() {
+ Subject subject = new Subject();
+ subject.setFactive(true);
+ @SuppressWarnings({"UnnecessaryLocalVariable"})
+ Record userRecord = UsersDataSource.getInstance().copyValues(subject, false);
+ return userRecord;
}
@Override
protected void editRecord(Record record) {
+ super.editRecord(record);
+
// Don't allow the rhqadmin account to be disabled.
if (getRecordId() == SUBJECT_ID_RHQADMIN) {
FormItem activeField = getForm().getField(UsersDataSource.Field.FACTIVE);
@@ -107,17 +114,6 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
});
getBottomLayout().addMember(roleSelector);
}
-
- super.editRecord(record);
- }
-
- @Override
- protected void editNewRecord() {
- super.editNewRecord();
-
- // Make sure the new user is enabled by default.
- FormItem enabledField = getForm().getField(UsersDataSource.Field.FACTIVE);
- enabledField.setValue(Boolean.TRUE.toString());
}
//
@@ -198,6 +194,8 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
protected void save() {
ListGridRecord[] roleRecords = this.roleSelector.getAssignedGrid().getRecords();
getForm().setValue(UsersDataSource.Field.ROLES, roleRecords);
+
+ // Submit the form values to the datasource.
super.save();
}
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 5f84ce5..0634e91 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
@@ -126,7 +126,6 @@ public class UsersDataSource extends RPCDataSource<Subject> {
passwordVerifyField.setValidators(passwordsEqualValidator);
fields.add(passwordVerifyField);
-
DataSourceTextField firstNameField = createTextField(Field.FIRST_NAME,
MSG.dataSource_users_field_firstName(), null, 100, true);
fields.add(firstNameField);
@@ -204,31 +203,19 @@ public class UsersDataSource extends RPCDataSource<Subject> {
@Override
protected void executeAdd(final Record recordToAdd, final DSRequest request, final DSResponse response) {
final Subject newSubject = copyValues(recordToAdd);
-
- final String username = newSubject.getName();
- subjectService.createSubject(newSubject, new AsyncCallback<Subject>() {
+ String password = recordToAdd.getAttribute(Field.PASSWORD);
+
+ subjectService.createSubject(newSubject, password, new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
// TODO: Throw more specific SLSB exceptions so we can set the right validation errors.
Map<String, String> errorMessages = new HashMap<String, String>();
- errorMessages.put(Field.NAME, "A user named [" + username + "] already exists.");
+ errorMessages.put(Field.NAME, "A user named [" + newSubject.getName() + "] already exists.");
sendValidationErrorResponse(request, response, errorMessages);
}
public void onSuccess(final Subject createdSubject) {
- String password = recordToAdd.getAttribute(Field.PASSWORD);
- subjectService.createPrincipal(newSubject.getName(), password, new AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- String message = "Subject created, but failed to create principal.";
- sendFailureResponse(request, response, message, caught);
- }
-
- public void onSuccess(Void nothing) {
- Record createdUserRecord = copyValues(createdSubject, false);
- sendSuccessResponse(request, response, createdUserRecord);
- }
- });
-
- // TODO: Update roles (currently requires separate SLSB call).
+ Record createdUserRecord = copyValues(createdSubject, false);
+ sendSuccessResponse(request, response, createdUserRecord);
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
index 57c1327..6a9fffa 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UsersView.java
@@ -32,9 +32,7 @@ import org.rhq.core.domain.authz.Permission;
import org.rhq.enterprise.gui.coregui.client.UserPermissionsManager;
import org.rhq.enterprise.gui.coregui.client.admin.AdministrationView;
import org.rhq.enterprise.gui.coregui.client.admin.roles.RolesDataSource;
-import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
-import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
import org.rhq.enterprise.gui.coregui.client.components.table.TableSection;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
@@ -143,9 +141,13 @@ public class UsersView extends TableSection<UsersDataSource> {
};
}
- private AbstractTableAction createNewAction() {
- return new AbstractTableAction(
- TableActionEnablement.ALWAYS) {
+ private TableAction createNewAction() {
+ return new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ Set<Permission> globalPermissions = UserPermissionsManager.getInstance().getGlobalPermissions();
+ return globalPermissions.contains(Permission.MANAGE_SECURITY);
+ }
+
public void executeAction(ListGridRecord[] selection, Object actionValue) {
newDetails();
}
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 4288a2e..19140df 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
@@ -232,7 +232,7 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
return listViewPath;
}
- protected abstract List<FormItem> createFormItems(boolean newUser);
+ protected abstract List<FormItem> createFormItems(boolean newRecord);
/**
* This method should be called whenever any editable item on the page is changed. It will enable the Reset button
@@ -323,8 +323,29 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
});
}
- @SuppressWarnings("unchecked")
- protected void editRecord(Record record) {
+ protected void editNewRecord() {
+ // Update the view title.
+ this.titleBar.setTitle("New " + this.dataTypeName);
+
+ // Create a new record.
+ Record record = createNewRecord();
+
+ // And populate the form with it.
+ this.form.editRecord(record);
+ this.form.setSaveOperationType(DSOperationType.ADD);
+
+ // But make sure the value of the "id" field is set to "0", since a value of null could cause the dataSource's
+ // copyValues(Record) impl to choke.
+ FormItem idItem = this.form.getItem(FIELD_ID);
+ if (idItem != null) {
+ idItem.setDefaultValue(ID_NEW);
+ idItem.hide();
+ }
+
+ editRecord(record);
+ }
+
+ protected void editExistingRecord(Record record) {
// Update the view title.
String recordName = record.getAttribute(getTitleFieldName());
String title = (this.isReadOnly) ? MSG.widget_recordEditor_title_view(this.dataTypeName, recordName) :
@@ -337,22 +358,23 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
// Perform up front validation for existing records.
// NOTE: We do *not* do this for new records, since we expect most of the required fields to be blank.
this.form.validate();
- }
- protected void editNewRecord() {
- // Update the view title.
- this.titleBar.setTitle("New " + this.dataTypeName);
+ editRecord(record);
+ }
- // Clear the form
- this.form.editNewRecord();
+ /**
+ * Initialize the editor with the data from the passed record. This method will be called for both new records
+ * (after the record has been created by {@link #createNewRecord()}) and existing records (after the record has
+ * been fetched by {@link #fetchExistingRecord(int)}.
+ *
+ * @param record the record
+ */
+ protected void editRecord(Record record) {
+ }
- // But make sure the value of the "id" field is set to "0", since a value of null could cause the dataSource's
- // copyValues(Record) impl to choke.
- FormItem idItem = this.form.getItem(FIELD_ID);
- if (idItem != null) {
- idItem.setDefaultValue(ID_NEW);
- idItem.hide();
- }
+ // Subclasses will generally want to override this.
+ protected Record createNewRecord() {
+ return new ListGridRecord();
}
private void displayForm() {
@@ -376,7 +398,7 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
throw new IllegalStateException(MSG.widget_recordEditor_error_multipleRecords());
}
Record record = records[0];
- editRecord(record);
+ editExistingRecord(record);
// Now that all the widgets have been created and initialized, make everything visible.
displayForm();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
index 7851c49..e6f4450 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/SubjectGWTService.java
@@ -18,12 +18,15 @@
*/
package org.rhq.enterprise.gui.coregui.client.gwt;
+import javax.persistence.EntityExistsException;
+
import com.google.gwt.user.client.rpc.RemoteService;
import org.rhq.core.domain.auth.Principal;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.SubjectCriteria;
import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.server.auth.SubjectException;
/**
* @see org.rhq.enterprise.server.auth.SubjectManagerLocal
@@ -50,6 +53,17 @@ public interface SubjectGWTService extends RemoteService {
Subject createSubject(Subject subjectToCreate);
/**
+ * Creates a new subject, including their assigned roles, as well as an associated principal with the specified
+ * password.
+ *
+ * @param subjectToCreate the subject to be created (which will never be the same as <code>subject</code>)
+ * @param password the password for the principal to be created for the new user
+ *
+ * @return the persisted subject
+ */
+ Subject createSubject(Subject subjectToCreate, String password);
+
+ /**
* Deletes the given set of users, including both the {@link Subject} and {@link org.rhq.core.domain.auth.Principal} objects associated with
* those users.
*
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
index 3ef64a4..b2d6071 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/SubjectGWTServiceImpl.java
@@ -59,6 +59,16 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
}
}
+ public Subject createSubject(Subject subjectToCreate, String password) {
+ try {
+ return SerialUtility.prepare(subjectManager.createSubject(getSessionSubject(), subjectToCreate, password),
+ "SubjectManager.createSubject");
+ } catch (RuntimeException e) {
+ handleException(e);
+ return null;
+ }
+ }
+
public void deleteSubjects(int[] subjectIds) {
try {
subjectManager.deleteSubjects(getSessionSubject(), subjectIds);
@@ -150,4 +160,5 @@ public class SubjectGWTServiceImpl extends AbstractGWTServiceImpl implements Sub
log.error("Unexpected error.", e);
throw new RuntimeException(ThrowableUtil.getAllMessages(e));
}
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
index b5818dd..9579f03 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml
@@ -91,8 +91,7 @@
must have a file suffixed with _<locale>.properties in the same package/directory as
the corresponding GWT i18n interface class resides.-->
<!--<extend-property name="locale" values="de,fr"/>-->
-
- <extend-property name="locale" values="de"/>
+ <extend-property name="locale" values="${gwt.locale}" />
<entry-point class='org.rhq.enterprise.gui.coregui.client.CoreGUI'/>
<entry-point class='org.rhq.enterprise.gui.coregui.client.SearchGUI'/>
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 3a01a86..9cf47f1 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
@@ -459,7 +459,7 @@ view_adminRoles_globalPerms = Global Permissions~
view_adminRoles_ldapGroups = LDAP Groups~
view_adminRoles_ldapGroupsReadOnly = LDAP group data is read only~
view_adminRoles_noItems = No items to show~
-view_adminRoles_noLdap = The LDAP security integration is not configured. To configure LDAP go to <a {0}>{1}</a>.~
+view_adminRoles_noLdap = The LDAP security integration is not configured. To configure LDAP, go to <a {0}>{1}</a>.~
view_adminRoles_perms = Permissions~
view_adminRoles_resourcePerms = Resource Permissions~
view_adminRoles_roleAdded = Role [{0}] added.~
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 80fc211..aff5bf1 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
@@ -30,6 +30,7 @@ import java.util.Set;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.interceptor.ExcludeDefaultInterceptors;
+import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
@@ -182,6 +183,25 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
return entityManager.merge(subjectToModify);
}
+ @Override
+ public Subject createSubject(Subject whoami, Subject subjectToCreate, String password)
+ throws SubjectException, EntityExistsException {
+ // Make sure there's not an existing subject with the same name.
+ if (getSubjectByName(subjectToCreate.getName()) != null) {
+ throw new EntityExistsException("A user named [" + subjectToCreate.getName() + "] already exists.");
+ }
+
+ if (subjectToCreate.getFsystem()) {
+ throw new SubjectException("Cannot create new system subjects: " + subjectToCreate.getName());
+ }
+
+ entityManager.persist(subjectToCreate);
+
+ createPrincipal(whoami, subjectToCreate.getName(), password);
+
+ return subjectToCreate;
+ }
+
public Subject updateSubject(Subject whoami, Subject subjectToModify, String newPassword) {
// let a user change his own details
Set<Permission> globalPermissions = authorizationManager.getExplicitGlobalPermissions(whoami);
@@ -280,7 +300,7 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
*/
@RequiredPermission(Permission.MANAGE_SECURITY)
public Subject createSubject(Subject whoami, Subject subject) throws SubjectException {
- // Make sure there's not already a system subject with that name
+ // Make sure there's not an existing subject with the same name.
if (getSubjectByName(subject.getName()) != null) {
throw new SubjectException("A user named [" + subject.getName() + "] already exists.");
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
index eabe9de..279d2fe 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerLocal.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.server.auth;
import java.util.Collection;
import javax.ejb.Local;
+import javax.persistence.EntityExistsException;
import org.rhq.core.domain.auth.Principal;
import org.rhq.core.domain.auth.Subject;
@@ -164,6 +165,19 @@ public interface SubjectManagerLocal {
boolean isLoggedIn(String username);
/**
+ * Creates a new subject, including their assigned roles, as well as an associated principal with the specified
+ * password.
+ *
+ * @param subject the logged in user's subject
+ * @param subjectToCreate the subject to be created (which will never be the same as <code>subject</code>)
+ * @param password the password for the principal to be created for the new user
+ *
+ * @return the persisted subject
+ */
+ Subject createSubject(Subject subject, Subject subjectToCreate, String password) throws SubjectException,
+ EntityExistsException;
+
+ /**
* Updates an existing subject, including their assigned roles, and optionally their password.
*
* @param subject the logged in user's subject
@@ -173,7 +187,7 @@ public interface SubjectManagerLocal {
* @return the merged subject, which may or may not be the <code>subjectToModify</code> instance
*/
Subject updateSubject(Subject subject, Subject subjectToModify, String newPassword);
-
+
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
// The following are shared with the Remote Interface
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 1cf06f5..b636004 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
@@ -20,6 +20,7 @@ package org.rhq.enterprise.server.authz;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -526,15 +527,29 @@ public class RoleManagerBean implements RoleManagerLocal, RoleManagerRemote {
* automagically give all permissions to users that are explicitly given the MANAGE_SECURITY permission
*/
if (role.getPermissions().contains(Permission.MANAGE_SECURITY)) {
- role.getPermissions().addAll(Arrays.asList(Permission.values()));
+ role.getPermissions().addAll(EnumSet.allOf(Permission.class));
+ }
+
+ /*
+ * similarly, MANAGE_INVENTORY implies all Resource perms
+ */
+ if (role.getPermissions().contains(Permission.MANAGE_INVENTORY)) {
+ role.getPermissions().addAll(Permission.RESOURCE_ALL);
}
/*
* write-access implies read-access
*/
- if ((role.getPermissions().contains(Permission.CONFIGURE_WRITE))) {
+ if (role.getPermissions().contains(Permission.CONFIGURE_WRITE)) {
role.getPermissions().add(Permission.CONFIGURE_READ);
}
+
+ /*
+ * and lack of read-access implies lack of write-access
+ */
+ if (!role.getPermissions().contains(Permission.CONFIGURE_READ)) {
+ role.getPermissions().remove(Permission.CONFIGURE_WRITE);
+ }
}
public PageList<Role> findSubjectAssignedRoles(Subject subject, int subjectId, PageControl pc) {