[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/i18n/TestRemoteServiceStatisticsView.java | 36 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/RemoteServiceStatistics.java | 4 +
2 files changed, 40 insertions(+)
New commits:
commit fda2701eca023f5590acdb54c97dfd6ab6a31d62
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Feb 25 11:00:11 2011 -0500
be able to clear the gwt rpc statistics and to refresh the page
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 57cb200..4757ff4 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
@@ -22,11 +22,14 @@ import java.util.List;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.SortDirection;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
import org.rhq.enterprise.gui.coregui.client.util.rpc.RemoteServiceStatistics;
import org.rhq.enterprise.gui.coregui.client.util.rpc.RemoteServiceStatistics.Record.Summary;
@@ -60,6 +63,39 @@ public class TestRemoteServiceStatisticsView extends Table {
stddev.setAlign(Alignment.RIGHT);
getListGrid().setFields(serviceName, methodName, count, slowest, average, fastest, stddev);
+ refresh();
+
+ addTableAction(extendLocatorId("delete"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
+ new AbstractTableAction(TableActionEnablement.ALWAYS) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ RemoteServiceStatistics.clearAll();
+ refresh();
+ }
+ });
+
+ addTableAction(extendLocatorId("refresh"), MSG.common_button_refresh(), new AbstractTableAction(
+ TableActionEnablement.ALWAYS) {
+ @Override
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ refresh();
+ }
+ });
+ }
+
+ @Override
+ protected SelectionStyle getDefaultSelectionStyle() {
+ return SelectionStyle.NONE;
+ }
+
+ @Override
+ public boolean isShowFooterRefresh() {
+ return false;
+ }
+
+ @Override
+ public void refresh() {
+ super.refresh();
getListGrid().setRecords(transform(RemoteServiceStatistics.getAll()));
}
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 204be10..e2abe2a 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
@@ -169,4 +169,8 @@ public class RemoteServiceStatistics {
return stats;
}
+
+ public static void clearAll() {
+ statistics.clear();
+ }
}
13 years, 3 months
[rhq] modules/enterprise
by Jay Shaughnessy
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 7 +------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 1 +
2 files changed, 2 insertions(+), 6 deletions(-)
New commits:
commit d7b642c7565faf98880781b0bd0406f9cf33f5cb
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Feb 25 10:54:28 2011 -0500
Fix merge problems
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 24bbb81..4a55504 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -367,12 +367,7 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
// default view
History.newItem(DEFAULT_VIEW_PATH);
} else {
- if (!viewPath.isRefresh()) {
- messageBar.clearMessage(true);
- }
-
- if (
- pendingMessage != null) {
+ if (pendingMessage != null) {
getMessageCenter().notify(pendingMessage);
pendingMessage = null;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
index e57484b..cd73f5d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
@@ -53,6 +53,7 @@ import org.rhq.core.domain.dashboard.DashboardPortlet;
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.components.form.ColorButtonItem;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
13 years, 3 months
[rhq] 3 commits - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/dbutils/pom.xml | 2
modules/core/dbutils/src/main/scripts/dbsetup/dashboard-schema.xml | 5
modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 44 +
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 15
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DashboardCriteria.java | 126 ++++
modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/Dashboard.java | 56 ++
modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardCategory.java | 68 ++
modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardPortlet.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java | 13
modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java | 13
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 58 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java | 49 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/TitleBar.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardContainer.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 198 +++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java | 45 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java | 38 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletWindow.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DashboardGWTService.java | 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java | 113 ++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView.java | 260 +++++++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java | 104 ++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java | 62 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DashboardGWTServiceImpl.java | 19
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerBean.java | 50 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerLocal.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerRemote.java | 15
32 files changed, 1060 insertions(+), 374 deletions(-)
New commits:
commit dee7679746cc14917e38a776bd9f7b931e726bff
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Feb 25 10:34:39 2011 -0500
Combine the footer and the message bar such that all of the info is now
in one place. This hopefully makes better use of real estate, giving our
LHS and RHS panes about 30 more pixels vertically, while also improving
look and usability.
- Also, allow navigation changes to clear the message bar, on the asumption
that if the user is navigating he probably no longer needs the message
displayed.
- Also, get rid of the annoying labels that used to spew in the footer for each
messageCenter message. The messageBar and the MessageCenter button is
sufficient.
This checkin also has embedded a change such that InitializableView handling
(in renderView) is no tied to BookmarkableViews. The interfaces are handled
separately.
NOTE: It's still currently called the footer even though it's no longer
at the bottom. If accepted it will be renamed, probably to InfoBar.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
index 2edcf48..24bbb81 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
@@ -54,7 +54,6 @@ import org.rhq.enterprise.gui.coregui.client.test.TestTopView;
import org.rhq.enterprise.gui.coregui.client.util.ErrorHandler;
import org.rhq.enterprise.gui.coregui.client.util.WidgetUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.message.MessageBar;
import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
@@ -86,8 +85,6 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
private static ErrorHandler errorHandler = new ErrorHandler();
- private static MessageBar messageBar;
-
private static MessageCenter messageCenter;
private static String currentPath;
@@ -95,8 +92,6 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
// @SuppressWarnings("unused")
// private static Canvas content;
- private RootCanvas rootCanvas;
-
private static ViewPath currentViewPath;
private static CoreGUI coreGUI;
@@ -109,6 +104,10 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
// while also changing the main content. Typically we refresh only when the path is not changed.
private static boolean pendingRefresh = false;
+ private RootCanvas rootCanvas;
+ private MenuBarView menuBarView;
+ private Footer footer;
+
public void onModuleLoad() {
String hostPageBaseURL = GWT.getHostPageBaseURL();
if (hostPageBaseURL.indexOf("/coregui/") == -1) {
@@ -162,10 +161,9 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
public void buildCoreUI() {
// If the core gui is already built (eg. from previous login) skip the build and just refire event
if (rootCanvas == null) {
- MenuBarView menuBarView = new MenuBarView("TopMenu");
+ menuBarView = new MenuBarView("TopMenu");
menuBarView.setWidth("100%");
-
- messageBar = new MessageBar();
+ footer = new Footer();
Canvas canvas = new Canvas(CONTENT_CANVAS_ID);
canvas.setWidth100();
@@ -173,12 +171,11 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
rootCanvas = new RootCanvas();
rootCanvas.setOverflow(Overflow.HIDDEN);
- rootCanvas.addMember(menuBarView);
- rootCanvas.addMember(messageBar);
- //rootCanvas.addMember(breadCrumbTrailPane);
+ rootCanvas.addMember(menuBarView);
+ rootCanvas.addMember(footer);
rootCanvas.addMember(canvas);
- rootCanvas.addMember(new Footer());
+
rootCanvas.draw();
History.addValueChangeHandler(this);
@@ -360,6 +357,9 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
public void renderView(final ViewPath viewPath) {
Window.setTitle(getViewPathTitle(viewPath));
+ // when navigating, clear any message, the user is probably no longer interested
+ coreGUI.footer.getMessageBar().clearMessage(true);
+
// keep our CoreGUI session alive by refreshing the session timer each time the user performs navigation
UserSessionManager.refresh();
@@ -405,25 +405,31 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
contentCanvas.markForRedraw();
}
- if (this.currentCanvas instanceof BookmarkableView) {
- if (this.currentCanvas instanceof InitializableView) {
- final InitializableView initializableView = (InitializableView) this.currentCanvas;
- new Timer() {
- final long startTime = System.currentTimeMillis();
+ if (this.currentCanvas instanceof InitializableView) {
+ final InitializableView initializableView = (InitializableView) this.currentCanvas;
+ new Timer() {
+ final long startTime = System.currentTimeMillis();
- public void run() {
- if (initializableView.isInitialized()) {
- ((BookmarkableView) currentCanvas).renderView(viewPath.next());
+ public void run() {
+ if (initializableView.isInitialized()) {
+ if (RootCanvas.this.currentCanvas instanceof BookmarkableView) {
+ ((BookmarkableView) RootCanvas.this.currentCanvas).renderView(viewPath.next());
} else {
- long elapsedMillis = System.currentTimeMillis() - startTime;
- if (elapsedMillis < 10000) {
- schedule(100); // Reschedule the timer.
- }
+ RootCanvas.this.currentCanvas.markForRedraw();
+ }
+ } else {
+ long elapsedMillis = System.currentTimeMillis() - startTime;
+ if (elapsedMillis < 10000) {
+ schedule(100); // Reschedule the timer.
}
}
- }.run(); // fire the timer immediately
+ }
+ }.run(); // fire the timer immediately
+ } else {
+ if (this.currentCanvas instanceof BookmarkableView) {
+ ((BookmarkableView) this.currentCanvas).renderView(viewPath.next());
} else {
- ((BookmarkableView) currentCanvas).renderView(viewPath.next());
+ this.currentCanvas.markForRedraw();
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
index a2b773f..1cfdd50 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/Footer.java
@@ -21,10 +21,11 @@ package org.rhq.enterprise.gui.coregui.client;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
-import com.smartgwt.client.widgets.toolbar.ToolStripSeparator;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.criteria.AlertCriteria;
@@ -34,24 +35,27 @@ import org.rhq.enterprise.gui.coregui.client.alert.AlertHistoryView;
import org.rhq.enterprise.gui.coregui.client.footer.FavoritesButton;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.report.ReportTopView;
+import org.rhq.enterprise.gui.coregui.client.util.message.MessageBar;
import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenterView;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableLabel;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableToolStrip;
/**
* @author Greg Hinkle
* @author Joseph Marques
*/
-public class Footer extends LocatableToolStrip {
+public class Footer extends LocatableHLayout {
private static final String LOCATOR_ID = "CoreFooter";
+ private MessageBar messageBar;
+
public Footer() {
super(LOCATOR_ID);
setHeight(30);
- setAlign(VerticalAlignment.CENTER);
+ setAlign(Alignment.LEFT);
setWidth100();
- setMembersMargin(10);
- setLayoutRightMargin(5);
+ setMembersMargin(5);
+ setBackgroundColor("#F1F2F3");
}
@Override
@@ -61,16 +65,25 @@ public class Footer extends LocatableToolStrip {
final MessageCenterView messageCenter = new MessageCenterView(extendLocatorId(MessageCenterView.LOCATOR_ID));
final FavoritesButton favoritesButton = new FavoritesButton(extendLocatorId("Favorites"));
final AlertsMessage alertsMessage = new AlertsMessage(extendLocatorId("Alerts"));
+ messageBar = new MessageBar();
- addMember(messageCenter);
-
- addMember(new ToolStripSeparator());
+ // leave space for the RPC Activity Spinner
+ addMember(createHSpacer(16));
addMember(alertsMessage);
- addMember(new ToolStripSeparator());
+ addMember(messageBar);
+
+ VLayout favoritesLayout = new VLayout();
+ favoritesLayout.setHeight100();
+ favoritesLayout.setAutoWidth();
+ favoritesLayout.setAlign(Alignment.CENTER);
+ favoritesLayout.addMember(favoritesButton);
+ addMember(favoritesLayout);
+
+ addMember(messageCenter);
- addMember(favoritesButton);
+ addMember(createHSpacer(0));
alertsMessage.schedule(60000);
}
@@ -115,7 +128,7 @@ public class Footer extends LocatableToolStrip {
public static class AlertsMessage extends RefreshableLabel {
public AlertsMessage(String locatorId) {
super(locatorId);
- setHeight(30);
+ setHeight100();
setPadding(5);
setIcon("subsystems/alert/Alert_LOW_16.png");
@@ -154,4 +167,14 @@ public class Footer extends LocatableToolStrip {
}
}
+ public MessageBar getMessageBar() {
+ return messageBar;
+ }
+
+ private HLayout createHSpacer(int width) {
+ HLayout spacer = new HLayout();
+ spacer.setWidth(width);
+ return spacer;
+ }
+
}
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 fe6c3b6..3ded730 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
@@ -48,7 +48,7 @@ public class TitleBar extends LocatableToolStrip {
super(parent.extendLocatorId("TitleBar"));
setWidth100();
- setHeight(37);
+ setHeight(30);
LocatableVLayout vLayout = new LocatableVLayout(extendLocatorId("VLayout"));
vLayout.setAlign(VerticalAlignment.CENTER);
@@ -62,7 +62,7 @@ public class TitleBar extends LocatableToolStrip {
this.label.setIcon(icon);
this.label.setIconWidth(24);
this.label.setIconHeight(24);
- this.label.setAutoHeight();
+ this.label.setAutoHeight();
hLayout.addMember(this.label);
setVisible(false);
@@ -98,8 +98,8 @@ public class TitleBar extends LocatableToolStrip {
contents = "<span class='HeaderLabel'>" + title + "</span>";
windowTitle = "RHQ: " + title;
}
- this.label.setContents(contents);
+ this.label.setContents(contents);
Window.setTitle(windowTitle);
}
-
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
index 03f29e1..b255002 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
@@ -56,14 +56,17 @@ public class FavoritesButton extends LocatableIMenuButton {
// this is the main menu - the "favorites" button shown in the UI the user initially clicks
final Menu favoritesMenu = new Menu();
+ favoritesMenu.setSubmenuDirection("left");
setMenu(favoritesMenu);
- setShowMenuBelow(false);
setAutoFit(true);
// these are the child menus directly under the main favorites button
final Menu favoriteResourcesMenu = new Menu();
final Menu favoriteGroupsMenu = new Menu();
final Menu recentlyViewedMenu = new Menu();
+ favoriteResourcesMenu.setSubmenuDirection("left");
+ favoriteGroupsMenu.setSubmenuDirection("left");
+ recentlyViewedMenu.setSubmenuDirection("left");
MenuItem favoriteResourcesMenuItem = new MenuItem(MSG.favorites_resources(), "Favorite_Resource_16.png");
favoriteResourcesMenuItem.setSubmenu(favoriteResourcesMenu);
favoriteResourcesMenu.setEmptyMessage(MSG.common_val_none());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
index b28c6ce..29d7b75 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageBar.java
@@ -34,6 +34,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableLabel;
* The message will be displayed for 30 seconds and then will be automatically cleared.
*
* @author Ian Springer
+ * @author Jay Shaughnessy
*/
public class MessageBar extends LocatableHLayout implements MessageCenter.MessageListener {
private static final String LOCATOR_ID = "MessageBar";
@@ -59,7 +60,7 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
label.setAlign(Alignment.CENTER);
label.setWidth("600px");
- label.setHeight("25px");
+ label.setHeight("30px");
setLabelEmpty();
addMember(label);
@@ -121,6 +122,9 @@ public class MessageBar extends LocatableHLayout implements MessageCenter.Messag
String styleName = (contents != null) ? message.getSeverity().getStyle() : null;
label.setStyleName(styleName);
+ // TODO: perhaps just set the text to green/orange/red along with the proper icon and not have the defined
+ // color block...
+
// TODO: Create some custom edge images in green, yellow, red, etc. so we can add nice rounded corners to the
// label.
//label.setShowEdges(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
index f9e7ec4..2564e1f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/MessageCenterView.java
@@ -21,14 +21,8 @@ package org.rhq.enterprise.gui.coregui.client.util.message;
import java.util.List;
import com.allen_sauer.gwt.log.client.Log;
-import com.google.gwt.user.client.Timer;
import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.types.AnimationEffect;
-import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.TitleOrientation;
-import com.smartgwt.client.types.VerticalAlignment;
-import com.smartgwt.client.widgets.AnimationCallback;
-import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
@@ -36,8 +30,6 @@ import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.FormItemIcon;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
-import com.smartgwt.client.widgets.layout.LayoutSpacer;
-import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.menu.IMenuButton;
import com.smartgwt.client.widgets.menu.Menu;
import com.smartgwt.client.widgets.menu.MenuItem;
@@ -45,24 +37,23 @@ import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIMenuButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
/**
* @author Greg Hinkle
*/
-public class MessageCenterView extends LocatableHLayout implements MessageCenter.MessageListener {
+public class MessageCenterView extends LocatableVLayout implements MessageCenter.MessageListener {
public static final String LOCATOR_ID = "MessageCenter";
public MessageCenterView(String locatorId) {
super(locatorId, 5);
setHeight100();
- //setAlign(Alignment.RIGHT);
- setAlign(VerticalAlignment.CENTER);
- setOverflow(Overflow.HIDDEN);
+ setAlign(Alignment.CENTER);
+ setAutoWidth();
}
@Override
@@ -74,10 +65,7 @@ public class MessageCenterView extends LocatableHLayout implements MessageCenter
IMenuButton recentEventsButton = new LocatableIMenuButton(extendLocatorId("RecentEvents"), MSG
.view_messageCenter_messageTitle(), recentEventsMenu);
- recentEventsButton.setTop(5);
- recentEventsButton.setShowMenuBelow(false);
recentEventsButton.setAutoFit(true);
- recentEventsButton.setValign(VerticalAlignment.CENTER);
recentEventsButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent clickEvent) {
@@ -103,14 +91,7 @@ public class MessageCenterView extends LocatableHLayout implements MessageCenter
}
});
- VLayout vl = new VLayout();
- vl.setAutoWidth();
- vl.setAlign(Alignment.LEFT);
- vl.setAlign(VerticalAlignment.CENTER);
- vl.addMember(recentEventsButton);
-
- addMember(new LayoutSpacer());
- addMember(vl);
+ addMember(recentEventsButton);
}
private void showDetails(Message message) {
@@ -161,39 +142,6 @@ public class MessageCenterView extends LocatableHLayout implements MessageCenter
public void onMessage(final Message message) {
if (!message.isTransient()) {
logMessage(message);
-
- final Label label = new Label(message.conciseMessage);
- label.setMargin(5);
- label.setAutoFit(true);
- label.setHeight(25);
- label.setWrap(false);
-
- String iconSrc = getSeverityIcon(message.severity);
-
- label.setIcon(iconSrc);
-
- label.setTooltip(message.detailedMessage);
-
- label.addClickHandler(new ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- showDetails(message);
- }
- });
-
- addMember(label, 1);
- redraw();
-
- Timer hideTimer = new Timer() {
- @Override
- public void run() {
- label.animateHide(AnimationEffect.FADE, new AnimationCallback() {
- public void execute(boolean b) {
- label.destroy();
- }
- });
- }
- };
- hideTimer.schedule(10000);
}
}
commit 889e4fc6975de868e910e1b80a6cd6ea194ef78a
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Feb 25 10:19:51 2011 -0500
fix some jdoc links
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java
index 822f817..57f3c6f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/TableSection.java
@@ -108,13 +108,13 @@ public abstract class TableSection<DS extends RPCDataSource> extends Table<DS> i
}
}
- /*
- * The default implementation wraps the @{link getDetailsLinkColumnCellFormatter()} column with the
- * @{link getDetailsLinkColumnCellFormatter()}. This is typically the 'name' column linking to the detail
+ /**
+ * The default implementation wraps the {@link getDetailsLinkColumnCellFormatter()} column with the
+ * {@link getDetailsLinkColumnCellFormatter()}. This is typically the 'name' column linking to the detail
* view, given the 'id'. Also, establishes a double click handler for the row which invokes
- * @{link showDetails()}</br>
+ * {@link showDetails()}</br>
* </br>
- * In general, in overrides, call super.configureTable *after* manipulating the ListGrid fields.
+ * In general, in overrides, call super.configureTable *after* manipulating the ListGrid fields.
*
* @see org.rhq.enterprise.gui.coregui.client.components.table.Table#configureTable()
*/
commit c7bcef231eb74c9e7e50f699f574bee38fecb8c1
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Feb 25 10:19:23 2011 -0500
Infrastructure for Dashboard-based group and resource summary pages.
- Domain changes to support subject/resource/group relations for dashboards.
(subject was already there but added FK)
- Uses cascade delete for dashboard cleanup
- db-upgrade work, schema version 2.103
- added Criteria querying for Dashboards, removed now obsolete slsb calls
- fixed issues with portal column width configuration
1) no longer ignored
2) stored values were corrupt, now stored as expected
3) added underlying support for (future) ability to change column widths
- [Bug 661515] detach edit dash form from portlet layout so it it doesn't
scroll when on screen.
- A couple of small domain class changes for clarity or things I thought may help
smartgwt.
- tweak dash look+feel
NOTE: There is a bunch of temporary MessageCenter messaging for debugging.
This will be removed in a future commit...
NOTE: The actual group dash portlets still need definition. Currently
just using placeholders.
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml
index a2ae0c7..bf65ffb 100644
--- a/modules/core/dbutils/pom.xml
+++ b/modules/core/dbutils/pom.xml
@@ -22,7 +22,7 @@
<properties>
<scm.module.path>modules/core/dbutils/</scm.module.path>
- <db.schema.version>2.102</db.schema.version>
+ <db.schema.version>2.103</db.schema.version>
</properties>
<dependencies>
diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/dashboard-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/dashboard-schema.xml
index 48c95a5..e6dd210 100644
--- a/modules/core/dbutils/src/main/scripts/dbsetup/dashboard-schema.xml
+++ b/modules/core/dbutils/src/main/scripts/dbsetup/dashboard-schema.xml
@@ -8,7 +8,10 @@
<table name="RHQ_DASHBOARD">
<column name="ID" default="sequence-only" initial="10001" primarykey="true" required="true" type="INTEGER"/>
<column name="NAME" type="VARCHAR2" size="200" required="true"/>
- <column name="SUBJECT_ID" type="INTEGER" required="true"/>
+ <column name="SUBJECT_ID" type="INTEGER" required="true" references="RHQ_SUBJECT"/>
+ <column name="RESOURCE_ID" type="INTEGER" required="false" references="RHQ_RESOURCE"/>
+ <column name="GROUP_ID" type="INTEGER" required="false" references="RHQ_RESOURCE_GROUP"/>
+ <column name="CATEGORY" type="VARCHAR2" size="20" required="true"/>
<column name="SHARED" type="BOOLEAN" required="true"/>
<column name="CONFIGURATION_ID" type="INTEGER" required="false" references="RHQ_CONFIG"/>
</table>
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 975c778..e9b78a8 100644
--- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
+++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml
@@ -3296,6 +3296,50 @@
</schema-directSQL>
</schemaSpec>
+ <schemaSpec version="2.103">
+ <!-- add FK for owning Subject -->
+ <schema-directSQL>
+ <statement desc="Creating RHQ_DASHBOARD foreign key relation to RHQ_SUBJECT for resource dashboards">
+ ALTER TABLE RHQ_DASHBOARD
+ ADD CONSTRAINT RHQ_DB_SUBJECT_ID_FK
+ FOREIGN KEY (SUBJECT_ID)
+ REFERENCES RHQ_SUBJECT (ID)
+ </statement>
+ </schema-directSQL>
+
+ <!-- Support resource specific dashboards -->
+ <schema-addColumn table="RHQ_DASHBOARD" column="RESOURCE_ID" columnType="INTEGER" />
+ <schema-directSQL>
+ <statement desc="Creating RHQ_DASHBOARD foreign key relation to RHQ_RESOURCE for resource dashboards">
+ ALTER TABLE RHQ_DASHBOARD
+ ADD CONSTRAINT RHQ_DB_RESOURCE_ID_FK
+ FOREIGN KEY (RESOURCE_ID)
+ REFERENCES RHQ_RESOURCE (ID)
+ </statement>
+ </schema-directSQL>
+
+ <!-- Support group specific dashboards -->
+ <schema-addColumn table="RHQ_DASHBOARD" column="GROUP_ID" columnType="INTEGER" />
+ <schema-directSQL>
+ <statement desc="Creating RHQ_DASHBOARD foreign key relation to RHQ_RESOURCE_GROUP for group dashboards">
+ ALTER TABLE RHQ_DASHBOARD
+ ADD CONSTRAINT RHQ_DB_RG_ID_FK
+ FOREIGN KEY (GROUP_ID)
+ REFERENCES RHQ_RESOURCE_GROUP (ID)
+ </statement>
+ </schema-directSQL>
+
+ <!-- Add category for distinguishing what kind of dashboard this is -->
+ <schema-addColumn table="RHQ_DASHBOARD" column="CATEGORY" columnType="VARCHAR2" precision="20"/>
+ <schema-directSQL>
+ <statement desc="Set dashboard category for existing dashboards to INVENTORY">
+ UPDATE RHQ_DASHBOARD
+ SET CATEGORY = 'INVENTORY'
+ </statement>
+ </schema-directSQL>
+ <schema-alterColumn table="RHQ_DASHBOARD" column="CATEGORY" nullable="FALSE" />
+ </schemaSpec>
+
</dbupgrade>
</target>
</project>
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 182b74b..dd66c1b 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
@@ -50,6 +50,7 @@ import org.jetbrains.annotations.NotNull;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.dashboard.Dashboard;
import org.rhq.core.domain.resource.group.ResourceGroup;
/**
@@ -305,10 +306,14 @@ public class Subject implements Serializable {
@ManyToMany
private java.util.Set<Role> ldapRoles;
- // When a subject is removed any owned groups should also be removed
+ // When a subject is removed any owned groups are removed manually, no cascade delete for groups
@OneToMany(mappedBy = "subject", fetch = FetchType.LAZY)
private List<ResourceGroup> ownedGroups = null;
+ // When a subject is removed any owned dashboards are removed automatically
+ @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
+ private List<Dashboard> ownedDashboards = null;
+
@Transient
private Integer sessionId = null;
@@ -503,6 +508,14 @@ public class Subject implements Serializable {
this.ownedGroups = ownedGroups;
}
+ protected List<Dashboard> getOwnedDashboards() {
+ return ownedDashboards;
+ }
+
+ protected void setOwnedDashboards(List<Dashboard> ownedDashboards) {
+ this.ownedDashboards = ownedDashboards;
+ }
+
@Override
public String toString() {
return "Subject[id=" + id + ",name=" + name + "]";
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DashboardCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DashboardCriteria.java
new file mode 100644
index 0000000..e1ef74a
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/DashboardCriteria.java
@@ -0,0 +1,126 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.domain.criteria;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+
+import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.dashboard.DashboardCategory;
+import org.rhq.core.domain.util.PageOrdering;
+
+/**
+ * The criteria for fetching {@link Dashboard}s.
+ *
+ * @author Jay Shaughnessy
+ */
+(a)XmlAccessorType(XmlAccessType.FIELD)
+@SuppressWarnings("unused")
+public class DashboardCriteria extends Criteria {
+ private static final long serialVersionUID = 1L;
+
+ private Integer filterId;
+ private DashboardCategory filterCategory = DashboardCategory.INVENTORY;
+ private Integer filterGroupId; // needs overrides
+ private String filterName;
+ private Integer filterOwnerId; // needs overrides
+ private Integer filterResourceId; // needs overrides
+ private Boolean filterShared;
+
+ private boolean fetchConfiguration;
+ private boolean fetchOwner;
+
+ private PageOrdering sortName;
+
+ /**
+ * Note: Default Criteria Settings:<br/>
+ * ownerId = sessionSubject (i.e. the caller)<br/>
+ * category = INVENTORY<br/>
+ */
+ public DashboardCriteria() {
+ filterOverrides.put("groupId", "group.id = ?");
+ filterOverrides.put("ownerId", "owner.id = ?");
+ filterOverrides.put("resourceId", "resource.id = ?");
+ }
+
+ @Override
+ public Class<Dashboard> getPersistentClass() {
+ return Dashboard.class;
+ }
+
+ public void addFilterId(Integer filterId) {
+ this.filterId = filterId;
+ }
+
+ /**
+ * If not set explicitly this defaults to {@link DashboardCategory.INVENTORY}.
+ * @param category
+ */
+ public void addFilterCategory(DashboardCategory category) {
+ this.filterCategory = category;
+ }
+
+ public DashboardCategory getFilterCategory() {
+ return this.filterCategory;
+ }
+
+ public void addFilterGroupId(Integer filterGroupId) {
+ this.filterGroupId = filterGroupId;
+ }
+
+ public void addFilterName(String filterName) {
+ this.filterName = filterName;
+ }
+
+ /**
+ * Requires MANAGE_INVENTORY to set. When not set defaults to dashboards owned by the current user.
+ * @param filterOwnerId set to 0 for dashboards owned by anyone
+ */
+ public void addFilterOwnerId(Integer filterOwnerId) {
+ this.filterOwnerId = filterOwnerId;
+ }
+
+ public Integer getFilterOwnerId() {
+ return filterOwnerId;
+ }
+
+ public void addFilterResourceId(Integer filterResourceId) {
+ this.filterResourceId = filterResourceId;
+ }
+
+ public void addFilterShared(Boolean filterShared) {
+ this.filterShared = filterShared;
+ }
+
+ public void addSortName(PageOrdering sortName) {
+ addSortField("name");
+ this.sortName = sortName;
+ }
+
+ @Override
+ public boolean isInventoryManagerRequired() {
+ // presently only inventory managers can view/manage other people's dashboards
+ return this.filterOwnerId != null;
+ }
+
+}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/Dashboard.java b/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/Dashboard.java
index 2c2482e..622bd28 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/Dashboard.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/Dashboard.java
@@ -35,6 +35,8 @@ import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@@ -54,9 +56,12 @@ import org.hibernate.annotations.Cascade;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.group.ResourceGroup;
/**
* @author Greg Hinkle
+ * @author Jay Shaughnessy
*/
@Entity
@SequenceGenerator(name = "RHQ_DASHBOARD_ID_SEQ", sequenceName = "RHQ_DASHBOARD_ID_SEQ")
@@ -70,11 +75,16 @@ public class Dashboard implements Serializable {
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "RHQ_DASHBOARD_ID_SEQ")
@Id
- private int id;
+ private int id = 0;
@Column(name = "NAME", nullable = false)
private String name;
+ @Column(name = "CATEGORY", nullable = false)
+ @Enumerated(EnumType.STRING)
+ private DashboardCategory category;
+
+ // currently unused
@Column(name = "SHARED", nullable = false)
private boolean shared = false;
@@ -86,6 +96,14 @@ public class Dashboard implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
private Subject owner;
+ @JoinColumn(name = "RESOURCE_ID", nullable = true)
+ @ManyToOne(fetch = FetchType.LAZY)
+ private Resource resource;
+
+ @JoinColumn(name = "GROUP_ID", nullable = true)
+ @ManyToOne(fetch = FetchType.LAZY)
+ private ResourceGroup group;
+
@OneToMany(mappedBy = "dashboard", fetch = FetchType.EAGER)
@Cascade( { org.hibernate.annotations.CascadeType.PERSIST, org.hibernate.annotations.CascadeType.MERGE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@@ -128,6 +146,30 @@ public class Dashboard implements Serializable {
this.owner = owner;
}
+ public DashboardCategory getCategory() {
+ return category;
+ }
+
+ public void setCategory(DashboardCategory category) {
+ this.category = category;
+ }
+
+ protected Resource getResource() {
+ return resource;
+ }
+
+ protected void setResource(Resource resource) {
+ this.resource = resource;
+ }
+
+ public ResourceGroup getGroup() {
+ return group;
+ }
+
+ public void setGroup(ResourceGroup group) {
+ this.group = group;
+ }
+
public int getColumns() {
return configuration.getSimple(CFG_COLUMNS).getIntegerValue();
}
@@ -141,7 +183,15 @@ public class Dashboard implements Serializable {
}
public void setColumnWidths(String... columnWidths) {
- configuration.put(new PropertySimple(CFG_WIDTHS, columnWidths));
+ if (null == columnWidths || columnWidths.length == 0) {
+ return;
+ }
+
+ String widths = columnWidths[0];
+ for (int i = 1; i < columnWidths.length; ++i) {
+ widths += ("," + columnWidths[i]);
+ }
+ configuration.put(new PropertySimple(CFG_WIDTHS, widths));
}
public Configuration getConfiguration() {
@@ -158,7 +208,7 @@ public class Dashboard implements Serializable {
public List<DashboardPortlet> getPortlets(int column) {
- List<DashboardPortlet> columnPortlets = new ArrayList<DashboardPortlet>();
+ ArrayList<DashboardPortlet> columnPortlets = new ArrayList<DashboardPortlet>();
for (DashboardPortlet p : this.portlets) {
if (p.getColumn() == column) {
columnPortlets.add(p);
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardCategory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardCategory.java
new file mode 100644
index 0000000..ed4a0ef
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardCategory.java
@@ -0,0 +1,68 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.core.domain.dashboard;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * A Dashboard category.
+ * <pre>
+ * INVENTORY : A dashboard for resources across a user's inventory.
+ * RESOURCE : A dashboard for a specific resource.
+ * GROUP : A dashboard for a specific resource group.
+ * </pre>
+ *
+ * @author Jay Shaughnessy
+ */
+(a)XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement
+public enum DashboardCategory {
+ INVENTORY("Inventory"), RESOURCE("Resource"), GROUP("Group");
+
+ private final String displayName;
+
+ DashboardCategory(String displayName) {
+ this.displayName = displayName;
+ }
+
+ /**
+ * A Java bean style getter to allow us to access the enum name from JSP or Facelets pages (e.g.
+ * ${Resource.resourceType.category.name}).
+ *
+ * @return the enum name
+ */
+ public String getName() {
+ return name();
+ }
+
+ public String getDisplayName() {
+ return this.displayName;
+ }
+
+ @Override
+ public String toString() {
+ return this.displayName;
+ }
+}
\ No newline at end of file
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardPortlet.java b/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardPortlet.java
index a83b061..b2906aa 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardPortlet.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/dashboard/DashboardPortlet.java
@@ -57,7 +57,7 @@ public class DashboardPortlet implements Serializable {
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "RHQ_DASHBOARD_PORTLET_ID_SEQ")
@Id
- private int id;
+ private int id = 0;
// A non-displayed, persisted identifier for the portlet.
@Column(name = "PORTLET_KEY")
@@ -68,10 +68,10 @@ public class DashboardPortlet implements Serializable {
private String name;
@Column(name = "COL")
- private int column;
+ private int column = 0;
@Column(name = "COL_INDEX")
- private int index;
+ private int index = 0;
@Column(name = "HEIGHT")
private int height = 300;
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
index dd14c13..b83f44c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/Resource.java
@@ -68,6 +68,7 @@ import org.rhq.core.domain.content.InstalledPackage;
import org.rhq.core.domain.content.InstalledPackageHistory;
import org.rhq.core.domain.content.Repo;
import org.rhq.core.domain.content.ResourceRepo;
+import org.rhq.core.domain.dashboard.Dashboard;
import org.rhq.core.domain.event.EventSource;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.measurement.MeasurementSchedule;
@@ -1058,6 +1059,10 @@ public class Resource implements Comparable<Resource>, Serializable {
@OneToMany(mappedBy = "autoGroupParentResource", fetch = FetchType.LAZY)
private List<ResourceGroup> autoGroupBackingGroups = null;
+ // When a group is removed any owned dashboards are removed automatically
+ @OneToMany(mappedBy = "resource", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
+ private Set<Dashboard> dashboards = null;
+
public Resource() {
}
@@ -1664,6 +1669,14 @@ public class Resource implements Comparable<Resource>, Serializable {
this.autoGroupBackingGroups = autoGroupBackingGroups;
}
+ protected Set<Dashboard> getDashboards() {
+ return dashboards;
+ }
+
+ protected void setDashboards(Set<Dashboard> dashboards) {
+ this.dashboards = dashboards;
+ }
+
public int compareTo(Resource that) {
return this.name.compareTo(that.getName());
}
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 0a34e0c..58f6b48 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
@@ -59,6 +59,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
+import org.rhq.core.domain.dashboard.Dashboard;
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
@@ -472,6 +473,10 @@ public class ResourceGroup extends Group {
@ManyToMany(mappedBy = "resourceGroups", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
private Set<Tag> tags;
+ // When a group is removed any owned dashboards are removed automatically
+ @OneToMany(mappedBy = "group", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
+ private Set<Dashboard> dashboards = null;
+
/* no-arg constructor required by EJB spec */
protected ResourceGroup() {
}
@@ -719,6 +724,14 @@ public class ResourceGroup extends Group {
}
}
+ protected Set<Dashboard> getDashboards() {
+ return dashboards;
+ }
+
+ protected void setDashboards(Set<Dashboard> dashboards) {
+ this.dashboards = dashboards;
+ }
+
@PrePersist
@PreUpdate
void onPersist() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardContainer.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardContainer.java
new file mode 100644
index 0000000..d072595
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardContainer.java
@@ -0,0 +1,15 @@
+package org.rhq.enterprise.gui.coregui.client.dashboard;
+
+import java.util.Set;
+
+import org.rhq.core.domain.authz.Permission;
+
+public interface DashboardContainer {
+
+ public Set<Permission> getGlobalPermissions();
+
+ public boolean supportsDashboardNameEdit();
+
+ public void updateDashboardNames();
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
index 3520afc..e57484b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
@@ -53,10 +53,9 @@ import org.rhq.core.domain.dashboard.DashboardPortlet;
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.components.form.ColorButtonItem;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.MeasurementUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIMenuButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
@@ -64,11 +63,12 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
+ * @author Jay Shaughnessy
* @author Greg Hinkle
* @author Simeon Pinder
*/
public class DashboardView extends LocatableVLayout {
- private DashboardsView dashboardsView;
+ private DashboardContainer dashboardContainer;
private Dashboard storedDashboard;
boolean editMode = false;
@@ -77,15 +77,15 @@ public class DashboardView extends LocatableVLayout {
LocatableDynamicForm editForm;
IMenuButton addPortlet;
- Set<PortletWindow> portletWindows = new HashSet<PortletWindow>();
+ HashSet<PortletWindow> portletWindows = new HashSet<PortletWindow>();
private static String STOP = MSG.view_dashboards_portlets_refresh_none();
private static String REFRESH1 = MSG.view_dashboards_portlets_refresh_one_min();
private static String REFRESH5 = MSG.view_dashboards_portlets_refresh_multiple_min(String.valueOf(5));
private static String REFRESH10 = MSG.view_dashboards_portlets_refresh_multiple_min(String.valueOf(10));
private static Integer STOP_VALUE = 0;
- private static Integer REFRESH1_VALUE = 1 * Long.valueOf(MeasurementUtility.MINUTES).intValue();
- private static Integer REFRESH5_VALUE = 5 * Long.valueOf(MeasurementUtility.MINUTES).intValue();
- private static Integer REFRESH10_VALUE = 10 * Long.valueOf(MeasurementUtility.MINUTES).intValue();
+ private static Integer REFRESH1_VALUE = 1 * 60000;
+ private static Integer REFRESH5_VALUE = 5 * 60000;
+ private static Integer REFRESH10_VALUE = 10 * 60000;
private HashMap<Integer, String> refreshMenuMappings;
private MenuItem[] refreshMenuItems;
@@ -97,26 +97,33 @@ public class DashboardView extends LocatableVLayout {
// the view is set to a Tab's pane.
private boolean isInitialized = false;
- public DashboardView(String locatorId, DashboardsView dashboardsView, Dashboard storedDashboard) {
+ public DashboardView(String locatorId, DashboardContainer dashboardContainer, Dashboard storedDashboard) {
super(locatorId);
- this.dashboardsView = dashboardsView;
+ this.dashboardContainer = dashboardContainer;
this.storedDashboard = storedDashboard;
- setOverflow(Overflow.AUTO);
- setPadding(5);
}
@Override
protected void onInit() {
-
if (!isInitialized) {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.oninit()", Severity.Info)); // TODO
+
super.onInit();
- addMember(buildEditForm());
+
+ this.setWidth100();
+ this.setHeight100();
+
+ this.addMember(buildEditForm());
+ buildPortlets();
+
isInitialized = true;
}
}
- public void redraw() {
+ public void rebuild() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.rebuild()", Severity.Info)); // TODO
+
// destroy all of the portlets and recreate from scratch
portalLayout.removeFromParent();
portalLayout.destroy();
@@ -125,53 +132,89 @@ public class DashboardView extends LocatableVLayout {
buildPortlets();
}
+ public void redraw() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.redraw()", Severity.Info)); // TODO
+ super.redraw();
+ }
+
+ @Override
+ public void draw() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.draw()", Severity.Info)); // TODO
+ super.draw();
+ }
+
@Override
protected void onDraw() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.onDraw()", Severity.Info)); // TODO
super.onDraw();
- buildPortlets();
+
+ setEditMode(editMode);
}
public void buildPortlets() {
- setWidth100();
- setHeight100();
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildPortlets(1)", Severity.Info)); // TODO
+
+ this.setBackgroundColor(storedDashboard.getConfiguration().getSimpleValue(Dashboard.CFG_BACKGROUND, "white"));
- setBackgroundColor(storedDashboard.getConfiguration().getSimpleValue(Dashboard.CFG_BACKGROUND, "white"));
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildPortlets(2)", Severity.Info)); // TODO
+ portalLayout = new PortalLayout(extendLocatorId("PortalLayout"), this, storedDashboard.getColumns(),
+ storedDashboard.getColumnWidths());
- portalLayout = new PortalLayout(extendLocatorId("PortalLayout"), this, storedDashboard.getColumns());
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildPortlets(3)", Severity.Info)); // TODO
+ portalLayout.setOverflow(Overflow.AUTO);
portalLayout.setWidth100();
portalLayout.setHeight100();
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildPortlets(4)", Severity.Info)); // TODO
+
loadPortletWindows();
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildPortlets(5)", Severity.Info)); // TODO
+
addMember(portalLayout);
+
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildPortlets(6)", Severity.Info)); // TODO
+ }
+
+ protected boolean canEditName() {
+ return true;
}
private DynamicForm buildEditForm() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildEditForm(1)", Severity.Info)); // TODO
+
editForm = new LocatableDynamicForm(extendLocatorId("Editor"));
+ editForm.setMargin(5);
editForm.setAutoWidth();
- editForm.setNumCols(12);
-
- TextItem nameItem = new TextItem("name", MSG.common_title_dashboard_name());
- nameItem.setValue(storedDashboard.getName());
- nameItem.setWrapTitle(false);
- nameItem.addBlurHandler(new BlurHandler() {
- public void onBlur(BlurEvent blurEvent) {
- String val = (String) blurEvent.getItem().getValue();
- val = (null == val) ? "" : val.trim();
- if (!("".equals(val) || val.equals(storedDashboard.getName()))) {
- storedDashboard.setName(val);
- save();
- dashboardsView.updateNames();
+ editForm.setNumCols(canEditName() ? 12 : 10);
+
+ TextItem nameItem = null;
+
+ if (dashboardContainer.supportsDashboardNameEdit()) {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildEditForm(2)", Severity.Info)); // TODO
+
+ nameItem = new TextItem("name", MSG.common_title_dashboard_name());
+ nameItem.setValue(storedDashboard.getName());
+ nameItem.setWrapTitle(false);
+ nameItem.addBlurHandler(new BlurHandler() {
+ public void onBlur(BlurEvent blurEvent) {
+ String val = (String) blurEvent.getItem().getValue();
+ val = (null == val) ? "" : val.trim();
+ if (!("".equals(val) || val.equals(storedDashboard.getName()))) {
+ storedDashboard.setName(val);
+ save();
+ dashboardContainer.updateDashboardNames();
+ }
}
- }
- });
+ });
+ }
final StaticTextItem numColItem = new StaticTextItem();
numColItem.setTitle(MSG.common_title_columns());
numColItem.setValue(storedDashboard.getColumns());
ButtonItem addColumn = new ButtonItem("addColumn", MSG.common_title_add_column());
- // addColumn.setIcon("silk/application_side_expand.png");
+
addColumn.setAutoFit(true);
addColumn.setStartRow(false);
addColumn.setEndRow(false);
@@ -323,29 +366,41 @@ public class DashboardView extends LocatableVLayout {
refreshCanvas.setStartRow(false);
refreshCanvas.setEndRow(false);
- editForm.setItems(nameItem, addCanvas, numColItem, addColumn, removeColumn, picker, refreshCanvas);
+ if (null != nameItem) {
+ editForm.setItems(nameItem, addCanvas, numColItem, addColumn, removeColumn, picker, refreshCanvas);
+ } else {
+ editForm.setItems(addCanvas, numColItem, addColumn, removeColumn, picker, refreshCanvas);
+ }
updateRefreshMenu();
this.refreshMenuButton.markForRedraw();
- markForRedraw();
+ //this.markForRedraw();
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.buildEditForm(2)", Severity.Info)); // TODO
return editForm;
}
private void loadPortletWindows() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.loadPortletWindows(1)", Severity.Info)); // TODO
+
for (int i = 0; i < storedDashboard.getColumns(); i++) {
for (DashboardPortlet storedPortlet : storedDashboard.getPortlets(i)) {
String locatorId = getPortletLocatorId(portalLayout, storedPortlet);
- final PortletWindow portletWindow = new PortletWindow(locatorId, this, storedPortlet);
- portletWindows.add(portletWindow);
- portletWindow.setTitle(storedPortlet.getName());
+ CoreGUI.getMessageCenter().notify(
+ new Message("------->> DashboardView.loadPortletWindows(" + locatorId + ")", Severity.Info)); // TODO
+
+ PortletWindow portletWindow = new PortletWindow(locatorId, this, storedPortlet);
+ portletWindow.setTitle(storedPortlet.getName());
portletWindow.setHeight(storedPortlet.getHeight());
portletWindow.setVisible(true);
+ portletWindows.add(portletWindow);
portalLayout.addPortletWindow(portletWindow, i);
}
}
+
+ CoreGUI.getMessageCenter().notify(new Message("------->> DashboardView.loadPortletWindows(2)", Severity.Info)); // TODO
}
/**
@@ -374,7 +429,7 @@ public class DashboardView extends LocatableVLayout {
return portalLayout.extendLocatorId(locatorId.toString());
}
- private void addPortlet(String portletKey, String portletName) {
+ protected void addPortlet(String portletKey, String portletName) {
DashboardPortlet storedPortlet = new DashboardPortlet(portletName, portletKey, 250);
storedDashboard.addPortlet(storedPortlet);
@@ -420,17 +475,17 @@ public class DashboardView extends LocatableVLayout {
storedDashboard.removePortlet(portlet);
// portlet remove means the portlet locations may have changed. The selenium testing locators include
- // positioning info. So, in this case we have to take the hit and completely redraw the dash.
+ // positioning info. So, in this case we have to take the hit and completely refresh the dash.
AsyncCallback<Dashboard> callback = SeleniumUtility.getUseDefaultIds() ? null : new AsyncCallback<Dashboard>() {
@Override
public void onFailure(Throwable caught) {
- redraw();
+ rebuild();
}
@Override
public void onSuccess(Dashboard result) {
- redraw();
+ rebuild();
}
};
save(callback);
@@ -489,15 +544,16 @@ public class DashboardView extends LocatableVLayout {
}
}
for (PortletWindow portletWindow : portletWindows) {
- for (DashboardPortlet portlet : result.getPortlets()) {
- if (equalsDashboardPortlet(portletWindow.getStoredPortlet(), portlet)) {
- portletWindow.setStoredPortlet(portlet);
+ for (DashboardPortlet updatedPortlet : result.getPortlets()) {
+ if (equalsDashboardPortlet(portletWindow.getStoredPortlet(), updatedPortlet)) {
+ portletWindow.setStoredPortlet(updatedPortlet);
- //restarting portlet auto-refresh with newest settings
+ // restarting portlet auto-refresh with newest settings
Portlet view = portletWindow.getView();
if (view instanceof AutoRefreshPortlet) {
((AutoRefreshPortlet) view).startRefreshCycle();
}
+ break;
}
}
}
@@ -507,35 +563,46 @@ public class DashboardView extends LocatableVLayout {
/**
* This is an enhanced equals for portlets that allows equality for unpersisted portlets. At times (like addPortlet)
* a portlet may have been associated with its window prior to being persisted. In this case we can consider
- * it equal if it is associated with the same dashboard and has the same positioning. Note that key-name pairing
+ * it equal if it is associated with the same dashboard(1) and has the same positioning. Note that key-name pairing
* can not be used for equality as a dashboard is allowed to have the same portlet multiple times, with a default
* name. But they can not hold the same position.
+ * <pre>
+ * (1) Even the dashboard comparison has been made flexible. To allow for lazy persist of the dashboard (to
+ * allow for the default group or resource dashboard to not be persisted) we allow the dash comparison
+ * to be done by name if an entity id is 0. This should be safe as dashboard names are set prior to
+ * persist, and should be unique for the session user.
*
- * @param portlet1
- * @param portlet2
+ * @param storedPortlet
+ * @param updatedPortlet
* @return
*/
- private boolean equalsDashboardPortlet(DashboardPortlet portlet1, DashboardPortlet portlet2) {
+ private boolean equalsDashboardPortlet(DashboardPortlet storedPortlet, DashboardPortlet updatedPortlet) {
- if (portlet1.equals(portlet2)) {
+ if (storedPortlet.equals(updatedPortlet)) {
return true;
}
- // make sure at least one portlet is not persisted
- if (portlet1.getId() > 0 && portlet2.getId() > 0) {
+ // make sure at least one portlet is not persisted for pseudo-equality
+ if (storedPortlet.getId() > 0 && updatedPortlet.getId() > 0) {
return false;
}
- // must match dash and position for psuedo-equality
- if (portlet1.getDashboard().getId() != portlet2.getDashboard().getId()) {
+ // must match position for pseudo-equality
+ if (storedPortlet.getColumn() != updatedPortlet.getColumn()) {
return false;
}
- if (portlet1.getColumn() != portlet2.getColumn()) {
+ if (storedPortlet.getIndex() != updatedPortlet.getIndex()) {
return false;
}
- if (portlet1.getIndex() != portlet2.getIndex()) {
+ // must match dash (ids if persisted, otherwise name) for pseudo-equality
+ boolean unpersistedDash = (storedPortlet.getDashboard().getId() == 0 || updatedPortlet.getDashboard().getId() == 0);
+ boolean dashMatchId = (!unpersistedDash && (storedPortlet.getDashboard().getId() == updatedPortlet
+ .getDashboard().getId()));
+ boolean dashMatchName = (unpersistedDash && storedPortlet.getDashboard().getName().equals(
+ updatedPortlet.getDashboard().getName()));
+ if (!(dashMatchId || dashMatchName)) {
return false;
}
@@ -568,7 +635,7 @@ public class DashboardView extends LocatableVLayout {
}
public Set<Permission> getGlobalPermissions() {
- return dashboardsView.getGlobalPermissions();
+ return dashboardContainer.getGlobalPermissions();
}
public void setEditMode(boolean editMode) {
@@ -578,7 +645,9 @@ public class DashboardView extends LocatableVLayout {
} else {
this.editForm.hide();
}
- markForRedraw();
+ this.editForm.markForRedraw();
+ this.portalLayout.show();
+ this.portalLayout.markForRedraw(); // TODO
}
public class UpdatePortletRefreshCallback implements AsyncCallback<Subject> {
@@ -614,7 +683,8 @@ public class DashboardView extends LocatableVLayout {
retrievedRefreshInterval = UserSessionManager.getUserPreferences().getPageRefreshInterval();
}
String currentSelection = refreshMenuMappings.get(retrievedRefreshInterval);
- if (currentSelection != null) {//iterate over menu items and update icon details
+ if (currentSelection != null) {
+ //iterate over menu items and update icon details
for (int i = 0; i < refreshMenuItems.length; i++) {
MenuItem menu = refreshMenuItems[i];
if (currentSelection.equals(menu.getTitle())) {
@@ -632,4 +702,8 @@ public class DashboardView extends LocatableVLayout {
this.refreshMenuButton.markForRedraw();
}
}
+
+ public Dashboard getStoredDashboard() {
+ return storedDashboard;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
index 9a4970e..f3d1c69 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
@@ -24,6 +24,7 @@ package org.rhq.enterprise.gui.coregui.client.dashboard;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -45,8 +46,11 @@ import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.dashboard.DashboardCategory;
import org.rhq.core.domain.dashboard.DashboardPortlet;
+import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.InitializableView;
@@ -72,9 +76,10 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
+ * @author Jay Shaughnessy
* @author Greg Hinkle
*/
-public class DashboardsView extends LocatableVLayout implements BookmarkableView, InitializableView {
+public class DashboardsView extends LocatableVLayout implements DashboardContainer, BookmarkableView, InitializableView {
public static final ViewName VIEW_ID = new ViewName("Dashboards", MSG.view_dashboards_title());
@@ -100,7 +105,7 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
private DashboardGWTServiceAsync dashboardService = GWTServiceLookup.getDashboardService();
// Capture the user's global permissions for use by any dashboard or portlet that may need it for rendering.
- private Set<Permission> globalPermissions;
+ private HashSet<Permission> globalPermissions;
private boolean initialized = false;
@@ -116,17 +121,18 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
protected void onInit() {
super.onInit();
- dashboardService.findDashboardsForSubject(new AsyncCallback<List<Dashboard>>() {
+ DashboardCriteria criteria = new DashboardCriteria();
+ dashboardService.findDashboardsByCriteria(criteria, new AsyncCallback<PageList<Dashboard>>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_dashboardsManager_error1(), caught);
}
- public void onSuccess(final List<Dashboard> result) {
+ public void onSuccess(final PageList<Dashboard> result) {
// now, a second async call to load global perms
new PermissionsLoader().loadExplicitGlobalPermissions(new PermissionsLoadedListener() {
public void onPermissionsLoaded(Set<Permission> permissions) {
- globalPermissions = permissions;
+ globalPermissions = new HashSet<Permission>(permissions);
if (result.isEmpty()) {
// if the user has no dashboards persist a default dashboard for him to work with. In
@@ -292,8 +298,10 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
Dashboard dashboard = new Dashboard();
dashboard.setName(MSG.common_title_default());
+ dashboard.setCategory(DashboardCategory.INVENTORY);
dashboard.setColumns(2);
- dashboard.setColumnWidths("32%", "68%");
+ // only leftmost column width is currently settable, the rest are equally divided
+ dashboard.setColumnWidths("32%");
dashboard.getConfiguration().put(new PropertySimple(Dashboard.CFG_BACKGROUND, "#F1F2F3"));
// Left Column
@@ -355,10 +363,11 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
}
Dashboard dashboard = new Dashboard();
+ dashboard.setCategory(DashboardCategory.INVENTORY);
dashboard.setName(availableDashboardName);
-
dashboard.setColumns(2);
- dashboard.setColumnWidths("30%", "70%");
+ // only leftmost column width is currently settable, the rest are equally divided
+ dashboard.setColumnWidths("32%");
dashboardService.storeDashboard(dashboard, new AsyncCallback<Dashboard>() {
public void onFailure(Throwable caught) {
@@ -385,13 +394,6 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
});
}
- public void updateNames() {
- for (Tab t : tabSet.getTabs()) {
- DashboardView view = (DashboardView) t.getPane();
- t.setTitle(view.getDashboard().getName());
- }
- }
-
public void renderView(ViewPath viewPath) {
// make sure we have at least a default dashboard tab
if (null == tabSet || 0 == tabSet.getTabs().length) {
@@ -428,8 +430,19 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
return initialized;
}
- public Set<Permission> getGlobalPermissions() {
+ public HashSet<Permission> getGlobalPermissions() {
return globalPermissions;
}
+ public boolean supportsDashboardNameEdit() {
+ return true;
+ }
+
+ public void updateDashboardNames() {
+ for (Tab t : tabSet.getTabs()) {
+ DashboardView view = (DashboardView) t.getPane();
+ t.setTitle(view.getDashboard().getName());
+ }
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java
index 87c3328..9a8b0dd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java
@@ -22,6 +22,8 @@
*/
package org.rhq.enterprise.gui.coregui.client.dashboard;
+import java.util.Arrays;
+
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.EventHandler;
import com.smartgwt.client.widgets.Canvas;
@@ -30,28 +32,43 @@ import com.smartgwt.client.widgets.events.DropHandler;
import org.rhq.core.domain.dashboard.Dashboard;
import org.rhq.core.domain.dashboard.DashboardPortlet;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+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.SeleniumUtility;
/**
* @author Greg Hinkle
+ * @author Jay Shaughnessy
*/
public class PortalLayout extends LocatableHLayout {
private DashboardView dashboardView;
- public PortalLayout(String locatorId, DashboardView dashboardView, int numColumns) {
+ /**
+ * @param locatorId
+ * @param dashboardView
+ * @param numColumns
+ * @param columnWidths Currently only the first column width is set, others are ignored and share the remaining space
+ * evenly. If null column 0 defaults to 30%.
+ */
+ public PortalLayout(String locatorId, DashboardView dashboardView, int numColumns, String[] columnWidths) {
super(locatorId);
- this.dashboardView = dashboardView;
+ CoreGUI.getMessageCenter().notify(
+ new Message("------->> PortalLayout(numColumns=" + numColumns + ",columnWidths="
+ + Arrays.toString(columnWidths) + ")")); // TODO
+ this.dashboardView = dashboardView;
+ setMargin(5);
setMembersMargin(6);
for (int i = 0; i < numColumns; i++) {
final PortalColumn column = new PortalColumn();
- if (i == 0) {
+ if (null != columnWidths && i < columnWidths.length) {
+ column.setWidth(columnWidths[i]);
+ } else if (i == 0) {
column.setWidth("30%");
}
- addMember(column);
final int columnNumber = i;
column.addDropHandler(new DropHandler() {
@@ -85,13 +102,13 @@ public class PortalLayout extends LocatableHLayout {
}
// drop means the portlet location has changed. The selenium testing locators include positioning
- // info. So, in this case we have to take the hit and completely redraw the dash.
+ // info. So, in this case we have to take the hit and completely rebuild the dash.
AsyncCallback<Dashboard> callback = SeleniumUtility.getUseDefaultIds() ? null
: new AsyncCallback<Dashboard>() {
@Override
public void onFailure(Throwable caught) {
- redraw();
+ rebuild();
}
@Override
@@ -103,7 +120,7 @@ public class PortalLayout extends LocatableHLayout {
target.removeFromParent();
target.destroy();
- redraw();
+ rebuild();
}
};
save(callback);
@@ -111,6 +128,9 @@ public class PortalLayout extends LocatableHLayout {
com.allen_sauer.gwt.log.client.Log.info("Rearranged column indexes");
}
});
+
+ CoreGUI.getMessageCenter().notify(new Message("------->> PortalLayout() adding column " + i)); // TODO
+ addMember(column);
}
}
@@ -130,8 +150,8 @@ public class PortalLayout extends LocatableHLayout {
this.dashboardView.save(callback);
}
- public void redraw() {
- this.dashboardView.redraw();
+ public void rebuild() {
+ this.dashboardView.rebuild();
}
public void resize() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletWindow.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletWindow.java
index 664b234..0f76e5b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletWindow.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletWindow.java
@@ -45,6 +45,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
/**
* @author Greg Hinkle
+ * @author Jay Shaughnessy
*/
public class PortletWindow extends LocatableWindow {
@@ -121,17 +122,18 @@ public class PortletWindow extends LocatableWindow {
extendLocatorId("Settings"), HeaderControl.SETTINGS, settingsHandler), new LocatableHeaderControl(
extendLocatorId("Help"), HeaderControl.HELP, helpHandler), HeaderControls.CLOSE_BUTTON);
- // show either a shadow, or translucency, when dragging a portlet
- // (could do both at the same time, but these are not visually compatible effects)
- // setShowDragShadow(true);
- setDragOpacity(30);
-
// enable predefined component animation
setAnimateMinimize(true);
// Window is draggable with "outline" appearance by default.
// "target" is the solid appearance.
+ setCanDrag(true);
setDragAppearance(DragAppearance.TARGET);
+ // show either a shadow, or translucency, when dragging a portlet
+ // (could do both at the same time, but these are not visually compatible effects)
+ // setShowDragShadow(true);
+ setDragOpacity(30);
+ // can be dropped on a column
setCanDrop(true);
setCanDragResize(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DashboardGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DashboardGWTService.java
index f56b97a..5d5efff 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DashboardGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/DashboardGWTService.java
@@ -22,23 +22,20 @@
*/
package org.rhq.enterprise.gui.coregui.client.gwt;
-import java.util.List;
-
import com.google.gwt.user.client.rpc.RemoteService;
+import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.util.PageList;
/**
- * @author Greg Hinkle
+ * @author Jay Shaughnessy
*/
public interface DashboardGWTService extends RemoteService {
- List<Dashboard> findDashboardsForSubject() throws RuntimeException;
-
- List<Dashboard> findSharedDashboards() throws RuntimeException;
+ PageList<Dashboard> findDashboardsByCriteria(DashboardCriteria criteria) throws RuntimeException;
Dashboard storeDashboard(Dashboard dashboard) throws RuntimeException;
void removeDashboard(int dashboardId) throws RuntimeException;
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
index 29c6590..65d4c88 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
@@ -23,7 +23,6 @@
package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail;
import java.util.EnumSet;
-import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.menu.Menu;
@@ -33,6 +32,7 @@ import com.smartgwt.client.widgets.menu.events.ClickHandler;
import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
import org.rhq.core.domain.dashboard.Dashboard;
import org.rhq.core.domain.dashboard.DashboardPortlet;
@@ -265,65 +265,68 @@ public class ResourceGroupContextMenu extends LocatableMenu {
MenuItem measurements = new MenuItem(MSG.view_tree_common_contextMenu_measurements());
final Menu measurementsSubMenu = new Menu();
- GWTServiceLookup.getDashboardService().findDashboardsForSubject(new AsyncCallback<List<Dashboard>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFail_dashboards(), caught);
- }
+ DashboardCriteria criteria = new DashboardCriteria();
+ GWTServiceLookup.getDashboardService().findDashboardsByCriteria(criteria,
+ new AsyncCallback<PageList<Dashboard>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFail_dashboards(),
+ caught);
+ }
- public void onSuccess(List<Dashboard> result) {
-
- if (type.getMetricDefinitions() != null) {
- for (final MeasurementDefinition def : type.getMetricDefinitions()) {
-
- MenuItem defItem = new MenuItem(def.getDisplayName());
- measurementsSubMenu.addItem(defItem);
- Menu defSubItem = new Menu();
- defItem.setSubmenu(defSubItem);
-
- for (final Dashboard d : result) {
- MenuItem addToDBItem = new MenuItem(MSG.view_tree_common_contextMenu_addChartToDashboard(d
- .getName()));
- defSubItem.addItem(addToDBItem);
-
- addToDBItem.addClickHandler(new ClickHandler() {
- public void onClick(MenuItemClickEvent menuItemClickEvent) {
-
- DashboardPortlet p = new DashboardPortlet(def.getDisplayName() + " "
- + MSG.view_tree_common_contextMenu_chart(), GraphPortlet.KEY, 250);
- p.getConfiguration().put(
- new PropertySimple(GraphPortlet.CFG_RESOURCE_GROUP_ID, group.getId()));
- p.getConfiguration().put(
- new PropertySimple(GraphPortlet.CFG_DEFINITION_ID, def.getId()));
-
- d.addPortlet(p);
-
- GWTServiceLookup.getDashboardService().storeDashboard(d,
- new AsyncCallback<Dashboard>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(),
- caught);
- }
-
- public void onSuccess(Dashboard result) {
- String msg = MSG
- .view_tree_common_contextMenu_saveChartToDashboardSuccessful(result
- .getName());
- CoreGUI.getMessageCenter().notify(
- new Message(msg, Message.Severity.Info));
- }
- });
-
- }
- });
+ public void onSuccess(PageList<Dashboard> result) {
- }
+ if (type.getMetricDefinitions() != null) {
+ for (final MeasurementDefinition def : type.getMetricDefinitions()) {
+
+ MenuItem defItem = new MenuItem(def.getDisplayName());
+ measurementsSubMenu.addItem(defItem);
+ Menu defSubItem = new Menu();
+ defItem.setSubmenu(defSubItem);
+
+ for (final Dashboard d : result) {
+ MenuItem addToDBItem = new MenuItem(MSG
+ .view_tree_common_contextMenu_addChartToDashboard(d.getName()));
+ defSubItem.addItem(addToDBItem);
+
+ addToDBItem.addClickHandler(new ClickHandler() {
+ public void onClick(MenuItemClickEvent menuItemClickEvent) {
+
+ DashboardPortlet p = new DashboardPortlet(def.getDisplayName() + " "
+ + MSG.view_tree_common_contextMenu_chart(), GraphPortlet.KEY, 250);
+ p.getConfiguration().put(
+ new PropertySimple(GraphPortlet.CFG_RESOURCE_GROUP_ID, group.getId()));
+ p.getConfiguration().put(
+ new PropertySimple(GraphPortlet.CFG_DEFINITION_ID, def.getId()));
+
+ d.addPortlet(p);
+ GWTServiceLookup.getDashboardService().storeDashboard(d,
+ new AsyncCallback<Dashboard>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(),
+ caught);
+ }
+
+ public void onSuccess(Dashboard result) {
+ String msg = MSG
+ .view_tree_common_contextMenu_saveChartToDashboardSuccessful(result
+ .getName());
+ CoreGUI.getMessageCenter().notify(
+ new Message(msg, Message.Severity.Info));
+ }
+ });
+
+ }
+ });
+
+ }
+
+ }
}
- }
- }
- });
+ }
+ });
measurements.setSubmenu(measurementsSubMenu);
return measurements;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index b42297b..89079ac 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -469,7 +469,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
if ("AutoCluster".equals(viewPath.getCurrent().getPath())) {
super.renderView(viewPath.next());
} else {
- // we are traversing to to the Members subtab. Assume this is happening after a save
+ // if we are traversing to the Members subtab assume this is happening after a save,
// which means the group type and membership may have changed - get it so we refresh everything.
if ((null != this.groupId) && this.inventoryTab.getName().equals(currentTabName)
&& this.inventoryMembers.getName().equals(currentSubTabName)) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView.java
index 8b34662..a240e45 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView.java
@@ -18,22 +18,69 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.summary;
-import com.smartgwt.client.widgets.Label;
+import java.util.Set;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.util.BooleanCallback;
+import com.smartgwt.client.util.SC;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.events.ClickHandler;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.DashboardCriteria;
+import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.dashboard.DashboardCategory;
+import org.rhq.core.domain.dashboard.DashboardPortlet;
+import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
-import org.rhq.enterprise.gui.coregui.client.RefreshableView;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.InitializableView;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoader;
+import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
+import org.rhq.enterprise.gui.coregui.client.dashboard.DashboardContainer;
+import org.rhq.enterprise.gui.coregui.client.dashboard.DashboardView;
+import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.util.MessagePortlet;
+import org.rhq.enterprise.gui.coregui.client.gwt.DashboardGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
+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;
/**
- * The content pane for the group Summary>Activity subtab.
+ * The content pane for the group Summary>Dashboard subtab.
*
- * @author Ian Springer
+ * @author Jay Shaughnessy
*/
-// TODO: Implement this.
-public class ActivityView extends LocatableVLayout implements RefreshableView {
+
+public class ActivityView extends LocatableVLayout implements DashboardContainer, InitializableView {
+
+ private static final String DASHBOARD_NAME_PREFIX = "GroupDashboard_";
private ResourceGroupComposite groupComposite;
+ private DashboardGWTServiceAsync dashboardService = GWTServiceLookup.getDashboardService();
+
+ private DashboardView dashboardView;
+
+ private LocatableToolStrip footer;
+ private IButton editButton;
+ private IButton resetButton;
+
+ // Capture the user's global permissions for use by any dashboard or portlet that may need it for rendering.
+ private Set<Permission> globalPermissions;
+
+ private boolean editMode = false;
+
+ private boolean isInitialized = false;
+
public ActivityView(String locatorId, ResourceGroupComposite groupComposite) {
super(locatorId);
this.groupComposite = groupComposite;
@@ -41,15 +88,206 @@ public class ActivityView extends LocatableVLayout implements RefreshableView {
@Override
protected void onInit() {
- super.onInit();
+ if (!isInitialized()) {
+ CoreGUI.getMessageCenter().notify(new Message("------->> ActivityView.oninit()", Severity.Info)); // TODO
+
+ super.onInit();
+
+ // first async call to get global permissions
+ new PermissionsLoader().loadExplicitGlobalPermissions(new PermissionsLoadedListener() {
+
+ public void onPermissionsLoaded(Set<Permission> permissions) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("------->> ActivityView.oninit( gotGlobalPerms )", Severity.Info)); // TODO
+
+ globalPermissions = permissions;
+
+ // now make async call to look for customized dash for this user and entity
+ DashboardCriteria criteria = new DashboardCriteria();
+ criteria.addFilterCategory(DashboardCategory.GROUP);
+ criteria.addFilterGroupId(groupComposite.getResourceGroup().getId());
+ dashboardService.findDashboardsByCriteria(criteria, new AsyncCallback<PageList<Dashboard>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_dashboardsManager_error1(), caught);
+ }
+
+ public void onSuccess(final PageList<Dashboard> result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("------->> ActivityView.oninit( gotCriteriaResult )", Severity.Info)); // TODO
- Label label = new Label("<h3>Coming soon...</h3>");
- addMember(label);
+ Dashboard dashboard = result.isEmpty() ? getDefaultDashboard() : result.get(0);
+ setDashboard(dashboard);
+
+ isInitialized = true;
+
+ // draw() may be done since onInit finishes asynchronously, if so redraw
+ if (isDrawn()) {
+ markForRedraw();
+ }
+ }
+ });
+ }
+ });
+ }
+ }
+
+ @Override
+ public void draw() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> ActivityView.draw()", Severity.Info)); // TODO
+ super.draw();
+ }
+
+ @Override
+ public void redraw() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> ActivityView.redraw()", Severity.Info)); // TODO
+ super.redraw();
}
@Override
- public void refresh() {
- // TODO: Reload the data.
+ protected void onDraw() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> ActivityView.onDraw()", Severity.Info)); // TODO
+ super.onDraw();
+
+ /*
+ * If we really had something to do here we'd want to wait until the async initialization was really over.
+ *
+ new Timer() {
+ final long startTime = System.currentTimeMillis();
+
+ public void run() {
+ if (isInitialized) {
+ CoreGUI.getMessageCenter().notify(new Message("------->> ActivityView.onDraw( 1 )", Severity.Info)); // TODO
+
+ ActivityView.super.onDraw();
+ if (!dashboardView.isDrawn()) {
+ dashboardView.draw();
+ }
+ if (!dashboardView.isVisible()) {
+ dashboardView.show();
+ }
+ markForRedraw();
+ dashboardView.markForRedraw();
+
+ } else {
+ long elapsedMillis = System.currentTimeMillis() - startTime;
+ if (elapsedMillis < 10000) {
+ CoreGUI.getMessageCenter().notify(
+ new Message("------->> ActivityView.onDraw( 2 )", Severity.Info)); // TODO
+ schedule(100); // Reschedule the timer.
+ } else {
+ // give up and just do the draw()
+ CoreGUI.getMessageCenter().notify(
+ new Message("------->> ActivityView.onDraw( 3 )", Severity.Info)); // TODO
+ ActivityView.super.onDraw();
+
+ }
+ }
+ }
+ }.run(); // fire the timer immediately
+ */
+ }
+
+ private void setDashboard(Dashboard dashboard) {
+ CoreGUI.getMessageCenter().notify(new Message("------->> ActivityView.setDashboard()", Severity.Info)); // TODO
+
+ Canvas[] members = getMembers();
+ removeMembers(members);
+
+ dashboardView = new DashboardView(extendLocatorId(dashboard.getName()), this, dashboard);
+ addMember(dashboardView);
+
+ footer = new LocatableToolStrip(extendLocatorId("Footer"));
+ footer.setPadding(5);
+ footer.setWidth100();
+ footer.setMembersMargin(15);
+
+ editButton = new LocatableIButton(footer.extendLocatorId("Mode"), editMode ? MSG.common_title_view_mode() : MSG
+ .common_title_edit_mode());
+ editButton.setAutoFit(true);
+ editButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ editMode = !editMode;
+ editButton.setTitle(editMode ? MSG.common_title_view_mode() : MSG.common_title_edit_mode());
+ dashboardView.setEditMode(editMode);
+ }
+ });
+
+ resetButton = new LocatableIButton(footer.extendLocatorId("Reset"), MSG.common_button_reset());
+ resetButton.setAutoFit(true);
+ resetButton.addClickHandler(new ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ String message = MSG.view_summaryDashboard_resetConfirm();
+
+ SC.ask(message, new BooleanCallback() {
+ public void execute(Boolean confirmed) {
+ if (confirmed) {
+ dashboardView.delete();
+ setDashboard(getDefaultDashboard());
+ markForRedraw();
+ }
+ }
+ });
+ }
+ });
+
+ footer.addMember(editButton);
+ footer.addMember(resetButton);
+
+ addMember(footer);
+ }
+
+ protected Dashboard getDefaultDashboard() {
+ CoreGUI.getMessageCenter().notify(new Message("------->> ActivityView.getDefaultDashboard", Severity.Info)); // TODO
+
+ Subject sessionSubject = UserSessionManager.getSessionSubject();
+ ResourceGroup group = groupComposite.getResourceGroup();
+
+ Dashboard dashboard = new Dashboard();
+
+ //dashboard.getConfiguration().setProperties(new ArrayList<Property>()); // replace the LinkedHashMap...
+
+ dashboard.setName(DASHBOARD_NAME_PREFIX + sessionSubject.getId() + "_" + group.getId());
+ dashboard.setCategory(DashboardCategory.GROUP);
+ dashboard.setGroup(group);
+ dashboard.setColumns(2);
+
+ // TODO, add real portlets
+ // set leftmost column and letthe rest be equally divided
+ dashboard.setColumnWidths("40%");
+ dashboard.getConfiguration().put(new PropertySimple(Dashboard.CFG_BACKGROUND, "#F1F2F3"));
+
+ // Left Column
+ DashboardPortlet dummyLeft = new DashboardPortlet(MessagePortlet.NAME, MessagePortlet.KEY, 220);
+ dummyLeft.getConfiguration().put(new PropertySimple("message", "<br/>Coming Soon... :-)"));
+ dashboard.addPortlet(dummyLeft, 0, 0);
+
+ // right Column
+ DashboardPortlet dummyRight = new DashboardPortlet(MessagePortlet.NAME, MessagePortlet.KEY, 220);
+ dummyRight.getConfiguration().put(new PropertySimple("message", "<br/>Coming Soon... :-)"));
+ dashboard.addPortlet(dummyRight, 1, 0);
+
+ return dashboard;
+ }
+
+ @Override
+ public boolean isInitialized() {
+ return isInitialized;
+ }
+
+ public Set<Permission> getGlobalPermissions() {
+ return globalPermissions;
+ }
+
+ /**
+ * name update not supported because the name is derived from the entity id.
+ * @return
+ */
+ public boolean supportsDashboardNameEdit() {
+ return false;
+ }
+
+ public void updateDashboardNames() {
+ return;
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
index 24ccac1..98e5755 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
@@ -51,6 +51,7 @@ import com.smartgwt.client.widgets.tree.events.NodeContextClickEvent;
import com.smartgwt.client.widgets.tree.events.NodeContextClickHandler;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
import org.rhq.core.domain.criteria.ResourceTypeCriteria;
@@ -522,60 +523,67 @@ public class ResourceTreeView extends LocatableVLayout {
MenuItem measurements = new MenuItem(MSG.view_tree_common_contextMenu_measurements());
final Menu measurementsSubMenu = new Menu();
- GWTServiceLookup.getDashboardService().findDashboardsForSubject(new AsyncCallback<List<Dashboard>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFailed_dashboard(), caught);
- }
+ DashboardCriteria criteria = new DashboardCriteria();
+ GWTServiceLookup.getDashboardService().findDashboardsByCriteria(criteria,
+ new AsyncCallback<PageList<Dashboard>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFailed_dashboard(),
+ caught);
+ }
- public void onSuccess(List<Dashboard> result) {
-
- for (final MeasurementDefinition def : type.getMetricDefinitions()) {
-
- MenuItem defItem = new MenuItem(def.getDisplayName());
- measurementsSubMenu.addItem(defItem);
- Menu defSubItem = new Menu();
- defItem.setSubmenu(defSubItem);
-
- for (final Dashboard d : result) {
- MenuItem addToDBItem = new MenuItem(MSG.view_tree_common_contextMenu_addChartToDashboard(d
- .getName()));
- defSubItem.addItem(addToDBItem);
-
- addToDBItem.addClickHandler(new ClickHandler() {
- public void onClick(MenuItemClickEvent menuItemClickEvent) {
- DashboardPortlet p = new DashboardPortlet(def.getDisplayName() + " Chart",
- GraphPortlet.KEY, 250);
- p.getConfiguration().put(
- new PropertySimple(GraphPortlet.CFG_RESOURCE_ID, resource.getId()));
- p.getConfiguration().put(
- new PropertySimple(GraphPortlet.CFG_DEFINITION_ID, def.getId()));
-
- d.addPortlet(p);
-
- GWTServiceLookup.getDashboardService().storeDashboard(d,
- new AsyncCallback<Dashboard>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(), caught);
- }
-
- public void onSuccess(Dashboard result) {
- CoreGUI.getMessageCenter().notify(
- new Message(MSG
- .view_tree_common_contextMenu_saveChartToDashboardSuccessful(result
- .getName()), Message.Severity.Info));
- }
- });
+ public void onSuccess(PageList<Dashboard> result) {
+
+ for (final MeasurementDefinition def : type.getMetricDefinitions()) {
+
+ MenuItem defItem = new MenuItem(def.getDisplayName());
+ measurementsSubMenu.addItem(defItem);
+ Menu defSubItem = new Menu();
+ defItem.setSubmenu(defSubItem);
+
+ for (final Dashboard d : result) {
+ MenuItem addToDBItem = new MenuItem(MSG.view_tree_common_contextMenu_addChartToDashboard(d
+ .getName()));
+ defSubItem.addItem(addToDBItem);
+
+ addToDBItem.addClickHandler(new ClickHandler() {
+ public void onClick(MenuItemClickEvent menuItemClickEvent) {
+ DashboardPortlet p = new DashboardPortlet(def.getDisplayName() + " Chart",
+ GraphPortlet.KEY, 250);
+ p.getConfiguration().put(
+ new PropertySimple(GraphPortlet.CFG_RESOURCE_ID, resource.getId()));
+ p.getConfiguration().put(
+ new PropertySimple(GraphPortlet.CFG_DEFINITION_ID, def.getId()));
+
+ d.addPortlet(p);
+
+ GWTServiceLookup.getDashboardService().storeDashboard(d,
+ new AsyncCallback<Dashboard>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(),
+ caught);
+ }
+
+ public void onSuccess(Dashboard result) {
+ CoreGUI
+ .getMessageCenter()
+ .notify(
+ new Message(
+ MSG
+ .view_tree_common_contextMenu_saveChartToDashboardSuccessful(result
+ .getName()), Message.Severity.Info));
+ }
+ });
- }
- });
+ }
+ });
+
+ }
}
}
-
- }
- });
+ });
measurements.setSubmenu(measurementsSubMenu);
return measurements;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DashboardGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DashboardGWTServiceImpl.java
index c45ca10..3aa0910 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DashboardGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/DashboardGWTServiceImpl.java
@@ -22,9 +22,9 @@
*/
package org.rhq.enterprise.gui.coregui.server.gwt;
-import java.util.List;
-
+import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.util.PageList;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.gui.coregui.client.gwt.DashboardGWTService;
import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
@@ -40,19 +40,10 @@ public class DashboardGWTServiceImpl extends AbstractGWTServiceImpl implements D
private DashboardManagerLocal dashboardManager = LookupUtil.getDashboardManagerLocal();
- public List<Dashboard> findDashboardsForSubject() throws RuntimeException {
- try {
- return SerialUtility.prepare(dashboardManager.findDashboardsForSubject(getSessionSubject()),
- "DashboardManager.findDashboardsForSubject");
- } catch (Throwable t) {
- throw new RuntimeException(ThrowableUtil.getAllMessages(t));
- }
- }
-
- public List<Dashboard> findSharedDashboards() throws RuntimeException {
+ public PageList<Dashboard> findDashboardsByCriteria(DashboardCriteria criteria) throws RuntimeException {
try {
- return SerialUtility.prepare(dashboardManager.findSharedDashboards(getSessionSubject()),
- "DashboardManager.findSharedDashboards");
+ return SerialUtility.prepare(dashboardManager.findDashboardsByCriteria(getSessionSubject(), criteria),
+ "DashboardManager.findDashboardsByCriteria");
} catch (Throwable t) {
throw new RuntimeException(ThrowableUtil.getAllMessages(t));
}
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 2d4f866..940b293 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
@@ -1859,6 +1859,10 @@ view_summaryOverviewForm_message_descriptionChangeSuccess = Description of Resou
view_summaryOverviewForm_error_locationChangeFailure = Failed to change location of Resource with id {0} from [{1}] to [{2}].
view_summaryOverviewForm_message_locationChangeSuccess = Location of Resource with id {0} was changed from [{1}] to [{2}].
+# Summary Dashboard
+#-----------------------------
+view_summaryDashboard_resetConfirm = Reset to default summary dashboard (lose local changes)?
+
# Group Inventory>Members subtab
#-----------------------------------------
view_groupInventoryMembers_button_updateMembership = Update Membership...
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerBean.java
index db4c6b6..c4a007e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerBean.java
@@ -22,31 +22,33 @@
*/
package org.rhq.enterprise.server.dashboard;
-import java.util.List;
-
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.dashboard.DashboardCategory;
+import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.auth.SubjectManagerBean;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
+import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
+import org.rhq.enterprise.server.util.CriteriaQueryRunner;
/**
- *
+ * @author Jay Shaughnessy
* @author Greg Hinkle
*/
@Stateless
-public class DashboardManagerBean implements DashboardManagerLocal, DashboardManagerRemote{
+public class DashboardManagerBean implements DashboardManagerLocal, DashboardManagerRemote {
@SuppressWarnings("unused")
private final Log log = LogFactory.getLog(SubjectManagerBean.class);
@@ -57,20 +59,30 @@ public class DashboardManagerBean implements DashboardManagerLocal, DashboardMan
@EJB
private AuthorizationManagerLocal authorizationManager;
+ public PageList<Dashboard> findDashboardsByCriteria(Subject subject, DashboardCriteria criteria) {
+ if (criteria.isInventoryManagerRequired()) {
+ if (!authorizationManager.isInventoryManager(subject)) {
+ throw new PermissionException("Subject [" + subject.getName()
+ + "] requires InventoryManager permission for requested query criteria.");
+ }
- public List<Dashboard> findDashboardsForSubject(Subject subject) {
- Query query = entityManager.createQuery("SELECT d FROM Dashboard d WHERE d.owner.id = :subjectId");
-
- query.setParameter("subjectId", subject.getId());
-
- return query.getResultList();
+ Integer ownerId = criteria.getFilterOwnerId();
+ if (null != ownerId && 0 == ownerId.intValue()) {
+ criteria.addFilterOwnerId(null);
+ }
+ } else {
+ criteria.addFilterOwnerId(subject.getId());
+ }
- }
+ if (null == criteria.getFilterCategory()) {
+ criteria.addFilterCategory(DashboardCategory.INVENTORY);
+ }
- public List<Dashboard> findSharedDashboards(Subject subject) {
- Query query = entityManager.createQuery("SELECT d FROM Dashboard d WHERE d.shared = true");
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
- return query.getResultList();
+ CriteriaQueryRunner<Dashboard> queryRunner = new CriteriaQueryRunner<Dashboard>(criteria, generator,
+ entityManager);
+ return queryRunner.execute();
}
public Dashboard storeDashboard(Subject subject, Dashboard dashboard) {
@@ -80,7 +92,8 @@ public class DashboardManagerBean implements DashboardManagerLocal, DashboardMan
entityManager.persist(dashboard);
return dashboard;
} else {
- if (!authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_SETTINGS) && d.getOwner().getId() != subject.getId()) {
+ if (!authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_SETTINGS)
+ && d.getOwner().getId() != subject.getId()) {
throw new PermissionException("You may only alter dashboards you own.");
}
return entityManager.merge(dashboard);
@@ -89,9 +102,10 @@ public class DashboardManagerBean implements DashboardManagerLocal, DashboardMan
public void removeDashboard(Subject subject, int dashboardId) {
- Dashboard toDelete = entityManager.find(Dashboard.class,dashboardId);
+ Dashboard toDelete = entityManager.find(Dashboard.class, dashboardId);
- if (!authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_SETTINGS) && toDelete.getOwner().getId() != subject.getId()) {
+ if (!authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_SETTINGS)
+ && toDelete.getOwner().getId() != subject.getId()) {
throw new PermissionException("You may only delete dashboards you own.");
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerLocal.java
index c915e5b..9a03ecb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerLocal.java
@@ -25,7 +25,7 @@ package org.rhq.enterprise.server.dashboard;
import javax.ejb.Local;
/**
- * @author Greg Hinkle
+ * @author Jay Shaughnessy
*/
@Local
public interface DashboardManagerLocal extends DashboardManagerRemote {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerRemote.java
index c51a9a5..2e42293 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/dashboard/DashboardManagerRemote.java
@@ -22,29 +22,22 @@
*/
package org.rhq.enterprise.server.dashboard;
-import java.util.List;
-import java.util.Set;
-
import javax.ejb.Remote;
import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.criteria.DashboardCriteria;
import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.util.PageList;
/**
- * @author Greg Hinkle
+ * @author Jay Shaughnessy
*/
@Remote
public interface DashboardManagerRemote {
-
- public List<Dashboard> findDashboardsForSubject(Subject subject);
-
- public List<Dashboard> findSharedDashboards(Subject subject);
+ public PageList<Dashboard> findDashboardsByCriteria(Subject subject, DashboardCriteria criteria);
public Dashboard storeDashboard(Subject subject, Dashboard dashboard);
public void removeDashboard(Subject subject, int dashboardId);
-
-
-
}
13 years, 3 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java | 8 ++++++++
1 file changed, 8 insertions(+)
New commits:
commit adbe97386a3046eef0a1e0d79765ca73050e7ecc
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Feb 25 09:57:29 2011 -0500
part of BZ 680167 - this illustrates how to fix this RefreshableView bug for those views that have this bug.
just track whether you are currently refreshing, if you are, abort the current call to refresh()
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
index 862c8c4..c924352 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/configuration/GroupResourceConfigurationEditView.java
@@ -72,6 +72,8 @@ public class GroupResourceConfigurationEditView extends LocatableVLayout impleme
private ConfigurationEditor editor;
private IButton saveButton;
+ private boolean refreshing = false;
+
public GroupResourceConfigurationEditView(String locatorId, ResourceGroupComposite groupComposite) {
super(locatorId);
@@ -110,6 +112,11 @@ public class GroupResourceConfigurationEditView extends LocatableVLayout impleme
@Override
public void refresh() {
+ if (this.refreshing) {
+ return; // we are already in the process of refreshing, don't do it again
+ }
+
+ this.refreshing = true;
this.saveButton.disable();
if (editor != null) {
editor.destroy();
@@ -129,6 +136,7 @@ public class GroupResourceConfigurationEditView extends LocatableVLayout impleme
this.editor.addPropertyValueChangeListener(this);
this.editor.setReadOnly(!this.resourcePermission.isConfigureWrite());
addMember(this.editor);
+ this.refreshing = false; // when we get here, we know we are done the refresh
}
}
13 years, 3 months
[rhq] 3 commits - modules/core modules/enterprise
by Simeon Pinder
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GroupBundleDeploymentCriteria.java | 55 ++
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageHistoryCriteria.java | 110 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ContentGWTService.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java | 33 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java | 216 +++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java | 55 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java | 14
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java | 28 +
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerLocal.java | 11
12 files changed, 451 insertions(+), 85 deletions(-)
New commits:
commit 9a26c11106e6a100e22da87d691f412832253cf7
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Feb 25 08:25:07 2011 -0500
enable 'see more...' links for Resource/Group Activity pages where applicable.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java
index 2cdc766..13abdd5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java
@@ -27,6 +27,7 @@ import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
@@ -73,6 +74,7 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
protected String RECENT_PKG_HISTORY_NONE = MSG.view_resource_inventory_activity_no_recent_pkg_history();
protected String RECENT_BUNDLE_DEPLOY = MSG.common_title_recent_bundle_deployments();
protected String RECENT_BUNDLE_DEPLOY_NONE = MSG.view_resource_inventory_activity_no_recent_bundle_deploy();
+ protected String SEE_MORE = MSG.common_msg_see_more();
private ResourceGroupComposite groupComposite = null;
@@ -109,6 +111,7 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
leftPane.setMembersMargin(5);
leftPane.setAutoHeight();
+ Resource resource = null;
ResourceGroup group = null;
if (groupComposite != null) {
group = groupComposite.getResourceGroup();
@@ -173,7 +176,9 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
}
HLayout recentBundleDeployTitle = new TitleWithIcon("subsystems/content/Content_24.png", RECENT_BUNDLE_DEPLOY);
- if (((group != null) && (group.getGroupCategory().equals(GroupCategory.COMPATIBLE)))) {//resource,CompatibleGroup
+ // if (resource.type==Platform) || (Group(Mixed/Compat) of Platforms)
+ // if ((group == null)&&())||((group != null) && (group.getGroupCategory().equals(GroupCategory.COMPATIBLE)))) {
+ if (((group != null) && (group.getGroupCategory().equals(GroupCategory.COMPATIBLE)))) {
rightPane.addMember(divider6);
rightPane.addMember(recentBundleDeployTitle);
rightPane.addMember(recentBundleDeployContent);
@@ -302,4 +307,19 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
return item;
}
+ /** Generates a "See more.." link item, using the locatable dynamic form passed in and appends to the VLayout passed in.
+ *
+ * @param form
+ * @param linkDestination
+ * @param column
+ */
+ protected void addSeeMoreLink(LocatableDynamicForm form, String linkDestination, VLayout column) {
+ if ((form != null) && (column != null)) {
+ form.setNumCols(1);
+ LinkItem link = newLinkItem(SEE_MORE, linkDestination);
+ form.setItems(link);
+ column.addMember(form);
+ }
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
index bacbb8d..a7c1b4f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
@@ -57,7 +57,6 @@ import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.summary.AbstractActivityView;
import org.rhq.enterprise.gui.coregui.client.resource.disambiguation.ReportDecorator;
@@ -132,14 +131,17 @@ public class ActivityView2 extends AbstractActivityView {
StaticTextItem iconItem = newTextItemIcon(ImageManager.getAlertIcon(alert.getAlertDefinition()
.getPriority()), alert.getAlertDefinition().getPriority().getDisplayName());
- LinkItem link = newLinkItem(alert.getAlertDefinition().getName() + ": ", LinkManager
- .getResourceGroupLink(groupId)
- + "/Alerts/History/" + alert.getId());
+ LinkItem link = newLinkItem(alert.getAlertDefinition().getName() + ": ",
+ ReportDecorator.GWT_GROUP_URL + groupId + "/Alerts/History/" + alert.getId());
StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(alert.getCtime()));
row.setItems(iconItem, link, time);
column.addMember(row);
}
+ //link to more details
+ LocatableDynamicForm row = new LocatableDynamicForm(recentAlertsContent.extendLocatorId(String
+ .valueOf(rowNum++)));
+ addSeeMoreLink(row, ReportDecorator.GWT_GROUP_URL + groupId + "/Alerts/History/", column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentAlertsContent.extendLocatorId("None"),
RECENT_ALERTS_NONE);
@@ -206,6 +208,10 @@ public class ActivityView2 extends AbstractActivityView {
column.addMember(row);
}
+ //insert see more link
+ LocatableDynamicForm row = new LocatableDynamicForm(recentOperationsContent
+ .extendLocatorId(String.valueOf(rowNum)));
+ addSeeMoreLink(row, ReportDecorator.GWT_GROUP_URL + groupId + "/Operations/History/", column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentOperationsContent
.extendLocatorId("None"), RECENT_OPERATIONS_NONE);
@@ -271,6 +277,10 @@ public class ActivityView2 extends AbstractActivityView {
row.setItems(iconItem, link, time);
column.addMember(row);
}
+ //insert see more link
+ LocatableDynamicForm row = new LocatableDynamicForm(recentConfigurationContent
+ .extendLocatorId(String.valueOf(rowNum)));
+ addSeeMoreLink(row, ReportDecorator.GWT_GROUP_URL + groupId + "/Configuration/History/", column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentConfigurationContent
.extendLocatorId("None"), RECENT_CONFIGURATIONS_NONE);
@@ -337,6 +347,10 @@ public class ActivityView2 extends AbstractActivityView {
column.addMember(row);
}
+ //insert see more link
+ LocatableDynamicForm row = new LocatableDynamicForm(recentEventsContent.extendLocatorId(String
+ .valueOf(rowNum)));
+ addSeeMoreLink(row, ReportDecorator.GWT_GROUP_URL + groupId + "/Events/History/", column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentEventsContent.extendLocatorId("None"),
RECENT_EVENTS_NONE);
@@ -385,6 +399,7 @@ public class ActivityView2 extends AbstractActivityView {
row.setItems(link, time);
column.addMember(row);
}
+ //insert see more link spinder(2/24/11): no page that displays all oobs... See More not possible.
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentOobContent.extendLocatorId("None"),
RECENT_OOB_NONE);
@@ -440,6 +455,11 @@ public class ActivityView2 extends AbstractActivityView {
row.setItems(iconItem, link, time);
column.addMember(row);
}
+ // //insert see more link
+ // LocatableDynamicForm row = new LocatableDynamicForm(recentPkgHistoryContent
+ // .extendLocatorId("PkgHistoryContentSeeMore"));
+ // String destination = "/rhq/resource/content/audit-trail-item.xhtml?id=" + groupId;
+ // addSeeMoreLink(row, destination, column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentPkgHistoryContent.extendLocatorId("None"),
RECENT_PKG_HISTORY_NONE);
@@ -576,6 +596,11 @@ public class ActivityView2 extends AbstractActivityView {
LocatableDynamicForm row = createEmptyDisplayRow(recentMeasurementsContent
.extendLocatorId("None"), RECENT_MEASUREMENTS_NONE);
column.addMember(row);
+ } else {
+ //insert see more link
+ LocatableDynamicForm row = new LocatableDynamicForm(recentMeasurementsContent
+ .extendLocatorId("RecentMeasurementsContentSeeMore"));
+ addSeeMoreLink(row, ReportDecorator.GWT_GROUP_URL + groupId + "/Monitoring/Graphs/", column);
}
//call out to 3rd party javascript lib
BrowserUtility.graphSparkLines();
@@ -639,6 +664,10 @@ public class ActivityView2 extends AbstractActivityView {
row.setItems(iconItem, link, time);
column.addMember(row);
}
+ //insert see more link
+ //TODO: spinder(add this later) no current view for seeing all bundle deployments
+ // LocatableDynamicForm row = new LocatableDynamicForm(recentBundleDeployContent.extendLocatorId("RecentBundleContentSeeMore"));
+ // addSeeMoreLink(row, LinkManager.getResourceGroupLink(groupId) + "/Events/History/", column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentBundleDeployContent
.extendLocatorId("None"), RECENT_BUNDLE_DEPLOY_NONE);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java
index 46bb87b..452d85c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java
@@ -51,13 +51,13 @@ import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.summary.AbstractActivityView;
import org.rhq.enterprise.gui.coregui.client.resource.disambiguation.ReportDecorator;
import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
import org.rhq.enterprise.gui.coregui.client.util.GwtRelativeDurationConverter;
import org.rhq.enterprise.gui.coregui.client.util.GwtTuple;
-import org.rhq.enterprise.gui.coregui.client.util.measurement.GwtMonitorUtils;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/**
@@ -121,6 +121,10 @@ public class ActivityView extends AbstractActivityView {
column.addMember(row);
}
+ //link to more details
+ LocatableDynamicForm row = new LocatableDynamicForm(recentAlertsContent.extendLocatorId(String
+ .valueOf(rowNum++)));
+ addSeeMoreLink(row, ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Alerts/History/", column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentAlertsContent.extendLocatorId("None"),
RECENT_ALERTS_NONE);
@@ -173,15 +177,20 @@ public class ActivityView extends AbstractActivityView {
StaticTextItem iconItem = newTextItemIcon(ImageManager.getOperationResultsIcon(report
.getOriginal().getOperationStatus()), report.getOriginal().getOperationStatus()
.getDisplayName());
- LinkItem link = newLinkItem(report.getOriginal().getOperationName() + ": ",
- ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Operations/History/"
- + report.getOriginal().getOperationHistoryId());
+ LinkItem link = newLinkItem(report.getOriginal().getOperationName() + ": ", LinkManager
+ .getResourceLink(resourceId)
+ + "/Operations/History/" + report.getOriginal().getOperationHistoryId());
StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(report.getOriginal()
.getOperationStartTime()));
row.setItems(iconItem, link, time);
column.addMember(row);
}
+ //link to more details
+ LocatableDynamicForm row = new LocatableDynamicForm(recentOperationsContent
+ .extendLocatorId(String.valueOf(rowNum++)));
+ addSeeMoreLink(row, ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Operations/History/",
+ column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentOperationsContent
.extendLocatorId("None"), RECENT_OPERATIONS_NONE);
@@ -234,7 +243,7 @@ public class ActivityView extends AbstractActivityView {
if ((update.getSubjectName() == null) || (update.getSubjectName().trim().isEmpty())) {
linkTitle = MSG.common_msg_changeAutoDetected();
}
- LinkItem link = newLinkItem(linkTitle, ReportDecorator.GWT_RESOURCE_URL + resourceId
+ LinkItem link = newLinkItem(linkTitle, LinkManager.getResourceLink(resourceId)
+ "/Configuration/History/" + update.getId());
StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(update
.getCreatedTime()));
@@ -242,6 +251,11 @@ public class ActivityView extends AbstractActivityView {
row.setItems(iconItem, link, time);
column.addMember(row);
}
+ //link to more details
+ LocatableDynamicForm row = new LocatableDynamicForm(recentConfigurationContent
+ .extendLocatorId(String.valueOf(rowNum++)));
+ addSeeMoreLink(row, ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Configuration/History/",
+ column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentConfigurationContent
.extendLocatorId("None"), RECENT_CONFIGURATIONS_NONE);
@@ -308,6 +322,9 @@ public class ActivityView extends AbstractActivityView {
column.addMember(row);
}
+ LocatableDynamicForm row = new LocatableDynamicForm(recentEventsContent.extendLocatorId(String
+ .valueOf(rowNum++)));
+ addSeeMoreLink(row, ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Events/History/", column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentEventsContent.extendLocatorId("None"),
RECENT_EVENTS_NONE);
@@ -409,6 +426,11 @@ public class ActivityView extends AbstractActivityView {
row.setItems(iconItem, link, time);
column.addMember(row);
}
+ // //insert see more link
+ // LocatableDynamicForm row = new LocatableDynamicForm(recentPkgHistoryContent
+ // .extendLocatorId("RecentPkgHistorySeeMore"));
+ // String destination = "/rhq/resource/content/audit-trail-item.xhtml?id=" + resourceId;
+ // addSeeMoreLink(row, destination, column);
} else {
LocatableDynamicForm row = createEmptyDisplayRow(recentPkgHistoryContent
.extendLocatorId("None"), RECENT_PKG_HISTORY_NONE);
@@ -543,6 +565,12 @@ public class ActivityView extends AbstractActivityView {
LocatableDynamicForm row = createEmptyDisplayRow(recentMeasurementsContent
.extendLocatorId("None"), RECENT_MEASUREMENTS_NONE);
column.addMember(row);
+ } else {
+ //insert see more link
+ LocatableDynamicForm row = new LocatableDynamicForm(recentMeasurementsContent
+ .extendLocatorId("RecentMeasurementsContentSeeMore"));
+ addSeeMoreLink(row, ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Monitoring/Graphs/",
+ column);
}
//call out to 3rd party javascript lib
BrowserUtility.graphSparkLines();
@@ -561,21 +589,4 @@ public class ActivityView extends AbstractActivityView {
recentMeasurementsContent.addChild(column);
recentMeasurementsContent.markForRedraw();
}
-
- /** Takes last double value returned and the relevant MeasurementDefinition and formats
- * the results for display in the UI. 'Formatting' refers to relevant rounding,
- * number format for significant digits depending upon the measurement definition
- * details.
- *
- * @param lastValue
- * @param md MeasurementDefinition
- * @return formatted String representation of the last value retrieved.
- */
- protected String convertLastValueForDisplay(double lastValue, MeasurementDefinition md) {
- String convertedValue = "";
- String[] convertedValues = GwtMonitorUtils.formatSimpleMetrics(new double[] { lastValue }, md);
- convertedValue = convertedValues[0];
-
- return convertedValue;
- }
}
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 33d344c..2d4f866 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
@@ -193,6 +193,7 @@ common_msg_emphasizedNotePrefix = NOTE:
common_msg_loading = Loading...
common_msg_noItemsToShow = No items to show
common_msg_notYetImplemented = Not Yet Implemented
+common_msg_see_more = see more...
# Common Values
#--------------
commit 6fd55ba202029187ee76b3a81a7e96b60c2ba2b4
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Thu Feb 24 13:57:12 2011 -0500
enable Bundles view for Group Activity page. Include new criteria.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
index 9e613c6..3ad25b8 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/BundleDeploymentCriteria.java
@@ -25,6 +25,7 @@ import javax.xml.bind.annotation.XmlRootElement;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentStatus;
+import org.rhq.core.domain.util.PageOrdering;
/**
* @author Jay Shaughnessy
@@ -44,6 +45,7 @@ public class BundleDeploymentCriteria extends TaggedCriteria {
private Integer filterDestinationId; // needs override
private String filterDestinationName; // needs override
private BundleDeploymentStatus filterStatus;
+ private PageOrdering sortStatus;
private String filterSubjectName;
private boolean fetchBundleVersion;
@@ -124,4 +126,9 @@ public class BundleDeploymentCriteria extends TaggedCriteria {
this.fetchResourceDeployments = fetchResourceDeployments;
}
+ public void addSortStatus(PageOrdering sortStatus) {
+ addSortField("sort");
+ this.sortStatus = sortStatus;
+ }
+
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GroupBundleDeploymentCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GroupBundleDeploymentCriteria.java
new file mode 100644
index 0000000..4678483
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/GroupBundleDeploymentCriteria.java
@@ -0,0 +1,55 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2009 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+package org.rhq.core.domain.criteria;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Simeon Pinder
+ */
+@XmlRootElement
+(a)XmlAccessorType(XmlAccessType.FIELD)
+@SuppressWarnings("unused")
+public class GroupBundleDeploymentCriteria extends BundleDeploymentCriteria {
+ private static final long serialVersionUID = 1L;
+
+ private List<Integer> filterResourceGroupIds; // requires overrides
+
+ public GroupBundleDeploymentCriteria() {
+ filterOverrides.put("resourceGroupIds", "destination.group.id IN " //
+ + "( SELECT rg.id " //
+ + " FROM ResourceGroup rg " //
+ + " JOIN rg.bundleDestinations bds " //
+ + " WHERE rg.id = ? )");
+ }
+
+ public void addFilterResourceGroupIds(Integer... filterResourceGroupIds) {
+ this.filterResourceGroupIds = Arrays.asList(filterResourceGroupIds);
+ }
+
+ public List<Integer> getFilterGroupIds() {
+ return filterResourceGroupIds;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java
index 5d06ee1..2cdc766 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/summary/AbstractActivityView.java
@@ -54,6 +54,7 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
protected LocatableCanvas recentOperationsContent = new LocatableCanvas(extendLocatorId("RecentOperations"));
protected LocatableCanvas recentEventsContent = new LocatableCanvas(extendLocatorId("RecentEvents"));
protected LocatableCanvas recentPkgHistoryContent = new LocatableCanvas(extendLocatorId("RecentPkgHistory"));
+ protected LocatableCanvas recentBundleDeployContent = new LocatableCanvas(extendLocatorId("RecentBundleDeploy"));
//retrieve localized text
protected String RECENT_MEASUREMENTS = MSG.common_title_recent_measurements();
@@ -70,6 +71,8 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
protected String RECENT_EVENTS_NONE = MSG.view_resource_inventory_activity_no_recent_events();
protected String RECENT_PKG_HISTORY = MSG.common_title_recent_pkg_history();
protected String RECENT_PKG_HISTORY_NONE = MSG.view_resource_inventory_activity_no_recent_pkg_history();
+ protected String RECENT_BUNDLE_DEPLOY = MSG.common_title_recent_bundle_deployments();
+ protected String RECENT_BUNDLE_DEPLOY_NONE = MSG.view_resource_inventory_activity_no_recent_bundle_deploy();
private ResourceGroupComposite groupComposite = null;
@@ -92,11 +95,13 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
HTMLFlow divider3 = new HTMLFlow("<hr/>");
HTMLFlow divider4 = new HTMLFlow("<hr/>");
HTMLFlow divider5 = new HTMLFlow("<hr/>");
+ HTMLFlow divider6 = new HTMLFlow("<hr/>");
divider1.setWidth("50%");
divider2.setWidth("50%");
divider3.setWidth("50%");
divider4.setWidth("50%");
divider5.setWidth("50%");
+ divider6.setWidth("50%");
//leftPane
leftPane.setWidth("50%");
@@ -167,6 +172,14 @@ public abstract class AbstractActivityView extends LocatableHLayout implements R
recentPkgHistoryContent.setHeight(20);
}
+ HLayout recentBundleDeployTitle = new TitleWithIcon("subsystems/content/Content_24.png", RECENT_BUNDLE_DEPLOY);
+ if (((group != null) && (group.getGroupCategory().equals(GroupCategory.COMPATIBLE)))) {//resource,CompatibleGroup
+ rightPane.addMember(divider6);
+ rightPane.addMember(recentBundleDeployTitle);
+ rightPane.addMember(recentBundleDeployContent);
+ recentBundleDeployTitle.setHeight(20);
+ }
+
addMember(leftPane);
addMember(rightPane);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
index 2262d36..bacbb8d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
@@ -37,9 +37,11 @@ import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertDefinition;
+import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.configuration.group.GroupResourceConfigurationUpdate;
import org.rhq.core.domain.content.InstalledPackageHistory;
import org.rhq.core.domain.criteria.AlertCriteria;
+import org.rhq.core.domain.criteria.GroupBundleDeploymentCriteria;
import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria;
import org.rhq.core.domain.criteria.GroupResourceConfigurationUpdateCriteria;
import org.rhq.core.domain.criteria.InstalledPackageHistoryCriteria;
@@ -86,12 +88,13 @@ public class ActivityView2 extends AbstractActivityView {
getRecentEventUpdates();
if ((groupComposite != null)
&& (groupComposite.getResourceGroup().getGroupCategory().equals(GroupCategory.COMPATIBLE))) {//CompatibleGroup
- //TODO: spinder need to drive these calls off off facet availability
+ //TODO: spinder should we drive these calls off of facet availability?
getRecentOperations();
getRecentConfigurationUpdates();
getRecentOobs();
getRecentPkgHistory();
getRecentMetrics();
+ getRecentBundleDeployments();
}
}
@@ -591,4 +594,63 @@ public class ActivityView2 extends AbstractActivityView {
recentMeasurementsContent.addChild(column);
recentMeasurementsContent.markForRedraw();
}
+
+ /** Fetches recent bundle deployment information and updates the DynamicForm instance with details.
+ */
+ private void getRecentBundleDeployments() {
+ final int groupId = this.groupComposite.getResourceGroup().getId();
+ GroupBundleDeploymentCriteria criteria = new GroupBundleDeploymentCriteria();
+ PageControl pageControl = new PageControl(0, 5);
+ criteria.setPageControl(pageControl);
+ criteria.addFilterResourceGroupIds(groupId);
+ criteria.addSortStatus(PageOrdering.DESC);
+ criteria.fetchDestination(true);
+ criteria.fetchBundleVersion(true);
+
+ GWTServiceLookup.getBundleService().findBundleDeploymentsByCriteria(criteria,
+ new AsyncCallback<PageList<BundleDeployment>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving installed bundle deployments for group [" + groupId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(PageList<BundleDeployment> result) {
+ VLayout column = new VLayout();
+ column.setHeight(10);
+ if (!result.isEmpty()) {
+ for (BundleDeployment deployment : result) {
+ LocatableDynamicForm row = new LocatableDynamicForm(recentBundleDeployContent
+ .extendLocatorId(deployment.getBundleVersion().getName()
+ + deployment.getBundleVersion().getVersion()));
+ row.setNumCols(3);
+
+ StaticTextItem iconItem = newTextItemIcon("subsystems/content/Content_16.png", null);
+ String title = deployment.getBundleVersion().getName() + "["
+ + deployment.getBundleVersion().getVersion() + "]:";
+ String destination = ReportDecorator.GWT_BUNDLE_URL
+ + deployment.getBundleVersion().getBundle().getId() + "/destinations/"
+ + deployment.getDestination().getId();
+ LinkItem link = newLinkItem(title, destination);
+ StaticTextItem time = newTextItem(GwtRelativeDurationConverter
+ .format(deployment.getCtime()));
+
+ row.setItems(iconItem, link, time);
+ column.addMember(row);
+ }
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentBundleDeployContent
+ .extendLocatorId("None"), RECENT_BUNDLE_DEPLOY_NONE);
+ column.addMember(row);
+ }
+ //cleanup
+ for (Canvas child : recentBundleDeployContent.getChildren()) {
+ child.destroy();
+ }
+ recentBundleDeployContent.addChild(column);
+ recentBundleDeployContent.markForRedraw();
+ }
+ });
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
index 8c7cc05..4e40077 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/resource/disambiguation/ReportDecorator.java
@@ -24,6 +24,7 @@ public class ReportDecorator {
//TODO: pull value from more bookmarking/history definition
public final static String GWT_RESOURCE_URL = "#Resource/";
public final static String GWT_GROUP_URL = "#ResourceGroup/";
+ public final static String GWT_BUNDLE_URL = "#Bundles/Bundle/";
public static final String DEFAULT_SEPARATOR = " > ";
/**
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 2caa83d..33d344c 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
@@ -137,6 +137,7 @@ common_title_port = Port
common_title_portlet_auto_refresh=Portlet Auto-Refresh Interval
common_title_providers = Providers
common_title_recent_alerts = Recent Alerts
+common_title_recent_bundle_deployments = Recent Bundle Deployments
common_title_recent_configuration_updates = Recent Configuration Updates
common_title_recent_event_counts = Recent Event Counts
common_title_recent_measurements = Recent Measurements
@@ -1463,6 +1464,7 @@ view_inventory_resources_title_children = Child Resources
view_inventory_resources_title_members = Member Resources
view_resource_inventory_activity_changed_by=Changed by
view_resource_inventory_activity_no_recent_alerts=No recent alerts
+view_resource_inventory_activity_no_recent_bundle_deploy=No recent bundle deployments
view_resource_inventory_activity_no_recent_config_history=No configuration change history
view_resource_inventory_activity_no_recent_events =No events in the last 24 hours
view_resource_inventory_activity_no_recent_metrics=This resource has no recent metrics
commit abb0a4e4572f19cf995108d4adee7bf5aa9fdfcd
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Wed Feb 23 15:07:49 2011 -0500
enable Pkg History for Group Activity page. Added new InstalledPackageHistoryCriteria class.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageHistoryCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageHistoryCriteria.java
new file mode 100644
index 0000000..e640369
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/InstalledPackageHistoryCriteria.java
@@ -0,0 +1,110 @@
+package org.rhq.core.domain.criteria;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+
+import org.rhq.core.domain.content.InstalledPackageHistory;
+import org.rhq.core.domain.util.PageOrdering;
+
+(a)XmlAccessorType(XmlAccessType.FIELD)
+@SuppressWarnings("unused")
+public class InstalledPackageHistoryCriteria extends Criteria {
+ private static final long serialVersionUID = 1L;
+
+ private Integer filterId;
+ private Long filterInstallationTimeMinimum; // requires overrides
+ private Long filterInstallationTimeMaximum; // requires overrides
+ private Integer filterPackageVersionId; // requires overrides
+ private Integer filterResourceId; // requires overrides
+ private List<Integer> filterResourceGroupIds; // requires overrides
+ private Integer filterUserId; // requires overrides
+
+ private boolean fetchPackageVersion;
+ private boolean fetchResource;
+ private boolean fetchUser;
+
+ private PageOrdering sortInstallationDate;
+ private PageOrdering sortStatus;
+
+ public InstalledPackageHistoryCriteria() {
+ super();
+ filterOverrides.put("installationTimeMinimum", "installationDate >= ?");
+ filterOverrides.put("installationTimeMaximum", "installationDate <= ?");
+ filterOverrides.put("packageVersionId", "packageVersion.id = ? ");
+ filterOverrides.put("resourceId", "resource.id = ? ");
+ filterOverrides.put("groupId", "resource.explicitGroups.id = ? ");
+ filterOverrides.put("resourceGroupIds", "resource.id IN " //
+ + "( SELECT res.id " //
+ + " FROM ResourceGroup rg " //
+ + " JOIN rg.explicitResources res " //
+ + " WHERE rg.id = ? )");
+ filterOverrides.put("userId", "user.id = ? ");
+ }
+
+ @Override
+ public Class<InstalledPackageHistory> getPersistentClass() {
+ return InstalledPackageHistory.class;
+ }
+
+ public void addFilterId(Integer filterId) {
+ this.filterId = filterId;
+ }
+
+ public void addFilterPackageVersionId(Integer filterPackageVersionId) {
+ this.filterPackageVersionId = filterPackageVersionId;
+ }
+
+ public void addFilterResourceId(Integer filterResourceId) {
+ this.filterResourceId = filterResourceId;
+ }
+
+ public void addFilterResourceGroupIds(Integer... filterResourceGroupIds) {
+ this.filterResourceGroupIds = Arrays.asList(filterResourceGroupIds);
+ }
+
+ public Integer getFilterResourceId() {
+ return filterResourceId;
+ }
+
+ public List<Integer> getFilterGroupIds() {
+ return filterResourceGroupIds;
+ }
+
+ public void addFilterSubjectId(Integer filterSubjectId) {
+ this.filterUserId = filterSubjectId;
+ }
+
+ public void addFilterInstallationTimeMinimum(Long filterInstallationTimeMinimum) {
+ this.filterInstallationTimeMinimum = filterInstallationTimeMinimum;
+ }
+
+ public void addFilterInstallationTimeMaximum(Long filterInstallationTimeMaximum) {
+ this.filterInstallationTimeMaximum = filterInstallationTimeMaximum;
+ }
+
+ public void fetchResource(boolean fetchResource) {
+ this.fetchResource = fetchResource;
+ }
+
+ public void fetchPackageVersion(boolean fetchPackageVersion) {
+ this.fetchPackageVersion = fetchPackageVersion;
+ }
+
+ public void fetchSubject(boolean fetchSubject) {
+ this.fetchUser = fetchSubject;
+ }
+
+ public void addSortInstallationTime(PageOrdering sortInstallationDate) {
+ addSortField("installationDate");
+ this.sortInstallationDate = sortInstallationDate;
+ }
+
+ public void addSortStatus(PageOrdering sortStatus) {
+ addSortField("sort");
+ this.sortStatus = sortStatus;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ContentGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ContentGWTService.java
index 7cd0f55..080d749 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ContentGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ContentGWTService.java
@@ -30,6 +30,7 @@ import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.InstalledPackageHistory;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.domain.criteria.InstalledPackageHistoryCriteria;
import org.rhq.core.domain.criteria.PackageVersionCriteria;
import org.rhq.core.domain.util.PageList;
@@ -44,6 +45,8 @@ public interface ContentGWTService extends RemoteService {
PageList<InstalledPackageHistory> getInstalledPackageHistoryForResource(int resourceId, int count);
+ PageList<InstalledPackageHistory> findInstalledPackageHistoryByCriteria(InstalledPackageHistoryCriteria criteria);
+
List<Architecture> getArchitectures() throws RuntimeException;
PackageType getResourceCreationPackageType(int resourceTypeId) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
index 625c139..2262d36 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/summary/ActivityView2.java
@@ -38,9 +38,11 @@ import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.alert.Alert;
import org.rhq.core.domain.alert.AlertDefinition;
import org.rhq.core.domain.configuration.group.GroupResourceConfigurationUpdate;
+import org.rhq.core.domain.content.InstalledPackageHistory;
import org.rhq.core.domain.criteria.AlertCriteria;
import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria;
import org.rhq.core.domain.criteria.GroupResourceConfigurationUpdateCriteria;
+import org.rhq.core.domain.criteria.InstalledPackageHistoryCriteria;
import org.rhq.core.domain.event.EventSeverity;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
@@ -88,7 +90,7 @@ public class ActivityView2 extends AbstractActivityView {
getRecentOperations();
getRecentConfigurationUpdates();
getRecentOobs();
- // getRecentPkgHistory();
+ getRecentPkgHistory();
getRecentMetrics();
}
}
@@ -395,63 +397,60 @@ public class ActivityView2 extends AbstractActivityView {
});
}
- // /** Fetches recent package history information and updates the DynamicForm instance with details.
- // */
- // private void getRecentPkgHistory() {
- // // final int resourceId = this.resourceComposite.getResource().getId();
- // final int groupId = this.groupComposite.getResourceGroup().getId();
- // InstalledPackageCriteria criteria = new InstalledPackageCriteria();
- // // criteria.addFilterResourceId(resourceId);
- //// criteria.addFilterResourceId(groupId);
- // criteria.addFilter(groupId);
- // PageControl pageControl = new PageControl(0, 5);
- // criteria.setPageControl(pageControl);
- //
- // // GWTServiceLookup.getContentService().getInstalledPackageHistoryForResource(resourceId, 5,
- // GWTServiceLookup.getContentService().getInstalledPackageHistoryForResource(resourceId, 5,
- // new AsyncCallback<PageList<InstalledPackageHistory>>() {
- // @Override
- // public void onFailure(Throwable caught) {
- // Log.debug("Error retrieving installed package history for resource [" + resourceId + "]:"
- // + caught.getMessage());
- // }
- //
- // @Override
- // public void onSuccess(PageList<InstalledPackageHistory> result) {
- // VLayout column = new VLayout();
- // column.setHeight(10);
- // if (!result.isEmpty()) {
- // for (InstalledPackageHistory history : result) {
- // LocatableDynamicForm row = new LocatableDynamicForm(recentPkgHistoryContent
- // .extendLocatorId(history.getPackageVersion().getFileName()
- // + history.getPackageVersion().getVersion()));
- // row.setNumCols(3);
- //
- // StaticTextItem iconItem = newTextItemIcon("subsystems/content/Content_16.png", null);
- // String title = history.getPackageVersion().getFileName() + ":";
- // String destination = "/rhq/resource/content/audit-trail-item.xhtml?id=" + resourceId
- // + "&selectedHistoryId=" + history.getId();
- // LinkItem link = newLinkItem(title, destination);
- // StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(history
- // .getTimestamp()));
- //
- // row.setItems(iconItem, link, time);
- // column.addMember(row);
- // }
- // } else {
- // LocatableDynamicForm row = createEmptyDisplayRow(recentPkgHistoryContent
- // .extendLocatorId("None"), RECENT_PKG_HISTORY_NONE);
- // column.addMember(row);
- // }
- // //cleanup
- // for (Canvas child : recentPkgHistoryContent.getChildren()) {
- // child.destroy();
- // }
- // recentPkgHistoryContent.addChild(column);
- // recentPkgHistoryContent.markForRedraw();
- // }
- // });
- // }
+ /** Fetches recent package history information and updates the DynamicForm instance with details.
+ */
+ private void getRecentPkgHistory() {
+ final int groupId = this.groupComposite.getResourceGroup().getId();
+ InstalledPackageHistoryCriteria criteria = new InstalledPackageHistoryCriteria();
+ PageControl pageControl = new PageControl(0, 5);
+ criteria.setPageControl(pageControl);
+ criteria.addFilterResourceGroupIds(groupId);
+ criteria.addSortStatus(PageOrdering.DESC);
+
+ GWTServiceLookup.getContentService().findInstalledPackageHistoryByCriteria(criteria,
+
+ new AsyncCallback<PageList<InstalledPackageHistory>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving installed package history for group [" + groupId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(PageList<InstalledPackageHistory> result) {
+ VLayout column = new VLayout();
+ column.setHeight(10);
+ if (!result.isEmpty()) {
+ for (InstalledPackageHistory history : result) {
+ LocatableDynamicForm row = new LocatableDynamicForm(recentPkgHistoryContent
+ .extendLocatorId(history.getPackageVersion().getFileName()
+ + history.getPackageVersion().getVersion()));
+ row.setNumCols(3);
+
+ StaticTextItem iconItem = newTextItemIcon("subsystems/content/Content_16.png", null);
+ String title = history.getPackageVersion().getFileName() + ":";
+ String destination = "/rhq/resource/content/audit-trail-item.xhtml?id=" + groupId
+ + "&selectedHistoryId=" + history.getId();
+ LinkItem link = newLinkItem(title, destination);
+ StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(history.getTimestamp()));
+
+ row.setItems(iconItem, link, time);
+ column.addMember(row);
+ }
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentPkgHistoryContent.extendLocatorId("None"),
+ RECENT_PKG_HISTORY_NONE);
+ column.addMember(row);
+ }
+ //cleanup
+ for (Canvas child : recentPkgHistoryContent.getChildren()) {
+ child.destroy();
+ }
+ recentPkgHistoryContent.addChild(column);
+ recentPkgHistoryContent.markForRedraw();
+ }
+ });
+ }
/** Fetches recent metric information and updates the DynamicForm instance with i)sparkline information,
* ii) link to recent metric graph for more details and iii) last metric value formatted to show significant
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java
index caee06b..603288e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ContentGWTServiceImpl.java
@@ -28,6 +28,7 @@ import org.rhq.core.domain.content.Architecture;
import org.rhq.core.domain.content.InstalledPackageHistory;
import org.rhq.core.domain.content.PackageType;
import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.domain.criteria.InstalledPackageHistoryCriteria;
import org.rhq.core.domain.criteria.PackageVersionCriteria;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -39,6 +40,7 @@ import org.rhq.enterprise.server.content.ContentUIManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
+ * @author Simeon Pinder
* @author Greg Hinkle
*/
public class ContentGWTServiceImpl extends AbstractGWTServiceImpl implements ContentGWTService {
@@ -68,6 +70,18 @@ public class ContentGWTServiceImpl extends AbstractGWTServiceImpl implements Con
}
}
+ public PageList<InstalledPackageHistory> findInstalledPackageHistoryByCriteria(
+ InstalledPackageHistoryCriteria criteria) throws RuntimeException {
+ try {
+ PageList<InstalledPackageHistory> results = SerialUtility.prepare(contentUiManager
+ .findInstalledPackageHistoryByCriteria(getSessionSubject(), criteria),
+ "ContentService.findInstalledPackageHistoryByCriteria");
+ return results;
+ } catch (Throwable t) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(t));
+ }
+ }
+
public PageList<InstalledPackageHistory> getInstalledPackageHistoryForResource(int resourceId, int count)
throws RuntimeException {
try {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java
index a3a377a..c54f6eb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerBean.java
@@ -25,6 +25,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@@ -48,12 +49,16 @@ import org.rhq.core.domain.content.composite.AdvisoryDetailsComposite;
import org.rhq.core.domain.content.composite.LoadedPackageBitsComposite;
import org.rhq.core.domain.content.composite.PackageListItemComposite;
import org.rhq.core.domain.content.composite.PackageVersionComposite;
+import org.rhq.core.domain.criteria.InstalledPackageHistoryCriteria;
import org.rhq.core.domain.util.OrderingField;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.PageOrdering;
import org.rhq.core.server.PersistenceUtility;
import org.rhq.enterprise.server.RHQConstants;
+import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
+import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
+import org.rhq.enterprise.server.util.CriteriaQueryRunner;
/**
* @author Jason Dobies
@@ -68,6 +73,9 @@ public class ContentUIManagerBean implements ContentUIManagerLocal {
@PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME)
private EntityManager entityManager;
+ @EJB
+ private AuthorizationManagerLocal authorizationManager;
+
// ContentUIManagerLocal Implementation --------------------------------------------
public LoadedPackageBitsComposite getLoadedPackageBitsComposite(int packageVersionId) {
@@ -497,4 +505,24 @@ public class ContentUIManagerBean implements ContentUIManagerLocal {
return new PageList<InstalledPackageHistory>(packages, (int) totalCount, pc);
}
+
+ @SuppressWarnings("unchecked")
+ public PageList<InstalledPackageHistory> findInstalledPackageHistoryByCriteria(Subject subject,
+ InstalledPackageHistoryCriteria criteria) {
+
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
+ ;
+
+ if (!authorizationManager.isInventoryManager(subject)) {
+ // Ensure we limit to packages installed to viewable resources
+ generator.setAuthorizationResourceFragment(CriteriaQueryGenerator.AuthorizationTokenType.RESOURCE,
+ "resource", subject.getId());
+ }
+
+ CriteriaQueryRunner<InstalledPackageHistory> queryRunner = new CriteriaQueryRunner(criteria, generator,
+ entityManager);
+
+ return queryRunner.execute();
+
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerLocal.java
index 6b9d2f8..6ef67d9 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentUIManagerLocal.java
@@ -35,6 +35,7 @@ import org.rhq.core.domain.content.composite.AdvisoryDetailsComposite;
import org.rhq.core.domain.content.composite.LoadedPackageBitsComposite;
import org.rhq.core.domain.content.composite.PackageListItemComposite;
import org.rhq.core.domain.content.composite.PackageVersionComposite;
+import org.rhq.core.domain.criteria.InstalledPackageHistoryCriteria;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
@@ -243,6 +244,16 @@ public interface ContentUIManagerLocal {
PageList<InstalledPackageHistory> getInstalledPackageHistoryForResource(int resourceId, PageControl pc);
/**
+ * Returns a pagable list of all package events that have taken place on the given resource.
+ *
+ * @param resourceId must refer to a valid resource in the database
+ * @param pc pagination controller
+ * @return pagable list of package change items; will not be <code>null</code>
+ */
+ PageList<InstalledPackageHistory> findInstalledPackageHistoryByCriteria(Subject subject,
+ InstalledPackageHistoryCriteria criteria);
+
+ /**
* Retrieves Advisory Details by its ID. One and only one must exist for the ID;
* @param user user who wants to see the information
* @param id identifier for advisory
13 years, 3 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java | 26 ++++++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java | 28 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java | 7 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesView.java | 18 +++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 3 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesView.java | 16 ++++-
7 files changed, 80 insertions(+), 20 deletions(-)
New commits:
commit 643ac4be5a53f4a457874b52310debf9dddc379d
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Feb 24 21:30:22 2011 -0500
disable enable/disable/set-interval controls on metric schedule views if logged-in user does not have the required permissions (https://bugzilla.redhat.com/show_bug.cgi?id=536281)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
index bb702ba..c9a4226 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/templates/TemplateSchedulesView.java
@@ -20,24 +20,47 @@ package org.rhq.enterprise.gui.coregui.client.admin.templates;
import com.smartgwt.client.data.Criteria;
+import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoader;
import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleListView;
+import java.util.EnumSet;
+import java.util.Set;
+
/**
* A view for viewing and updating the default metric schedules ("metric templates") for a particular ResourceType.
*
* @author Ian Springer
*/
public class TemplateSchedulesView extends AbstractMeasurementScheduleListView {
- private static final String TITLE = MSG.view_admin_measTemplates_title();
+ private static final String TITLE = MSG.view_admin_measTemplates_title();
private static final String[] EXCLUDED_FIELD_NAMES = new String[] { MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_TYPE_ID };
private boolean updateExistingSchedules = true;
+ private Set<Permission> globalPermissions;
public TemplateSchedulesView(String locatorId, int resourceTypeId) {
super(locatorId, TITLE, new TemplateSchedulesDataSource(resourceTypeId), createCriteria(resourceTypeId),
EXCLUDED_FIELD_NAMES);
+
+ this.globalPermissions = EnumSet.noneOf(Permission.class);
+ loadGlobalPermissions();
+ }
+
+ public boolean hasManageMeasurementsPermission() {
+ loadGlobalPermissions();
+ return globalPermissions.contains(Permission.MANAGE_INVENTORY);
+ }
+
+ private void loadGlobalPermissions() {
+ new PermissionsLoader().loadExplicitGlobalPermissions(new PermissionsLoadedListener() {
+ public void onPermissionsLoaded(Set<Permission> permissions) {
+ globalPermissions = permissions;
+ }
+ });
}
private static Criteria createCriteria(int resourceTypeId) {
@@ -60,4 +83,5 @@ public class TemplateSchedulesView extends AbstractMeasurementScheduleListView {
public void setUpdateExistingSchedules(boolean updateExistingSchedules) {
this.updateExistingSchedules = updateExistingSchedules;
}
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java
index e1479af..43f130f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/AbstractMeasurementScheduleListView.java
@@ -27,10 +27,9 @@ import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
-import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.BooleanCellFormatter;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
-import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
/**
* A view that displays a non-paginated table of {@link org.rhq.core.domain.measurement.MeasurementSchedule measurement
@@ -39,8 +38,10 @@ import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablem
* @author Ian Springer
*/
public abstract class AbstractMeasurementScheduleListView extends Table {
- private static final SortSpecifier[] SORT_SPECIFIERS = new SortSpecifier[] { new SortSpecifier(
- MeasurementScheduleCriteria.SORT_FIELD_DISPLAY_NAME, SortDirection.ASCENDING) };
+
+ private static final SortSpecifier[] SORT_SPECIFIERS = new SortSpecifier[] {
+ new SortSpecifier(MeasurementScheduleCriteria.SORT_FIELD_DISPLAY_NAME, SortDirection.ASCENDING)
+ };
public AbstractMeasurementScheduleListView(String locatorId, String title,
AbstractMeasurementScheduleCompositeDataSource dataSource, Criteria criteria, String[] excludedFieldNames) {
@@ -48,6 +49,8 @@ public abstract class AbstractMeasurementScheduleListView extends Table {
setDataSource(dataSource);
}
+ public abstract boolean hasManageMeasurementsPermission();
+
@Override
public AbstractMeasurementScheduleCompositeDataSource getDataSource() {
return (AbstractMeasurementScheduleCompositeDataSource) super.getDataSource();
@@ -68,20 +71,25 @@ public abstract class AbstractMeasurementScheduleListView extends Table {
intervalField.setWidth("25%");
// Add action buttons and widgets.
- addTableAction(extendLocatorId("Enable"), MSG.common_button_enable(), null, new AbstractTableAction(
- TableActionEnablement.ANY) {
+ addTableAction(extendLocatorId("Enable"), MSG.common_button_enable(), null, new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ return ((selection.length >= 1) && hasManageMeasurementsPermission());
+ }
+
public void executeAction(ListGridRecord[] selection, Object actionValue) {
getDataSource().enableSchedules(AbstractMeasurementScheduleListView.this);
}
});
- addTableAction(extendLocatorId("Disable"), MSG.common_button_disable(), null, new AbstractTableAction(
- TableActionEnablement.ANY) {
+ addTableAction(extendLocatorId("Disable"), MSG.common_button_disable(), null, new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ return ((selection.length >= 1) && hasManageMeasurementsPermission());
+ }
+
public void executeAction(ListGridRecord[] selection, Object actionValue) {
getDataSource().disableSchedules(AbstractMeasurementScheduleListView.this);
}
});
addExtraWidget(new UpdateCollectionIntervalWidget(this.getLocatorId(), this), true);
-
}
protected class CollectionEnabledCellFormatter extends BooleanCellFormatter {
@@ -93,6 +101,7 @@ public abstract class AbstractMeasurementScheduleListView extends Table {
}
protected class CollectionIntervalCellFormatter implements CellFormatter {
+
public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
if (value == null) {
return MSG.view_inventory_mixed();
@@ -139,4 +148,5 @@ public abstract class AbstractMeasurementScheduleListView extends Table {
}
}
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java
index debc8be..76378f0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/UpdateCollectionIntervalWidget.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2010 Red Hat, Inc.
+ * Copyright (C) 2010-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -110,6 +110,11 @@ public class UpdateCollectionIntervalWidget extends LocatableHLayout implements
}
});
+ if (!schedulesView.hasManageMeasurementsPermission()) {
+ intervalItem.setDisabled(true);
+ unitsItem.setDisabled(true);
+ }
+
this.form.setFields(intervalItem, unitsItem);
addMember(this.form);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index fd52d17..b42297b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -278,7 +278,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
updateSubTab(this.monitoringTab, this.monitorTraits, canvas, visible, true);
visible = hasMetricsOfType(this.groupComposite, null);
- canvas = (visible) ? new SchedulesView(this.monitorSched.extendLocatorId("View"), groupId) : null;
+ canvas = (visible) ? new SchedulesView(this.monitorSched.extendLocatorId("View"), this.groupComposite) : null;
updateSubTab(this.monitoringTab, this.monitorSched, canvas, visible, true);
visible = facets.contains(ResourceTypeFacet.CALL_TIME);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesView.java
index 0f59f7d..bd8d36d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/monitoring/schedules/SchedulesView.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.monitoring
import com.smartgwt.client.data.Criteria;
import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
+import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleListView;
/**
@@ -29,13 +30,21 @@ import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasuremen
* @author Ian Springer
*/
public class SchedulesView extends AbstractMeasurementScheduleListView {
- private static final String TITLE = MSG.view_group_meas_schedules_title();
+ private static final String TITLE = MSG.view_group_meas_schedules_title();
private static final String[] EXCLUDED_FIELD_NAMES = new String[] { MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_GROUP_ID };
- public SchedulesView(String locatorId, int resourceGroupId) {
- super(locatorId, TITLE, new SchedulesDataSource(resourceGroupId), createCriteria(resourceGroupId),
- EXCLUDED_FIELD_NAMES);
+ private ResourceGroupComposite resourceGroupComposite;
+
+ public SchedulesView(String locatorId, ResourceGroupComposite resourceGroupComposite) {
+ super(locatorId, TITLE, new SchedulesDataSource(resourceGroupComposite.getResourceGroup().getId()),
+ createCriteria(resourceGroupComposite.getResourceGroup().getId()), EXCLUDED_FIELD_NAMES);
+
+ this.resourceGroupComposite = resourceGroupComposite;
+ }
+
+ public boolean hasManageMeasurementsPermission() {
+ return this.resourceGroupComposite.getResourcePermission().isMeasure();
}
private static Criteria createCriteria(int resourceGroupId) {
@@ -43,4 +52,5 @@ public class SchedulesView extends AbstractMeasurementScheduleListView {
criteria.addCriteria(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_GROUP_ID, resourceGroupId);
return criteria;
}
+
}
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 e0504d6..89a87fb 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
@@ -324,7 +324,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
"/rhq/resource/monitor/availabilityHistory-plain.xhtml?id=" + resource.getId()), true, true);
updateSubTab(this.monitoringTab, this.monitorSched, new SchedulesView(monitoringTab
- .extendLocatorId("SchedulesView"), resource.getId()), hasMetricsOfType(this.resourceComposite, null), true);
+ .extendLocatorId("SchedulesView"), this.resourceComposite), hasMetricsOfType(this.resourceComposite, null),
+ true);
visible = facets.contains(ResourceTypeFacet.CALL_TIME);
canvas = (visible) ? new FullHTMLPane(this.monitorCallTime.extendLocatorId("View"),
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesView.java
index 813ac07..46ef463 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/schedules/SchedulesView.java
@@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitori
import com.smartgwt.client.data.Criteria;
import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
+import org.rhq.core.domain.resource.composite.ResourceComposite;
import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasurementScheduleListView;
/**
@@ -31,11 +32,19 @@ import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractMeasuremen
public class SchedulesView extends AbstractMeasurementScheduleListView {
private static final String TITLE = MSG.view_resource_monitor_schedules_title();
-
private static final String[] EXCLUDED_FIELD_NAMES = new String[] { MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_ID };
- public SchedulesView(String locatorId, int resourceId) {
- super(locatorId, TITLE, new SchedulesDataSource(resourceId), createCriteria(resourceId), EXCLUDED_FIELD_NAMES);
+ private ResourceComposite resourceComposite;
+
+ public SchedulesView(String locatorId, ResourceComposite resourceComposite) {
+ super(locatorId, TITLE, new SchedulesDataSource(resourceComposite.getResource().getId()),
+ createCriteria(resourceComposite.getResource().getId()), EXCLUDED_FIELD_NAMES);
+
+ this.resourceComposite = resourceComposite;
+ }
+
+ public boolean hasManageMeasurementsPermission() {
+ return resourceComposite.getResourcePermission().isMeasure();
}
private static Criteria createCriteria(int resourceId) {
@@ -43,4 +52,5 @@ public class SchedulesView extends AbstractMeasurementScheduleListView {
criteria.addCriteria(MeasurementScheduleCriteria.FILTER_FIELD_RESOURCE_ID, resourceId);
return criteria;
}
+
}
13 years, 3 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java | 18 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java | 91 ----------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java | 3
7 files changed, 23 insertions(+), 99 deletions(-)
New commits:
commit fc373c2646c3700df778c76d1720e366a5907e85
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 20:49:08 2011 -0500
fix some plugin config history things
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java
index 3b462c2..15e0fb1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java
@@ -38,6 +38,7 @@ import org.rhq.core.domain.configuration.AbstractPropertyMap;
import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
@@ -173,14 +174,23 @@ public class ConfigurationComparisonView extends VLayout {
}
public static void displayComparisonDialog(final ArrayList<? extends AbstractResourceConfigurationUpdate> configs) {
- int resourceId = configs.get(0).getResource().getResourceType().getId();
- ResourceTypeRepository.Cache.getInstance().getResourceTypes(resourceId,
- EnumSet.of(ResourceTypeRepository.MetadataType.resourceConfigurationDefinition),
+ AbstractResourceConfigurationUpdate theFirstUpdateItem = configs.get(0);
+ int resourceId = theFirstUpdateItem.getResource().getResourceType().getId();
+ final boolean isResourceConfig = theFirstUpdateItem instanceof ResourceConfigurationUpdate;
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(
+ resourceId,
+ isResourceConfig ? EnumSet.of(ResourceTypeRepository.MetadataType.resourceConfigurationDefinition)
+ : EnumSet.of(ResourceTypeRepository.MetadataType.pluginConfigurationDefinition),
new ResourceTypeRepository.TypeLoadedCallback() {
public void onTypesLoaded(ResourceType type) {
- ConfigurationDefinition definition = type.getResourceConfigurationDefinition();
+ ConfigurationDefinition definition;
+ if (isResourceConfig) {
+ definition = type.getResourceConfigurationDefinition();
+ } else {
+ definition = type.getPluginConfigurationDefinition();
+ }
ArrayList<Configuration> configurations = new ArrayList<Configuration>();
ArrayList<String> titles = new ArrayList<String>();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java
deleted file mode 100644
index 926fa76..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java
+++ /dev/null
@@ -1,91 +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.inventory.resource.detail.configuration;
-
-import java.util.EnumSet;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-
-import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
-import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ViewPath;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-
-/**
- * @author Greg Hinkle
- */
-public class AbstractConfigurationHistoryDetailView extends LocatableVLayout implements BookmarkableView {
-
- public AbstractConfigurationHistoryDetailView(String locatorId) {
- super(locatorId);
-
- setWidth100();
- setHeight100();
- }
-
- private void displayHistory(final ResourceConfigurationUpdate update) {
-
- ResourceTypeRepository.Cache.getInstance().getResourceTypes(update.getResource().getResourceType().getId(),
- EnumSet.of(ResourceTypeRepository.MetadataType.resourceConfigurationDefinition),
- new ResourceTypeRepository.TypeLoadedCallback() {
-
- public void onTypesLoaded(ResourceType type) {
- ConfigurationDefinition definition = type.getResourceConfigurationDefinition();
- ConfigurationEditor editor = new ConfigurationEditor("ResConfigHist-"
- + update.getResource().getName(), definition, update.getConfiguration());
- editor.setReadOnly(true);
- addMember(editor);
- markForRedraw();
- }
- });
- }
-
- @Override
- public void renderView(ViewPath viewPath) {
-
- int updateId = viewPath.getCurrentAsInt();
-
- ResourceConfigurationUpdateCriteria criteria = new ResourceConfigurationUpdateCriteria();
- criteria.fetchConfiguration(true);
- criteria.fetchResource(true);
- criteria.addFilterId(updateId);
-
- GWTServiceLookup.getConfigurationService().findResourceConfigurationUpdatesByCriteria(criteria,
- new AsyncCallback<PageList<ResourceConfigurationUpdate>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_configurationHistoryDetails_error_loadFailure(),
- caught);
- }
-
- public void onSuccess(PageList<ResourceConfigurationUpdate> result) {
-
- ResourceConfigurationUpdate update = result.get(0);
- displayHistory(update);
- }
- });
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java
index d72af99..c8041fe 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java
@@ -29,7 +29,6 @@ import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
-import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationComparisonView;
@@ -123,9 +122,9 @@ public abstract class AbstractConfigurationHistoryView<T extends AbstractConfigu
addTableAction(extendLocatorId("Compare"), MSG.common_button_compare(), null, new AbstractTableAction(
TableActionEnablement.MULTIPLE) {
public void executeAction(ListGridRecord[] selection, Object actionValue) {
- ArrayList<ResourceConfigurationUpdate> configs = new ArrayList<ResourceConfigurationUpdate>();
+ ArrayList<AbstractResourceConfigurationUpdate> configs = new ArrayList<AbstractResourceConfigurationUpdate>();
for (ListGridRecord record : selection) {
- ResourceConfigurationUpdate update = (ResourceConfigurationUpdate) record
+ AbstractResourceConfigurationUpdate update = (AbstractResourceConfigurationUpdate) record
.getAttributeAsObject(AbstractConfigurationHistoryDataSource.Field.OBJECT);
configs.add(update);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
index a71c133..47dc9a0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -106,6 +107,7 @@ public class ConfigurationHistoryDataSource extends AbstractConfigurationHistory
@Override
public void onFailure(Throwable caught) {
// should we show an error message? this just means we can't show any item as the "current" one
+ Log.error("cannot get latest resource config", caught);
finish();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java
index 2ea63c4..420732c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java
@@ -58,6 +58,7 @@ public class ConfigurationHistoryDetailView extends LocatableVLayout implements
ConfigurationEditor editor = new ConfigurationEditor("ResConfigHist-"
+ update.getResource().getName(), definition, update.getConfiguration());
editor.setReadOnly(true);
+ editor.setEditorTitle(MSG.common_title_version() + " - " + update.getId());
addMember(editor);
markForRedraw();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java
index 77a3bcc..b6831a5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory;
+import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
@@ -107,6 +108,7 @@ public class PluginConfigurationHistoryDataSource extends
@Override
public void onFailure(Throwable caught) {
// should we show an error message? this just means we can't show any item as the "current" one
+ Log.error("cannot get latest plugin config", caught);
finish();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java
index f3d48f5..3d10722 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java
@@ -50,7 +50,7 @@ public class PluginConfigurationHistoryDetailView extends LocatableVLayout imple
private void displayHistory(final PluginConfigurationUpdate update) {
ResourceTypeRepository.Cache.getInstance().getResourceTypes(update.getResource().getResourceType().getId(),
- EnumSet.of(ResourceTypeRepository.MetadataType.resourceConfigurationDefinition),
+ EnumSet.of(ResourceTypeRepository.MetadataType.pluginConfigurationDefinition),
new ResourceTypeRepository.TypeLoadedCallback() {
public void onTypesLoaded(ResourceType type) {
@@ -58,6 +58,7 @@ public class PluginConfigurationHistoryDetailView extends LocatableVLayout imple
ConfigurationEditor editor = new ConfigurationEditor("PluginConfigHist-"
+ update.getResource().getName(), definition, update.getConfiguration());
editor.setReadOnly(true);
+ editor.setEditorTitle(MSG.common_title_version() + " - " + update.getId());
addMember(editor);
markForRedraw();
}
13 years, 3 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 7e2ebf9f4ffd489cdb5b19d5b2b2ed4f2971e081
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 19:05:35 2011 -0500
fix genrics compile problem
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
index 18d5b60..aba8fdf 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
@@ -93,7 +93,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
* @author Greg Hinkle
* @author Ian Springer
*/
-public class Table<DS extends RPCDataSource<?>> extends LocatableHLayout implements RefreshableView {
+public class Table<DS extends RPCDataSource> extends LocatableHLayout implements RefreshableView {
protected static final String FIELD_ID = "id";
protected static final String FIELD_NAME = "name";
13 years, 3 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/users/UserEditView.java | 45 +++++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java | 6 +
2 files changed, 30 insertions(+), 21 deletions(-)
New commits:
commit 24b5e060106db8a791cd2e7de2f78ef3a7fb579b
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Feb 24 17:20:49 2011 -0500
several small authz-related fixes to user edit view
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 314d279..4ce9950 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
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2010 Red Hat, Inc.
+ * Copyright (C) 2005-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -58,7 +58,7 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
private SubjectRoleSelector roleSelector;
- private boolean hasManageSecurityPermission;
+ private boolean loggedInUserHasManageSecurityPermission;
public UserEditView(String locatorId, int subjectId) {
super(locatorId, new UsersDataSource(), subjectId, MSG.common_label_user(), HEADER_ICON);
@@ -72,10 +72,10 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
@Override
public void onPermissionsLoaded(Set<Permission> permissions) {
if (permissions != null) {
- UserEditView.this.hasManageSecurityPermission = permissions.contains(Permission.MANAGE_SECURITY);
+ UserEditView.this.loggedInUserHasManageSecurityPermission = permissions.contains(Permission.MANAGE_SECURITY);
Subject sessionSubject = UserSessionManager.getSessionSubject();
boolean isEditingSelf = (sessionSubject.getId() == getRecordId());
- boolean isReadOnly = (!UserEditView.this.hasManageSecurityPermission && !isEditingSelf);
+ boolean isReadOnly = (!UserEditView.this.loggedInUserHasManageSecurityPermission && !isEditingSelf);
init(isReadOnly);
}
}
@@ -95,23 +95,17 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
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);
- activeField.disable();
- }
+ Subject sessionSubject = UserSessionManager.getSessionSubject();
+ boolean userBeingEditedIsLoggedInUser = (getRecordId() == sessionSubject.getId());
// 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();
- String username = record.getAttribute(UsersDataSource.Field.NAME);
- if (this.hasManageSecurityPermission || whoami.getName().equals(username)) {
+ if (this.loggedInUserHasManageSecurityPermission || userBeingEditedIsLoggedInUser) {
Record[] roleRecords = record.getAttributeAsRecordArray(UsersDataSource.Field.ROLES);
ListGridRecord[] roleListGridRecords = toListGridRecordArray(roleRecords);
+ boolean rolesAreReadOnly = areRolesReadOnly(record);
- boolean isReadOnly = areRolesReadOnly(record);
-
- this.roleSelector = new SubjectRoleSelector(this.extendLocatorId("Roles"), roleListGridRecords, isReadOnly);
+ this.roleSelector = new SubjectRoleSelector(this.extendLocatorId("Roles"), roleListGridRecords, rolesAreReadOnly);
this.roleSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
public void onSelectionChanged(AssignedItemsChangedEvent event) {
UserEditView.this.onItemChanged();
@@ -130,7 +124,7 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
//
private boolean areRolesReadOnly(Record record) {
boolean isLdap = Boolean.valueOf(record.getAttribute(UsersDataSource.Field.LDAP));
- return (!this.hasManageSecurityPermission || (getRecordId() == SUBJECT_ID_RHQADMIN) || isLdap);
+ return (!this.loggedInUserHasManageSecurityPermission || (getRecordId() == SUBJECT_ID_RHQADMIN) || isLdap);
}
@Override
@@ -152,11 +146,13 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
boolean isLdap = Boolean.valueOf(form.getValueAsString(UsersDataSource.Field.LDAP));
// Only display the password fields for non-LDAP users (i.e. users that have an associated RHQ Principal).
- if (!isLdap) {
+ if (!this.isReadOnly() && !isLdap) {
PasswordItem passwordItem = new PasswordItem(UsersDataSource.Field.PASSWORD);
+ passwordItem.setShowTitle(true);
items.add(passwordItem);
final PasswordItem verifyPasswordItem = new PasswordItem(UsersDataSource.Field.PASSWORD_VERIFY);
+ verifyPasswordItem.setShowTitle(true);
final boolean[] initialPasswordChange = { true };
passwordItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
@@ -166,17 +162,19 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
}
}
});
-
items.add(verifyPasswordItem);
}
TextItem firstNameItem = new TextItem(UsersDataSource.Field.FIRST_NAME);
+ firstNameItem.setShowTitle(true);
items.add(firstNameItem);
TextItem lastNameItem = new TextItem(UsersDataSource.Field.LAST_NAME);
+ lastNameItem.setShowTitle(true);
items.add(lastNameItem);
TextItem emailAddressItem = new TextItem(UsersDataSource.Field.EMAIL_ADDRESS);
+ emailAddressItem.setShowTitle(true);
items.add(emailAddressItem);
TextItem phoneNumberItem = new TextItem(UsersDataSource.Field.PHONE_NUMBER);
@@ -185,8 +183,15 @@ public class UserEditView extends AbstractRecordEditor<UsersDataSource> {
TextItem departmentItem = new TextItem(UsersDataSource.Field.DEPARTMENT);
items.add(departmentItem);
- RadioGroupItem activeItem = new RadioGroupItem(UsersDataSource.Field.FACTIVE);
- activeItem.setVertical(false);
+ boolean userBeingEditedIsRhqadmin = (getRecordId() == SUBJECT_ID_RHQADMIN);
+ FormItem activeItem;
+ if (!this.loggedInUserHasManageSecurityPermission || userBeingEditedIsRhqadmin) {
+ activeItem = new StaticTextItem(UsersDataSource.Field.FACTIVE);
+ } else {
+ RadioGroupItem activeRadioGroupItem = new RadioGroupItem(UsersDataSource.Field.FACTIVE);
+ activeRadioGroupItem.setVertical(false);
+ activeItem = activeRadioGroupItem;
+ }
items.add(activeItem);
return items;
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 06403ad..59c8b9d 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
@@ -144,7 +144,11 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
}
for (FormItem item : itemsList) {
- item.setValidateOnExit(true);
+ if (item instanceof StaticTextItem) {
+ item.setRequired(false);
+ } else {
+ item.setValidateOnExit(true);
+ }
//item.setWidth("*"); // this causes a JavaScript exception ... :-(
item.setWidth(195);
13 years, 3 months
[rhq] 7 commits - modules/core modules/enterprise
by mazz
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractConfigurationUpdate.java | 5
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java | 9
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java | 7
modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 21
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 14
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java | 290 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java | 91 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java | 177 ++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java | 237 --------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java | 130 ----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java | 122 ++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java | 90 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryView.java | 103 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java | 53 +
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 16
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java | 29 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java | 44 +
26 files changed, 1101 insertions(+), 382 deletions(-)
New commits:
commit 9cf8a15457284b44deea1fc7f7bd5b095f3b7bdb
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 17:19:34 2011 -0500
refactor the config history views to abstract out the parts that are reusable for plugin config views
create plugin config views
we now have the plugin config history views and they look pretty much the same as the config history views (due to the use of the abstracted classes for both)
still have some work to do to finish, mainly in the area of deleting/rolling back and other operations like that
the data that you can view seems correct
still needs testing
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java
index aa073a6..1e01f08 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java
@@ -34,6 +34,7 @@ import javax.persistence.InheritanceType;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
+import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
import org.rhq.core.domain.resource.Resource;
/**
@@ -61,6 +62,8 @@ public abstract class AbstractResourceConfigurationUpdate extends AbstractConfig
public abstract Resource getResource();
+ public abstract AbstractGroupConfigurationUpdate getAbstractGroupConfigurationUpdate();
+
protected AbstractResourceConfigurationUpdate() {
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java
index d7e7af4..e7c5845 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java
@@ -34,6 +34,7 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlTransient;
+import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
import org.rhq.core.domain.configuration.group.GroupPluginConfigurationUpdate;
import org.rhq.core.domain.resource.Resource;
@@ -163,6 +164,11 @@ public class PluginConfigurationUpdate extends AbstractResourceConfigurationUpda
this.resource = resource;
}
+ @Override
+ public AbstractGroupConfigurationUpdate getAbstractGroupConfigurationUpdate() {
+ return getGroupConfigurationUpdate();
+ }
+
public GroupPluginConfigurationUpdate getGroupConfigurationUpdate() {
return groupConfigurationUpdate;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java
index b814ea4..f7f4bee 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java
@@ -32,6 +32,7 @@ import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlTransient;
+import org.rhq.core.domain.configuration.group.AbstractGroupConfigurationUpdate;
import org.rhq.core.domain.configuration.group.GroupResourceConfigurationUpdate;
import org.rhq.core.domain.resource.Resource;
@@ -216,6 +217,11 @@ public class ResourceConfigurationUpdate extends AbstractResourceConfigurationUp
this.resource = resource;
}
+ @Override
+ public AbstractGroupConfigurationUpdate getAbstractGroupConfigurationUpdate() {
+ return getGroupConfigurationUpdate();
+ }
+
public GroupResourceConfigurationUpdate getGroupConfigurationUpdate() {
return groupConfigurationUpdate;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
index d010c41..5770cd3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
@@ -87,12 +87,21 @@ public class LinkManager {
return getResourceLink(groupId) + "/Inventory/ConnectionSettingsHistory";
}
- public static String getGroupPluginConfigurationUpdateHistoryLink(int groupId) {
- return getResourceGroupLink(groupId) + "/Inventory/ConnectionSettingsHistory";
+ public static String getGroupPluginConfigurationUpdateHistoryLink(int groupId, Integer groupUpdateHistoryId) {
+ if (groupUpdateHistoryId != null) {
+ return getResourceGroupLink(groupId) + "/Inventory/ConnectionSettingsHistory/" + groupUpdateHistoryId
+ + "/Members";
+ } else {
+ return getResourceGroupLink(groupId) + "/Inventory/ConnectionSettingsHistory";
+ }
}
- public static String getGroupResourceConfigurationUpdateHistoryLink(int groupId, int groupUpdateHistoryId) {
- return getResourceGroupLink(groupId) + "/Configuration/History/" + groupUpdateHistoryId;
+ public static String getGroupResourceConfigurationUpdateHistoryLink(int groupId, Integer groupUpdateHistoryId) {
+ if (groupUpdateHistoryId != null) {
+ return getResourceGroupLink(groupId) + "/Configuration/History/" + groupUpdateHistoryId;
+ } else {
+ return getResourceGroupLink(groupId) + "/Configuration/History";
+ }
}
public static String getGroupOperationHistoryLink(int groupId, int groupOperationHistoryId) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
index c2403c6..18d5b60 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java
@@ -93,7 +93,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
* @author Greg Hinkle
* @author Ian Springer
*/
-public class Table<DS extends RPCDataSource> extends LocatableHLayout implements RefreshableView {
+public class Table<DS extends RPCDataSource<?>> extends LocatableHLayout implements RefreshableView {
protected static final String FIELD_ID = "id";
protected static final String FIELD_NAME = "name";
@@ -801,11 +801,11 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
private static class TableFilter extends DynamicForm implements KeyPressHandler, ChangedHandler,
com.google.gwt.event.dom.client.KeyPressHandler {
- private Table table;
+ private Table<?> table;
private SearchBarItem searchBarItem;
private HiddenItem hiddenItem;
- public TableFilter(Table table) {
+ public TableFilter(Table<?> table) {
super();
setWidth100();
setPadding(5);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
index 171a28e..e1757b8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
@@ -36,6 +36,8 @@ public interface ConfigurationGWTService extends RemoteService {
ResourceConfigurationUpdate getLatestResourceConfigurationUpdate(int resourceId) throws RuntimeException;
+ PluginConfigurationUpdate getLatestPluginConfigurationUpdate(int resourceId) throws RuntimeException;
+
Configuration getPluginConfiguration(int resourceId) throws RuntimeException;
ConfigurationDefinition getPluginConfigurationDefinition(int resourceTypeId) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
index 7567f58..bd68f55 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationMembers.java
@@ -75,7 +75,7 @@ public class HistoryGroupPluginConfigurationMembers extends LocatableVLayout {
setMargin(5);
setMembersMargin(5);
- String backPath = LinkManager.getGroupPluginConfigurationUpdateHistoryLink(this.group.getId());
+ String backPath = LinkManager.getGroupPluginConfigurationUpdateHistoryLink(this.group.getId(), null);
BackButton backButton = new BackButton(extendLocatorId("BackButton"), MSG.view_tableSection_backButton(),
backPath);
addMember(backButton);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java
index fed4f63..b89f449 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java
@@ -67,7 +67,7 @@ public class HistoryGroupPluginConfigurationSettings extends LocatableVLayout {
setMargin(5);
setMembersMargin(5);
- String backPath = LinkManager.getGroupPluginConfigurationUpdateHistoryLink(this.group.getId());
+ String backPath = LinkManager.getGroupPluginConfigurationUpdateHistoryLink(this.group.getId(), null);
BackButton backButton = new BackButton(extendLocatorId("BackButton"), MSG.view_tableSection_backButton(),
backPath);
addMember(backButton);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
index df2c56f..e4d5c78 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationTable.java
@@ -188,9 +188,8 @@ public class HistoryGroupPluginConfigurationTable extends Table {
new AbstractTableAction(TableActionEnablement.SINGLE) {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
- CoreGUI.goToView(LinkManager
- .getGroupPluginConfigurationUpdateHistoryLink(HistoryGroupPluginConfigurationTable.this.group
- .getId())
+ CoreGUI.goToView(LinkManager.getGroupPluginConfigurationUpdateHistoryLink(
+ HistoryGroupPluginConfigurationTable.this.group.getId(), null)
+ "/" + selection[0].getAttribute("id") + "/Settings");
}
});
@@ -199,9 +198,8 @@ public class HistoryGroupPluginConfigurationTable extends Table {
.view_group_pluginConfig_table_viewMemberHistory(), new AbstractTableAction(TableActionEnablement.SINGLE) {
@Override
public void executeAction(ListGridRecord[] selection, Object actionValue) {
- CoreGUI.goToView(LinkManager
- .getGroupPluginConfigurationUpdateHistoryLink(HistoryGroupPluginConfigurationTable.this.group
- .getId())
+ CoreGUI.goToView(LinkManager.getGroupPluginConfigurationUpdateHistoryLink(
+ HistoryGroupPluginConfigurationTable.this.group.getId(), null)
+ "/" + selection[0].getAttribute("id") + "/Members");
}
});
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 a1b2fc3..e0504d6 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
@@ -58,8 +58,8 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceComposit
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
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.HistoryPluginConfigurationView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.PluginConfigurationEditView;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.PluginConfigurationHistoryView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.ResourceResourceAgentView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.schedules.SchedulesView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table.MeasurementTableView;
@@ -147,7 +147,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
inventoryConn = new SubTab(inventoryTab.extendLocatorId("ConnectionSettings"), new ViewName(
"ConnectionSettings", MSG.view_tabs_common_connectionSettings()), null);
inventoryConnHistory = new SubTab(inventoryTab.extendLocatorId("ConnSetHist"),
- HistoryPluginConfigurationView.VIEW_ID, null);
+ PluginConfigurationHistoryView.VIEW_ID, null);
inventoryGroups = new SubTab(inventoryTab.extendLocatorId("Groups"), new ViewName("Groups", MSG
.view_tabs_common_groups()), null);
inventoryAgent = new SubTab(inventoryTab.extendLocatorId("Agent"), new ViewName("Agent", MSG
@@ -281,8 +281,9 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
updateSubTab(this.inventoryTab, this.inventoryConn, canvas, visible, true);
// same test, use above setting for 'visible'
- canvas = (visible) ? new HistoryPluginConfigurationView(this.inventoryConnHistory.extendLocatorId("View"),
- this.resourceComposite) : null;
+ canvas = (visible) ? new PluginConfigurationHistoryView(this.inventoryConnHistory.extendLocatorId("View"),
+ this.resourceComposite.getResourcePermission().isInventory(), this.resourceComposite.getResource().getId())
+ : null;
updateSubTab(this.inventoryTab, this.inventoryConnHistory, canvas, visible, true);
boolean canModifyMembership = globalPermissions.contains(Permission.MANAGE_INVENTORY);
@@ -364,7 +365,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
updateSubTab(this.configurationTab, this.configCurrent, new ResourceConfigurationEditView(this
.extendLocatorId("ResourceConfigView"), resourceComposite), true, true);
- updateSubTab(this.configurationTab, this.configHistory, ConfigurationHistoryView.getHistoryOf(this
+ updateSubTab(this.configurationTab, this.configHistory, new ConfigurationHistoryView(this
.extendLocatorId("ConfigHistView"), this.resourceComposite.getResourcePermission().isConfigureWrite(),
resource.getId()), true, true);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java
new file mode 100644
index 0000000..a50e8a8
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDataSource.java
@@ -0,0 +1,290 @@
+/*
+ * 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.configuration;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.smartgwt.client.data.DataSourceField;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.DateDisplayFormat;
+import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+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.core.domain.configuration.AbstractConfigurationUpdate;
+import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.gui.coregui.client.ErrorMessageWindow;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
+
+/**
+ * A superclass data source that loads information about all the plugin/resource configuration changes that happened
+ * for a resource or across all inventory.
+ *
+ * @author Greg Hinkle
+ * @author John Mazzitelli
+ */
+public abstract class AbstractConfigurationHistoryDataSource<T extends AbstractResourceConfigurationUpdate> extends
+ RPCDataSource<T> {
+
+ public static abstract class Field {
+ public static final String ID = "id";
+ public static final String RESOURCE = "resource";
+ public static final String CREATED_TIME = "createdTime";
+ public static final String STATUS = "status";
+ public static final String SUBJECT = "subject";
+ public static final String RESOURCE_TYPE_ID = "resourceTypeId";
+ public static final String CONFIGURATION = "configuration";
+ public static final String GROUP_CONFIG_UPDATE_ID = "groupConfigUpdateId";
+ public static final String GROUP_ID = "groupId"; // will only be non-null if group config update id is non-null
+ public static final String DURATION = "duration";
+ public static final String ERROR_MESSAGE = "errorMessage";
+ public static final String MODIFIED_TIME = "modifiedTime";
+ public static final String CURRENT_CONFIG = "currentConfig"; // will be true if the history item represents the current config
+ public static final String OBJECT = "object"; // the full entity object is stored in this attribute
+ }
+
+ public static abstract class CriteriaField {
+ public static final String RESOURCE_ID = "resourceId";
+ }
+
+ private ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
+
+ protected ConfigurationGWTServiceAsync getConfigurationService() {
+ return this.configurationService;
+ }
+
+ public AbstractConfigurationHistoryDataSource() {
+ super();
+ List<DataSourceField> fields = addDataSourceFields();
+ addFields(fields);
+ }
+
+ protected String getStatusHtmlString(Record record) {
+ String html = null;
+ AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record.getAttributeAsObject(Field.OBJECT);
+ switch (obj.getStatus()) {
+ case SUCCESS: {
+ html = MSG.view_configurationHistoryList_table_statusSuccess();
+ break;
+ }
+ case INPROGRESS: {
+ html = "<p>" + MSG.view_configurationHistoryList_table_statusInprogress() + "</p>";
+ break;
+ }
+ case NOCHANGE: {
+ html = MSG.view_configurationHistoryList_table_statusNochange();
+ break;
+ }
+ case FAILURE: {
+ html = obj.getErrorMessage();
+ if (html == null) {
+ html = "<p>" + MSG.view_configurationHistoryList_table_statusFailure() + "</p>";
+ } else {
+ 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_configurationHistoryList_table_clickStatusIcon() + "</p>";
+ } else {
+ html = "<pre>" + html + "</pre>";
+ }
+ }
+ break;
+ }
+ }
+ return html;
+ }
+
+ /**
+ * Views that use this data source can call this method to get a list of fields
+ * that can be used in a list grid to show the data for this data source.
+ *
+ * @param includeResourceFields if true, the list of fields that are returned will
+ * include fields to show individual resource data.
+ * Pass in false if you are only collecting data on a
+ * single resource, since you don't need every row to
+ * show the same data on the same resource.
+ * @return fields
+ */
+ public ArrayList<ListGridField> getListGridFields(boolean includeResourceFields) {
+ ArrayList<ListGridField> fields = new ArrayList<ListGridField>();
+
+ ListGridField idField = new ListGridField(Field.ID, MSG.common_title_version());
+ idField.setShowHover(true);
+ idField.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
+ if (Boolean.parseBoolean(record.getAttribute(Field.CURRENT_CONFIG))) {
+ return MSG.dataSource_configurationHistory_currentConfig();
+ }
+ return null;
+ }
+ });
+ fields.add(idField);
+
+ ListGridField submittedTimeField = new ListGridField(Field.CREATED_TIME, MSG
+ .dataSource_configurationHistory_dateSubmitted());
+ submittedTimeField.setType(ListGridFieldType.DATE);
+ submittedTimeField.setDateFormatter(DateDisplayFormat.TOLOCALESTRING);
+ fields.add(submittedTimeField);
+
+ ListGridField completedTimeField = new ListGridField(Field.MODIFIED_TIME, MSG
+ .dataSource_configurationHistory_dateCompleted());
+ completedTimeField.setType(ListGridFieldType.DATE);
+ completedTimeField.setDateFormatter(DateDisplayFormat.TOLOCALESTRING);
+ fields.add(completedTimeField);
+
+ ListGridField statusField = new ListGridField(Field.STATUS, MSG.common_title_status());
+ statusField.setAlign(Alignment.CENTER);
+ statusField.setCellFormatter(new CellFormatter() {
+ public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
+ ConfigurationUpdateStatus status = ConfigurationUpdateStatus.valueOf(value.toString());
+ return Canvas.imgHTML(getConfigurationUpdateStatusIcon(status), 16, 16);
+ }
+ });
+ statusField.setShowHover(true);
+ statusField.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
+ String html = getStatusHtmlString(record);
+ return html;
+ }
+ });
+ statusField.addRecordClickHandler(new RecordClickHandler() {
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ String err = event.getRecord().getAttribute(Field.ERROR_MESSAGE);
+ if (err != null && err.length() > 0) {
+ err = "<pre>" + err + "</pre>";
+ new ErrorMessageWindow("errWin", MSG.common_title_error(), err).show();
+ }
+ }
+ });
+ fields.add(statusField);
+
+ ListGridField subjectField = new ListGridField(Field.SUBJECT, MSG.common_title_user());
+ fields.add(subjectField);
+
+ ListGridField updateTypeField = new ListGridField(Field.GROUP_CONFIG_UPDATE_ID, MSG
+ .dataSource_configurationHistory_updateType());
+ updateTypeField.setCellFormatter(new CellFormatter() {
+ @Override
+ public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
+ if (value == null) {
+ return MSG.dataSource_configurationHistory_updateType_individual();
+ }
+ Integer groupId = record.getAttributeAsInt(Field.GROUP_ID);
+ return "<a href=\"" + getGroupConfigurationUpdateHistoryLink(groupId, (Number) value) + "\">"
+ + MSG.dataSource_configurationHistory_updateType_group() + "</a>";
+ }
+ });
+ fields.add(updateTypeField);
+
+ // determine the widths of our columns
+ if (includeResourceFields) {
+ ListGridField resourceField = new ListGridField(Field.RESOURCE, MSG.common_title_resource());
+ resourceField.setCellFormatter(new CellFormatter() {
+ public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
+ if (listGridRecord == null) {
+ return "unknown";
+ }
+ Resource res = (Resource) listGridRecord.getAttributeAsObject(Field.RESOURCE);
+ String url = LinkManager.getResourceLink(res.getId());
+ // TODO disambiguate the resource name
+ return SeleniumUtility.getLocatableHref(url, res.getName(), null);
+ }
+ });
+ fields.add(resourceField);
+
+ idField.setWidth("10%");
+ submittedTimeField.setWidth("20%");
+ completedTimeField.setWidth("20%");
+ statusField.setWidth("10%");
+ subjectField.setWidth("10%");
+ updateTypeField.setWidth("10%");
+ resourceField.setWidth("*");
+ } else {
+ idField.setWidth("10%");
+ submittedTimeField.setWidth("20%");
+ completedTimeField.setWidth("20%");
+ statusField.setWidth("10%");
+ subjectField.setWidth("10%");
+ updateTypeField.setWidth("*");
+ }
+
+ return fields;
+ }
+
+ @Override
+ protected List<DataSourceField> addDataSourceFields() {
+ List<DataSourceField> fields = super.addDataSourceFields();
+ DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, MSG.common_title_version());
+ idField.setPrimaryKey(true);
+ fields.add(idField);
+ return fields;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T copyValues(Record from) {
+ return (T) from.getAttributeAsObject(Field.OBJECT);
+ }
+
+ @Override
+ public ListGridRecord copyValues(T from) {
+ ListGridRecord record = new ListGridRecord();
+ record.setAttribute(Field.ID, from.getId());
+ record.setAttribute(Field.RESOURCE, from.getResource());
+ record.setAttribute(Field.RESOURCE_TYPE_ID, from.getResource().getResourceType().getId());
+ record.setAttribute(Field.SUBJECT, from.getSubjectName());
+ record.setAttribute(Field.STATUS, from.getStatus().name());
+ record.setAttribute(Field.CONFIGURATION, from.getConfiguration());
+ record.setAttribute(Field.DURATION, from.getDuration());
+ record.setAttribute(Field.ERROR_MESSAGE, from.getErrorMessage());
+ record.setAttribute(Field.CREATED_TIME, new Date(from.getCreatedTime()));
+ // if it is still in progress, the modified time (which we label as "date completed") is meaningless since it isn't completed yet
+ if (from.getStatus() != ConfigurationUpdateStatus.INPROGRESS) {
+ record.setAttribute(Field.MODIFIED_TIME, new Date(from.getModifiedTime()));
+ }
+ if (from.getAbstractGroupConfigurationUpdate() != null) {
+ record.setAttribute(Field.GROUP_CONFIG_UPDATE_ID, from.getAbstractGroupConfigurationUpdate().getId());
+ record.setAttribute(Field.GROUP_ID, from.getAbstractGroupConfigurationUpdate().getGroup().getId()); // note group must be eagerly loaded here
+ }
+ record.setAttribute(Field.OBJECT, from);
+ return record;
+ }
+
+ protected abstract String getConfigurationUpdateStatusIcon(ConfigurationUpdateStatus status);
+
+ protected abstract String getGroupConfigurationUpdateHistoryLink(Integer groupId, Number value);
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java
new file mode 100644
index 0000000..926fa76
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryDetailView.java
@@ -0,0 +1,91 @@
+/*
+ * 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.configuration;
+
+import java.util.EnumSet;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * @author Greg Hinkle
+ */
+public class AbstractConfigurationHistoryDetailView extends LocatableVLayout implements BookmarkableView {
+
+ public AbstractConfigurationHistoryDetailView(String locatorId) {
+ super(locatorId);
+
+ setWidth100();
+ setHeight100();
+ }
+
+ private void displayHistory(final ResourceConfigurationUpdate update) {
+
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(update.getResource().getResourceType().getId(),
+ EnumSet.of(ResourceTypeRepository.MetadataType.resourceConfigurationDefinition),
+ new ResourceTypeRepository.TypeLoadedCallback() {
+
+ public void onTypesLoaded(ResourceType type) {
+ ConfigurationDefinition definition = type.getResourceConfigurationDefinition();
+ ConfigurationEditor editor = new ConfigurationEditor("ResConfigHist-"
+ + update.getResource().getName(), definition, update.getConfiguration());
+ editor.setReadOnly(true);
+ addMember(editor);
+ markForRedraw();
+ }
+ });
+ }
+
+ @Override
+ public void renderView(ViewPath viewPath) {
+
+ int updateId = viewPath.getCurrentAsInt();
+
+ ResourceConfigurationUpdateCriteria criteria = new ResourceConfigurationUpdateCriteria();
+ criteria.fetchConfiguration(true);
+ criteria.fetchResource(true);
+ criteria.addFilterId(updateId);
+
+ GWTServiceLookup.getConfigurationService().findResourceConfigurationUpdatesByCriteria(criteria,
+ new AsyncCallback<PageList<ResourceConfigurationUpdate>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_configurationHistoryDetails_error_loadFailure(),
+ caught);
+ }
+
+ public void onSuccess(PageList<ResourceConfigurationUpdate> result) {
+
+ ResourceConfigurationUpdate update = result.get(0);
+ displayHistory(update);
+ }
+ });
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java
new file mode 100644
index 0000000..d72af99
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/AbstractConfigurationHistoryView.java
@@ -0,0 +1,177 @@
+/*
+ * 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.configuration;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.types.SortDirection;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
+import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationComparisonView;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+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.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
+
+/**
+ * The superclass to the main plugin/resource views that lists all configuration history items.
+ *
+ * @author Greg Hinkle
+ * @author John Mazzitelli
+ */
+public abstract class AbstractConfigurationHistoryView<T extends AbstractConfigurationHistoryDataSource<? extends AbstractResourceConfigurationUpdate>>
+ extends TableSection<T> {
+
+ private Integer resourceId;
+ private boolean hasWritePerm; // can delete history or rollback to a previous config
+
+ /**
+ * Use this constructor to view config histories for all viewable Resources.
+ */
+ public AbstractConfigurationHistoryView(String locatorId, String title, boolean hasWritePerm) {
+ super(locatorId, title);
+ this.hasWritePerm = hasWritePerm;
+ this.resourceId = null;
+ }
+
+ /**
+ * Use this constructor to view the config history for the Resource with the specified ID.
+ *
+ * @param resourceId a Resource ID
+ */
+ public AbstractConfigurationHistoryView(String locatorId, String title, boolean hasWritePerm, int resourceId) {
+ super(locatorId, title, createCriteria(resourceId));
+ this.hasWritePerm = hasWritePerm;
+ this.resourceId = resourceId;
+ }
+
+ private static Criteria createCriteria(int resourceId) {
+ Criteria criteria = new Criteria();
+ criteria.addCriteria(AbstractConfigurationHistoryDataSource.CriteriaField.RESOURCE_ID, resourceId);
+ return criteria;
+ }
+
+ public Integer getResourceId() {
+ return resourceId;
+ }
+
+ public boolean hasWritePermission() {
+ return hasWritePerm;
+ }
+
+ @Override
+ protected void configureTable() {
+ List<ListGridField> fields = getDataSource().getListGridFields(this.resourceId == null);
+ setListGridFields(true, fields.toArray(new ListGridField[fields.size()])); // true = always show the ID field
+ getListGrid().sort(AbstractConfigurationHistoryDataSource.Field.ID, SortDirection.DESCENDING);
+
+ addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
+ new AbstractTableAction(hasWritePerm ? TableActionEnablement.ANY : TableActionEnablement.NEVER) {
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ if (selection != null && selection.length > 0) {
+ int[] doomedIds = new int[selection.length];
+ int i = 0;
+ for (ListGridRecord selected : selection) {
+ doomedIds[i] = selected.getAttributeAsInt(AbstractConfigurationHistoryDataSource.Field.ID);
+ if (selected
+ .getAttribute(AbstractConfigurationHistoryDataSource.Field.GROUP_CONFIG_UPDATE_ID) != null) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_configurationHistoryList_cannotDeleteGroupItems(),
+ Severity.Warning));
+ return; // abort
+ }
+ if (Boolean.parseBoolean(selected
+ .getAttribute(AbstractConfigurationHistoryDataSource.Field.CURRENT_CONFIG))) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_configurationHistoryList_cannotDeleteCurrent(),
+ Severity.Warning));
+ return; // abort
+ }
+ }
+ delete(doomedIds);
+ }
+ }
+ });
+
+ addTableAction(extendLocatorId("Compare"), MSG.common_button_compare(), null, new AbstractTableAction(
+ TableActionEnablement.MULTIPLE) {
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ ArrayList<ResourceConfigurationUpdate> configs = new ArrayList<ResourceConfigurationUpdate>();
+ for (ListGridRecord record : selection) {
+ ResourceConfigurationUpdate update = (ResourceConfigurationUpdate) record
+ .getAttributeAsObject(AbstractConfigurationHistoryDataSource.Field.OBJECT);
+ configs.add(update);
+ }
+ ConfigurationComparisonView.displayComparisonDialog(configs);
+ }
+ });
+
+ if (getResourceId() != null) {
+ addTableAction(extendLocatorId("Rollback"), MSG.view_configurationHistoryList_rollback(), MSG
+ .common_msg_areYouSure(), new AbstractTableAction(hasWritePerm ? TableActionEnablement.SINGLE
+ : TableActionEnablement.NEVER) {
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ if (selection != null && selection.length == 1) {
+ ListGridRecord record = selection[0];
+ rollback(record.getAttributeAsInt(AbstractConfigurationHistoryDataSource.Field.ID).intValue());
+ }
+ }
+ });
+ }
+
+ super.configureTable();
+ }
+
+ @Override
+ protected String getDetailsLinkColumnName() {
+ return AbstractConfigurationHistoryDataSource.Field.ID;
+ }
+
+ @Override
+ protected CellFormatter getDetailsLinkColumnCellFormatter() {
+ return new CellFormatter() {
+ public String format(Object value, ListGridRecord record, int i, int i1) {
+ Integer recordId = getId(record);
+ String detailsUrl = "#" + getBasePath() + "/" + recordId;
+ String cellHtml = SeleniumUtility.getLocatableHref(detailsUrl, value.toString(), null);
+ String isCurrentConfig = record
+ .getAttribute(AbstractConfigurationHistoryDataSource.Field.CURRENT_CONFIG);
+ if (Boolean.parseBoolean(isCurrentConfig)) {
+ cellHtml = Canvas.imgHTML(ImageManager.getApproveIcon()) + cellHtml;
+ }
+ return cellHtml;
+ }
+ };
+ }
+
+ protected abstract void rollback(int configHistoryIdToRollbackTo);
+
+ protected abstract void delete(int[] doomedIds);
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
index 579083e..a71c133 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDataSource.java
@@ -18,40 +18,18 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
-import com.smartgwt.client.data.DataSourceField;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.data.fields.DataSourceIntegerField;
-import com.smartgwt.client.types.Alignment;
-import com.smartgwt.client.types.DateDisplayFormat;
-import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.grid.CellFormatter;
-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.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.criteria.ResourceConfigurationUpdateCriteria;
-import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ErrorMessageWindow;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
-import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* A data source that loads information about all the configuration changes that happened
@@ -60,190 +38,20 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
* @author Greg Hinkle
* @author John Mazzitelli
*/
-public class ConfigurationHistoryDataSource extends RPCDataSource<ResourceConfigurationUpdate> {
-
- public static abstract class Field {
- public static final String ID = "id";
- public static final String RESOURCE = "resource";
- public static final String CREATED_TIME = "createdTime";
- public static final String STATUS = "status";
- public static final String SUBJECT = "subject";
- public static final String RESOURCE_TYPE_ID = "resourceTypeId";
- public static final String CONFIGURATION = "configuration";
- public static final String GROUP_CONFIG_UPDATE_ID = "groupConfigUpdateId";
- public static final String GROUP_ID = "groupId"; // will only be non-null if group config update id is non-null
- public static final String DURATION = "duration";
- public static final String ERROR_MESSAGE = "errorMessage";
- public static final String MODIFIED_TIME = "modifiedTime";
- public static final String CURRENT_CONFIG = "currentConfig"; // will be true if the history item represents the current config
- public static final String OBJECT = "object"; // the full entity object is stored in this attribute
- }
-
- public static abstract class CriteriaField {
- public static final String RESOURCE_ID = "resourceId";
- }
-
- private ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
+public class ConfigurationHistoryDataSource extends AbstractConfigurationHistoryDataSource<ResourceConfigurationUpdate> {
public ConfigurationHistoryDataSource() {
super();
- List<DataSourceField> fields = addDataSourceFields();
- addFields(fields);
}
- /**
- * Views that use this data source can call this method to get a list of fields
- * that can be used in a list grid to show the data for this data source.
- *
- * @param includeResourceFields if true, the list of fields that are returned will
- * include fields to show individual resource data.
- * Pass in false if you are only collecting data on a
- * single resource, since you don't need every row to
- * show the same data on the same resource.
- * @return fields
- */
- public ArrayList<ListGridField> getListGridFields(boolean includeResourceFields) {
- ArrayList<ListGridField> fields = new ArrayList<ListGridField>();
-
- ListGridField idField = new ListGridField(Field.ID, MSG.common_title_version());
- idField.setShowHover(true);
- idField.setHoverCustomizer(new HoverCustomizer() {
- @Override
- public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
- if (Boolean.parseBoolean(record.getAttribute(Field.CURRENT_CONFIG))) {
- return MSG.dataSource_configurationHistory_currentConfig();
- }
- return null;
- }
- });
- fields.add(idField);
-
- ListGridField submittedTimeField = new ListGridField(Field.CREATED_TIME, MSG
- .dataSource_configurationHistory_dateSubmitted());
- submittedTimeField.setType(ListGridFieldType.DATE);
- submittedTimeField.setDateFormatter(DateDisplayFormat.TOLOCALESTRING);
- fields.add(submittedTimeField);
-
- ListGridField completedTimeField = new ListGridField(Field.MODIFIED_TIME, MSG
- .dataSource_configurationHistory_dateCompleted());
- completedTimeField.setType(ListGridFieldType.DATE);
- completedTimeField.setDateFormatter(DateDisplayFormat.TOLOCALESTRING);
- fields.add(completedTimeField);
-
- ListGridField statusField = new ListGridField(Field.STATUS, MSG.common_title_status());
- statusField.setAlign(Alignment.CENTER);
- statusField.setCellFormatter(new CellFormatter() {
- public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
- ConfigurationUpdateStatus status = ConfigurationUpdateStatus.valueOf(value.toString());
- return Canvas.imgHTML(ImageManager.getResourceConfigurationIcon(status), 16, 16);
- }
- });
- statusField.setShowHover(true);
- statusField.setHoverCustomizer(new HoverCustomizer() {
- @Override
- public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
- String html = null;
- String err = record.getAttribute(Field.ERROR_MESSAGE);
- if (err != null && err.length() > 0) {
- html = MSG.dataSource_configurationHistory_clickToSeeError();
- } else {
- ConfigurationUpdateStatus status = ConfigurationUpdateStatus.valueOf(record
- .getAttribute(Field.STATUS));
- switch (status) {
- case SUCCESS: {
- html = MSG.common_status_success();
- break;
- }
- case FAILURE: {
- html = MSG.common_status_failed();
- break;
- }
- case INPROGRESS: {
- html = MSG.common_status_inprogress();
- break;
- }
- case NOCHANGE: {
- html = MSG.common_status_success();
- break;
- }
- }
- }
- return html;
- }
- });
- statusField.addRecordClickHandler(new RecordClickHandler() {
- @Override
- public void onRecordClick(RecordClickEvent event) {
- String err = event.getRecord().getAttribute(Field.ERROR_MESSAGE);
- if (err != null && err.length() > 0) {
- err = "<pre>" + err + "</pre>";
- new ErrorMessageWindow("errWin", MSG.common_title_error(), err).show();
- }
- }
- });
- fields.add(statusField);
-
- ListGridField subjectField = new ListGridField(Field.SUBJECT, MSG.common_title_user());
- fields.add(subjectField);
-
- ListGridField updateTypeField = new ListGridField(Field.GROUP_CONFIG_UPDATE_ID, MSG
- .dataSource_configurationHistory_updateType());
- updateTypeField.setCellFormatter(new CellFormatter() {
- @Override
- public String format(Object value, ListGridRecord record, int rowNum, int colNum) {
- if (value == null) {
- return MSG.dataSource_configurationHistory_updateType_individual();
- }
- Integer groupId = record.getAttributeAsInt(Field.GROUP_ID);
- return "<a href=\""
- + LinkManager.getGroupResourceConfigurationUpdateHistoryLink(groupId, ((Number) value).intValue())
- + "\">" + MSG.dataSource_configurationHistory_updateType_group() + "</a>";
- }
- });
- fields.add(updateTypeField);
-
- // determine the widths of our columns
- if (includeResourceFields) {
- ListGridField resourceField = new ListGridField(Field.RESOURCE, MSG.common_title_resource());
- resourceField.setCellFormatter(new CellFormatter() {
- public String format(Object o, ListGridRecord listGridRecord, int i, int i1) {
- if (listGridRecord == null) {
- return "unknown";
- }
- Resource res = (Resource) listGridRecord.getAttributeAsObject(Field.RESOURCE);
- String url = LinkManager.getResourceLink(res.getId());
- // TODO disambiguate the resource name
- return SeleniumUtility.getLocatableHref(url, res.getName(), null);
- }
- });
- fields.add(resourceField);
-
- idField.setWidth("10%");
- submittedTimeField.setWidth("20%");
- completedTimeField.setWidth("20%");
- statusField.setWidth("10%");
- subjectField.setWidth("10%");
- updateTypeField.setWidth("10%");
- resourceField.setWidth("*");
- } else {
- idField.setWidth("10%");
- submittedTimeField.setWidth("20%");
- completedTimeField.setWidth("20%");
- statusField.setWidth("10%");
- subjectField.setWidth("10%");
- updateTypeField.setWidth("*");
- }
-
- return fields;
+ @Override
+ protected String getConfigurationUpdateStatusIcon(ConfigurationUpdateStatus status) {
+ return ImageManager.getResourceConfigurationIcon(status);
}
@Override
- protected List<DataSourceField> addDataSourceFields() {
- List<DataSourceField> fields = super.addDataSourceFields();
- DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, MSG.common_title_version());
- idField.setPrimaryKey(true);
- fields.add(idField);
- return fields;
+ protected String getGroupConfigurationUpdateHistoryLink(Integer groupId, Number value) {
+ return LinkManager.getGroupResourceConfigurationUpdateHistoryLink(groupId, value.intValue());
}
@Override
@@ -261,7 +69,7 @@ public class ConfigurationHistoryDataSource extends RPCDataSource<ResourceConfig
criteria.addFilterResourceIds(resourceId);
}
- configurationService.findResourceConfigurationUpdatesByCriteria(criteria,
+ getConfigurationService().findResourceConfigurationUpdatesByCriteria(criteria,
new AsyncCallback<PageList<ResourceConfigurationUpdate>>() {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.dataSource_configurationHistory_error_fetchFailure(),
@@ -281,7 +89,7 @@ public class ConfigurationHistoryDataSource extends RPCDataSource<ResourceConfig
// we are obtaining a single resource's history items. Let's find out which is
// its latest, current config item so we can mark it as such
- configurationService.getLatestResourceConfigurationUpdate(resourceId.intValue(),
+ getConfigurationService().getLatestResourceConfigurationUpdate(resourceId.intValue(),
new AsyncCallback<ResourceConfigurationUpdate>() {
@Override
public void onSuccess(ResourceConfigurationUpdate latestResult) {
@@ -310,33 +118,4 @@ public class ConfigurationHistoryDataSource extends RPCDataSource<ResourceConfig
}
});
}
-
- @Override
- public ResourceConfigurationUpdate copyValues(Record from) {
- return (ResourceConfigurationUpdate) from.getAttributeAsObject(Field.OBJECT);
- }
-
- @Override
- public ListGridRecord copyValues(ResourceConfigurationUpdate from) {
- ListGridRecord record = new ListGridRecord();
- record.setAttribute(Field.ID, from.getId());
- record.setAttribute(Field.RESOURCE, from.getResource());
- record.setAttribute(Field.RESOURCE_TYPE_ID, from.getResource().getResourceType().getId());
- record.setAttribute(Field.SUBJECT, from.getSubjectName());
- record.setAttribute(Field.STATUS, from.getStatus().name());
- record.setAttribute(Field.CONFIGURATION, from.getConfiguration());
- record.setAttribute(Field.DURATION, from.getDuration());
- record.setAttribute(Field.ERROR_MESSAGE, from.getErrorMessage());
- record.setAttribute(Field.CREATED_TIME, new Date(from.getCreatedTime()));
- // if it is still in progress, the modified time (which we label as "date completed") is meaningless since it isn't completed yet
- if (from.getStatus() != ConfigurationUpdateStatus.INPROGRESS) {
- record.setAttribute(Field.MODIFIED_TIME, new Date(from.getModifiedTime()));
- }
- if (from.getGroupConfigurationUpdate() != null) {
- record.setAttribute(Field.GROUP_CONFIG_UPDATE_ID, from.getGroupConfigurationUpdate().getId());
- record.setAttribute(Field.GROUP_ID, from.getGroupConfigurationUpdate().getGroup().getId()); // note group must be eagerly loaded here
- }
- record.setAttribute(Field.OBJECT, from);
- return record;
- }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java
index 136ba94..2ea63c4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryDetailView.java
@@ -82,7 +82,6 @@ public class ConfigurationHistoryDetailView extends LocatableVLayout implements
}
public void onSuccess(PageList<ResourceConfigurationUpdate> result) {
-
ResourceConfigurationUpdate update = result.get(0);
displayHistory(update);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
index cf83667..c445d32 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
@@ -18,30 +18,14 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration;
-import java.util.ArrayList;
-import java.util.List;
-
import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.data.Criteria;
-import com.smartgwt.client.types.SortDirection;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.grid.CellFormatter;
-import com.smartgwt.client.widgets.grid.ListGridField;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationComparisonView;
-import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
-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;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ConfigurationHistoryDataSource.Field;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* The main view that lists all resource configuration history items.
@@ -49,20 +33,15 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
* @author Greg Hinkle
* @author John Mazzitelli
*/
-public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryDataSource> {
- public static final ViewName VIEW_ID = new ViewName("RecentConfigurationChanges", MSG
+public class ConfigurationHistoryView extends AbstractConfigurationHistoryView<ConfigurationHistoryDataSource> {
+ public static final ViewName VIEW_ID = new ViewName("ConfigurationHistoryView", MSG
.view_configurationHistoryList_title());
- private Integer resourceId;
- private boolean hasWritePerm; // can delete history or rollback to a previous config
-
/**
* Use this constructor to view config histories for all viewable Resources.
*/
public ConfigurationHistoryView(String locatorId, boolean hasWritePerm) {
- super(locatorId, VIEW_ID.getTitle());
- this.hasWritePerm = hasWritePerm;
- this.resourceId = null;
+ super(locatorId, VIEW_ID.getTitle(), hasWritePerm);
ConfigurationHistoryDataSource datasource = new ConfigurationHistoryDataSource();
setDataSource(datasource);
}
@@ -73,101 +52,20 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
* @param resourceId a Resource ID
*/
public ConfigurationHistoryView(String locatorId, boolean hasWritePerm, int resourceId) {
- super(locatorId, VIEW_ID.getTitle(), createCriteria(resourceId));
- this.hasWritePerm = hasWritePerm;
- this.resourceId = resourceId;
+ super(locatorId, VIEW_ID.getTitle(), hasWritePerm, resourceId);
ConfigurationHistoryDataSource datasource = new ConfigurationHistoryDataSource();
setDataSource(datasource);
}
- private static Criteria createCriteria(int resourceId) {
- Criteria criteria = new Criteria();
- criteria.addCriteria(ConfigurationHistoryDataSource.CriteriaField.RESOURCE_ID, resourceId);
- return criteria;
- }
-
- @Override
- protected void configureTable() {
- List<ListGridField> fields = getDataSource().getListGridFields(this.resourceId == null);
- setListGridFields(true, fields.toArray(new ListGridField[fields.size()])); // true = always show the ID field
- getListGrid().sort(Field.ID, SortDirection.DESCENDING);
-
- addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
- new AbstractTableAction(hasWritePerm ? TableActionEnablement.ANY : TableActionEnablement.NEVER) {
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- if (selection != null && selection.length > 0) {
- int[] doomedIds = new int[selection.length];
- int i = 0;
- for (ListGridRecord selected : selection) {
- doomedIds[i] = selected.getAttributeAsInt(Field.ID);
- if (selected.getAttribute(Field.GROUP_CONFIG_UPDATE_ID) != null) {
- CoreGUI.getMessageCenter().notify(
- new Message(MSG.view_configurationHistoryList_cannotDeleteGroupItems(),
- Severity.Warning));
- return; // abort
- }
- }
- delete(doomedIds);
- }
- }
- });
-
- addTableAction(extendLocatorId("Compare"), MSG.common_button_compare(), null, new AbstractTableAction(
- TableActionEnablement.MULTIPLE) {
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- ArrayList<ResourceConfigurationUpdate> configs = new ArrayList<ResourceConfigurationUpdate>();
- for (ListGridRecord record : selection) {
- ResourceConfigurationUpdate update = (ResourceConfigurationUpdate) record
- .getAttributeAsObject(ConfigurationHistoryDataSource.Field.OBJECT);
- configs.add(update);
- }
- ConfigurationComparisonView.displayComparisonDialog(configs);
- }
- });
-
- addTableAction(extendLocatorId("Rollback"), MSG.view_configurationHistoryList_rollback(), MSG
- .common_msg_areYouSure(), new AbstractTableAction(hasWritePerm ? TableActionEnablement.SINGLE
- : TableActionEnablement.NEVER) {
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- if (selection != null && selection.length == 1) {
- ListGridRecord record = selection[0];
- rollback(record.getAttributeAsInt(Field.ID).intValue());
- }
- }
- });
-
- super.configureTable();
- }
-
- @Override
- protected String getDetailsLinkColumnName() {
- return Field.ID;
- }
-
- @Override
- protected CellFormatter getDetailsLinkColumnCellFormatter() {
- return new CellFormatter() {
- public String format(Object value, ListGridRecord record, int i, int i1) {
- Integer recordId = getId(record);
- String detailsUrl = "#" + getBasePath() + "/" + recordId;
- String cellHtml = SeleniumUtility.getLocatableHref(detailsUrl, value.toString(), null);
- String isCurrentConfig = record.getAttribute(Field.CURRENT_CONFIG);
- if (Boolean.parseBoolean(isCurrentConfig)) {
- cellHtml = Canvas.imgHTML(ImageManager.getApproveIcon()) + cellHtml;
- }
- return cellHtml;
- }
- };
- }
-
@Override
public Canvas getDetailsView(int id) {
ConfigurationHistoryDetailView detailView = new ConfigurationHistoryDetailView(this.getLocatorId());
return detailView;
}
- private void rollback(int configHistoryIdToRollbackTo) {
- GWTServiceLookup.getConfigurationService().rollbackResourceConfiguration(this.resourceId.intValue(),
+ @Override
+ protected void rollback(int configHistoryIdToRollbackTo) {
+ GWTServiceLookup.getConfigurationService().rollbackResourceConfiguration(getResourceId().intValue(),
configHistoryIdToRollbackTo, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
@@ -183,7 +81,8 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
});
}
- private void delete(int[] doomedIds) {
+ @Override
+ protected void delete(int[] doomedIds) {
GWTServiceLookup.getConfigurationService().purgeResourceConfigurationUpdates(doomedIds, true,
new AsyncCallback<Void>() {
@Override
@@ -199,11 +98,4 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
}
});
}
-
- // -------- Static Utility loaders ------------
-
- public static ConfigurationHistoryView getHistoryOf(String locatorId, boolean hasWritePerm, int resourceId) {
- return new ConfigurationHistoryView(locatorId, hasWritePerm, resourceId);
- }
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationSettings.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationSettings.java
deleted file mode 100644
index 506e130..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationSettings.java
+++ /dev/null
@@ -1,139 +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.inventory.resource.detail.inventory;
-
-import java.util.EnumSet;
-import java.util.Map;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.types.Overflow;
-
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
-import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
-import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.core.domain.resource.composite.ResourcePermission;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.LinkManager;
-import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-
-/**
- * Read only view that shows resource plugin configuration properties.
- *
- * @author John Mazzitelli
- */
-public class HistoryPluginConfigurationSettings extends LocatableVLayout {
- private final Resource resource;
- private final ResourcePermission resourcePerms;
- private final int resourceUpdateId;
- private ConfigurationDefinition configurationDefinition;
- private Configuration resourceConfiguration;
- private ConfigurationEditor editor;
-
- public HistoryPluginConfigurationSettings(String locatorId, ResourceComposite composite, int updateId) {
- super(locatorId);
- this.resource = composite.getResource();
- this.resourcePerms = composite.getResourcePermission();
- this.resourceUpdateId = updateId;
-
- setMargin(5);
- setMembersMargin(5);
- String backPath = LinkManager.getResourcePluginConfigurationUpdateHistoryLink(this.resource.getId());
- BackButton backButton = new BackButton(extendLocatorId("BackButton"), MSG.view_tableSection_backButton(),
- backPath);
- addMember(backButton);
- }
-
- @Override
- protected void onDraw() {
- super.onDraw();
- if (this.resourcePerms.isInventory()) {
- loadConfigurationDefinition();
- loadConfiguration();
- } else {
- CoreGUI.getMessageCenter().notify(new Message(MSG.view_connectionSettingsHistory_view_noperm()));
- }
- }
-
- private void initEditor() {
- if (this.configurationDefinition != null && this.resourceConfiguration != null) {
- this.editor = new ConfigurationEditor(this.extendLocatorId("Editor"), this.configurationDefinition,
- this.resourceConfiguration);
- this.editor.setEditorTitle(MSG.view_connectionSettingsHistory_view_connProperties() + " - "
- + this.resourceUpdateId);
- this.editor.setOverflow(Overflow.AUTO);
- this.editor.setReadOnly(true);
- addMember(this.editor);
- }
- }
-
- private void loadConfigurationDefinition() {
- if (this.configurationDefinition == null) {
- final ResourceType type = this.resource.getResourceType();
- ResourceTypeRepository.Cache.getInstance().getResourceTypes(new Integer[] { type.getId() },
- EnumSet.of(ResourceTypeRepository.MetadataType.pluginConfigurationDefinition),
- new ResourceTypeRepository.TypesLoadedCallback() {
- public void onTypesLoaded(Map<Integer, ResourceType> types) {
- configurationDefinition = types.get(type.getId()).getPluginConfigurationDefinition();
- if (configurationDefinition == null) {
- throw new IllegalStateException("Connection settings are not supported by this group.");
- }
- initEditor();
- }
- });
- }
- }
-
- private void loadConfiguration() {
- this.resourceConfiguration = null;
-
- PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
- criteria.addFilterId(resourceUpdateId);
- criteria.fetchConfiguration(true);
-
- GWTServiceLookup.getConfigurationService().findPluginConfigurationUpdatesByCriteria(criteria,
- new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_connectionSettingsHistory_settings_fetchFailure(resource.getName()), caught);
- }
-
- public void onSuccess(PageList<PluginConfigurationUpdate> results) {
- if (results != null && results.size() > 0) {
- resourceConfiguration = results.get(0).getConfiguration();
- initEditor();
- } else {
- // should never really happen
- CoreGUI.getErrorHandler().handleError(
- MSG.view_connectionSettingsHistory_settings_fetchFailure(resource.getName()),
- new Throwable("bad results"));
- }
- }
- });
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
deleted file mode 100644
index 9a43379..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
+++ /dev/null
@@ -1,337 +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.inventory.resource.detail.inventory;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.EnumSet;
-import java.util.HashMap;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.data.DSRequest;
-import com.smartgwt.client.data.DSResponse;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.widgets.Canvas;
-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.ListGrid;
-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.core.domain.configuration.AbstractConfigurationUpdate;
-import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
-import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
-import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.core.domain.resource.composite.ResourcePermission;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationComparisonView;
-import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
-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;
-import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ConfigurationHistoryDataSource.Field;
-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.message.Message.Severity;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
-
-/**
- * Table showing resource plugin configuration history.
- *
- * @author John Mazzitelli
- */
-public class HistoryPluginConfigurationView extends TableSection<HistoryPluginConfigurationView.DataSource> {
- public static final ViewName VIEW_ID = new ViewName("ConnectionSettings", MSG
- .view_tabs_common_connectionSettingsHistory());
-
- private final Resource resource;
- private final ResourcePermission resourcePerms;
-
- public HistoryPluginConfigurationView(String locatorId, ResourceComposite composite) {
- super(locatorId, VIEW_ID.getTitle());
- this.resource = composite.getResource();
- this.resourcePerms = composite.getResourcePermission();
-
- setDataSource(new DataSource());
- }
-
- @Override
- protected String getDetailsLinkColumnName() {
- return DataSource.ID;
- }
-
- @Override
- protected void configureTable() {
- ListGridField fieldId = new ListGridField(DataSource.ID, MSG.common_title_version());
- ListGridField fieldDateCreated = new ListGridField(DataSource.DATE_CREATED, MSG.common_title_dateCreated());
- ListGridField fieldLastUpdated = new ListGridField(DataSource.LAST_UPDATED, MSG.common_title_lastUpdated());
- ListGridField fieldStatus = new ListGridField(DataSource.STATUS, MSG.common_title_status());
- ListGridField fieldUser = new ListGridField(DataSource.USER, MSG.common_title_user());
-
- fieldId.setWidth("10%");
- fieldDateCreated.setWidth("35%");
- fieldLastUpdated.setWidth("35%");
- fieldStatus.setWidth("10%");
- fieldUser.setWidth("*");
-
- fieldStatus.setType(ListGridFieldType.ICON);
- HashMap<String, String> statusIcons = new HashMap<String, String>(4);
- statusIcons.put(ConfigurationUpdateStatus.SUCCESS.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
- statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
- statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
- statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.NOCHANGE));
- fieldStatus.setValueIcons(statusIcons);
- fieldStatus.addRecordClickHandler(new RecordClickHandler() {
- @Override
- public void onRecordClick(RecordClickEvent event) {
- final Window winModal = new LocatableWindow(HistoryPluginConfigurationView.this
- .extendLocatorId("statusDetailsWin"));
- winModal.setTitle(MSG.view_connectionSettingsHistory_table_statusDetails());
- 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(HistoryPluginConfigurationView.this
- .extendLocatorId("statusDetailsPane"));
- htmlPane.setMargin(10);
- htmlPane.setDefaultWidth(500);
- htmlPane.setDefaultHeight(400);
- htmlPane.setContents(getStatusHtmlString(event.getRecord()));
- winModal.addItem(htmlPane);
- winModal.show();
- }
- });
- fieldStatus.setShowHover(true);
- fieldStatus.setHoverCustomizer(new HoverCustomizer() {
- @Override
- public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
- String html = getStatusHtmlString(record);
- return html;
- }
- });
-
- ListGrid listGrid = getListGrid();
- listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldStatus, fieldUser);
-
- addTableAction(extendLocatorId("deleteAction"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
- new AbstractTableAction(this.resourcePerms.isInventory() ? TableActionEnablement.ANY
- : TableActionEnablement.NEVER) {
-
- @Override
- public void executeAction(final ListGridRecord[] selection, Object actionValue) {
- if (selection == null || selection.length == 0) {
- return;
- }
-
- ConfigurationGWTServiceAsync service = GWTServiceLookup.getConfigurationService();
- int[] updateIds = new int[selection.length];
- int i = 0;
- for (ListGridRecord record : selection) {
- updateIds[i++] = record.getAttributeAsInt(DataSource.ID).intValue();
- }
-
- service.purgePluginConfigurationUpdates(updateIds, true, new AsyncCallback<Void>() {
- @Override
- public void onSuccess(Void result) {
- refresh();
- Message message = new Message(
- MSG.view_connectionSettingsHistory_table_deleteSuccessful(String
- .valueOf(selection.length)), Message.Severity.Info, EnumSet.of(
- Message.Option.Transient, Message.Option.Sticky));
- CoreGUI.getMessageCenter().notify(message);
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_connectionSettingsHistory_table_deleteFailure(), caught);
- }
- });
- }
- });
-
- addTableAction(extendLocatorId("Compare"), MSG.common_button_compare(), null, new AbstractTableAction(
- TableActionEnablement.MULTIPLE) {
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- ArrayList<PluginConfigurationUpdate> configs = new ArrayList<PluginConfigurationUpdate>();
- for (ListGridRecord record : selection) {
- PluginConfigurationUpdate update = (PluginConfigurationUpdate) record
- .getAttributeAsObject(DataSource.OBJECT);
- configs.add(update);
- }
- ConfigurationComparisonView.displayComparisonDialog(configs);
- }
- });
-
- addTableAction(extendLocatorId("Rollback"), MSG.view_connectionSettingsHistory_table_rollback(), MSG
- .common_msg_areYouSure(), new AbstractTableAction(
- this.resourcePerms.isInventory() ? TableActionEnablement.SINGLE : TableActionEnablement.NEVER) {
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- if (selection != null && selection.length == 1) {
- ListGridRecord record = selection[0];
- GWTServiceLookup.getConfigurationService().rollbackPluginConfiguration(resource.getId(),
- record.getAttributeAsInt(Field.ID).intValue(), new AsyncCallback<Void>() {
- @Override
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message(MSG.view_connectionSettingsHistory_table_rollback_success(),
- Severity.Info));
- refresh();
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_connectionSettingsHistory_table_rollback_failure(), caught);
- }
- });
- }
- }
- });
-
- }
-
- private String getStatusHtmlString(Record record) {
- String html = null;
- AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record.getAttributeAsObject(DataSource.OBJECT);
- switch (obj.getStatus()) {
- case SUCCESS: {
- html = MSG.view_connectionSettingsHistory_table_statusSuccess();
- break;
- }
- case INPROGRESS: {
- html = "<p>" + MSG.view_connectionSettingsHistory_table_statusInprogress() + "</p>";
- break;
- }
- case NOCHANGE: {
- html = MSG.view_connectionSettingsHistory_table_statusNochange();
- break;
- }
- case FAILURE: {
- html = obj.getErrorMessage();
- if (html == null) {
- html = "<p>" + MSG.view_connectionSettingsHistory_table_statusFailure() + "</p>";
- } else {
- 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_connectionSettingsHistory_table_clickStatusIcon() + "</p>";
- } else {
- html = "<pre>" + html + "</pre>";
- }
- }
- break;
- }
- }
- return html;
- }
-
- class DataSource extends RPCDataSource<PluginConfigurationUpdate> {
-
- public static final String ID = "id";
- public static final String DATE_CREATED = "dateCreated";
- public static final String LAST_UPDATED = "lastUpdated";
- public static final String USER = "user";
- public static final String STATUS = "status";
- public static final String OBJECT = "object";
-
- @Override
- public PluginConfigurationUpdate copyValues(Record from) {
- return (PluginConfigurationUpdate) from.getAttributeAsObject(DataSource.OBJECT);
- }
-
- @Override
- public ListGridRecord copyValues(PluginConfigurationUpdate from) {
- ListGridRecord record = new ListGridRecord();
-
- record.setAttribute(DataSource.ID, from.getId());
- record.setAttribute(DataSource.DATE_CREATED, new Date(from.getCreatedTime()));
- record.setAttribute(DataSource.LAST_UPDATED, new Date(from.getModifiedTime()));
- record.setAttribute(DataSource.USER, from.getSubjectName());
- record.setAttribute(DataSource.STATUS, from.getStatus().name());
-
- record.setAttribute(DataSource.OBJECT, from);
-
- return record;
- }
-
- @Override
- protected void executeFetch(final DSRequest request, final DSResponse response) {
- ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
-
- PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
- criteria.addFilterResourceIds(HistoryPluginConfigurationView.this.resource.getId());
-
- configurationService.findPluginConfigurationUpdatesByCriteria(criteria,
- new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
-
- @Override
- public void onSuccess(PageList<PluginConfigurationUpdate> result) {
- response.setData(buildRecords(result));
- response.setTotalRows(result.getTotalSize());
- processResponse(request.getRequestId(), response);
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_connectionSettingsHistory_table_failFetch(),
- caught);
- response.setStatus(DSResponse.STATUS_FAILURE);
- processResponse(request.getRequestId(), response);
- }
- });
- }
- }
-
- @Override
- public Canvas getDetailsView(int id) {
- // TODO Auto-generated method stub
- return null;
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java
new file mode 100644
index 0000000..77a3bcc
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDataSource.java
@@ -0,0 +1,122 @@
+/*
+ * 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 com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
+import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.AbstractConfigurationHistoryDataSource;
+
+/**
+ * A data source that loads information about all the plugin configuration changes that happened
+ * for a resource or across all inventory.
+ *
+ * @author John Mazzitelli
+ */
+public class PluginConfigurationHistoryDataSource extends
+ AbstractConfigurationHistoryDataSource<PluginConfigurationUpdate> {
+
+ public PluginConfigurationHistoryDataSource() {
+ super();
+ }
+
+ @Override
+ protected String getConfigurationUpdateStatusIcon(ConfigurationUpdateStatus status) {
+ return ImageManager.getPluginConfigurationIcon(status);
+ }
+
+ @Override
+ protected String getGroupConfigurationUpdateHistoryLink(Integer groupId, Number value) {
+ return LinkManager.getGroupPluginConfigurationUpdateHistoryLink(groupId, value.intValue());
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+
+ PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
+ criteria.fetchConfiguration(true);
+ criteria.fetchResource(true);
+ criteria.fetchGroupConfigurationUpdate(true);
+
+ criteria.setPageControl(getPageControl(request));
+
+ final Integer resourceId = (Integer) request.getCriteria().getValues().get(CriteriaField.RESOURCE_ID);
+ if (resourceId != null) {
+ criteria.addFilterResourceIds(resourceId);
+ }
+
+ getConfigurationService().findPluginConfigurationUpdatesByCriteria(criteria,
+ new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.dataSource_configurationHistory_error_fetchFailure(),
+ caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(final PageList<PluginConfigurationUpdate> result) {
+ final ListGridRecord[] records = buildRecords(result);
+ if (resourceId == null) {
+ response.setData(records);
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ return; // we can finish now, we don't need any additional information
+ }
+
+ // we are obtaining a single resource's history items. Let's find out which is
+ // its latest, current config item so we can mark it as such
+ getConfigurationService().getLatestPluginConfigurationUpdate(resourceId.intValue(),
+ new AsyncCallback<PluginConfigurationUpdate>() {
+ @Override
+ public void onSuccess(PluginConfigurationUpdate latestResult) {
+ if (latestResult != null) {
+ for (ListGridRecord record : records) {
+ boolean latest = record.getAttributeAsInt(Field.ID).intValue() == latestResult
+ .getId();
+ record.setAttribute(Field.CURRENT_CONFIG, latest);
+ }
+ }
+ finish();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ // should we show an error message? this just means we can't show any item as the "current" one
+ finish();
+ }
+
+ private void finish() {
+ response.setData(records);
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+ });
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java
new file mode 100644
index 0000000..f3d48f5
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryDetailView.java
@@ -0,0 +1,90 @@
+/*
+ * 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.EnumSet;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * @author John Mazzitelli
+ */
+public class PluginConfigurationHistoryDetailView extends LocatableVLayout implements BookmarkableView {
+
+ public PluginConfigurationHistoryDetailView(String locatorId) {
+ super(locatorId);
+
+ setWidth100();
+ setHeight100();
+ }
+
+ private void displayHistory(final PluginConfigurationUpdate update) {
+
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(update.getResource().getResourceType().getId(),
+ EnumSet.of(ResourceTypeRepository.MetadataType.resourceConfigurationDefinition),
+ new ResourceTypeRepository.TypeLoadedCallback() {
+
+ public void onTypesLoaded(ResourceType type) {
+ ConfigurationDefinition definition = type.getPluginConfigurationDefinition();
+ ConfigurationEditor editor = new ConfigurationEditor("PluginConfigHist-"
+ + update.getResource().getName(), definition, update.getConfiguration());
+ editor.setReadOnly(true);
+ addMember(editor);
+ markForRedraw();
+ }
+ });
+ }
+
+ @Override
+ public void renderView(ViewPath viewPath) {
+
+ int updateId = viewPath.getCurrentAsInt();
+
+ PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
+ criteria.fetchConfiguration(true);
+ criteria.fetchResource(true);
+ criteria.addFilterId(updateId);
+
+ GWTServiceLookup.getConfigurationService().findPluginConfigurationUpdatesByCriteria(criteria,
+ new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_configurationHistoryDetails_error_loadFailure(),
+ caught);
+ }
+
+ public void onSuccess(PageList<PluginConfigurationUpdate> result) {
+ PluginConfigurationUpdate update = result.get(0);
+ displayHistory(update);
+ }
+ });
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryView.java
new file mode 100644
index 0000000..fdd6657
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/PluginConfigurationHistoryView.java
@@ -0,0 +1,103 @@
+/*
+ * 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 com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.Canvas;
+
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.AbstractConfigurationHistoryView;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
+
+/**
+ * The main view that lists all plugin configuration history items.
+ *
+ * @author Greg Hinkle
+ * @author John Mazzitelli
+ */
+public class PluginConfigurationHistoryView extends
+ AbstractConfigurationHistoryView<PluginConfigurationHistoryDataSource> {
+ public static final ViewName VIEW_ID = new ViewName("PluginConfigurationHistoryView", MSG
+ .view_tabs_common_connectionSettingsHistory());
+
+ /**
+ * Use this constructor to view plugin config histories for all viewable Resources.
+ */
+ public PluginConfigurationHistoryView(String locatorId, boolean hasWritePerm) {
+ super(locatorId, VIEW_ID.getTitle(), hasWritePerm);
+ PluginConfigurationHistoryDataSource datasource = new PluginConfigurationHistoryDataSource();
+ setDataSource(datasource);
+ }
+
+ /**
+ * Use this constructor to view the plugin config history for the Resource with the specified ID.
+ *
+ * @param resourceId a Resource ID
+ */
+ public PluginConfigurationHistoryView(String locatorId, boolean hasWritePerm, int resourceId) {
+ super(locatorId, VIEW_ID.getTitle(), hasWritePerm, resourceId);
+ PluginConfigurationHistoryDataSource datasource = new PluginConfigurationHistoryDataSource();
+ setDataSource(datasource);
+ }
+
+ @Override
+ public Canvas getDetailsView(int id) {
+ PluginConfigurationHistoryDetailView detailView = new PluginConfigurationHistoryDetailView(this.getLocatorId());
+ return detailView;
+ }
+
+ @Override
+ protected void rollback(int configHistoryIdToRollbackTo) {
+ GWTServiceLookup.getConfigurationService().rollbackPluginConfiguration(getResourceId().intValue(),
+ configHistoryIdToRollbackTo, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_configurationHistoryList_rollback_success(), Severity.Info));
+ refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_configurationHistoryList_rollback_failure(), caught);
+ }
+ });
+ }
+
+ @Override
+ protected void delete(int[] doomedIds) {
+ GWTServiceLookup.getConfigurationService().purgePluginConfigurationUpdates(doomedIds, true,
+ new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_configurationHistoryList_delete_success(), Severity.Info));
+ refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_configurationHistoryList_delete_failure(), caught);
+ }
+ });
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
index ff848de..e30b1f1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
@@ -98,6 +98,17 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
@Override
+ public PluginConfigurationUpdate getLatestPluginConfigurationUpdate(int resourceId) throws RuntimeException {
+ try {
+ PluginConfigurationUpdate update = configurationManager.getLatestPluginConfigurationUpdate(
+ getSessionSubject(), resourceId);
+ return SerialUtility.prepare(update, "ConfigurationService.getLatestPluginConfigurationUpdate");
+ } catch (Throwable t) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(t));
+ }
+ }
+
+ @Override
public Configuration getPluginConfiguration(int resourceId) throws RuntimeException {
try {
Configuration configuration = configurationManager.getPluginConfiguration(getSessionSubject(), resourceId);
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 951f0b9..2caa83d 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
@@ -1727,24 +1727,6 @@ view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settin
view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.
view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.
-# Connection History
-#-----------------------------------------
-view_connectionSettingsHistory_view_noperm = You do not have permissions to see the connection settings
-view_connectionSettingsHistory_view_connProperties = Connection Properties
-view_connectionSettingsHistory_table_rollback = Rollback
-view_connectionSettingsHistory_table_rollback_success = You successfully rolled back the resource configuration to the selected past configuration.
-view_connectionSettingsHistory_table_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
-view_connectionSettingsHistory_table_failFetch = Failed to get plugin config history
-view_connectionSettingsHistory_table_statusDetails = Status Details
-view_connectionSettingsHistory_table_deleteSuccessful = You have successfully deleted [{0}] history items
-view_connectionSettingsHistory_table_deleteFailure = Failed to delete plugin configuration history
-view_connectionSettingsHistory_table_statusSuccess = This configuration update was successful
-view_connectionSettingsHistory_table_statusInprogress = This configuration update is still in progress
-view_connectionSettingsHistory_table_statusNochange = No changes were made to this configuration
-view_connectionSettingsHistory_table_statusFailure = This configuration update failed
-view_connectionSettingsHistory_table_clickStatusIcon = Click the status icon for full details
-view_connectionSettingsHistory_settings_fetchFailure = Failed to retrieve connection settings for [{0}]
-
# Resource Resource Groups
#-----------------------------------------
view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.
@@ -1760,15 +1742,25 @@ view_configurationDetails_messageDetailed = Configuration updated for Resource [
view_configurationDetails_allPropertiesValid = All configuration properties have valid values, so the configuration can now be saved.
view_configurationDetails_somePropertiesInvalid = The following configuration properties have invalid values: {0}. The values must be corrected before the configuration can be saved.
-# Configuration History List
+# Resource Configuration History List
+#-------------------------------
view_configurationHistoryList_title = Configuration History
+
+# Abstract Configuration History List
+#-------------------------------
view_configurationHistoryList_rollback = Rollback
-view_configurationHistoryList_rollback_success = You successfully rolled back the resource configuration to the selected past configuration.
+view_configurationHistoryList_rollback_success = You successfully rolled back the configuration to the selected past configuration.
view_configurationHistoryList_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
view_configurationHistoryList_delete_success = You successfully deleted the selected configuration history items.
view_configurationHistoryList_delete_failure = Failed to delete the configuration history items.
view_configurationHistoryList_cannotDeleteGroupItems = One or more selected configuration history items are part of a group configuration update. \
You must purge that parent group history item before you can delete its individual resource history items.
+view_configurationHistoryList_cannotDeleteCurrent = One of the selected history items represents the current configuration - you cannot delete it.
+view_configurationHistoryList_table_statusSuccess = This configuration update was successful
+view_configurationHistoryList_table_statusInprogress = This configuration update is still in progress
+view_configurationHistoryList_table_statusNochange = No changes were made to this configuration
+view_configurationHistoryList_table_statusFailure = This configuration update failed
+view_configurationHistoryList_table_clickStatusIcon = Click the status icon for full details
# Configuration History Details
#------------------------------------------
commit 9a45e868aa6db13ba0aa326d581a896205733dda
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 15:02:10 2011 -0500
more code to support plugin configuration history pages
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java
index 5f377cf..aa073a6 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractResourceConfigurationUpdate.java
@@ -34,6 +34,8 @@ import javax.persistence.InheritanceType;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
+import org.rhq.core.domain.resource.Resource;
+
/**
* Provides a {@link Configuration configuration} that constitutes a configuration update request. This allows you to
* maintain a history of a configuration update request - when it was made, who made it and if it was successful or not.
@@ -57,6 +59,8 @@ public abstract class AbstractResourceConfigurationUpdate extends AbstractConfig
@Id
private int id;
+ public abstract Resource getResource();
+
protected AbstractResourceConfigurationUpdate() {
}
@@ -70,7 +74,7 @@ public abstract class AbstractResourceConfigurationUpdate extends AbstractConfig
protected AbstractResourceConfigurationUpdate(Configuration config, String subjectName) {
super(subjectName);
//this.configuration = config.deepCopy(false);
- this.configuration = config.deepCopyWithoutProxies();
+ this.configuration = config.deepCopyWithoutProxies();
}
public int getId() {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java
index b07e884..d7e7af4 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/PluginConfigurationUpdate.java
@@ -154,6 +154,7 @@ public class PluginConfigurationUpdate extends AbstractResourceConfigurationUpda
this.resource = resource;
}
+ @Override
public Resource getResource() {
return resource;
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java
index e0a2460..b814ea4 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/ResourceConfigurationUpdate.java
@@ -207,6 +207,7 @@ public class ResourceConfigurationUpdate extends AbstractResourceConfigurationUp
this.resource = resource;
}
+ @Override
public Resource getResource() {
return resource;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java
index f9e4970..3b462c2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationComparisonView.java
@@ -35,9 +35,9 @@ import com.smartgwt.client.widgets.tree.TreeGridField;
import com.smartgwt.client.widgets.tree.TreeNode;
import org.rhq.core.domain.configuration.AbstractPropertyMap;
+import org.rhq.core.domain.configuration.AbstractResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.configuration.ResourceConfigurationUpdate;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
@@ -172,7 +172,7 @@ public class ConfigurationComparisonView extends VLayout {
parent.setChildren(children.toArray(new TreeNode[children.size()]));
}
- public static void displayComparisonDialog(final ArrayList<ResourceConfigurationUpdate> configs) {
+ public static void displayComparisonDialog(final ArrayList<? extends AbstractResourceConfigurationUpdate> configs) {
int resourceId = configs.get(0).getResource().getResourceType().getId();
ResourceTypeRepository.Cache.getInstance().getResourceTypes(resourceId,
EnumSet.of(ResourceTypeRepository.MetadataType.resourceConfigurationDefinition),
@@ -184,7 +184,7 @@ public class ConfigurationComparisonView extends VLayout {
ArrayList<Configuration> configurations = new ArrayList<Configuration>();
ArrayList<String> titles = new ArrayList<String>();
- for (ResourceConfigurationUpdate update : configs) {
+ for (AbstractResourceConfigurationUpdate update : configs) {
configurations.add(update.getConfiguration());
titles.add(String.valueOf(update.getId()));
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
index 45bd2c4..171a28e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
@@ -30,6 +30,8 @@ public interface ConfigurationGWTService extends RemoteService {
void purgeResourceConfigurationUpdates(int[] configUpdateIds, boolean purgeInProgress) throws RuntimeException;
+ void rollbackPluginConfiguration(int resourceId, int configHistoryId) throws RuntimeException;
+
void rollbackResourceConfiguration(int resourceId, int configHistoryId) throws RuntimeException;
ResourceConfigurationUpdate getLatestResourceConfigurationUpdate(int resourceId) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
index ea03013..9a43379 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory;
+import java.util.ArrayList;
import java.util.Date;
import java.util.EnumSet;
import java.util.HashMap;
@@ -28,6 +29,7 @@ import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.CloseClientEvent;
@@ -48,14 +50,17 @@ import org.rhq.core.domain.resource.composite.ResourcePermission;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationComparisonView;
import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
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;
import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ConfigurationHistoryDataSource.Field;
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.message.Message.Severity;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
@@ -190,6 +195,46 @@ public class HistoryPluginConfigurationView extends TableSection<HistoryPluginCo
});
}
});
+
+ addTableAction(extendLocatorId("Compare"), MSG.common_button_compare(), null, new AbstractTableAction(
+ TableActionEnablement.MULTIPLE) {
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ ArrayList<PluginConfigurationUpdate> configs = new ArrayList<PluginConfigurationUpdate>();
+ for (ListGridRecord record : selection) {
+ PluginConfigurationUpdate update = (PluginConfigurationUpdate) record
+ .getAttributeAsObject(DataSource.OBJECT);
+ configs.add(update);
+ }
+ ConfigurationComparisonView.displayComparisonDialog(configs);
+ }
+ });
+
+ addTableAction(extendLocatorId("Rollback"), MSG.view_connectionSettingsHistory_table_rollback(), MSG
+ .common_msg_areYouSure(), new AbstractTableAction(
+ this.resourcePerms.isInventory() ? TableActionEnablement.SINGLE : TableActionEnablement.NEVER) {
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ if (selection != null && selection.length == 1) {
+ ListGridRecord record = selection[0];
+ GWTServiceLookup.getConfigurationService().rollbackPluginConfiguration(resource.getId(),
+ record.getAttributeAsInt(Field.ID).intValue(), new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_connectionSettingsHistory_table_rollback_success(),
+ Severity.Info));
+ refresh();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_connectionSettingsHistory_table_rollback_failure(), caught);
+ }
+ });
+ }
+ }
+ });
+
}
private String getStatusHtmlString(Record record) {
@@ -283,4 +328,10 @@ public class HistoryPluginConfigurationView extends TableSection<HistoryPluginCo
});
}
}
+
+ @Override
+ public Canvas getDetailsView(int id) {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
index a301b44..ff848de 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
@@ -78,6 +78,15 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
@Override
+ public void rollbackPluginConfiguration(int resourceId, int configHistoryId) throws RuntimeException {
+ try {
+ configurationManager.rollbackPluginConfiguration(getSessionSubject(), resourceId, configHistoryId);
+ } catch (Throwable t) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(t));
+ }
+ }
+
+ @Override
public ResourceConfigurationUpdate getLatestResourceConfigurationUpdate(int resourceId) throws RuntimeException {
try {
ResourceConfigurationUpdate update = configurationManager.getLatestResourceConfigurationUpdate(
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 401359f..951f0b9 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
@@ -1731,9 +1731,12 @@ view_connectionSettingsDetails_somePropertiesInvalid = The following connection
#-----------------------------------------
view_connectionSettingsHistory_view_noperm = You do not have permissions to see the connection settings
view_connectionSettingsHistory_view_connProperties = Connection Properties
+view_connectionSettingsHistory_table_rollback = Rollback
+view_connectionSettingsHistory_table_rollback_success = You successfully rolled back the resource configuration to the selected past configuration.
+view_connectionSettingsHistory_table_rollback_failure = Failed to rollback the configuration. The original configuration is still in effect.
view_connectionSettingsHistory_table_failFetch = Failed to get plugin config history
view_connectionSettingsHistory_table_statusDetails = Status Details
-view_connectionSettingsHistory_table_deleteSuccessful = You have deleted [{0}] history items
+view_connectionSettingsHistory_table_deleteSuccessful = You have successfully deleted [{0}] history items
view_connectionSettingsHistory_table_deleteFailure = Failed to delete plugin configuration history
view_connectionSettingsHistory_table_statusSuccess = This configuration update was successful
view_connectionSettingsHistory_table_statusInprogress = This configuration update is still in progress
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 5c82990..1552162 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -1184,6 +1184,19 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
}
}
+ public void rollbackPluginConfiguration(Subject subject, int resourceId, int configHistoryId)
+ throws ConfigurationUpdateException {
+ PluginConfigurationUpdate configurationUpdateHistory = entityManager.find(PluginConfigurationUpdate.class,
+ configHistoryId);
+ Configuration configuration = configurationUpdateHistory.getConfiguration();
+ if (configuration == null) {
+ throw new ConfigurationUpdateException("No plugin configuration history element exists with id = '"
+ + configHistoryId + "'");
+ }
+
+ updatePluginConfiguration(subject, resourceId, configuration);
+ }
+
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public ResourceConfigurationUpdate persistNewResourceConfigurationUpdateHistory(Subject subject, int resourceId,
Configuration newConfiguration, ConfigurationUpdateStatus newStatus, String newSubject,
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
index 37d8a06..018b6eb 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
@@ -165,6 +165,24 @@ public interface ConfigurationManagerLocal {
throws ConfigurationUpdateException;
/**
+ * This method is called when a user has requested to change the plugin configuration for an existing resource to
+ * one of its previous values. If the user does not have the proper permissions to change the resource's
+ * plugin configuration, an exception is thrown.
+ *
+ * <p>This will not wait for the agent to finish the configuration update. This will return after the request is
+ * sent. Once the agent finishes with the request, it will send the completed request information to
+ * {@link #completePluginConfigurationUpdate}.</p>
+ *
+ * @param subject the user who is requesting the update
+ * @param resourceId identifies the resource to be updated
+ * @param configHistoryId the id of the resource's previous configuration to rollback to
+ *
+ * @throws ConfigurationUpdateException if the configHistoryId does not exist
+ */
+ void rollbackPluginConfiguration(Subject subject, int resourceId, int configHistoryId)
+ throws ConfigurationUpdateException;
+
+ /**
* For internal use only - do not call this method. This is for
* {@link #updateResourceConfiguration(Subject, int, Configuration)} to call with REQUIRES_NEW transaction scope so
* it can force the new request to be committed to the DB. Also used by
commit 2d043745134c1f4e35065e6197b18711156f5820
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 15:01:51 2011 -0500
dont' refresh the entire ui, just the table
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
index 837206b..cf83667 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
@@ -173,7 +173,7 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
public void onSuccess(Void result) {
CoreGUI.getMessageCenter().notify(
new Message(MSG.view_configurationHistoryList_rollback_success(), Severity.Info));
- CoreGUI.refresh();
+ refresh();
}
@Override
@@ -190,7 +190,7 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
public void onSuccess(Void result) {
CoreGUI.getMessageCenter().notify(
new Message(MSG.view_configurationHistoryList_delete_success(), Severity.Info));
- CoreGUI.refresh();
+ refresh();
}
@Override
commit fd3ea15d142423479c30eacdcbeaecabbde0fe56
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 14:33:16 2011 -0500
remove unused imports
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractConfigurationUpdate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractConfigurationUpdate.java
index 79c0145..c6d5cbf 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractConfigurationUpdate.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/configuration/AbstractConfigurationUpdate.java
@@ -22,8 +22,6 @@
*/
package org.rhq.core.domain.configuration;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
import java.io.Serializable;
import javax.persistence.CascadeType;
@@ -244,7 +242,8 @@ public abstract class AbstractConfigurationUpdate implements Serializable {
@Override
public String toString() {
- StringBuilder str = new StringBuilder(this.getClass().getName().substring(this.getClass().getName().lastIndexOf(".")+1));
+ StringBuilder str = new StringBuilder(this.getClass().getName().substring(
+ this.getClass().getName().lastIndexOf(".") + 1));
str.append("[status=").append(this.status);
str.append(", configuration=").append(this.configuration);
str.append(", subjectName=").append(this.subjectName);
commit 7966ffef9b662085ad2ac066a5665d74ed3ef106
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 14:32:57 2011 -0500
adding auth check to res config history views
more coding for plugin config history views (not done yet)
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 d5da970..a1b2fc3 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
@@ -146,8 +146,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
.view_tabs_common_child_history()), null);
inventoryConn = new SubTab(inventoryTab.extendLocatorId("ConnectionSettings"), new ViewName(
"ConnectionSettings", MSG.view_tabs_common_connectionSettings()), null);
- inventoryConnHistory = new SubTab(inventoryTab.extendLocatorId("ConnSetHist"), new ViewName(
- "ConnectionSettingsHistory", MSG.view_tabs_common_connectionSettingsHistory()), null);
+ inventoryConnHistory = new SubTab(inventoryTab.extendLocatorId("ConnSetHist"),
+ HistoryPluginConfigurationView.VIEW_ID, null);
inventoryGroups = new SubTab(inventoryTab.extendLocatorId("Groups"), new ViewName("Groups", MSG
.view_tabs_common_groups()), null);
inventoryAgent = new SubTab(inventoryTab.extendLocatorId("Agent"), new ViewName("Agent", MSG
@@ -365,7 +365,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
.extendLocatorId("ResourceConfigView"), resourceComposite), true, true);
updateSubTab(this.configurationTab, this.configHistory, ConfigurationHistoryView.getHistoryOf(this
- .extendLocatorId("ConfigHistView"), resource.getId()), true, true);
+ .extendLocatorId("ConfigHistView"), this.resourceComposite.getResourcePermission().isConfigureWrite(),
+ resource.getId()), true, true);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
index 5e7bc9e..837206b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/configuration/ConfigurationHistoryView.java
@@ -54,12 +54,14 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
.view_configurationHistoryList_title());
private Integer resourceId;
+ private boolean hasWritePerm; // can delete history or rollback to a previous config
/**
* Use this constructor to view config histories for all viewable Resources.
*/
- public ConfigurationHistoryView(String locatorId) {
+ public ConfigurationHistoryView(String locatorId, boolean hasWritePerm) {
super(locatorId, VIEW_ID.getTitle());
+ this.hasWritePerm = hasWritePerm;
this.resourceId = null;
ConfigurationHistoryDataSource datasource = new ConfigurationHistoryDataSource();
setDataSource(datasource);
@@ -70,8 +72,9 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
*
* @param resourceId a Resource ID
*/
- public ConfigurationHistoryView(String locatorId, int resourceId) {
+ public ConfigurationHistoryView(String locatorId, boolean hasWritePerm, int resourceId) {
super(locatorId, VIEW_ID.getTitle(), createCriteria(resourceId));
+ this.hasWritePerm = hasWritePerm;
this.resourceId = resourceId;
ConfigurationHistoryDataSource datasource = new ConfigurationHistoryDataSource();
setDataSource(datasource);
@@ -90,7 +93,7 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
getListGrid().sort(Field.ID, SortDirection.DESCENDING);
addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
- new AbstractTableAction(TableActionEnablement.ANY) {
+ new AbstractTableAction(hasWritePerm ? TableActionEnablement.ANY : TableActionEnablement.NEVER) {
public void executeAction(ListGridRecord[] selection, Object actionValue) {
if (selection != null && selection.length > 0) {
int[] doomedIds = new int[selection.length];
@@ -123,7 +126,8 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
});
addTableAction(extendLocatorId("Rollback"), MSG.view_configurationHistoryList_rollback(), MSG
- .common_msg_areYouSure(), new AbstractTableAction(TableActionEnablement.SINGLE) {
+ .common_msg_areYouSure(), new AbstractTableAction(hasWritePerm ? TableActionEnablement.SINGLE
+ : TableActionEnablement.NEVER) {
public void executeAction(ListGridRecord[] selection, Object actionValue) {
if (selection != null && selection.length == 1) {
ListGridRecord record = selection[0];
@@ -198,8 +202,8 @@ public class ConfigurationHistoryView extends TableSection<ConfigurationHistoryD
// -------- Static Utility loaders ------------
- public static ConfigurationHistoryView getHistoryOf(String locatorId, int resourceId) {
- return new ConfigurationHistoryView(locatorId, resourceId);
+ public static ConfigurationHistoryView getHistoryOf(String locatorId, boolean hasWritePerm, int resourceId) {
+ return new ConfigurationHistoryView(locatorId, hasWritePerm, resourceId);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationTable.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationTable.java
deleted file mode 100644
index 1e6ccb4..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationTable.java
+++ /dev/null
@@ -1,277 +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.inventory.resource.detail.inventory;
-
-import java.util.Date;
-import java.util.EnumSet;
-import java.util.HashMap;
-
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.data.DSRequest;
-import com.smartgwt.client.data.DSResponse;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.types.ListGridFieldType;
-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.ListGrid;
-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.core.domain.configuration.AbstractConfigurationUpdate;
-import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
-import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
-import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
-import org.rhq.core.domain.resource.Resource;
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.core.domain.resource.composite.ResourcePermission;
-import org.rhq.core.domain.util.PageList;
-import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
-import org.rhq.enterprise.gui.coregui.client.components.table.Table;
-import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
-import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-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.LocatableHTMLPane;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
-
-/**
- * Table showing resource plugin configuration history.
- *
- * @author John Mazzitelli
- */
-public class HistoryPluginConfigurationTable extends Table<HistoryPluginConfigurationTable.DataSource> {
- private final Resource resource;
- private final ResourcePermission resourcePerms;
-
- public HistoryPluginConfigurationTable(String locatorId, ResourceComposite composite) {
- super(locatorId, MSG.view_connectionSettingsHistory_table_title());
- this.resource = composite.getResource();
- this.resourcePerms = composite.getResourcePermission();
-
- setDataSource(new DataSource());
- }
-
- @Override
- protected void configureTable() {
- ListGridField fieldId = new ListGridField(DataSource.ID, MSG.common_title_version());
- ListGridField fieldDateCreated = new ListGridField(DataSource.DATE_CREATED, MSG.common_title_dateCreated());
- ListGridField fieldLastUpdated = new ListGridField(DataSource.LAST_UPDATED, MSG.common_title_lastUpdated());
- ListGridField fieldUser = new ListGridField(DataSource.USER, MSG.common_title_user());
- ListGridField fieldStatus = new ListGridField(DataSource.STATUS, MSG.common_title_status());
-
- fieldId.setWidth("10%");
- fieldDateCreated.setWidth("35%");
- fieldLastUpdated.setWidth("35%");
- fieldUser.setWidth("*");
- fieldStatus.setWidth("10%");
-
- fieldStatus.setType(ListGridFieldType.ICON);
- HashMap<String, String> statusIcons = new HashMap<String, String>(4);
- statusIcons.put(ConfigurationUpdateStatus.SUCCESS.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
- statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
- statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
- statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(), ImageManager
- .getPluginConfigurationIcon(ConfigurationUpdateStatus.NOCHANGE));
- fieldStatus.setValueIcons(statusIcons);
- fieldStatus.addRecordClickHandler(new RecordClickHandler() {
- @Override
- public void onRecordClick(RecordClickEvent event) {
- final Window winModal = new LocatableWindow(HistoryPluginConfigurationTable.this
- .extendLocatorId("statusDetailsWin"));
- winModal.setTitle(MSG.view_connectionSettingsHistory_table_statusDetails());
- 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(HistoryPluginConfigurationTable.this
- .extendLocatorId("statusDetailsPane"));
- htmlPane.setMargin(10);
- htmlPane.setDefaultWidth(500);
- htmlPane.setDefaultHeight(400);
- htmlPane.setContents(getStatusHtmlString(event.getRecord()));
- winModal.addItem(htmlPane);
- winModal.show();
- }
- });
- fieldStatus.setShowHover(true);
- fieldStatus.setHoverCustomizer(new HoverCustomizer() {
- @Override
- public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
- String html = getStatusHtmlString(record);
- return html;
- }
- });
-
- ListGrid listGrid = getListGrid();
- listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldUser, fieldStatus);
-
- addTableAction(extendLocatorId("deleteAction"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
- new AbstractTableAction(this.resourcePerms.isInventory() ? TableActionEnablement.ANY
- : TableActionEnablement.NEVER) {
-
- @Override
- public void executeAction(final ListGridRecord[] selection, Object actionValue) {
- if (selection == null || selection.length == 0) {
- return;
- }
-
- ConfigurationGWTServiceAsync service = GWTServiceLookup.getConfigurationService();
- int[] updateIds = new int[selection.length];
- int i = 0;
- for (ListGridRecord record : selection) {
- updateIds[i++] = record.getAttributeAsInt(DataSource.ID).intValue();
- }
-
- service.purgePluginConfigurationUpdates(updateIds, true, new AsyncCallback<Void>() {
- @Override
- public void onSuccess(Void result) {
- refresh();
- Message message = new Message(
- MSG.view_connectionSettingsHistory_table_deleteSuccessful(String
- .valueOf(selection.length)), Message.Severity.Info, EnumSet.of(
- Message.Option.Transient, Message.Option.Sticky));
- CoreGUI.getMessageCenter().notify(message);
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_connectionSettingsHistory_table_deleteFailure(), caught);
- }
- });
- }
- });
- }
-
- private String getStatusHtmlString(Record record) {
- String html = null;
- AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record.getAttributeAsObject(DataSource.OBJECT);
- switch (obj.getStatus()) {
- case SUCCESS: {
- html = MSG.view_connectionSettingsHistory_table_statusSuccess();
- break;
- }
- case INPROGRESS: {
- html = "<p>" + MSG.view_connectionSettingsHistory_table_statusInprogress() + "</p>";
- break;
- }
- case NOCHANGE: {
- html = MSG.view_connectionSettingsHistory_table_statusNochange();
- break;
- }
- case FAILURE: {
- html = obj.getErrorMessage();
- if (html == null) {
- html = "<p>" + MSG.view_connectionSettingsHistory_table_statusFailure() + "</p>";
- } else {
- 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_connectionSettingsHistory_table_clickStatusIcon() + "</p>";
- } else {
- html = "<pre>" + html + "</pre>";
- }
- }
- break;
- }
- }
- return html;
- }
-
- class DataSource extends RPCDataSource<PluginConfigurationUpdate> {
-
- public static final String ID = "id";
- public static final String DATE_CREATED = "dateCreated";
- public static final String LAST_UPDATED = "lastUpdated";
- public static final String USER = "user";
- public static final String STATUS = "status";
- public static final String OBJECT = "object";
-
- @Override
- public PluginConfigurationUpdate copyValues(Record from) {
- return (PluginConfigurationUpdate) from.getAttributeAsObject(DataSource.OBJECT);
- }
-
- @Override
- public ListGridRecord copyValues(PluginConfigurationUpdate from) {
- ListGridRecord record = new ListGridRecord();
-
- record.setAttribute(DataSource.ID, from.getId());
- record.setAttribute(DataSource.DATE_CREATED, new Date(from.getCreatedTime()));
- record.setAttribute(DataSource.LAST_UPDATED, new Date(from.getModifiedTime()));
- record.setAttribute(DataSource.USER, from.getSubjectName());
- record.setAttribute(DataSource.STATUS, from.getStatus().name());
-
- record.setAttribute(DataSource.OBJECT, from);
-
- return record;
- }
-
- @Override
- protected void executeFetch(final DSRequest request, final DSResponse response) {
- ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
-
- PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
- criteria.addFilterResourceIds(HistoryPluginConfigurationTable.this.resource.getId());
-
- configurationService.findPluginConfigurationUpdatesByCriteria(criteria,
- new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
-
- @Override
- public void onSuccess(PageList<PluginConfigurationUpdate> result) {
- response.setData(buildRecords(result));
- response.setTotalRows(result.getTotalSize());
- processResponse(request.getRequestId(), response);
- }
-
- @Override
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_connectionSettingsHistory_table_failFetch(),
- caught);
- response.setStatus(DSResponse.STATUS_FAILURE);
- processResponse(request.getRequestId(), response);
- }
- });
- }
- }
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
new file mode 100644
index 0000000..ea03013
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
@@ -0,0 +1,286 @@
+/*
+ * 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.Date;
+import java.util.EnumSet;
+import java.util.HashMap;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.ListGridFieldType;
+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.ListGrid;
+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.core.domain.configuration.AbstractConfigurationUpdate;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
+import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.composite.ResourceComposite;
+import org.rhq.core.domain.resource.composite.ResourcePermission;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+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;
+import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+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.LocatableHTMLPane;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
+
+/**
+ * Table showing resource plugin configuration history.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryPluginConfigurationView extends TableSection<HistoryPluginConfigurationView.DataSource> {
+ public static final ViewName VIEW_ID = new ViewName("ConnectionSettings", MSG
+ .view_tabs_common_connectionSettingsHistory());
+
+ private final Resource resource;
+ private final ResourcePermission resourcePerms;
+
+ public HistoryPluginConfigurationView(String locatorId, ResourceComposite composite) {
+ super(locatorId, VIEW_ID.getTitle());
+ this.resource = composite.getResource();
+ this.resourcePerms = composite.getResourcePermission();
+
+ setDataSource(new DataSource());
+ }
+
+ @Override
+ protected String getDetailsLinkColumnName() {
+ return DataSource.ID;
+ }
+
+ @Override
+ protected void configureTable() {
+ ListGridField fieldId = new ListGridField(DataSource.ID, MSG.common_title_version());
+ ListGridField fieldDateCreated = new ListGridField(DataSource.DATE_CREATED, MSG.common_title_dateCreated());
+ ListGridField fieldLastUpdated = new ListGridField(DataSource.LAST_UPDATED, MSG.common_title_lastUpdated());
+ ListGridField fieldStatus = new ListGridField(DataSource.STATUS, MSG.common_title_status());
+ ListGridField fieldUser = new ListGridField(DataSource.USER, MSG.common_title_user());
+
+ fieldId.setWidth("10%");
+ fieldDateCreated.setWidth("35%");
+ fieldLastUpdated.setWidth("35%");
+ fieldStatus.setWidth("10%");
+ fieldUser.setWidth("*");
+
+ fieldStatus.setType(ListGridFieldType.ICON);
+ HashMap<String, String> statusIcons = new HashMap<String, String>(4);
+ statusIcons.put(ConfigurationUpdateStatus.SUCCESS.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
+ statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
+ statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
+ statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.NOCHANGE));
+ fieldStatus.setValueIcons(statusIcons);
+ fieldStatus.addRecordClickHandler(new RecordClickHandler() {
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ final Window winModal = new LocatableWindow(HistoryPluginConfigurationView.this
+ .extendLocatorId("statusDetailsWin"));
+ winModal.setTitle(MSG.view_connectionSettingsHistory_table_statusDetails());
+ 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(HistoryPluginConfigurationView.this
+ .extendLocatorId("statusDetailsPane"));
+ htmlPane.setMargin(10);
+ htmlPane.setDefaultWidth(500);
+ htmlPane.setDefaultHeight(400);
+ htmlPane.setContents(getStatusHtmlString(event.getRecord()));
+ winModal.addItem(htmlPane);
+ winModal.show();
+ }
+ });
+ fieldStatus.setShowHover(true);
+ fieldStatus.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
+ String html = getStatusHtmlString(record);
+ return html;
+ }
+ });
+
+ ListGrid listGrid = getListGrid();
+ listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldStatus, fieldUser);
+
+ addTableAction(extendLocatorId("deleteAction"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
+ new AbstractTableAction(this.resourcePerms.isInventory() ? TableActionEnablement.ANY
+ : TableActionEnablement.NEVER) {
+
+ @Override
+ public void executeAction(final ListGridRecord[] selection, Object actionValue) {
+ if (selection == null || selection.length == 0) {
+ return;
+ }
+
+ ConfigurationGWTServiceAsync service = GWTServiceLookup.getConfigurationService();
+ int[] updateIds = new int[selection.length];
+ int i = 0;
+ for (ListGridRecord record : selection) {
+ updateIds[i++] = record.getAttributeAsInt(DataSource.ID).intValue();
+ }
+
+ service.purgePluginConfigurationUpdates(updateIds, true, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void result) {
+ refresh();
+ Message message = new Message(
+ MSG.view_connectionSettingsHistory_table_deleteSuccessful(String
+ .valueOf(selection.length)), Message.Severity.Info, EnumSet.of(
+ Message.Option.Transient, Message.Option.Sticky));
+ CoreGUI.getMessageCenter().notify(message);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_connectionSettingsHistory_table_deleteFailure(), caught);
+ }
+ });
+ }
+ });
+ }
+
+ private String getStatusHtmlString(Record record) {
+ String html = null;
+ AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record.getAttributeAsObject(DataSource.OBJECT);
+ switch (obj.getStatus()) {
+ case SUCCESS: {
+ html = MSG.view_connectionSettingsHistory_table_statusSuccess();
+ break;
+ }
+ case INPROGRESS: {
+ html = "<p>" + MSG.view_connectionSettingsHistory_table_statusInprogress() + "</p>";
+ break;
+ }
+ case NOCHANGE: {
+ html = MSG.view_connectionSettingsHistory_table_statusNochange();
+ break;
+ }
+ case FAILURE: {
+ html = obj.getErrorMessage();
+ if (html == null) {
+ html = "<p>" + MSG.view_connectionSettingsHistory_table_statusFailure() + "</p>";
+ } else {
+ 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_connectionSettingsHistory_table_clickStatusIcon() + "</p>";
+ } else {
+ html = "<pre>" + html + "</pre>";
+ }
+ }
+ break;
+ }
+ }
+ return html;
+ }
+
+ class DataSource extends RPCDataSource<PluginConfigurationUpdate> {
+
+ public static final String ID = "id";
+ public static final String DATE_CREATED = "dateCreated";
+ public static final String LAST_UPDATED = "lastUpdated";
+ public static final String USER = "user";
+ public static final String STATUS = "status";
+ public static final String OBJECT = "object";
+
+ @Override
+ public PluginConfigurationUpdate copyValues(Record from) {
+ return (PluginConfigurationUpdate) from.getAttributeAsObject(DataSource.OBJECT);
+ }
+
+ @Override
+ public ListGridRecord copyValues(PluginConfigurationUpdate from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute(DataSource.ID, from.getId());
+ record.setAttribute(DataSource.DATE_CREATED, new Date(from.getCreatedTime()));
+ record.setAttribute(DataSource.LAST_UPDATED, new Date(from.getModifiedTime()));
+ record.setAttribute(DataSource.USER, from.getSubjectName());
+ record.setAttribute(DataSource.STATUS, from.getStatus().name());
+
+ record.setAttribute(DataSource.OBJECT, from);
+
+ return record;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+ ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
+
+ PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
+ criteria.addFilterResourceIds(HistoryPluginConfigurationView.this.resource.getId());
+
+ configurationService.findPluginConfigurationUpdatesByCriteria(criteria,
+ new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
+
+ @Override
+ public void onSuccess(PageList<PluginConfigurationUpdate> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_connectionSettingsHistory_table_failFetch(),
+ caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
index 7a29da1..b82603f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/ReportTopView.java
@@ -113,7 +113,8 @@ public class ReportTopView extends AbstractSectionedLeftNavigationView {
NavigationItem recentConfigurationChangesItem = new NavigationItem(ConfigurationHistoryView.VIEW_ID,
"subsystems/configure/Configure_16.png", new ViewFactory() {
public Canvas createView() {
- return new ConfigurationHistoryView(extendLocatorId(ConfigurationHistoryView.VIEW_ID.getName()));
+ return new ConfigurationHistoryView(extendLocatorId(ConfigurationHistoryView.VIEW_ID.getName()),
+ getGlobalPermissions().contains(Permission.MANAGE_INVENTORY));
}
});
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 dbf48f4..401359f 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
@@ -1732,7 +1732,6 @@ view_connectionSettingsDetails_somePropertiesInvalid = The following connection
view_connectionSettingsHistory_view_noperm = You do not have permissions to see the connection settings
view_connectionSettingsHistory_view_connProperties = Connection Properties
view_connectionSettingsHistory_table_failFetch = Failed to get plugin config history
-view_connectionSettingsHistory_table_title = Connection Settings History
view_connectionSettingsHistory_table_statusDetails = Status Details
view_connectionSettingsHistory_table_deleteSuccessful = You have deleted [{0}] history items
view_connectionSettingsHistory_table_deleteFailure = Failed to delete plugin configuration history
commit f98ee8d204fb4a403bf14a266f7cf94295589a64
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 13:52:12 2011 -0500
remove this file, the table will be the view now (will check that in separately)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
deleted file mode 100644
index ff35b3e..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
+++ /dev/null
@@ -1,65 +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.inventory.resource.detail.inventory;
-
-import com.smartgwt.client.widgets.Canvas;
-
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
-import org.rhq.enterprise.gui.coregui.client.ViewPath;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-
-/**
- * A view for resource plugin configuration history.
- *
- * @author John Mazzitelli
- */
-public class HistoryPluginConfigurationView extends LocatableVLayout implements BookmarkableView {
- private final ResourceComposite resourceComposite;
- private HistoryPluginConfigurationTable historyTable;
- private Canvas detailsCanvas = null;
-
- public HistoryPluginConfigurationView(String locatorId, ResourceComposite composite) {
- super(locatorId);
- this.resourceComposite = composite;
-
- historyTable = new HistoryPluginConfigurationTable(extendLocatorId("Table"), composite);
- addMember(historyTable);
- }
-
- @Override
- public void renderView(ViewPath viewPath) {
- if (viewPath.isEnd()) {
- setVisibleMember(this.historyTable);
- } else {
- int historyId = viewPath.getCurrentAsInt();
-
- if (detailsCanvas != null) {
- removeMember(detailsCanvas);
- this.detailsCanvas.destroy();
- }
-
- detailsCanvas = new HistoryPluginConfigurationSettings(extendLocatorId("SettingsView"),
- this.resourceComposite, historyId);
-
- addMember(detailsCanvas);
- setVisibleMember(detailsCanvas);
- }
- }
-}
commit bd5178f61a91718655ddd086a278810cdabe0422
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Thu Feb 24 13:42:44 2011 -0500
the start of the resource plugin config history pages
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
index 5ea1c98..d010c41 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java
@@ -83,6 +83,10 @@ public class LinkManager {
}
}
+ public static String getResourcePluginConfigurationUpdateHistoryLink(int groupId) {
+ return getResourceLink(groupId) + "/Inventory/ConnectionSettingsHistory";
+ }
+
public static String getGroupPluginConfigurationUpdateHistoryLink(int groupId) {
return getResourceGroupLink(groupId) + "/Inventory/ConnectionSettingsHistory";
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
index 25bc2dd..45bd2c4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ConfigurationGWTService.java
@@ -21,11 +21,13 @@ import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
/**
- *
+ * API for resource and plugin configurations for resources and groups.
*/
@RemoteServiceRelativePath("ConfigurationGWTService")
public interface ConfigurationGWTService extends RemoteService {
+ void purgePluginConfigurationUpdates(int[] configUpdateIds, boolean purgeInProgress) throws RuntimeException;
+
void purgeResourceConfigurationUpdates(int[] configUpdateIds, boolean purgeInProgress) throws RuntimeException;
void rollbackResourceConfiguration(int resourceId, int configHistoryId) throws RuntimeException;
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 8e6bc32..d5da970 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
@@ -58,6 +58,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceComposit
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
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.HistoryPluginConfigurationView;
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.monitoring.schedules.SchedulesView;
@@ -280,7 +281,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
updateSubTab(this.inventoryTab, this.inventoryConn, canvas, visible, true);
// same test, use above setting for 'visible'
- canvas = (visible) ? new Canvas() : null; // TODO: Add real canvas when visible
+ canvas = (visible) ? new HistoryPluginConfigurationView(this.inventoryConnHistory.extendLocatorId("View"),
+ this.resourceComposite) : null;
updateSubTab(this.inventoryTab, this.inventoryConnHistory, canvas, visible, true);
boolean canModifyMembership = globalPermissions.contains(Permission.MANAGE_INVENTORY);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationSettings.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationSettings.java
new file mode 100644
index 0000000..506e130
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationSettings.java
@@ -0,0 +1,139 @@
+/*
+ * 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.EnumSet;
+import java.util.Map;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.Overflow;
+
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
+import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.core.domain.resource.composite.ResourceComposite;
+import org.rhq.core.domain.resource.composite.ResourcePermission;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.components.buttons.BackButton;
+import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * Read only view that shows resource plugin configuration properties.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryPluginConfigurationSettings extends LocatableVLayout {
+ private final Resource resource;
+ private final ResourcePermission resourcePerms;
+ private final int resourceUpdateId;
+ private ConfigurationDefinition configurationDefinition;
+ private Configuration resourceConfiguration;
+ private ConfigurationEditor editor;
+
+ public HistoryPluginConfigurationSettings(String locatorId, ResourceComposite composite, int updateId) {
+ super(locatorId);
+ this.resource = composite.getResource();
+ this.resourcePerms = composite.getResourcePermission();
+ this.resourceUpdateId = updateId;
+
+ setMargin(5);
+ setMembersMargin(5);
+ String backPath = LinkManager.getResourcePluginConfigurationUpdateHistoryLink(this.resource.getId());
+ BackButton backButton = new BackButton(extendLocatorId("BackButton"), MSG.view_tableSection_backButton(),
+ backPath);
+ addMember(backButton);
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+ if (this.resourcePerms.isInventory()) {
+ loadConfigurationDefinition();
+ loadConfiguration();
+ } else {
+ CoreGUI.getMessageCenter().notify(new Message(MSG.view_connectionSettingsHistory_view_noperm()));
+ }
+ }
+
+ private void initEditor() {
+ if (this.configurationDefinition != null && this.resourceConfiguration != null) {
+ this.editor = new ConfigurationEditor(this.extendLocatorId("Editor"), this.configurationDefinition,
+ this.resourceConfiguration);
+ this.editor.setEditorTitle(MSG.view_connectionSettingsHistory_view_connProperties() + " - "
+ + this.resourceUpdateId);
+ this.editor.setOverflow(Overflow.AUTO);
+ this.editor.setReadOnly(true);
+ addMember(this.editor);
+ }
+ }
+
+ private void loadConfigurationDefinition() {
+ if (this.configurationDefinition == null) {
+ final ResourceType type = this.resource.getResourceType();
+ ResourceTypeRepository.Cache.getInstance().getResourceTypes(new Integer[] { type.getId() },
+ EnumSet.of(ResourceTypeRepository.MetadataType.pluginConfigurationDefinition),
+ new ResourceTypeRepository.TypesLoadedCallback() {
+ public void onTypesLoaded(Map<Integer, ResourceType> types) {
+ configurationDefinition = types.get(type.getId()).getPluginConfigurationDefinition();
+ if (configurationDefinition == null) {
+ throw new IllegalStateException("Connection settings are not supported by this group.");
+ }
+ initEditor();
+ }
+ });
+ }
+ }
+
+ private void loadConfiguration() {
+ this.resourceConfiguration = null;
+
+ PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
+ criteria.addFilterId(resourceUpdateId);
+ criteria.fetchConfiguration(true);
+
+ GWTServiceLookup.getConfigurationService().findPluginConfigurationUpdatesByCriteria(criteria,
+ new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_connectionSettingsHistory_settings_fetchFailure(resource.getName()), caught);
+ }
+
+ public void onSuccess(PageList<PluginConfigurationUpdate> results) {
+ if (results != null && results.size() > 0) {
+ resourceConfiguration = results.get(0).getConfiguration();
+ initEditor();
+ } else {
+ // should never really happen
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_connectionSettingsHistory_settings_fetchFailure(resource.getName()),
+ new Throwable("bad results"));
+ }
+ }
+ });
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationTable.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationTable.java
new file mode 100644
index 0000000..1e6ccb4
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationTable.java
@@ -0,0 +1,277 @@
+/*
+ * 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.Date;
+import java.util.EnumSet;
+import java.util.HashMap;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.ListGridFieldType;
+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.ListGrid;
+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.core.domain.configuration.AbstractConfigurationUpdate;
+import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
+import org.rhq.core.domain.configuration.PluginConfigurationUpdate;
+import org.rhq.core.domain.criteria.PluginConfigurationUpdateCriteria;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.resource.composite.ResourceComposite;
+import org.rhq.core.domain.resource.composite.ResourcePermission;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.components.table.AbstractTableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
+import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+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.LocatableHTMLPane;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
+
+/**
+ * Table showing resource plugin configuration history.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryPluginConfigurationTable extends Table<HistoryPluginConfigurationTable.DataSource> {
+ private final Resource resource;
+ private final ResourcePermission resourcePerms;
+
+ public HistoryPluginConfigurationTable(String locatorId, ResourceComposite composite) {
+ super(locatorId, MSG.view_connectionSettingsHistory_table_title());
+ this.resource = composite.getResource();
+ this.resourcePerms = composite.getResourcePermission();
+
+ setDataSource(new DataSource());
+ }
+
+ @Override
+ protected void configureTable() {
+ ListGridField fieldId = new ListGridField(DataSource.ID, MSG.common_title_version());
+ ListGridField fieldDateCreated = new ListGridField(DataSource.DATE_CREATED, MSG.common_title_dateCreated());
+ ListGridField fieldLastUpdated = new ListGridField(DataSource.LAST_UPDATED, MSG.common_title_lastUpdated());
+ ListGridField fieldUser = new ListGridField(DataSource.USER, MSG.common_title_user());
+ ListGridField fieldStatus = new ListGridField(DataSource.STATUS, MSG.common_title_status());
+
+ fieldId.setWidth("10%");
+ fieldDateCreated.setWidth("35%");
+ fieldLastUpdated.setWidth("35%");
+ fieldUser.setWidth("*");
+ fieldStatus.setWidth("10%");
+
+ fieldStatus.setType(ListGridFieldType.ICON);
+ HashMap<String, String> statusIcons = new HashMap<String, String>(4);
+ statusIcons.put(ConfigurationUpdateStatus.SUCCESS.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.SUCCESS));
+ statusIcons.put(ConfigurationUpdateStatus.FAILURE.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.FAILURE));
+ statusIcons.put(ConfigurationUpdateStatus.INPROGRESS.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.INPROGRESS));
+ statusIcons.put(ConfigurationUpdateStatus.NOCHANGE.name(), ImageManager
+ .getPluginConfigurationIcon(ConfigurationUpdateStatus.NOCHANGE));
+ fieldStatus.setValueIcons(statusIcons);
+ fieldStatus.addRecordClickHandler(new RecordClickHandler() {
+ @Override
+ public void onRecordClick(RecordClickEvent event) {
+ final Window winModal = new LocatableWindow(HistoryPluginConfigurationTable.this
+ .extendLocatorId("statusDetailsWin"));
+ winModal.setTitle(MSG.view_connectionSettingsHistory_table_statusDetails());
+ 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(HistoryPluginConfigurationTable.this
+ .extendLocatorId("statusDetailsPane"));
+ htmlPane.setMargin(10);
+ htmlPane.setDefaultWidth(500);
+ htmlPane.setDefaultHeight(400);
+ htmlPane.setContents(getStatusHtmlString(event.getRecord()));
+ winModal.addItem(htmlPane);
+ winModal.show();
+ }
+ });
+ fieldStatus.setShowHover(true);
+ fieldStatus.setHoverCustomizer(new HoverCustomizer() {
+ @Override
+ public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
+ String html = getStatusHtmlString(record);
+ return html;
+ }
+ });
+
+ ListGrid listGrid = getListGrid();
+ listGrid.setFields(fieldId, fieldDateCreated, fieldLastUpdated, fieldUser, fieldStatus);
+
+ addTableAction(extendLocatorId("deleteAction"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
+ new AbstractTableAction(this.resourcePerms.isInventory() ? TableActionEnablement.ANY
+ : TableActionEnablement.NEVER) {
+
+ @Override
+ public void executeAction(final ListGridRecord[] selection, Object actionValue) {
+ if (selection == null || selection.length == 0) {
+ return;
+ }
+
+ ConfigurationGWTServiceAsync service = GWTServiceLookup.getConfigurationService();
+ int[] updateIds = new int[selection.length];
+ int i = 0;
+ for (ListGridRecord record : selection) {
+ updateIds[i++] = record.getAttributeAsInt(DataSource.ID).intValue();
+ }
+
+ service.purgePluginConfigurationUpdates(updateIds, true, new AsyncCallback<Void>() {
+ @Override
+ public void onSuccess(Void result) {
+ refresh();
+ Message message = new Message(
+ MSG.view_connectionSettingsHistory_table_deleteSuccessful(String
+ .valueOf(selection.length)), Message.Severity.Info, EnumSet.of(
+ Message.Option.Transient, Message.Option.Sticky));
+ CoreGUI.getMessageCenter().notify(message);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_connectionSettingsHistory_table_deleteFailure(), caught);
+ }
+ });
+ }
+ });
+ }
+
+ private String getStatusHtmlString(Record record) {
+ String html = null;
+ AbstractConfigurationUpdate obj = (AbstractConfigurationUpdate) record.getAttributeAsObject(DataSource.OBJECT);
+ switch (obj.getStatus()) {
+ case SUCCESS: {
+ html = MSG.view_connectionSettingsHistory_table_statusSuccess();
+ break;
+ }
+ case INPROGRESS: {
+ html = "<p>" + MSG.view_connectionSettingsHistory_table_statusInprogress() + "</p>";
+ break;
+ }
+ case NOCHANGE: {
+ html = MSG.view_connectionSettingsHistory_table_statusNochange();
+ break;
+ }
+ case FAILURE: {
+ html = obj.getErrorMessage();
+ if (html == null) {
+ html = "<p>" + MSG.view_connectionSettingsHistory_table_statusFailure() + "</p>";
+ } else {
+ 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_connectionSettingsHistory_table_clickStatusIcon() + "</p>";
+ } else {
+ html = "<pre>" + html + "</pre>";
+ }
+ }
+ break;
+ }
+ }
+ return html;
+ }
+
+ class DataSource extends RPCDataSource<PluginConfigurationUpdate> {
+
+ public static final String ID = "id";
+ public static final String DATE_CREATED = "dateCreated";
+ public static final String LAST_UPDATED = "lastUpdated";
+ public static final String USER = "user";
+ public static final String STATUS = "status";
+ public static final String OBJECT = "object";
+
+ @Override
+ public PluginConfigurationUpdate copyValues(Record from) {
+ return (PluginConfigurationUpdate) from.getAttributeAsObject(DataSource.OBJECT);
+ }
+
+ @Override
+ public ListGridRecord copyValues(PluginConfigurationUpdate from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute(DataSource.ID, from.getId());
+ record.setAttribute(DataSource.DATE_CREATED, new Date(from.getCreatedTime()));
+ record.setAttribute(DataSource.LAST_UPDATED, new Date(from.getModifiedTime()));
+ record.setAttribute(DataSource.USER, from.getSubjectName());
+ record.setAttribute(DataSource.STATUS, from.getStatus().name());
+
+ record.setAttribute(DataSource.OBJECT, from);
+
+ return record;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response) {
+ ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
+
+ PluginConfigurationUpdateCriteria criteria = new PluginConfigurationUpdateCriteria();
+ criteria.addFilterResourceIds(HistoryPluginConfigurationTable.this.resource.getId());
+
+ configurationService.findPluginConfigurationUpdatesByCriteria(criteria,
+ new AsyncCallback<PageList<PluginConfigurationUpdate>>() {
+
+ @Override
+ public void onSuccess(PageList<PluginConfigurationUpdate> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_connectionSettingsHistory_table_failFetch(),
+ caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
new file mode 100644
index 0000000..ff35b3e
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/HistoryPluginConfigurationView.java
@@ -0,0 +1,65 @@
+/*
+ * 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 com.smartgwt.client.widgets.Canvas;
+
+import org.rhq.core.domain.resource.composite.ResourceComposite;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+
+/**
+ * A view for resource plugin configuration history.
+ *
+ * @author John Mazzitelli
+ */
+public class HistoryPluginConfigurationView extends LocatableVLayout implements BookmarkableView {
+ private final ResourceComposite resourceComposite;
+ private HistoryPluginConfigurationTable historyTable;
+ private Canvas detailsCanvas = null;
+
+ public HistoryPluginConfigurationView(String locatorId, ResourceComposite composite) {
+ super(locatorId);
+ this.resourceComposite = composite;
+
+ historyTable = new HistoryPluginConfigurationTable(extendLocatorId("Table"), composite);
+ addMember(historyTable);
+ }
+
+ @Override
+ public void renderView(ViewPath viewPath) {
+ if (viewPath.isEnd()) {
+ setVisibleMember(this.historyTable);
+ } else {
+ int historyId = viewPath.getCurrentAsInt();
+
+ if (detailsCanvas != null) {
+ removeMember(detailsCanvas);
+ this.detailsCanvas.destroy();
+ }
+
+ detailsCanvas = new HistoryPluginConfigurationSettings(extendLocatorId("SettingsView"),
+ this.resourceComposite, historyId);
+
+ addMember(detailsCanvas);
+ setVisibleMember(detailsCanvas);
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
index 9668517..a301b44 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ConfigurationGWTServiceImpl.java
@@ -31,7 +31,7 @@ import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
- *
+ * API for resource and plugin configurations for resources and groups.
*/
public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implements ConfigurationGWTService {
@@ -47,6 +47,17 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
private ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
private ResourceGroupManagerLocal groupManager = LookupUtil.getResourceGroupManager();
+ @Override
+ public void purgePluginConfigurationUpdates(int[] configUpdateIds, boolean purgeInProgress) throws RuntimeException {
+ try {
+ this.configurationManager.purgePluginConfigurationUpdates(getSessionSubject(), configUpdateIds,
+ purgeInProgress);
+ } catch (Throwable t) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(t));
+ }
+ }
+
+ @Override
public void purgeResourceConfigurationUpdates(int[] configUpdateIds, boolean purgeInProgress)
throws RuntimeException {
try {
@@ -57,6 +68,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public void rollbackResourceConfiguration(int resourceId, int configHistoryId) throws RuntimeException {
try {
configurationManager.rollbackResourceConfiguration(getSessionSubject(), resourceId, configHistoryId);
@@ -65,6 +77,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public ResourceConfigurationUpdate getLatestResourceConfigurationUpdate(int resourceId) throws RuntimeException {
try {
ResourceConfigurationUpdate update = configurationManager.getLatestResourceConfigurationUpdate(
@@ -75,6 +88,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public Configuration getPluginConfiguration(int resourceId) throws RuntimeException {
try {
Configuration configuration = configurationManager.getPluginConfiguration(getSessionSubject(), resourceId);
@@ -84,6 +98,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public ConfigurationDefinition getPluginConfigurationDefinition(int resourceTypeId) throws RuntimeException {
try {
ConfigurationDefinition definition = configurationManager.getPluginConfigurationDefinitionForResourceType(
@@ -94,6 +109,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public Configuration getResourceConfiguration(int resourceId) throws RuntimeException {
try {
Configuration configuration = configurationManager
@@ -104,6 +120,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public ConfigurationDefinition getResourceConfigurationDefinition(int resourceTypeId) throws RuntimeException {
try {
ConfigurationDefinition definition = configurationManager
@@ -114,6 +131,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public PageList<ResourceConfigurationUpdate> findResourceConfigurationUpdates(Integer resourceId, Long beginDate,
Long endDate, boolean suppressOldest, PageControl pc) throws RuntimeException {
try {
@@ -125,6 +143,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public ResourceConfigurationUpdate updateResourceConfiguration(int resourceId, Configuration configuration)
throws RuntimeException {
try {
@@ -136,6 +155,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public PluginConfigurationUpdate updatePluginConfiguration(int resourceId, Configuration configuration)
throws RuntimeException {
try {
@@ -147,6 +167,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public PageList<ResourceConfigurationUpdate> findResourceConfigurationUpdatesByCriteria(
ResourceConfigurationUpdateCriteria criteria) throws RuntimeException {
try {
@@ -158,6 +179,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public PageList<PluginConfigurationUpdate> findPluginConfigurationUpdatesByCriteria(
PluginConfigurationUpdateCriteria criteria) throws RuntimeException {
try {
@@ -169,6 +191,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public PageList<GroupResourceConfigurationUpdate> findGroupResourceConfigurationUpdatesByCriteria(
GroupResourceConfigurationUpdateCriteria criteria) throws RuntimeException {
try {
@@ -181,6 +204,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public PageList<GroupPluginConfigurationUpdate> findGroupPluginConfigurationUpdatesByCriteria(
GroupPluginConfigurationUpdateCriteria criteria) throws RuntimeException {
try {
@@ -192,6 +216,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public List<DisambiguationReport<ResourceConfigurationComposite>> findResourceConfigurationsForGroup(int groupId)
throws RuntimeException {
try {
@@ -212,6 +237,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public List<DisambiguationReport<ResourceConfigurationComposite>> findPluginConfigurationsForGroup(int groupId)
throws RuntimeException {
try {
@@ -231,6 +257,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public List<DisambiguationReport<ResourceConfigurationComposite>> findPluginConfigurationsForGroupUpdate(
int groupUpdateId) throws RuntimeException {
try {
@@ -250,6 +277,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public void updateResourceConfigurationsForGroup(int groupId,
List<ResourceConfigurationComposite> resourceConfigurations) throws RuntimeException {
try {
@@ -261,6 +289,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public void updatePluginConfigurationsForGroup(int groupId,
List<ResourceConfigurationComposite> pluginConfigurations) throws RuntimeException {
try {
@@ -272,6 +301,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public void deleteGroupPluginConfigurationUpdate(Integer groupId, Integer[] groupPluginConfigUpdateIds)
throws RuntimeException {
try {
@@ -282,6 +312,7 @@ public class ConfigurationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public void deleteGroupResourceConfigurationUpdate(Integer groupId, Integer[] groupResourceConfigUpdateIds)
throws RuntimeException {
try {
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 d2ad927..dbf48f4 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
@@ -1674,7 +1674,7 @@ view_group_resConfig_edit_saveFailure = Failed to initiate group configuration u
view_group_resConfig_edit_valid = All configuration properties have valid values, so the configuration can now be saved
view_group_resConfig_edit_invalid = The following configuration properties have invalid values and must be corrected before the configuration can be saved: [{0}]
view_group_pluginConfig_view_noperm = You do not have permissions to see the connection settings
-view_group_pluginConfig_view_groupProperties = Group Properties
+view_group_pluginConfig_view_groupProperties = Group Properties
view_group_pluginConfig_table_failFetch = Failed to get group plugin config history
view_group_pluginConfig_table_title = Group Connection Settings History
view_group_pluginConfig_table_statusDetails = Status Details
@@ -1727,6 +1727,22 @@ view_connectionSettingsDetails_messageDetailed_updateSuccess = Connection settin
view_connectionSettingsDetails_allPropertiesValid = All connection settings have valid values, so the settings can now be saved.
view_connectionSettingsDetails_somePropertiesInvalid = The following connection settings have invalid values: {0}. The values must be corrected before the settings can be saved.
+# Connection History
+#-----------------------------------------
+view_connectionSettingsHistory_view_noperm = You do not have permissions to see the connection settings
+view_connectionSettingsHistory_view_connProperties = Connection Properties
+view_connectionSettingsHistory_table_failFetch = Failed to get plugin config history
+view_connectionSettingsHistory_table_title = Connection Settings History
+view_connectionSettingsHistory_table_statusDetails = Status Details
+view_connectionSettingsHistory_table_deleteSuccessful = You have deleted [{0}] history items
+view_connectionSettingsHistory_table_deleteFailure = Failed to delete plugin configuration history
+view_connectionSettingsHistory_table_statusSuccess = This configuration update was successful
+view_connectionSettingsHistory_table_statusInprogress = This configuration update is still in progress
+view_connectionSettingsHistory_table_statusNochange = No changes were made to this configuration
+view_connectionSettingsHistory_table_statusFailure = This configuration update failed
+view_connectionSettingsHistory_table_clickStatusIcon = Click the status icon for full details
+view_connectionSettingsHistory_settings_fetchFailure = Failed to retrieve connection settings for [{0}]
+
# Resource Resource Groups
#-----------------------------------------
view_resourceResourceGroupList_error_fetchFailure = Failed to fetch Resource''s groups.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
index 4b99c06..5c82990 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerBean.java
@@ -808,8 +808,7 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
long duration = request.getDuration();
if (duration > timeout) {
- log.info("Group Resource configuration update request seems to have been orphaned - timing it out: "
- + request);
+ log.info("Group Resource config update request seems to be orphaned - timing it out: " + request);
request.setErrorMessage("Timed out - did not complete after " + duration + " ms"
+ " (the timeout period was " + timeout + " ms)");
@@ -979,6 +978,19 @@ public class ConfigurationManagerBean implements ConfigurationManagerLocal, Conf
return;
}
+ public void purgePluginConfigurationUpdates(Subject subject, int[] configurationUpdateIds, boolean purgeInProgress) {
+ if ((configurationUpdateIds == null) || (configurationUpdateIds.length == 0)) {
+ return;
+ }
+
+ // TODO [mazz]: ugly - let's make this more efficient, just getting this to work first
+ for (int configurationUpdateId : configurationUpdateIds) {
+ purgePluginConfigurationUpdate(subject, configurationUpdateId, purgeInProgress);
+ }
+
+ return;
+ }
+
public void purgeResourceConfigurationUpdate(Subject subject, int configurationUpdateId, boolean purgeInProgress) {
ResourceConfigurationUpdate doomedRequest = entityManager.find(ResourceConfigurationUpdate.class,
configurationUpdateId);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
index f2cab8a..37d8a06 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/configuration/ConfigurationManagerLocal.java
@@ -201,9 +201,35 @@ public interface ConfigurationManagerLocal {
ConfigurationUpdateResponse executePluginConfigurationUpdate(PluginConfigurationUpdate update);
+ /**
+ * This deletes the update information belonging to the {@link AbstractResourceConfigurationUpdate} object with the
+ * given ID. Once this returns, the complete audit trail for that update will be gone and you will not be able to
+ * rollback to that configuration.
+ *
+ * <p>Under normal circumstances, you will not want to purge an update that is currently in progress. However, there
+ * may be conditions in which an update request "gets stuck" in the in-progress state, even though you know the
+ * agent will never report the completed request (typically caused by an unusual crash of the agent). In this case,
+ * you should pass <code>true</code> in for the <code>purgeInProgress</code> parameter to tell this method to delete
+ * the request even if it says it is in-progress.
+ *
+ * @param subject the user who is requesting the purge
+ * @param configurationUpdateId identifies the update record to be deleted
+ * @param purgeInProgress if <code>true</code>, delete it even if its
+ * {@link ConfigurationUpdateStatus#INPROGRESS in progress}
+ */
public void purgePluginConfigurationUpdate(Subject subject, int configurationUpdateId, boolean purgeInProgress);
/**
+ * This deletes one or more plugin configuration updates from the resource's plugin config history.
+ *
+ * @param subject the user who is requesting the purge
+ * @param configurationUpdateIds identifies the update records to be deleted
+ * @param purgeInProgress if <code>true</code>, delete those even if
+ * {@link ConfigurationUpdateStatus#INPROGRESS in progress}
+ */
+ void purgePluginConfigurationUpdates(Subject subject, int[] configurationUpdateIds, boolean purgeInProgress);
+
+ /**
* This deletes the update information belonging to the {@link AbstractResourceConfigurationUpdate} object with the
* given ID. Once this returns, the complete audit trail for that update will be gone and you will not be able to
* rollback to that configuration.
13 years, 3 months