[rhq] 3 commits - modules/enterprise
by Simeon Pinder
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java | 17 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java | 107 +++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java | 1
modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java | 24 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java | 5
6 files changed, 134 insertions(+), 30 deletions(-)
New commits:
commit dea3ebef4e4e58af479d4701cd71ad04c63e34d8
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Feb 4 17:14:15 2011 -0500
some refactoring and more documentation.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index 2dd12d6..4da58e2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -52,6 +52,20 @@ import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
* Else check server-side logged in state
* If logged out on server-side, LoginView will be shown, which sets local loggedIn bit to false.
*
+ * Additionally, all login checks go through checkLoginStatus where the following happens
+ *
+ * 1)HTTP Get request sent to portal.war SessionAccessServlet which when logged in:
+ * yes)logged in returns (Subject.id):(Server side session id):(Last Accessed time)
+ * no )empty text and Login screen displayed
+ *
+ * 2)If logged in there are two flavors of Subject logins that will occur
+ * a)Regular RHQ logins and case sensitive LDAP users with established RHQ accounts: Subject.id > 0
+ * b)LDAP users i)registering new user ii)Existing but case-insensitive ldap username used : Subject.id == 0
+ *
+ * Case a) is trivial and well understood. With case b) the credentials are used to retrieve or create RHQ Subject
+ * instances by terminating previous sessions and creating new ones to be used with all future client
+ * side UI requests. In case b) the WebUser is updated appropriately.
+ *
* @author Joseph Marques
* @author Jay Shaughnessy
* @author Simeon Pinder
@@ -237,15 +251,16 @@ public class UserSessionManager {
}
//pipe through method to handle case insensitive
- public void onSuccess(PageList<Subject> results) {
- if (results.size() == 0) {//no case insensitive matches found, launch registration
+ public void onSuccess(PageList<Subject> subjects) {
+ //no case insensitive matches found, launch registration
+ if (subjects.size() == 0) {
Log.trace("Proceeding with registration for ldap user '" + user + "'.");
sessionState = State.IS_REGISTERING;
new LoginView(LOCATOR_ID).showRegistrationDialog(subject.getName(),
sessionId, password, callback);
return;
} else {//launch case sensitive code handling
- final Subject locatedSubject = results.get(0);
+ final Subject locatedSubject = subjects.get(0);
Log
.trace("Checked credentials and determined that ldap case insensitive login '"
+ locatedSubject.getName()
@@ -268,7 +283,6 @@ public class UserSessionManager {
public void onSuccess(final Subject checked) {
Log.trace("Proceeding with case sensitive login of ldap user '"
+ user + "'.");
-
callback.onSuccess(checked);
return;
}
@@ -321,11 +335,8 @@ public class UserSessionManager {
}
});
- // reset the session subject to the latest, for wrapping in user preferences
- sessionSubject = validSessionSubject;
- userPreferences = new UserPreferences(sessionSubject);
- //calling refresh here will set State to IS_LOGGED_IN
- refresh();
+ //indicate success to 'login' Callback
+ callback.onSuccess(validSessionSubject);
}
});
}//end of server side session check;
@@ -353,29 +364,29 @@ public class UserSessionManager {
/** Takes an updated Subject and signals SessionAccessServlet in portal.war to update the associated WebUser
* because for this specific authenticated user. Currently assumes Subject instances returned from SubjectManagerBean.processSubjectForLdap.
*
- * @param checked Subject with updated session
+ * @param loggedInSubject Subject with updated session
*/
- private static void scheduleWebUserUpdate(final Subject checked) {
+ private static void scheduleWebUserUpdate(final Subject loggedInSubject) {
final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
//add header to signal SessionAccessServlet to update the WebUser for the successfully logged in user
- b.setHeader(WEB_USER_UPDATE, String.valueOf(checked.getSessionId()));
+ b.setHeader(WEB_USER_UPDATE, String.valueOf(loggedInSubject.getSessionId()));
try {
b.setCallback(new RequestCallback() {
public void onResponseReceived(final Request request, final Response response) {
Log.trace("Successfully submitted request to update server side WebUser for subject '"
- + checked.getName() + "'.");
+ + loggedInSubject.getName() + "'.");
}
@Override
public void onError(Request request, Throwable exception) {
Log.trace("Failed to submit request to update server side WebUser for subject '"
- + checked.getName() + "'."
+ + loggedInSubject.getName() + "'."
+ ((exception != null ? exception.getMessage() : " Exception ref null.")));
}
});
b.send();
} catch (RequestException e) {
- Log.trace("Failure submitting update request for WebUser '" + checked.getName() + "'."
+ Log.trace("Failure submitting update request for WebUser '" + loggedInSubject.getName() + "'."
+ (e != null ? e.getMessage() : "RequestException reference is null."));
}
}
commit d0701a76dd6093333e9658876a432cebb84a7fea
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Feb 4 13:30:44 2011 -0500
i)Fixed BZ: 662073 via modifying sessionAccessServlet to additionally update WebUser.
ii)Fixed new user registration configuration issue.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index e8e6958..2240f77 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
@@ -469,6 +469,7 @@ public class LoginView extends LocatableCanvas {
Log.trace("Succesfully registered the new ldap Subject.");
window.destroy();
loginShowing = false;
+ //indicate to login callback success
callback.onSuccess(checked);
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index ed7c24d..2dd12d6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -54,6 +54,7 @@ import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences;
*
* @author Joseph Marques
* @author Jay Shaughnessy
+ * @author Simeon Pinder
*/
public class UserSessionManager {
private static final Messages MSG = CoreGUI.getMessages();
@@ -66,6 +67,8 @@ public class UserSessionManager {
// The web session scheduled to be logged out on the server side
private static final String DOOMED_SESSION_NAME = "RHQ_DoomedSession";
+ // header identifier for triggering updating portal war webUser
+ private static final String WEB_USER_UPDATE = "rhq_webuser_update";
private static final String LOCATOR_ID = "SessionManagerLogin";
private static Subject sessionSubject;
@@ -266,12 +269,10 @@ public class UserSessionManager {
Log.trace("Proceeding with case sensitive login of ldap user '"
+ user + "'.");
- sessionState = State.IS_LOGGED_IN;
- userPreferences = new UserPreferences(checked);
- refresh();
callback.onSuccess(checked);
return;
}
+
});//end processSubjectForLdap call
}//end of case insensitive processing
}
@@ -349,6 +350,36 @@ public class UserSessionManager {
}
}
+ /** Takes an updated Subject and signals SessionAccessServlet in portal.war to update the associated WebUser
+ * because for this specific authenticated user. Currently assumes Subject instances returned from SubjectManagerBean.processSubjectForLdap.
+ *
+ * @param checked Subject with updated session
+ */
+ private static void scheduleWebUserUpdate(final Subject checked) {
+ final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
+ //add header to signal SessionAccessServlet to update the WebUser for the successfully logged in user
+ b.setHeader(WEB_USER_UPDATE, String.valueOf(checked.getSessionId()));
+ try {
+ b.setCallback(new RequestCallback() {
+ public void onResponseReceived(final Request request, final Response response) {
+ Log.trace("Successfully submitted request to update server side WebUser for subject '"
+ + checked.getName() + "'.");
+ }
+
+ @Override
+ public void onError(Request request, Throwable exception) {
+ Log.trace("Failed to submit request to update server side WebUser for subject '"
+ + checked.getName() + "'."
+ + ((exception != null ? exception.getMessage() : " Exception ref null.")));
+ }
+ });
+ b.send();
+ } catch (RequestException e) {
+ Log.trace("Failure submitting update request for WebUser '" + checked.getName() + "'."
+ + (e != null ? e.getMessage() : "RequestException reference is null."));
+ }
+ }
+
public static void login() {
login(null, null);
}
@@ -361,12 +392,30 @@ public class UserSessionManager {
public static void login(String user, String password) {
checkLoginStatus(user, password, new AsyncCallback<Subject>() {
- public void onSuccess(final Subject result) {
+ public void onSuccess(final Subject loggedInSubject) {
// will build UI if necessary, then fires history event
sessionState = State.IS_LOGGED_IN;
+ int storedSessionSubjectId = -1;
+ if (sessionSubject != null) {
+ sessionSubject.getId();
+ }
+
//update the sessionSubject appropriately
- sessionSubject = result;
+ sessionSubject = loggedInSubject;
+ sessionState = State.IS_LOGGED_IN;
+ userPreferences = new UserPreferences(loggedInSubject);
+ refresh();
+
+ //conditionally update session information and server side WebUser when updated.
+ if ((sessionSubject != null) && (loggedInSubject.getId() != storedSessionSubjectId)) {
+ //update the sessionSubject appropriately
+ sessionSubject = loggedInSubject;
+ //update the sessionId
+ saveSessionId(String.valueOf(loggedInSubject.getSessionId().intValue()));
+ //Update the portal war WebUser now that we've updated subject+session
+ scheduleWebUserUpdate(loggedInSubject);
+ }
CoreGUI.get().buildCoreUI();
}
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
index 037e6b9..7c388b1 100644
--- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
+++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/authentication/SessionAccessServlet.java
@@ -63,13 +63,37 @@ public class SessionAccessServlet extends HttpServlet {
//if a session does not already exist this call will create one
HttpSession session = request.getSession();
+ //check for web user update request from coregui
+ String sessionWebUserUpdate = request.getHeader("rhq_webuser_update");
+
/*
* check if the user object is in the session. if not, then the user is not validated, the response output
* will not contain the "<subjectId>:<sessionId>:<lastAccess>", which will forward the user to the login page
*/
WebUser webUser = SessionUtils.getWebUser(session);
+
if (webUser != null && webUser.getSubject() != null) {
+ //if sessionWebUserUpdate header sent then request for WebUser to be updated
+ if ((sessionWebUserUpdate != null) && (!sessionWebUserUpdate.trim().isEmpty())) {
+ //if webUser.getSubject.getName is same as user with session id passed in
+ try {
+ //attempt to retrieve Subject for the requested session update
+ Subject currentSubject = SessionManager.getInstance().getSubject(
+ Integer.valueOf(sessionWebUserUpdate));
+ if (currentSubject != null) {//located associated subject
+ //if userNames match(case insensitive) then update webUser appropriately and re-associate in session
+ if (webUser.getSubject().getName().equalsIgnoreCase(currentSubject.getName())) {
+ webUser = new WebUser(currentSubject);
+ SessionUtils.setWebUser(session, webUser);
+ }
+ }
+ } catch (SessionNotFoundException snfe) {
+ } catch (NumberFormatException e) {
+ } catch (SessionTimeoutException e) {
+ }
+ }
+
// the web user exists, so update our SessionManager's session last-access-time
Subject subject = webUser.getSubject();
try {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
index 1941085..aa657ad 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/auth/SubjectManagerBean.java
@@ -168,7 +168,7 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
}
if (authorizationManager.isSystemSuperuser(subjectToModify) && !subjectToModify.getFactive()) {
throw new PermissionException("You cannot disable system user [" + subjectToModify.getName()
- + "] - it must always be active.");
+ + "] - it must always be active.");
}
// Reset the roles, LDAP roles, and owned groups according to the current settings as this method will not
@@ -501,6 +501,9 @@ public class SubjectManagerBean implements SubjectManagerLocal, SubjectManagerRe
// new subject in order to do it with his own credentials
logout(subject.getSessionId().intValue());
subject = login(subject.getName(), subjectPassword);
+ //insert empty configuration to start
+ Configuration newUserConfig = new Configuration();
+ subject.setUserConfiguration(newUserConfig);
}
// //either way need to refresh the WebUser
// if ((request != null) && (request.getSession() != null)) {
commit 611daf5a547b08ed3b452c9c951e30c114b555b0
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Thu Feb 3 13:47:16 2011 -0500
fix for blank dash with case insensitive login and a few other cosmetic fixes.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
index cc50eb8..e8e6958 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
@@ -258,6 +258,7 @@ public class LoginView extends LocatableCanvas {
IButton okButton = new LocatableIButton(inputForm.extendLocatorId("OK"), MSG.common_button_ok());
okButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
+
//F5 refresh check? If they've reloaded the form for some reason then bail.
boolean credentialsEmpty = ((user == null) || (user.trim().isEmpty()) || (password == null) || (password
.trim().isEmpty()));
@@ -271,12 +272,17 @@ public class LoginView extends LocatableCanvas {
if (inputForm.validate()) {
Log.trace("Successfully validated all data for user registration.");
//populate form
- inputForm.setValue(FIRST, String.valueOf(first.getValue()));
- inputForm.setValue(LAST, String.valueOf(last.getValue()));
+ if (first.getValue() != null)
+ inputForm.setValue(FIRST, String.valueOf(first.getValue()));
+ if (last.getValue() != null)
+ inputForm.setValue(LAST, String.valueOf(last.getValue()));
inputForm.setValue(USERNAME, String.valueOf(username.getValue()));
- inputForm.setValue(EMAIL, String.valueOf(email.getValue()));
- inputForm.setValue(PHONE, String.valueOf(phone.getValue()));
- inputForm.setValue(DEPARTMENT, String.valueOf(department.getValue()));
+ if (email.getValue() != null)
+ inputForm.setValue(EMAIL, String.valueOf(email.getValue()));
+ if (phone.getValue() != null)
+ inputForm.setValue(PHONE, String.valueOf(phone.getValue()));
+ if (department.getValue() != null)
+ inputForm.setValue(DEPARTMENT, String.valueOf(department.getValue()));
inputForm.setValue(SESSIONID, sessionId);
inputForm.setValue(PASSWORD, password);
registerLdapUser(LoginView.this.extendLocatorId("RegisterLdap"), inputForm, callback);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
index b345cff..ed7c24d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java
@@ -102,7 +102,8 @@ public class UserSessionManager {
public static void checkLoginStatus(final String user, final String password, final AsyncCallback<Subject> callback) {
BrowserUtility.forceIe6Hacks();
-
+ //initiate request to portal.war(SessionAccessServlet) to retrieve existing session info if exists
+ //session has valid user then <subjectId>:<sessionId>:<lastAccess> else ""
final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, "/sessionAccess");
try {
b.setCallback(new RequestCallback() {
@@ -212,7 +213,6 @@ public class UserSessionManager {
new LoginView(LOCATOR_ID).showLoginDialog();
return;
}
-
// BZ-586435: insert case insensitivity for usernames with ldap auth
// locate first matching subject and attach.
SubjectCriteria subjectCriteria = new SubjectCriteria();
@@ -242,7 +242,7 @@ public class UserSessionManager {
sessionId, password, callback);
return;
} else {//launch case sensitive code handling
- Subject locatedSubject = results.get(0);
+ final Subject locatedSubject = results.get(0);
Log
.trace("Checked credentials and determined that ldap case insensitive login '"
+ locatedSubject.getName()
@@ -251,6 +251,7 @@ public class UserSessionManager {
+ "'");
//use the original username to pass session check.
subject.setName(user);
+
GWTServiceLookup.getSubjectService().processSubjectForLdap(subject,
password, new AsyncCallback<Subject>() {
public void onFailure(Throwable caught) {
@@ -261,23 +262,22 @@ public class UserSessionManager {
return;
}
- public void onSuccess(Subject checked) {
- Log.trace("Proceeding with registration for ldap user '" + user
- + "'.");
+ public void onSuccess(final Subject checked) {
+ Log.trace("Proceeding with case sensitive login of ldap user '"
+ + user + "'.");
+
sessionState = State.IS_LOGGED_IN;
userPreferences = new UserPreferences(checked);
refresh();
-
callback.onSuccess(checked);
return;
}
});//end processSubjectForLdap call
- }
+ }//end of case insensitive processing
}
});//end findSubjectsByCriteria
} else {//else send through regular session check
-
SubjectCriteria criteria = new SubjectCriteria();
criteria.fetchConfiguration(true);
criteria.addFilterId(subjectId);
@@ -308,12 +308,14 @@ public class UserSessionManager {
Log.warn("Errors occurred processing subject for LDAP."
+ caught.getMessage());
//TODO: pass informative message to Login UI.
+ callback.onSuccess(validSessionSubject);
return;
}
public void onSuccess(Subject result) {
Log.trace("Succesfully processed subject '"
+ validSessionSubject.getName() + "' for LDAP.");
+ callback.onSuccess(validSessionSubject);
return;
}
});
@@ -321,15 +323,13 @@ public class UserSessionManager {
// reset the session subject to the latest, for wrapping in user preferences
sessionSubject = validSessionSubject;
userPreferences = new UserPreferences(sessionSubject);
+ //calling refresh here will set State to IS_LOGGED_IN
refresh();
- sessionState = State.IS_LOGGED_IN;
- callback.onSuccess(validSessionSubject);
- return;
}
});
}//end of server side session check;
- } else {
+ } else {
//invalid client session. Back to login
sessionState = State.IS_LOGGED_OUT;
new LoginView(LOCATOR_ID).showLoginDialog();
@@ -361,10 +361,13 @@ public class UserSessionManager {
public static void login(String user, String password) {
checkLoginStatus(user, password, new AsyncCallback<Subject>() {
- public void onSuccess(Subject result) {
+ public void onSuccess(final Subject result) {
// will build UI if necessary, then fires history event
sessionState = State.IS_LOGGED_IN;
+ //update the sessionSubject appropriately
+ sessionSubject = result;
+
CoreGUI.get().buildCoreUI();
}
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 5a19688..55cacda 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
@@ -288,7 +288,10 @@ public class DashboardView extends LocatableVLayout {
Integer[] refreshValues = { STOP_VALUE, REFRESH1_VALUE, REFRESH5_VALUE, REFRESH10_VALUE };
refreshMenuMappings = new HashMap<Integer, String>();
refreshMenuItems = new MenuItem[refreshIntervals.length];
- int retrievedRefreshInterval = UserSessionManager.getUserPreferences().getPageRefreshInterval();
+ int retrievedRefreshInterval = REFRESH1_VALUE;
+ if (null != UserSessionManager.getUserPreferences()) {
+ retrievedRefreshInterval = UserSessionManager.getUserPreferences().getPageRefreshInterval();
+ }
for (int i = 0; i < refreshIntervals.length; i++) {
MenuItem item = new MenuItem(refreshIntervals[i], "");
item.addClickHandler(menuClick);
@@ -587,7 +590,10 @@ public class DashboardView extends LocatableVLayout {
public void updateRefreshMenu() {
if (refreshMenuItems != null) {
- int retrievedRefreshInterval = UserSessionManager.getUserPreferences().getPageRefreshInterval();
+ int retrievedRefreshInterval = REFRESH1_VALUE;
+ if (null != UserSessionManager.getUserPreferences()) {
+ retrievedRefreshInterval = UserSessionManager.getUserPreferences().getPageRefreshInterval();
+ }
String currentSelection = refreshMenuMappings.get(retrievedRefreshInterval);
if (currentSelection != null) {//iterate over menu items and update icon details
for (int i = 0; i < refreshMenuItems.length; i++) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java
index b361fb9..165ae4e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/rpc/TrackingRemoteServiceProxy.java
@@ -53,6 +53,7 @@ public class TrackingRemoteServiceProxy extends RemoteServiceProxy {
private static final Set<String> bypassMethods = new HashSet<String>();
static {
bypassMethods.add("SubjectGWTService_Proxy.findSubjectsByCriteria");
+ bypassMethods.add("SubjectGWTService_Proxy.processSubjectForLdap");
bypassMethods.add("SubjectGWTService_Proxy.logout");
}
13 years, 4 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java | 286 +++++-----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/UnitType.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java | 44 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java | 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TypeConversionUtility.java | 26
9 files changed, 232 insertions(+), 158 deletions(-)
New commits:
commit aa921e544cbff948cb15809e8f4d9afd2fe91d26
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Feb 4 17:23:35 2011 -0500
finish DurationItem widget
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
index 5a06a57..e882254 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
@@ -25,20 +25,24 @@ package org.rhq.enterprise.gui.coregui.client.components.form;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.ComboBoxItem;
+import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.IntegerItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
+import org.rhq.enterprise.gui.coregui.client.util.TypeConversionUtility;
import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
+import java.util.EnumSet;
import java.util.LinkedHashMap;
import java.util.Set;
import java.util.TreeSet;
/**
- * A form item for entering a time duration - consists of an IntegerItem for entering the amount of time and a
- * ComboBoxItem for entering the time units.
+ * A form item for entering a duration - consists of an IntegerItem for entering the amount of time and a
+ * ComboBoxItem for entering the duration units.
*
* @author Ian Springer
*/
@@ -48,116 +52,143 @@ public class DurationItem extends CanvasItem {
private static final String FIELD_UNITS = "units";
private final DynamicForm form;
- private TimeUnit defaultUnit;
- private String contextualHelp;
- private boolean supportsIterations;
+ private TimeUnit defaultTimeUnit;
+ private Set<UnitType> supportedUnitTypes;
private TimeUnit valueUnit;
private boolean isReadOnly;
+ private UnitType unitType;
- public DurationItem(String name, String title, Set<TimeUnit> supportedUnits, boolean supportsIterations,
+ public DurationItem(String name, String title, TreeSet<TimeUnit> supportedUnits, boolean supportsIterations,
boolean isReadOnly, Locatable parentWidget) {
super(name, title);
- this.supportsIterations = supportsIterations;
+ this.supportedUnitTypes = EnumSet.noneOf(UnitType.class);
+ if (supportedUnits != null && !supportedUnits.isEmpty()) {
+ this.supportedUnitTypes.add(UnitType.TIME);
+ this.valueUnit = supportedUnits.iterator().next();
+ }
+ if (supportsIterations) {
+ this.supportedUnitTypes.add(UnitType.ITERATIONS);
+ }
+
this.isReadOnly = isReadOnly;
this.form = new EnhancedDynamicForm(parentWidget.extendLocatorId(name), false, false);
- this.form.setNumCols(4);
- this.form.setColWidths("140", "90", "105", "*");
-
- final IntegerItem valueItem = new IntegerItem(FIELD_VALUE, title);
- valueItem.setShowTitle(getShowTitle());
- valueItem.setValue(getValue());
- IntegerRangeValidator integerRangeValidator = new IntegerRangeValidator();
- integerRangeValidator.setMin(1);
- valueItem.setValidators(integerRangeValidator);
- valueItem.setValidateOnChange(getValidateOnChange());
- valueItem.setValidateOnExit(getValidateOnExit());
-
- valueItem.addChangedHandler(new ChangedHandler() {
- public void onChanged(ChangedEvent event) {
- updateValue();
- }
- });
- ComboBoxItem unitsItem = new ComboBoxItem(FIELD_UNITS);
- unitsItem.setShowTitle(false);
+ if (this.isReadOnly) {
+ this.form.setNumCols(2);
+ this.form.setColWidths("140", "160");
- // TODO: i18n valueMap values
- LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
- if (supportsIterations) {
- valueMap.put("times", "times");
- }
- if (supportedUnits != null && !supportedUnits.isEmpty()) {
- TreeSet<TimeUnit> sortedSupportedUnits = new TreeSet<TimeUnit>(supportedUnits);
- for (TimeUnit unit : sortedSupportedUnits) {
- valueMap.put(unit.name().toLowerCase(), unit.name().toLowerCase());
- }
- this.valueUnit = sortedSupportedUnits.iterator().next();
- unitsItem.setValueMap(valueMap);
- }
+ StaticTextItem staticTextItem = new StaticTextItem(FIELD_VALUE, title);
+ staticTextItem.setShowTitle(getShowTitle());
- if (this.defaultUnit != null) {
- unitsItem.setDefaultValue(this.defaultUnit.name().toLowerCase());
+ this.form.setFields(staticTextItem);
} else {
- unitsItem.setDefaultToFirstOption(true);
- }
+ this.form.setNumCols(4);
+ this.form.setColWidths("140", "90", "105", "*");
+
+ final IntegerItem valueItem = new IntegerItem(FIELD_VALUE, title);
+ valueItem.setShowTitle(getShowTitle());
+ valueItem.setValue(getValue());
+ IntegerRangeValidator integerRangeValidator = new IntegerRangeValidator();
+ integerRangeValidator.setMin(1);
+ valueItem.setValidators(integerRangeValidator);
+ valueItem.setValidateOnChange(getValidateOnChange());
+ valueItem.setValidateOnExit(getValidateOnExit());
+
+ valueItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updateValue();
+ }
+ });
- if (this.contextualHelp != null) {
- FormUtility.addContextualHelp(unitsItem, this.contextualHelp);
- }
+ ComboBoxItem unitsItem = new ComboBoxItem(FIELD_UNITS);
+ unitsItem.setShowTitle(false);
+
+ // TODO: i18n valueMap values
+ LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
+ if (this.supportedUnitTypes.contains(UnitType.ITERATIONS)) {
+ valueMap.put("times", "times");
+ }
+ if (this.supportedUnitTypes.contains(UnitType.TIME)) {
+ for (TimeUnit unit : supportedUnits) {
+ valueMap.put(unit.name().toLowerCase(), unit.name().toLowerCase());
+ }
+ }
+ unitsItem.setValueMap(valueMap);
- unitsItem.addChangedHandler(new ChangedHandler() {
- public void onChanged(ChangedEvent event) {
- updateValue();
+ if (this.defaultTimeUnit != null) {
+ unitsItem.setDefaultValue(this.defaultTimeUnit.name().toLowerCase());
+ } else {
+ unitsItem.setDefaultToFirstOption(true);
}
- });
- this.form.setFields(valueItem, unitsItem);
- valueItem.setWidth(90);
- unitsItem.setWidth(105);
+ unitsItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updateValue();
+ }
+ });
+
+ this.form.setFields(valueItem, unitsItem);
+ valueItem.setWidth(90);
+ unitsItem.setWidth(105);
+ }
setCanvas(this.form);
}
- public void setValue(Object value) {
- Integer intValue;
- if (value instanceof String) {
- intValue = Integer.valueOf((String)value);
- } else if (value instanceof Integer) {
- intValue = (Integer) value;
- } else {
- intValue = null;
+ public void setValue(Integer value, UnitType unitType) {
+ if (!this.supportedUnitTypes.contains(unitType)) {
+ throw new IllegalArgumentException("Unit type [" + unitType + "] is not supported by this DurationItem.");
+ }
+ this.unitType = unitType;
+
+ String unitString = null;
+ switch (unitType) {
+ case TIME:
+ unitString = this.valueUnit.name().toLowerCase();
+ break;
+ case ITERATIONS:
+ unitString = "times";
}
- if (intValue != null) {
- this.form.setValue(FIELD_VALUE, intValue);
+ if (this.isReadOnly) {
+ String stringValue;
+ if (value == null) {
+ stringValue = "";
+ } else {
+ stringValue = value + " " + unitString;
+ }
+ this.form.setValue(FIELD_VALUE, stringValue);
} else {
- this.form.setValue(FIELD_VALUE, (String)null);
+ if (value != null) {
+ this.form.setValue(FIELD_VALUE, value);
+ } else {
+ this.form.setValue(FIELD_VALUE, (String)null);
+ }
+ this.form.setValue(FIELD_UNITS, unitString);
}
- super.setValue(value);
+ setValue(value);
}
private void updateValue() {
- Integer convertedValue = null;
+ Integer value = calculateValue();
+ setValue(value);
+ }
+ private Integer calculateValue() {
IntegerItem valueItem = (IntegerItem) this.form.getItem(FIELD_VALUE);
Object value = valueItem.getValue();
- Integer intValue;
- if (value instanceof String) {
- intValue = Integer.valueOf((String)value);
- } else if (value instanceof Integer) {
- intValue = (Integer) value;
- } else {
- intValue = null;
- }
-
- if (intValue != null) {
+ Integer integerValue = TypeConversionUtility.toInteger(value);
+ Integer convertedValue = null;
+ if (integerValue != null) {
TimeUnit unit = getInputTimeUnit();
if (unit == null) {
- convertedValue = intValue;
+ this.unitType = UnitType.ITERATIONS;
+ convertedValue = integerValue;
} else {
+ this.unitType = UnitType.TIME;
if (unit.compareTo(this.valueUnit) < 0) {
throw new IllegalStateException("Input unit is less than target unit.");
}
@@ -165,148 +196,147 @@ public class DurationItem extends CanvasItem {
case MILLISECONDS:
switch (this.valueUnit) {
case MILLISECONDS:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
}
break;
case SECONDS:
switch (this.valueUnit) {
case SECONDS:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
case MILLISECONDS:
- convertedValue = intValue * 1000;
+ convertedValue = integerValue * 1000;
break;
}
break;
case MINUTES:
switch (this.valueUnit) {
case MINUTES:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
case SECONDS:
- convertedValue = intValue * 60;
+ convertedValue = integerValue * 60;
break;
case MILLISECONDS:
- convertedValue = intValue * 60 * 1000;
+ convertedValue = integerValue * 60 * 1000;
break;
}
break;
case HOURS:
switch (this.valueUnit) {
case HOURS:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
case MINUTES:
- convertedValue = intValue * 60;
+ convertedValue = integerValue * 60;
break;
case SECONDS:
- convertedValue = intValue * 60 * 60;
+ convertedValue = integerValue * 60 * 60;
break;
case MILLISECONDS:
- convertedValue = intValue * 60 * 60 * 1000;
+ convertedValue = integerValue * 60 * 60 * 1000;
break;
}
break;
case DAYS:
switch (this.valueUnit) {
case DAYS:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
case HOURS:
- convertedValue = intValue * 24;
+ convertedValue = integerValue * 24;
break;
case MINUTES:
- convertedValue = intValue * 24 * 60;
+ convertedValue = integerValue * 24 * 60;
break;
case SECONDS:
- convertedValue = intValue * 24 * 60 * 60;
+ convertedValue = integerValue * 24 * 60 * 60;
break;
case MILLISECONDS:
- convertedValue = intValue * 24 * 60 * 60 * 1000;
+ convertedValue = integerValue * 24 * 60 * 60 * 1000;
break;
}
break;
case WEEKS:
switch (this.valueUnit) {
case WEEKS:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
case DAYS:
- convertedValue = intValue * 7;
+ convertedValue = integerValue * 7;
break;
case HOURS:
- convertedValue = intValue * 7 * 24;
+ convertedValue = integerValue * 7 * 24;
break;
case MINUTES:
- convertedValue = intValue * 7 * 24 * 60;
+ convertedValue = integerValue * 7 * 24 * 60;
break;
case SECONDS:
- convertedValue = intValue * 7 * 24 * 60 * 60;
+ convertedValue = integerValue * 7 * 24 * 60 * 60;
break;
case MILLISECONDS:
- convertedValue = intValue * 7 * 24 * 60 * 60 * 1000;
+ convertedValue = integerValue * 7 * 24 * 60 * 60 * 1000;
break;
}
break;
case MONTHS:
switch (this.valueUnit) {
case MONTHS:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
case WEEKS:
- convertedValue = intValue * 4;
+ convertedValue = integerValue * 4;
break;
case DAYS:
- convertedValue = intValue * 30;
+ convertedValue = integerValue * 30;
break;
case HOURS:
- convertedValue = intValue * 30 * 24;
+ convertedValue = integerValue * 30 * 24;
break;
case MINUTES:
- convertedValue = intValue * 30 * 24 * 60;
+ convertedValue = integerValue * 30 * 24 * 60;
break;
case SECONDS:
- convertedValue = intValue * 30 * 24 * 60 * 60;
+ convertedValue = integerValue * 30 * 24 * 60 * 60;
break;
case MILLISECONDS:
- convertedValue = intValue * 30 * 24 * 60 * 60 * 1000;
+ convertedValue = integerValue * 30 * 24 * 60 * 60 * 1000;
break;
}
break;
case YEARS:
switch (this.valueUnit) {
case YEARS:
- convertedValue = intValue;
+ convertedValue = integerValue;
break;
case MONTHS:
- convertedValue = intValue * 12;
+ convertedValue = integerValue * 12;
break;
case WEEKS:
- convertedValue = intValue * 52;
+ convertedValue = integerValue * 52;
break;
case DAYS:
- convertedValue = intValue * 365;
+ convertedValue = integerValue * 365;
break;
case HOURS:
- convertedValue = intValue * 365 * 24;
+ convertedValue = integerValue * 365 * 24;
break;
case MINUTES:
- convertedValue = intValue * 365 * 24 * 60;
+ convertedValue = integerValue * 365 * 24 * 60;
break;
case SECONDS:
- convertedValue = intValue * 365 * 24 * 60 * 60;
+ convertedValue = integerValue * 365 * 24 * 60 * 60;
break;
case MILLISECONDS:
- convertedValue = intValue * 365 * 24 * 60 * 60 * 1000;
+ convertedValue = integerValue * 365 * 24 * 60 * 60 * 1000;
break;
}
break;
}
}
}
-
- super.setValue(convertedValue);
+ return convertedValue;
}
private TimeUnit getInputTimeUnit() {
@@ -322,6 +352,10 @@ public class DurationItem extends CanvasItem {
return unit;
}
+ public UnitType getUnitType() {
+ return unitType;
+ }
+
public Integer getValueAsInteger() {
return (Integer) getValue();
}
@@ -331,20 +365,28 @@ public class DurationItem extends CanvasItem {
return this.form.validate();
}
- public void setDefaultUnit(TimeUnit defaultUnit) {
- this.defaultUnit = defaultUnit;
+ public void setDefaultTimeUnit(TimeUnit defaultTimeUnit) {
+ this.defaultTimeUnit = defaultTimeUnit;
}
public void setContextualHelp(String contextualHelp) {
- this.contextualHelp = contextualHelp;
+ if (contextualHelp != null) {
+ FormItem item;
+ if (this.isReadOnly) {
+ item = this.form.getItem(FIELD_VALUE);
+ } else {
+ item = this.form.getItem(FIELD_UNITS);
+ }
+ FormUtility.addContextualHelp(item, contextualHelp);
+ }
}
/**
- * Returns the time unit of this item's {@link #getValue() value} - if null, the item's value represents an iteration
- * count, not a time duration.
+ * If this item's {@link #getValue() value} represents a time duration, returns the value's time unit; otherwise
+ * returns null.
*
- * @return the time unit of this item's {@link #getValue() value} - if null, the item's value represents an iteration
- * count, not a time duration
+ * @return if this item's {@link #getValue() value} represents a time duration, returns the value's time unit; otherwise
+ * returns null
*/
public TimeUnit getValueUnit() {
return this.valueUnit;
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 27df563..7f01d38 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
@@ -101,7 +101,7 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
hasIdField = true;
}
if (this.isReadOnly) {
- if ((item instanceof StaticTextItem) || (item instanceof CanvasItem && !(item instanceof DurationItem))) {
+ if ((item instanceof StaticTextItem) || (item instanceof CanvasItem)) {
// note: EditableFormItem is a subclass of CanvasItem
if (item instanceof EditableFormItem) {
((EditableFormItem) item).setReadOnly(true);
@@ -110,8 +110,7 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
} else {
StaticTextItem staticItem = new StaticTextItem(item.getName(), item.getTitle());
staticItem.setTooltip(item.getTooltip());
- Object value = (item instanceof DurationItem) ? item.toString() : item.getValue();
- staticItem.setValue(value);
+ staticItem.setValue(item.getValue());
staticItem.setColSpan(item.getAttribute("colSpan"));
// TODO: Any other fields we should copy? icons?
@@ -153,4 +152,5 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
public boolean isReadOnly() {
return isReadOnly;
}
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/UnitType.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/UnitType.java
new file mode 100644
index 0000000..2731c52
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/UnitType.java
@@ -0,0 +1,9 @@
+package org.rhq.enterprise.gui.coregui.client.components.form;
+
+/**
+ * @author Ian Springer
+ */
+public enum UnitType {
+ TIME,
+ ITERATIONS
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
index f927030..07d90e3 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
@@ -90,7 +90,7 @@ public abstract class AbstractOperationScheduleDataSource<T extends OperationSch
idField.setCanEdit(false);
fields.add(idField);
- DataSourceTextField operationNameField = createTextField(Field.OPERATION_NAME, "Operation Name", null, 100,
+ DataSourceTextField operationNameField = createTextField(Field.OPERATION_NAME, "Operation", null, 100,
true);
fields.add(operationNameField);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index 6f0162e..2801c7a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -22,10 +22,10 @@ package org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeSet;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.Record;
@@ -52,9 +52,11 @@ import org.rhq.enterprise.gui.coregui.client.components.form.AbstractRecordEdito
import org.rhq.enterprise.gui.coregui.client.components.form.DurationItem;
import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm;
import org.rhq.enterprise.gui.coregui.client.components.form.TimeUnit;
+import org.rhq.enterprise.gui.coregui.client.components.form.UnitType;
import org.rhq.enterprise.gui.coregui.client.components.trigger.JobTriggerEditor;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
+import org.rhq.enterprise.gui.coregui.client.util.TypeConversionUtility;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -88,12 +90,14 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
}
}
+ protected abstract boolean hasControlPermission();
+
@Override
public void renderView(ViewPath viewPath) {
super.renderView(viewPath);
// Existing schedules are not editable. This may change in the future.
- boolean isReadOnly = (getRecordId() != 0);
+ boolean isReadOnly = (!hasControlPermission() || (getRecordId() != 0));
init(isReadOnly);
}
@@ -112,11 +116,11 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
List<FormItem> items = new ArrayList<FormItem>();
if (!isNewRecord()) {
- StaticTextItem idItem = new StaticTextItem(ResourceOperationScheduleDataSource.Field.ID);
+ StaticTextItem idItem = new StaticTextItem(AbstractOperationScheduleDataSource.Field.ID);
items.add(idItem);
}
- SelectItem operationNameItem = new SelectItem(ResourceOperationScheduleDataSource.Field.OPERATION_NAME, "Name");
+ SelectItem operationNameItem = new SelectItem(AbstractOperationScheduleDataSource.Field.OPERATION_NAME);
items.add(operationNameItem);
operationNameItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
@@ -154,41 +158,19 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
contentPane.addMember(hr);
}
- /*this.timeoutForm = new EnhancedDynamicForm(extendLocatorId("TimeoutForm"), isReadOnly(), isNewRecord());
- this.timeoutForm.setNumCols(4);
- this.timeoutForm.setColWidths("140", "90", "105", "*");
-
- IntegerItem timeoutItem = new IntegerItem("timeoutValue", "Timeout");
- IntegerRangeValidator integerRangeValidator = new IntegerRangeValidator();
- integerRangeValidator.setMin(1);
- timeoutItem.setValidators(integerRangeValidator);
- ComboBoxItem timeoutUnitsItem = new ComboBoxItem("timeoutUnits");
- timeoutUnitsItem.setShowTitle(false);
- LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>(3);
- valueMap.put("seconds", "seconds");
- valueMap.put("minutes", "minutes");
- valueMap.put("hours", "hours");
- timeoutUnitsItem.setValueMap(valueMap);
- timeoutUnitsItem.setDefaultValue("minutes");
- FormUtility.addContextualHelp(timeoutUnitsItem, "a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was initiated");
- this.timeoutForm.setFields(timeoutItem, timeoutUnitsItem);
- timeoutItem.setWidth(90);
- timeoutUnitsItem.setWidth(105);
- contentPane.addMember(this.timeoutForm);
- */
-
this.notesForm = new EnhancedDynamicForm(extendLocatorId("NotesForm"), isReadOnly(),
isNewRecord());
this.notesForm.setColWidths("140", "50%", "140", "50%");
List<FormItem> notesFields = new ArrayList<FormItem>();
- Set<TimeUnit> supportedUnits = new HashSet<TimeUnit>(3);
+ TreeSet<TimeUnit> supportedUnits = new TreeSet<TimeUnit>();
supportedUnits.add(TimeUnit.SECONDS);
supportedUnits.add(TimeUnit.MINUTES);
supportedUnits.add(TimeUnit.HOURS);
DurationItem timeoutItem = new DurationItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout",
supportedUnits, false, isReadOnly(), this.notesForm);
+ timeoutItem.setContextualHelp("a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was already initiated");
notesFields.add(timeoutItem);
if (!isNewRecord()) {
@@ -245,8 +227,10 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
FormItem nextFireTimeItem = this.notesForm.getField(ResourceOperationScheduleDataSource.Field.NEXT_FIRE_TIME);
nextFireTimeItem.setValue(getForm().getValue(ResourceOperationScheduleDataSource.Field.NEXT_FIRE_TIME));
- FormItem timeoutItem = this.notesForm.getField(AbstractOperationScheduleDataSource.Field.TIMEOUT);
- timeoutItem.setValue(getForm().getValue(AbstractOperationScheduleDataSource.Field.TIMEOUT));
+ DurationItem timeoutItem = (DurationItem) this.notesForm.getField(AbstractOperationScheduleDataSource.Field.TIMEOUT);
+ Object value = getForm().getValue(AbstractOperationScheduleDataSource.Field.TIMEOUT);
+ Integer integerValue = TypeConversionUtility.toInteger(value);
+ timeoutItem.setValue(integerValue, UnitType.TIME);
FormItem notesItem = this.notesForm.getField(ResourceOperationScheduleDataSource.Field.DESCRIPTION);
notesItem.setValue(getForm().getValue(ResourceOperationScheduleDataSource.Field.DESCRIPTION));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
index 59f58e6..152260f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
@@ -39,7 +39,6 @@ public abstract class AbstractOperationScheduleListView extends TableSection<Abs
protected abstract boolean hasControlPermission();
-
@Override
protected void configureTable() {
super.configureTable();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
index a397553..23db066 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
@@ -40,6 +40,11 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
}
@Override
+ protected boolean hasControlPermission() {
+ return this.groupComposite.getResourcePermission().isControl();
+ }
+
+ @Override
protected void init(final boolean isReadOnly) {
if (isNewRecord()) {
ResourceDatasource resourceDatasource = new ResourceDatasource();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
index 483f97d..22d89dd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
@@ -4,13 +4,22 @@ import org.rhq.core.domain.resource.composite.ResourceComposite;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDetailsView;
/**
- *
+ * @author Ian Springer
*/
public class ResourceOperationScheduleDetailsView extends AbstractOperationScheduleDetailsView {
+ private ResourceComposite resourceComposite;
+
public ResourceOperationScheduleDetailsView(String locatorId, ResourceComposite resourceComposite, int scheduleId) {
super(locatorId, new ResourceOperationScheduleDataSource(resourceComposite),
resourceComposite.getResource().getResourceType(), scheduleId);
+
+ this.resourceComposite = resourceComposite;
+ }
+
+ @Override
+ protected boolean hasControlPermission() {
+ return this.resourceComposite.getResourcePermission().isControl();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TypeConversionUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TypeConversionUtility.java
new file mode 100644
index 0000000..ac6d6ae
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/TypeConversionUtility.java
@@ -0,0 +1,26 @@
+package org.rhq.enterprise.gui.coregui.client.util;
+
+/**
+ * @author Ian Springer
+ */
+public class TypeConversionUtility {
+
+ private TypeConversionUtility() {
+ }
+
+ public static Integer toInteger(Object object) {
+ Integer integer;
+ if (object instanceof String) {
+ integer = Integer.valueOf((String)object);
+ } else if (object instanceof Number) {
+ integer = ((Number) object).intValue();
+ } else if (object == null) {
+ integer = null;
+ } else {
+ throw new IllegalArgumentException("Failed to convert " + object.getClass().getName() + " [" + object
+ + "] to an Integer.");
+ }
+ return integer;
+ }
+
+}
13 years, 4 months
[rhq] modules/enterprise
by Jay Shaughnessy
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 18 +++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 32 +++++++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java | 6 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java | 5 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 14 +++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java | 6 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java | 5 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java | 5 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java | 8 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java | 11 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java | 4 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java | 5 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableSectionStack.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java | 15 +---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java | 5 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java | 5 -
16 files changed, 82 insertions(+), 65 deletions(-)
New commits:
commit ee308f382aaf8c22bbf699dbf5aa8687b7a53eb5
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Feb 4 16:30:10 2011 -0500
Selenium work - more destroy chain logic changes
- tweak CoreGUI's setContent cleanup to be ultra-thorough
- make a better distinction between overriding destroy() and onDestroy().
Override destroy() should be more common, do this when you need to destroy
layout members or some other explcit destroy() - basically anytime you need to perform
cleanup prior to the BaseWidget destroy(). Note that BaseWidget.destory()
destroys itself before calling onDestroy(). So, onDestroy() should be
overriden only to perform side-effect cleanup, like Timer cancels.
- When overriding destroy() make sure you call super().destroy (in general)
as the last thing. You don't want to destroy the base widget before you're
done with it.
- Had to do some explicit destruction in AbstractSelector. In certain scenarios,
I think it must be a smartgwt bug, the destroy logic would leave some
widgets detached (i.e. no parent) and not fully wipe it out.
- Add Table.destroy() override to cleanup the non-locatable contents layout.
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 beea6da..71171fb 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
@@ -89,8 +89,8 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
private static String currentPath;
- @SuppressWarnings("unused")
- private static Canvas content;
+ // @SuppressWarnings("unused")
+ // private static Canvas content;
private RootCanvas rootCanvas;
@@ -259,15 +259,17 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
}
public static void setContent(Canvas newContent) {
- if (content != null) {
- content.removeFromParent();
- content.destroy();
- content = null;
+ // A call to destroy (e.g. certain IFrames/FullHTMLPane) can actually remove multiple children of the
+ // contentCanvas. As such, we need to query for the children after each destroy to ensure only valid children
+ // are in the array.
+ Canvas contentCanvas = Canvas.getById(CONTENT_CANVAS_ID);
+ Canvas[] children;
+ while ((children = contentCanvas.getChildren()).length > 0) {
+ children[0].destroy();
}
- Canvas contentCanvas = Canvas.getById(CONTENT_CANVAS_ID);
if (newContent != null) {
- content = newContent;
+ //content = newContent;
contentCanvas.addChild(newContent);
}
contentCanvas.markForRedraw();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
index f88c8b0..83ba909 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
@@ -63,8 +63,11 @@ import com.smartgwt.client.widgets.layout.VStack;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTransferImgButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVStack;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* @author Greg Hinkle
@@ -202,8 +205,31 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
addMember(this.hlayout);
}
+ @Override
+ public void destroy() {
+ // explicitly destroy non-locatable member layouts
+ SeleniumUtility.destroyMembers(hlayout);
+ super.destroy();
+
+ // For reasons unknown, possibly issues in smartgwt's cleanup of VStack and SectionStack, these
+ // widgets did not always get destroyed (for example, if something was moved to assigned, but nothing
+ // was moved to available - go figure), so destroy them manually when the other cleanup is already done.
+ availableGrid.removeFromParent();
+ availableGrid.destroy();
+ assignedGrid.removeFromParent();
+ assignedGrid.destroy();
+ addButton.removeFromParent();
+ addButton.destroy();
+ addAllButton.removeFromParent();
+ addAllButton.destroy();
+ removeButton.removeFromParent();
+ removeButton.destroy();
+ removeAllButton.removeFromParent();
+ removeAllButton.destroy();
+ }
+
private SectionStack buildAvailableItemsStack() {
- SectionStack availableSectionStack = new SectionStack();
+ SectionStack availableSectionStack = new LocatableSectionStack(extendLocatorId("Available"));
availableSectionStack.setWidth(300);
availableSectionStack.setHeight(250);
@@ -321,7 +347,7 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
}
private VStack buildButtonStack() {
- VStack moveButtonStack = new VStack(6);
+ VStack moveButtonStack = new LocatableVStack(extendLocatorId("MoveButtons"), 6);
moveButtonStack.setWidth(42);
moveButtonStack.setHeight(250);
moveButtonStack.setAlign(VerticalAlignment.CENTER);
@@ -365,7 +391,7 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
}
private SectionStack buildAssignedItemsStack() {
- SectionStack assignedSectionStack = new SectionStack();
+ SectionStack assignedSectionStack = new LocatableSectionStack(extendLocatorId("Assigned"));
assignedSectionStack.setWidth(300);
assignedSectionStack.setHeight(250);
assignedSectionStack.setAlign(Alignment.LEFT);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
index 62c8a2d..50b6348 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
@@ -53,12 +53,10 @@ public class NamedTabSet extends LocatableTabSet {
}
@Override
- protected void onDestroy() {
+ public void destroy() {
for (NamedTab tab : getTabs()) {
tab.destroy();
}
-
- super.onDestroy();
+ super.destroy();
}
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
index f8f0f32..7413dae 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
@@ -157,7 +157,7 @@ public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, T
}
@Override
- protected void onDestroy() {
+ public void destroy() {
// add the hidden tabs back under the TabSet. This will get them destroyed by smartgwt when the tabset
// goes away. There is no explicit Tab.destroy().
for (TwoLevelTab tab : hiddenTabs.values()) {
@@ -166,7 +166,6 @@ public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, T
for (TwoLevelTab tab : getTabs()) {
tab.getLayout().destroyViews();
}
- super.onDestroy();
+ super.destroy();
}
-
}
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 b1541d0..8a9ab88 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
@@ -84,6 +84,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIMenuButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* A tabular view of set of data records from an {@link RPCDataSource}.
@@ -310,6 +311,12 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
}
}
+ @Override
+ public void destroy() {
+ SeleniumUtility.destroyMembers(contents);
+ super.destroy();
+ }
+
private void drawHeader() {
for (String headerIcon : headerIcons) {
Img img = new Img(headerIcon, 24, 24);
@@ -575,7 +582,8 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
int destIndex = 0;
if (dataSourceFieldNamesSet.contains(FIELD_ID)) {
String datasourceFieldTitle = this.dataSource.getField(FIELD_ID).getTitle();
- String listGridFieldTitle = (datasourceFieldTitle != null) ? datasourceFieldTitle : MSG.common_title_id();
+ String listGridFieldTitle = (datasourceFieldTitle != null) ? datasourceFieldTitle : MSG
+ .common_title_id();
listGridIdField = new ListGridField(FIELD_ID, listGridFieldTitle, 55);
// Override the DataSource id field metadata for consistent display across all Tables.
listGridIdField.setType(ListGridFieldType.INTEGER);
@@ -706,8 +714,8 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
if (deletedRecordNames.size() == selectedRecordCount) {
// all selected schedules were successfully deleted.
Message message = new Message(MSG.widget_recordEditor_info_recordsDeletedConcise(String
- .valueOf(deletedRecordNames.size()), getDataTypeNamePlural()), MSG
- .widget_recordEditor_info_recordsDeletedDetailed(String.valueOf(deletedRecordNames.size()),
+ .valueOf(deletedRecordNames.size()), getDataTypeNamePlural()), MSG
+ .widget_recordEditor_info_recordsDeletedDetailed(String.valueOf(deletedRecordNames.size()),
getDataTypeNamePlural(), deletedRecordNames.toString()));
CoreGUI.getMessageCenter().notify(message);
refresh();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
index 930b4a9..1eedc08 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
@@ -56,10 +56,8 @@ public class PortalColumn extends VStack {
}
@Override
- protected void onDestroy() {
- super.onDestroy();
-
+ public void destroy() {
SeleniumUtility.destroyMembers(this);
+ super.destroy();
}
-
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
index 9cf6a6a..1611328 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
@@ -265,9 +265,8 @@ public abstract class AbstractTwoLevelTabSetView<T, U extends Layout> extends Lo
}
@Override
- protected void onDestroy() {
- super.onDestroy();
+ public void destroy() {
tabSet.destroy();
+ super.destroy();
}
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
index 6e3e580..01284cc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
@@ -291,14 +291,13 @@ public class LiveGraphView extends LocatableVLayout {
}
protected void stop() {
- dataLoader.cancel();
hoverLabel.destroy();
+ dataLoader.cancel();
}
@Override
protected void onDestroy() {
- super.onDestroy();
-
stop();
+ super.onDestroy();
}
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
index faa3ab1..a6d3fe9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
@@ -311,8 +311,8 @@ public class SmallGraphView extends LocatableVLayout {
@Override
public void destroy() {
- super.destroy();
hoverLabel.destroy();
+ super.destroy();
}
@Override
@@ -377,10 +377,4 @@ public class SmallGraphView extends LocatableVLayout {
graphPopup.show();
}
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- hoverLabel.destroy();
- }
}
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 17b4e5c..d8b3d04 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
@@ -203,12 +203,12 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
}
@Override
- protected void onDestroy() {
- super.onDestroy();
-
+ public void destroy() {
// destroy members of non-locatable layouts
SeleniumUtility.destroyMembers(leftPane);
SeleniumUtility.destroyMembers(rightPane);
+
+ super.destroy();
}
@Override
@@ -235,10 +235,9 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
}
@Override
- protected void onDestroy() {
- super.onDestroy();
-
+ public void destroy() {
SeleniumUtility.destroyMembers(this);
+ super.destroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
index 6729210..38eabc2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
@@ -52,9 +52,9 @@ public class LocatableHLayout extends HLayout implements Locatable {
}
@Override
- protected void onDestroy() {
+ public void destroy() {
destroyMembers();
- super.onDestroy();
+ super.destroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
index efe2894..acfedb4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
@@ -36,9 +36,8 @@ public class LocatableLayout extends Layout implements Locatable {
}
@Override
- protected void onDestroy() {
+ public void destroy() {
destroyMembers();
- super.onDestroy();
+ super.destroy();
}
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableSectionStack.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableSectionStack.java
index 62fb4ac..29da927 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableSectionStack.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableSectionStack.java
@@ -31,4 +31,7 @@ public class LocatableSectionStack extends SectionStack implements Locatable {
return this.locatorId + "_" + extension;
}
+ // NOTE: It seems SectionStack does not need the sort of destroy() override that other Layout superclasses
+ // need. The section cleanup seems sufficient on baseWidget destroy, and further attempts to remove
+ // members explicitly may cause issues.
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
index 6e7a2ac..64a5c3c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
@@ -35,14 +35,9 @@ public class LocatableToolStrip extends ToolStrip implements Locatable {
SeleniumUtility.destroyMembers(this);
}
- // It was my understanding that Layouts needed explicit removal of members but it seems
- // that ToolStrip may treat its members differently. The logic below actually caused issues because
- // the member was being destroyed automatically.
- //
- //@Override
- //protected void onDestroy() {
- // destroyMembers();
- // super.onDestroy();
- //}
-
+ @Override
+ public void destroy() {
+ destroyMembers();
+ super.destroy();
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
index 54f081c..187d8ba 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
@@ -52,9 +52,8 @@ public class LocatableVLayout extends VLayout implements Locatable {
}
@Override
- protected void onDestroy() {
+ public void destroy() {
destroyMembers();
- super.onDestroy();
+ super.destroy();
}
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
index 4a86ee4..a9db523 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
@@ -52,9 +52,8 @@ public class LocatableVStack extends VStack implements Locatable {
}
@Override
- protected void onDestroy() {
+ public void destroy() {
destroyMembers();
- super.onDestroy();
+ super.destroy();
}
-
}
13 years, 4 months
[rhq] modules/enterprise
by Heiko W. Rupp
modules/enterprise/server/plugins/alert-log4j/pom.xml | 210 ++++++++++
modules/enterprise/server/plugins/alert-log4j/src/main/java/org/rhq/enterprise/server/plugins/alertlog4j/Log4JSender.java | 83 +++
modules/enterprise/server/plugins/alert-log4j/src/main/resources/META-INF/rhq-serverplugin.xml | 32 +
modules/enterprise/server/plugins/pom.xml | 1
modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml | 1
5 files changed, 327 insertions(+)
New commits:
commit ea44c9b22fcf4ca02623fc1513415147f7cd26dd
Author: Steve Millidge <smillidge(a)c2b2.co.uk>
Date: Fri Feb 4 15:05:41 2011 +0100
BZ 675159 -- provide an alert notification sender that writes alert notifications to log4j appenders.
diff --git a/modules/enterprise/server/plugins/alert-log4j/pom.xml b/modules/enterprise/server/plugins/alert-log4j/pom.xml
new file mode 100644
index 0000000..fd8bedf
--- /dev/null
+++ b/modules/enterprise/server/plugins/alert-log4j/pom.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>rhq-enterprise-server-plugins-parent</artifactId>
+ <groupId>org.rhq</groupId>
+ <version>4.0.0-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.rhq</groupId>
+ <artifactId>alert-log4j</artifactId>
+ <version>4.0.0-SNAPSHOT</version>
+
+ <name>RHQ Enterprise Server Log4J Alert Plugin</name>
+
+ <scm>
+ <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/...</connection>
+ <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/...</developerConnection>
+ </scm>
+
+ <properties>
+ <scm.module.path>modules/enterprise/server/plugins/alert-snmp/</scm.module.path>
+ </properties>
+
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludedGroups>${rhq.testng.excludedGroups}</excludedGroups>
+ <!--
+ <argLine>-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y</argLine>
+ -->
+ </configuration>
+ </plugin>
+
+ </plugins>
+ </build>
+
+ <profiles>
+
+ <profile>
+ <id>dev</id>
+
+ <properties>
+ <rhq.rootDir>../../../../..</rhq.rootDir>
+ <rhq.containerDir>${rhq.rootDir}/${rhq.defaultDevContainerPath}</rhq.containerDir>
+ <rhq.deploymentDir>${rhq.containerDir}/jbossas/server/default/deploy/${rhq.earName}/rhq-serverplugins</rhq.deploymentDir>
+ </properties>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+
+ <execution>
+ <id>deploy</id>
+ <phase>compile</phase>
+ <configuration>
+ <tasks>
+ <mkdir dir="${rhq.deploymentDir}" />
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating ${deployment.file}...</echo>
+ <jar destfile="${deployment.file}" basedir="${project.build.outputDirectory}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>undeploy</id>
+ <phase>clean</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Deleting ${deployment.file}...</echo>
+ <delete file="${deployment.file}" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>deploy-jar-meta-inf</id>
+ <phase>package</phase>
+ <configuration>
+ <tasks>
+ <property name="deployment.file" location="${rhq.deploymentDir}/${project.build.finalName}.jar" />
+ <echo>*** Updating META-INF dir in ${deployment.file}...</echo>
+ <unjar src="${project.build.directory}/${project.build.finalName}.jar" dest="${project.build.outputDirectory}">
+ <patternset>
+ <include name="META-INF/**" />
+ </patternset>
+ </unjar>
+ <jar destfile="${deployment.file}" manifest="${project.build.outputDirectory}/META-INF/MANIFEST.MF" update="true">
+ </jar>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+
+ </executions>
+ </plugin>
+
+
+
+ </plugins>
+ </build>
+
+ </profile>
+
+ <profile>
+ <id>cobertura-plugins</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>net.sourceforge.cobertura</groupId>
+ <artifactId>cobertura</artifactId>
+ <version>1.9.4.1</version>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <id>cobertura-instrument</id>
+ <phase>pre-integration-test</phase>
+ <configuration>
+ <tasks>
+ <!-- prepare directory structure for cobertura-->
+ <mkdir dir="target/cobertura" />
+ <mkdir dir="target/cobertura/backup" />
+ <!-- backup all classes so that we can instrument the original classes-->
+ <copy toDir="target/cobertura/backup" verbose="true" overwrite="true">
+ <fileset dir="target/classes">
+ <include name="**/*.class" />
+ </fileset>
+ </copy>
+ <!-- create a properties file and save there location of cobertura data file-->
+ <touch file="target/classes/cobertura.properties" />
+ <echo file="target/classes/cobertura.properties">net.sourceforge.cobertura.datafile=${project.build.directory}/cobertura/cobertura.ser</echo>
+ <taskdef classpathref="maven.plugin.classpath" resource="tasks.properties" />
+ <!-- instrument all classes in target/classes directory -->
+ <cobertura-instrument datafile="${project.build.directory}/cobertura/cobertura.ser" todir="${project.build.directory}/classes">
+ <fileset dir="${project.build.directory}/classes">
+ <include name="**/*.class" />
+ </fileset>
+ </cobertura-instrument>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>cobertura-report</id>
+ <phase>post-integration-test</phase>
+ <configuration>
+ <tasks>
+ <taskdef classpathref="maven.plugin.classpath" resource="tasks.properties" />
+ <!-- prepare directory structure for cobertura-->
+ <mkdir dir="target/cobertura" />
+ <mkdir dir="target/site/cobertura" />
+ <!-- restore classes from backup folder to classes folder -->
+ <copy toDir="target/classes" verbose="true" overwrite="true">
+ <fileset dir="target/cobertura/backup">
+ <include name="**/*.class" />
+ </fileset>
+ </copy>
+ <!-- delete backup folder-->
+ <delete dir="target/cobertura/backup" />
+ <!-- create a code coverage report -->
+ <cobertura-report format="html" datafile="${project.build.directory}/cobertura/cobertura.ser" destdir="${project.build.directory}/site/cobertura">
+ <fileset dir="${basedir}/src/main/java">
+ <include name="**/*.java" />
+ </fileset>
+ </cobertura-report>
+ <!-- delete cobertura.properties file -->
+ <delete file="target/classes/cobertura.properties" />
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+</project>
diff --git a/modules/enterprise/server/plugins/alert-log4j/src/main/java/org/rhq/enterprise/server/plugins/alertlog4j/Log4JSender.java b/modules/enterprise/server/plugins/alert-log4j/src/main/java/org/rhq/enterprise/server/plugins/alertlog4j/Log4JSender.java
new file mode 100644
index 0000000..5539acf
--- /dev/null
+++ b/modules/enterprise/server/plugins/alert-log4j/src/main/java/org/rhq/enterprise/server/plugins/alertlog4j/Log4JSender.java
@@ -0,0 +1,83 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.plugins.alertlog4j;
+
+
+import java.util.List;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.log4j.Logger;
+
+import org.rhq.core.domain.alert.Alert;
+import org.rhq.core.domain.alert.notification.SenderResult;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.enterprise.server.alert.AlertManagerLocal;
+import org.rhq.enterprise.server.plugin.pc.alert.AlertSender;
+import org.rhq.enterprise.server.resource.ResourceManagerLocal;
+import org.rhq.enterprise.server.util.LookupUtil;
+
+/**
+ * AlertSender that sends alerts to Log4J
+ * @author Steve Millidge (C2B2 Consulting Limited)
+ */
+public class Log4JSender extends AlertSender {
+
+ private final Log log = LogFactory.getLog(Log4JSender.class);
+
+ @Override
+ public SenderResult send(Alert alert) {
+ String category = alertParameters.getSimpleValue("log4JCategory", this.getClass().getName());
+ Logger logger = Logger.getLogger(category);
+ AlertManagerLocal alertManager = LookupUtil.getAlertManager();
+ ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
+
+ List lineage = resourceManager.getResourceLineage(alert.getAlertDefinition().getResource().getId());
+ String platformName = ((Resource)lineage.get(0)).getName();
+ String conditions = alertManager.prettyPrintAlertConditions(alert, false).replace('\n', ' ');
+ String alertURL = alertManager.prettyPrintAlertURL(alert);
+ StringBuilder message = new StringBuilder();
+ message.append("ALERT,");
+ message.append(alert.getAlertDefinition().getPriority().getName());
+ message.append(',');
+ message.append(alert.getAlertDefinition().getName());
+ message.append(',');
+ message.append(alert.getAlertDefinition().getDescription());
+ message.append(',');
+ message.append(alert.getAlertDefinition().getResource().getName()).append(',');
+ message.append(platformName).append(',');
+ message.append(conditions).append(',');
+ message.append(alertURL);
+
+ switch (alert.getAlertDefinition().getPriority()){
+ case HIGH:
+ logger.error(message);
+ break;
+ case MEDIUM:
+ logger.warn(message);
+ break;
+ case LOW:
+ logger.info(message);
+ break;
+ default: //do nothing
+ }
+ return SenderResult.getSimpleSuccess("Alert Sent to Log4J Category " + category);
+
+ }
+
+}
diff --git a/modules/enterprise/server/plugins/alert-log4j/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/alert-log4j/src/main/resources/META-INF/rhq-serverplugin.xml
new file mode 100644
index 0000000..41f914e
--- /dev/null
+++ b/modules/enterprise/server/plugins/alert-log4j/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<alert-plugin
+ name="alert-log4j"
+ displayName="Alert:Log4J"
+ xmlns="urn:xmlns:rhq-serverplugin.alert"
+ xmlns:c="urn:xmlns:rhq-configuration"
+ xmlns:serverplugin="urn:xmlns:rhq-serverplugin"
+ package="org.rhq.enterprise.server.plugins.alertlog4j"
+ description="Alert sender plugin that sends alert notifications to a Log4J category"
+ >
+
+ <serverplugin:help>
+ Used to send notifications to a Log4J Category. This enables you to send different alerts to different
+ log files where they can be scraped by different system management tools e.g. OVO.
+
+ To configure log4j in the RHQServer edit the file ${rhq.server.home}/conf/jboss-log4j.xml and
+ configure an appender for each of your log categories.
+ The format of the log4J message is;
+ ALERT,Priority,AlertName,AlertDescription,ResourceName,ResourcePlatform,AlertDetails,RHQURL
+ </serverplugin:help>
+
+ <!-- How does this sender show up in drop downs etc -->
+ <short-name>Log4J Alerter</short-name>
+
+ <!-- Class that does the actual sending -->
+ <plugin-class>Log4JSender</plugin-class>
+
+ <alert-configuration>
+ <c:simple-property name="log4JCategory" type="string" required="true" displayName="Log4J Category" description="Log4J Category to log the Alert to"/>
+ </alert-configuration>
+</alert-plugin>
diff --git a/modules/enterprise/server/plugins/pom.xml b/modules/enterprise/server/plugins/pom.xml
index 29d09dd..738ec95 100644
--- a/modules/enterprise/server/plugins/pom.xml
+++ b/modules/enterprise/server/plugins/pom.xml
@@ -80,6 +80,7 @@
-->
<module>alert-snmp</module>
<module>alert-subject</module>
+ <module>alert-log4j</module>
<module>cobbler</module>
<module>filetemplate-bundle</module>
<module>ant-bundle</module>
diff --git a/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml b/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
index ab4f217..3ec9918 100644
--- a/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
+++ b/modules/enterprise/server/plugins/validate-all-serverplugins/pom.xml
@@ -52,6 +52,7 @@
<pathelement location="../alert-sms/target/alert-sms-${project.version}.jar" />
<pathelement location="../alert-snmp/target/alert-snmp-${project.version}.jar" />
<pathelement location="../alert-subject/target/alert-subject-${project.version}.jar" />
+ <pathelement location="../alert-log4j/target/alert-log4j-${project.version}.jar" />
<pathelement location="../cobbler/target/cobbler-${project.version}.jar" />
<pathelement location="../filetemplate-bundle/target/rhq-serverplugin-filetemplate-bundle-${project.version}.jar" />
<pathelement location="../ant-bundle/target/rhq-serverplugin-ant-bundle-${project.version}.jar" />
13 years, 4 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java | 12 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TimeUnit.java | 35 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java | 3
3 files changed, 43 insertions(+), 7 deletions(-)
New commits:
commit fd0426f868b297f325d48af5898edaf9c88509e3
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Thu Feb 3 12:02:36 2011 -0500
add TimeUnit class I forgot to check in last night; add isReadOnly param to DurationItem's constructor
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
index d83841f..5a06a57 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
@@ -50,14 +50,16 @@ public class DurationItem extends CanvasItem {
private final DynamicForm form;
private TimeUnit defaultUnit;
private String contextualHelp;
- private boolean iterationsSupported;
+ private boolean supportsIterations;
private TimeUnit valueUnit;
+ private boolean isReadOnly;
- public DurationItem(String name, String title, Set<TimeUnit> supportedUnits, boolean iterationsSupported,
- Locatable parentWidget) {
+ public DurationItem(String name, String title, Set<TimeUnit> supportedUnits, boolean supportsIterations,
+ boolean isReadOnly, Locatable parentWidget) {
super(name, title);
- this.iterationsSupported = iterationsSupported;
+ this.supportsIterations = supportsIterations;
+ this.isReadOnly = isReadOnly;
this.form = new EnhancedDynamicForm(parentWidget.extendLocatorId(name), false, false);
this.form.setNumCols(4);
@@ -83,7 +85,7 @@ public class DurationItem extends CanvasItem {
// TODO: i18n valueMap values
LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
- if (iterationsSupported) {
+ if (supportsIterations) {
valueMap.put("times", "times");
}
if (supportedUnits != null && !supportedUnits.isEmpty()) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TimeUnit.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TimeUnit.java
new file mode 100644
index 0000000..0733712
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TimeUnit.java
@@ -0,0 +1,35 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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.components.form;
+
+/**
+ * A unit of time.
+ *
+ * @author Ian Springer
+ */
+public enum TimeUnit {
+ MILLISECONDS,
+ SECONDS,
+ MINUTES,
+ HOURS,
+ DAYS,
+ WEEKS,
+ MONTHS,
+ YEARS
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index 7d01228..6f0162e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -75,7 +75,6 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
private JobTriggerEditor triggerEditor;
private Configuration parameters;
private EnhancedDynamicForm notesForm;
- private EnhancedDynamicForm timeoutForm;
public AbstractOperationScheduleDetailsView(String locatorId, AbstractOperationScheduleDataSource dataSource,
ResourceType resourceType, int scheduleId) {
@@ -189,7 +188,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
supportedUnits.add(TimeUnit.MINUTES);
supportedUnits.add(TimeUnit.HOURS);
DurationItem timeoutItem = new DurationItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout",
- supportedUnits, false, this.notesForm);
+ supportedUnits, false, isReadOnly(), this.notesForm);
notesFields.add(timeoutItem);
if (!isNewRecord()) {
13 years, 4 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java | 366 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnumSelectItem.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/RadioGroupWithComponentsItem.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java | 44 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java | 30
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java | 16
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RecordUtility.java | 66 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java | 13
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 20
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java | 18
13 files changed, 564 insertions(+), 26 deletions(-)
New commits:
commit 21043546ed5662d821bc58fa6993d743894b3012
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Feb 2 20:39:40 2011 -0500
write new DurationItem widget and start integrating it into the op schedule views
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
new file mode 100644
index 0000000..d83841f
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/DurationItem.java
@@ -0,0 +1,366 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2011 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.components.form;
+
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
+import com.smartgwt.client.widgets.form.fields.ComboBoxItem;
+import com.smartgwt.client.widgets.form.fields.IntegerItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
+import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
+import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
+
+import java.util.LinkedHashMap;
+import java.util.Set;
+import java.util.TreeSet;
+
+/**
+ * A form item for entering a time duration - consists of an IntegerItem for entering the amount of time and a
+ * ComboBoxItem for entering the time units.
+ *
+ * @author Ian Springer
+ */
+public class DurationItem extends CanvasItem {
+
+ private static final String FIELD_VALUE = "value";
+ private static final String FIELD_UNITS = "units";
+
+ private final DynamicForm form;
+ private TimeUnit defaultUnit;
+ private String contextualHelp;
+ private boolean iterationsSupported;
+ private TimeUnit valueUnit;
+
+ public DurationItem(String name, String title, Set<TimeUnit> supportedUnits, boolean iterationsSupported,
+ Locatable parentWidget) {
+ super(name, title);
+
+ this.iterationsSupported = iterationsSupported;
+
+ this.form = new EnhancedDynamicForm(parentWidget.extendLocatorId(name), false, false);
+ this.form.setNumCols(4);
+ this.form.setColWidths("140", "90", "105", "*");
+
+ final IntegerItem valueItem = new IntegerItem(FIELD_VALUE, title);
+ valueItem.setShowTitle(getShowTitle());
+ valueItem.setValue(getValue());
+ IntegerRangeValidator integerRangeValidator = new IntegerRangeValidator();
+ integerRangeValidator.setMin(1);
+ valueItem.setValidators(integerRangeValidator);
+ valueItem.setValidateOnChange(getValidateOnChange());
+ valueItem.setValidateOnExit(getValidateOnExit());
+
+ valueItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updateValue();
+ }
+ });
+
+ ComboBoxItem unitsItem = new ComboBoxItem(FIELD_UNITS);
+ unitsItem.setShowTitle(false);
+
+ // TODO: i18n valueMap values
+ LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
+ if (iterationsSupported) {
+ valueMap.put("times", "times");
+ }
+ if (supportedUnits != null && !supportedUnits.isEmpty()) {
+ TreeSet<TimeUnit> sortedSupportedUnits = new TreeSet<TimeUnit>(supportedUnits);
+ for (TimeUnit unit : sortedSupportedUnits) {
+ valueMap.put(unit.name().toLowerCase(), unit.name().toLowerCase());
+ }
+ this.valueUnit = sortedSupportedUnits.iterator().next();
+ unitsItem.setValueMap(valueMap);
+ }
+
+ if (this.defaultUnit != null) {
+ unitsItem.setDefaultValue(this.defaultUnit.name().toLowerCase());
+ } else {
+ unitsItem.setDefaultToFirstOption(true);
+ }
+
+ if (this.contextualHelp != null) {
+ FormUtility.addContextualHelp(unitsItem, this.contextualHelp);
+ }
+
+ unitsItem.addChangedHandler(new ChangedHandler() {
+ public void onChanged(ChangedEvent event) {
+ updateValue();
+ }
+ });
+
+ this.form.setFields(valueItem, unitsItem);
+ valueItem.setWidth(90);
+ unitsItem.setWidth(105);
+
+ setCanvas(this.form);
+ }
+
+ public void setValue(Object value) {
+ Integer intValue;
+ if (value instanceof String) {
+ intValue = Integer.valueOf((String)value);
+ } else if (value instanceof Integer) {
+ intValue = (Integer) value;
+ } else {
+ intValue = null;
+ }
+
+ if (intValue != null) {
+ this.form.setValue(FIELD_VALUE, intValue);
+ } else {
+ this.form.setValue(FIELD_VALUE, (String)null);
+ }
+
+ super.setValue(value);
+ }
+
+ private void updateValue() {
+ Integer convertedValue = null;
+
+ IntegerItem valueItem = (IntegerItem) this.form.getItem(FIELD_VALUE);
+ Object value = valueItem.getValue();
+ Integer intValue;
+ if (value instanceof String) {
+ intValue = Integer.valueOf((String)value);
+ } else if (value instanceof Integer) {
+ intValue = (Integer) value;
+ } else {
+ intValue = null;
+ }
+
+ if (intValue != null) {
+ TimeUnit unit = getInputTimeUnit();
+ if (unit == null) {
+ convertedValue = intValue;
+ } else {
+ if (unit.compareTo(this.valueUnit) < 0) {
+ throw new IllegalStateException("Input unit is less than target unit.");
+ }
+ switch (unit) {
+ case MILLISECONDS:
+ switch (this.valueUnit) {
+ case MILLISECONDS:
+ convertedValue = intValue;
+ break;
+ }
+ break;
+ case SECONDS:
+ switch (this.valueUnit) {
+ case SECONDS:
+ convertedValue = intValue;
+ break;
+ case MILLISECONDS:
+ convertedValue = intValue * 1000;
+ break;
+ }
+ break;
+ case MINUTES:
+ switch (this.valueUnit) {
+ case MINUTES:
+ convertedValue = intValue;
+ break;
+ case SECONDS:
+ convertedValue = intValue * 60;
+ break;
+ case MILLISECONDS:
+ convertedValue = intValue * 60 * 1000;
+ break;
+ }
+ break;
+ case HOURS:
+ switch (this.valueUnit) {
+ case HOURS:
+ convertedValue = intValue;
+ break;
+ case MINUTES:
+ convertedValue = intValue * 60;
+ break;
+ case SECONDS:
+ convertedValue = intValue * 60 * 60;
+ break;
+ case MILLISECONDS:
+ convertedValue = intValue * 60 * 60 * 1000;
+ break;
+ }
+ break;
+ case DAYS:
+ switch (this.valueUnit) {
+ case DAYS:
+ convertedValue = intValue;
+ break;
+ case HOURS:
+ convertedValue = intValue * 24;
+ break;
+ case MINUTES:
+ convertedValue = intValue * 24 * 60;
+ break;
+ case SECONDS:
+ convertedValue = intValue * 24 * 60 * 60;
+ break;
+ case MILLISECONDS:
+ convertedValue = intValue * 24 * 60 * 60 * 1000;
+ break;
+ }
+ break;
+ case WEEKS:
+ switch (this.valueUnit) {
+ case WEEKS:
+ convertedValue = intValue;
+ break;
+ case DAYS:
+ convertedValue = intValue * 7;
+ break;
+ case HOURS:
+ convertedValue = intValue * 7 * 24;
+ break;
+ case MINUTES:
+ convertedValue = intValue * 7 * 24 * 60;
+ break;
+ case SECONDS:
+ convertedValue = intValue * 7 * 24 * 60 * 60;
+ break;
+ case MILLISECONDS:
+ convertedValue = intValue * 7 * 24 * 60 * 60 * 1000;
+ break;
+ }
+ break;
+ case MONTHS:
+ switch (this.valueUnit) {
+ case MONTHS:
+ convertedValue = intValue;
+ break;
+ case WEEKS:
+ convertedValue = intValue * 4;
+ break;
+ case DAYS:
+ convertedValue = intValue * 30;
+ break;
+ case HOURS:
+ convertedValue = intValue * 30 * 24;
+ break;
+ case MINUTES:
+ convertedValue = intValue * 30 * 24 * 60;
+ break;
+ case SECONDS:
+ convertedValue = intValue * 30 * 24 * 60 * 60;
+ break;
+ case MILLISECONDS:
+ convertedValue = intValue * 30 * 24 * 60 * 60 * 1000;
+ break;
+ }
+ break;
+ case YEARS:
+ switch (this.valueUnit) {
+ case YEARS:
+ convertedValue = intValue;
+ break;
+ case MONTHS:
+ convertedValue = intValue * 12;
+ break;
+ case WEEKS:
+ convertedValue = intValue * 52;
+ break;
+ case DAYS:
+ convertedValue = intValue * 365;
+ break;
+ case HOURS:
+ convertedValue = intValue * 365 * 24;
+ break;
+ case MINUTES:
+ convertedValue = intValue * 365 * 24 * 60;
+ break;
+ case SECONDS:
+ convertedValue = intValue * 365 * 24 * 60 * 60;
+ break;
+ case MILLISECONDS:
+ convertedValue = intValue * 365 * 24 * 60 * 60 * 1000;
+ break;
+ }
+ break;
+ }
+ }
+ }
+
+ super.setValue(convertedValue);
+ }
+
+ private TimeUnit getInputTimeUnit() {
+ ComboBoxItem unitsItem = (ComboBoxItem) this.form.getItem(FIELD_UNITS);
+ String unitString = unitsItem.getValueAsString(); // this will always be non-null
+ TimeUnit unit;
+ try {
+ unit = TimeUnit.valueOf(unitString.toUpperCase());
+ } catch (IllegalArgumentException e) {
+ // not a time unit, so unit must be "times" (i.e. iterations)
+ unit = null;
+ }
+ return unit;
+ }
+
+ public Integer getValueAsInteger() {
+ return (Integer) getValue();
+ }
+
+ @Override
+ public Boolean validate() {
+ return this.form.validate();
+ }
+
+ public void setDefaultUnit(TimeUnit defaultUnit) {
+ this.defaultUnit = defaultUnit;
+ }
+
+ public void setContextualHelp(String contextualHelp) {
+ this.contextualHelp = contextualHelp;
+ }
+
+ /**
+ * Returns the time unit of this item's {@link #getValue() value} - if null, the item's value represents an iteration
+ * count, not a time duration.
+ *
+ * @return the time unit of this item's {@link #getValue() value} - if null, the item's value represents an iteration
+ * count, not a time duration
+ */
+ public TimeUnit getValueUnit() {
+ return this.valueUnit;
+ }
+
+ @Override
+ public String toString() {
+ Object value = form.getValue(FIELD_VALUE);
+ String string;
+ if (value != null) {
+ TimeUnit timeUnit = getInputTimeUnit();
+ String unitString = (timeUnit != null) ? timeUnit.name().toLowerCase() : "times";
+ string = value + " " + unitString;
+ } else {
+ string = "";
+ }
+
+ return string;
+ }
+
+}
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 e846a1d..27df563 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
@@ -101,7 +101,7 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
hasIdField = true;
}
if (this.isReadOnly) {
- if ((item instanceof StaticTextItem) || (item instanceof CanvasItem)) {
+ if ((item instanceof StaticTextItem) || (item instanceof CanvasItem && !(item instanceof DurationItem))) {
// note: EditableFormItem is a subclass of CanvasItem
if (item instanceof EditableFormItem) {
((EditableFormItem) item).setReadOnly(true);
@@ -110,7 +110,8 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
} else {
StaticTextItem staticItem = new StaticTextItem(item.getName(), item.getTitle());
staticItem.setTooltip(item.getTooltip());
- staticItem.setValue(item.getValue());
+ Object value = (item instanceof DurationItem) ? item.toString() : item.getValue();
+ staticItem.setValue(value);
staticItem.setColSpan(item.getAttribute("colSpan"));
// TODO: Any other fields we should copy? icons?
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnumSelectItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnumSelectItem.java
index e1a09fe..c5404de 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnumSelectItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnumSelectItem.java
@@ -31,7 +31,7 @@ import com.smartgwt.client.types.MultipleAppearance;
import com.smartgwt.client.widgets.form.fields.SelectItem;
/**
- * A convenients class for exposing an {@link Enum} as a multi-select form item.
+ * A convenience class for exposing an {@link Enum} as a multi-select form item.
*
* @author Joseph Marques
*/
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/RadioGroupWithComponentsItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/RadioGroupWithComponentsItem.java
index 9412237..e75ee44 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/RadioGroupWithComponentsItem.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/RadioGroupWithComponentsItem.java
@@ -38,6 +38,8 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
/**
+ * TODO
+ *
* @author Greg Hinkle
*/
public class RadioGroupWithComponentsItem extends CanvasItem {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java
index 194c921..a3b402a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java
@@ -34,6 +34,7 @@ import org.rhq.core.domain.operation.composite.ResourceOperationScheduleComposit
import org.rhq.core.domain.resource.composite.DisambiguationReport;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
/**
* @author Greg Hinkle
@@ -61,6 +62,10 @@ public interface OperationGWTService extends RemoteService {
int scheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException;
+ ResourceOperationSchedule getResourceOperationSchedule(int scheduleId);
+
+ GroupOperationSchedule getGroupOperationSchedule(int scheduleId);
+
void unscheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule) throws RuntimeException;
void unscheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
index 56e7d52..f927030 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
@@ -42,6 +42,7 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.RecordUtility;
/**
* @author Ian Springer
@@ -134,7 +135,7 @@ public abstract class AbstractOperationScheduleDataSource<T extends OperationSch
SubjectRecord subjectRecord = (SubjectRecord) from.getAttributeAsRecord(Field.SUBJECT);
to.setSubject(subjectRecord.toSubject());
Configuration parameters = (Configuration) from.getAttributeAsObject(Field.PARAMETERS);
- Integer timeout = from.getAttributeAsInt(Field.TIMEOUT);
+ Integer timeout = RecordUtility.getAttributeAsInteger(from, Field.TIMEOUT);
if (timeout != null) {
if (parameters == null) {
parameters = new Configuration();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index 1ea15db..7d01228 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -22,7 +22,7 @@ package org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
-import java.util.LinkedHashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -31,16 +31,13 @@ import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
-import com.smartgwt.client.widgets.form.fields.ComboBoxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
-import com.smartgwt.client.widgets.form.fields.IntegerItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
-import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.auth.Subject;
@@ -52,7 +49,9 @@ import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
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.components.form.AbstractRecordEditor;
+import org.rhq.enterprise.gui.coregui.client.components.form.DurationItem;
import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.components.form.TimeUnit;
import org.rhq.enterprise.gui.coregui.client.components.trigger.JobTriggerEditor;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
@@ -156,7 +155,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
contentPane.addMember(hr);
}
- this.timeoutForm = new EnhancedDynamicForm(extendLocatorId("TimeoutForm"), isReadOnly(), isNewRecord());
+ /*this.timeoutForm = new EnhancedDynamicForm(extendLocatorId("TimeoutForm"), isReadOnly(), isNewRecord());
this.timeoutForm.setNumCols(4);
this.timeoutForm.setColWidths("140", "90", "105", "*");
@@ -177,6 +176,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
timeoutItem.setWidth(90);
timeoutUnitsItem.setWidth(105);
contentPane.addMember(this.timeoutForm);
+ */
this.notesForm = new EnhancedDynamicForm(extendLocatorId("NotesForm"), isReadOnly(),
isNewRecord());
@@ -184,8 +184,17 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
List<FormItem> notesFields = new ArrayList<FormItem>();
+ Set<TimeUnit> supportedUnits = new HashSet<TimeUnit>(3);
+ supportedUnits.add(TimeUnit.SECONDS);
+ supportedUnits.add(TimeUnit.MINUTES);
+ supportedUnits.add(TimeUnit.HOURS);
+ DurationItem timeoutItem = new DurationItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout",
+ supportedUnits, false, this.notesForm);
+ notesFields.add(timeoutItem);
+
if (!isNewRecord()) {
- StaticTextItem nextFireTimeItem = new StaticTextItem(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME, "Next Fire Time");
+ StaticTextItem nextFireTimeItem = new StaticTextItem(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME,
+ "Next Fire Time");
notesFields.add(nextFireTimeItem);
}
@@ -229,15 +238,21 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
refreshOperationDescriptionItem();
refreshOperationParametersItem();
- if (!isNewRecord()) {
- FormItem nextFireTimeItem = this.notesForm.getField(ResourceOperationScheduleDataSource.Field.NEXT_FIRE_TIME);
- nextFireTimeItem.setValue(getForm().getValue(ResourceOperationScheduleDataSource.Field.NEXT_FIRE_TIME));
- }
+ super.editRecord(record);
+ }
+
+ @Override
+ protected void editExistingRecord(Record record) {
+ FormItem nextFireTimeItem = this.notesForm.getField(ResourceOperationScheduleDataSource.Field.NEXT_FIRE_TIME);
+ nextFireTimeItem.setValue(getForm().getValue(ResourceOperationScheduleDataSource.Field.NEXT_FIRE_TIME));
+
+ FormItem timeoutItem = this.notesForm.getField(AbstractOperationScheduleDataSource.Field.TIMEOUT);
+ timeoutItem.setValue(getForm().getValue(AbstractOperationScheduleDataSource.Field.TIMEOUT));
FormItem notesItem = this.notesForm.getField(ResourceOperationScheduleDataSource.Field.DESCRIPTION);
notesItem.setValue(getForm().getValue(ResourceOperationScheduleDataSource.Field.DESCRIPTION));
- super.editRecord(record);
+ super.editExistingRecord(record);
}
@Override
@@ -269,8 +284,11 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
form.setValue("jobTrigger", jobTriggerRecord);
- FormItem notesItem = this.notesForm.getField(ResourceOperationScheduleDataSource.Field.DESCRIPTION);
- form.setValue(ResourceOperationScheduleDataSource.Field.DESCRIPTION, (String)notesItem.getValue());
+ DurationItem timeoutItem = (DurationItem)this.notesForm.getItem(AbstractOperationScheduleDataSource.Field.TIMEOUT);
+ form.setValue(AbstractOperationScheduleDataSource.Field.TIMEOUT, timeoutItem.getValueAsInteger());
+
+ FormItem notesItem = this.notesForm.getField(AbstractOperationScheduleDataSource.Field.DESCRIPTION);
+ form.setValue(AbstractOperationScheduleDataSource.Field.DESCRIPTION, (String)notesItem.getValue());
super.save(requestProperties);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
index 188a892..1aebfec 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
@@ -60,19 +60,33 @@ public class GroupOperationScheduleDataSource extends AbstractOperationScheduleD
@Override
protected void executeFetch(final DSRequest request, final DSResponse response) {
- operationService.findScheduledGroupOperations(this.groupComposite.getResourceGroup().getId(),
- new AsyncCallback<List<GroupOperationSchedule>>() {
- public void onSuccess(List<GroupOperationSchedule> result) {
- Record[] records = buildRecords(result);
- response.setData(records);
- processResponse(request.getRequestId(), response);
+ final Integer scheduleId = request.getCriteria().getAttributeAsInt(AbstractOperationScheduleDataSource.Field.ID);
+ if (scheduleId != null) {
+ operationService.getGroupOperationSchedule(scheduleId, new AsyncCallback<GroupOperationSchedule>() {
+ public void onSuccess(GroupOperationSchedule result) {
+ sendSuccessResponse(request, response, result);
}
public void onFailure(Throwable caught) {
- throw new RuntimeException("Failed to find scheduled operations for "
- + groupComposite.getResourceGroup() + ".", caught);
+ sendFailureResponse(request, response, "Failed to fetch GroupOperationSchedule with id "
+ + scheduleId + ".", caught);
}
});
+ } else {
+ operationService.findScheduledGroupOperations(this.groupComposite.getResourceGroup().getId(),
+ new AsyncCallback<List<GroupOperationSchedule>>() {
+ public void onSuccess(List<GroupOperationSchedule> result) {
+ Record[] records = buildRecords(result);
+ response.setData(records);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onFailure(Throwable caught) {
+ throw new RuntimeException("Failed to find scheduled operations for "
+ + groupComposite.getResourceGroup() + ".", caught);
+ }
+ });
+ }
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java
index 0950a70..cb4f95c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java
@@ -55,7 +55,20 @@ public class ResourceOperationScheduleDataSource extends AbstractOperationSchedu
@Override
protected void executeFetch(final DSRequest request, final DSResponse response) {
- operationService.findScheduledResourceOperations(this.resourceComposite.getResource().getId(),
+ final Integer scheduleId = request.getCriteria().getAttributeAsInt(Field.ID);
+ if (scheduleId != null) {
+ operationService.getResourceOperationSchedule(scheduleId, new AsyncCallback<ResourceOperationSchedule>() {
+ public void onSuccess(ResourceOperationSchedule result) {
+ sendSuccessResponse(request, response, result);
+ }
+
+ public void onFailure(Throwable caught) {
+ sendFailureResponse(request, response, "Failed to fetch ResourceOperationSchedule with id "
+ + scheduleId + ".", caught);
+ }
+ });
+ } else {
+ operationService.findScheduledResourceOperations(this.resourceComposite.getResource().getId(),
new AsyncCallback<List<ResourceOperationSchedule>>() {
public void onSuccess(List<ResourceOperationSchedule> result) {
Record[] records = buildRecords(result);
@@ -68,6 +81,7 @@ public class ResourceOperationScheduleDataSource extends AbstractOperationSchedu
+ resourceComposite.getResource() + ".", caught);
}
});
+ }
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RecordUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RecordUtility.java
new file mode 100644
index 0000000..b8f1e77
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RecordUtility.java
@@ -0,0 +1,66 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2011 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.util;
+
+import com.smartgwt.client.data.Record;
+
+/**
+ * A collection of utility methods for working with SmartGWT {@link Record}s.
+ *
+ * @author Ian Springer
+ */
+public class RecordUtility {
+
+ private RecordUtility() {
+ // static utility class only
+ }
+
+ public static Integer getAttributeAsInteger(Record record, String attributeName) {
+ Object value;
+ try {
+ value = record.getAttributeAsInt(attributeName);
+ } catch (Exception e) {
+ try {
+ value = record.getAttributeAsDouble(attributeName);
+ } catch (Exception e1) {
+ try {
+ value = record.getAttributeAsString(attributeName);
+ } catch (Exception e2) {
+ throw new RuntimeException("Failed to obtain value of attribute [" + attributeName + "] of Record ["
+ + record + "].");
+ }
+ }
+ }
+
+ Integer integerValue;
+ if (value instanceof Number) {
+ integerValue = ((Number) value).intValue();
+ } else if (value instanceof String) {
+ integerValue = Integer.parseInt((String) value);
+ } else if (value == null) {
+ integerValue = null;
+ } else {
+ throw new RuntimeException("Value of attribute [" + attributeName + "] of Record [" + record
+ + "] is not an integer.");
+ }
+
+ return integerValue;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
index d194adf..0bc70db 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
@@ -28,6 +28,7 @@ import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria;
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite;
import org.rhq.core.domain.operation.composite.ResourceOperationScheduleComposite;
@@ -119,6 +120,18 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O
}
}
+ public ResourceOperationSchedule getResourceOperationSchedule(int scheduleId) {
+ ResourceOperationSchedule resourceOperationSchedule =
+ operationManager.getResourceOperationSchedule(getSessionSubject(), scheduleId);
+ return SerialUtility.prepare(resourceOperationSchedule, "getResourceOperationSchedule");
+ }
+
+ public GroupOperationSchedule getGroupOperationSchedule(int scheduleId) {
+ GroupOperationSchedule groupOperationSchedule =
+ operationManager.getGroupOperationSchedule(getSessionSubject(), scheduleId);
+ return SerialUtility.prepare(groupOperationSchedule, "getGroupOperationSchedule");
+ }
+
public void unscheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule)
throws RuntimeException {
try {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index 308f459..746b723 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -467,6 +467,26 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
return operationSchedules;
}
+ public ResourceOperationSchedule getResourceOperationSchedule(Subject whoami, int scheduleId) {
+ OperationScheduleEntity operationScheduleEntity = entityManager.find(OperationScheduleEntity.class, scheduleId);
+ try {
+ ResourceOperationSchedule resourceOperationSchedule = getResourceOperationSchedule(whoami, operationScheduleEntity.getJobId().toString());
+ return resourceOperationSchedule;
+ } catch (SchedulerException e) {
+ throw new RuntimeException("Failed to retrieve ResourceOperationSchedule with id [" + scheduleId + "].", e);
+ }
+ }
+
+ public GroupOperationSchedule getGroupOperationSchedule(Subject whoami, int scheduleId) {
+ OperationScheduleEntity operationScheduleEntity = entityManager.find(OperationScheduleEntity.class, scheduleId);
+ try {
+ GroupOperationSchedule groupOperationSchedule = getGroupOperationSchedule(whoami, operationScheduleEntity.getJobId().toString());
+ return groupOperationSchedule;
+ } catch (SchedulerException e) {
+ throw new RuntimeException("Failed to retrieve GroupOperationSchedule with id [" + scheduleId + "].", e);
+ }
+ }
+
public ResourceOperationSchedule getResourceOperationSchedule(Subject whoami, JobDetail jobDetail) {
JobDataMap jobDataMap = jobDetail.getJobDataMap();
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
index 846b54d..e365ee8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
@@ -130,6 +130,24 @@ public interface OperationManagerLocal {
throws SchedulerException;
/**
+ * TODO
+ *
+ * @param whoami
+ * @param scheduleId
+ * @return
+ */
+ ResourceOperationSchedule getResourceOperationSchedule(Subject whoami, int scheduleId);
+
+ /**
+ * TODO
+ *
+ * @param whoami
+ * @param scheduleId
+ * @return
+ */
+ GroupOperationSchedule getGroupOperationSchedule(Subject whoami, int scheduleId);
+
+ /**
* This will delete an operation schedule entity identified with the given job ID. Note that this does <b>not</b>
* actually unschedule the job - it merely removed our schedule tracking entity. This schedule tracking entity is
* really just used to provide some additional querying capabilities since it allows us to link a resource or group
13 years, 4 months
[rhq] modules/enterprise
by Jay Shaughnessy
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java | 10 ++++++++++
1 file changed, 10 insertions(+)
New commits:
commit 16cb2cddf7e169c2ed5bb0655df59603b8ee9d3d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Feb 2 09:30:28 2011 -0500
For SectionedLeftNav views, make sure that if you go back to the default
view you initialize the LHS section trees. This prevents ignored clicks
on the previously selected tree nodes. Good for a normal user and
very important for repeatable selenium tests.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
index 3cfe369..614fb1d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/view/AbstractSectionedLeftNavigationView.java
@@ -232,6 +232,7 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
if (viewPath.isEnd()) {
// Display default view
setContent(defaultView());
+ initSectionPageTreeGrids();
} else {
renderContentView(viewPath);
}
@@ -246,6 +247,15 @@ public abstract class AbstractSectionedLeftNavigationView extends LocatableHLayo
}
}
+ private void initSectionPageTreeGrids() {
+ for (String name : treeGrids.keySet()) {
+ TreeGrid treeGrid = treeGrids.get(name);
+ treeGrid.deselectAllRecords();
+ this.currentSectionViewId = null;
+ this.currentPageViewId = null;
+ }
+ }
+
private void selectSectionPageTreeGridNode(String sectionName, String pageName) {
for (String name : treeGrids.keySet()) {
TreeGrid treeGrid = treeGrids.get(name);
13 years, 4 months
[rhq] Branch 'cli-alert-notifs' - 17 commits - modules/core modules/enterprise
by lkrejci
modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotification.java | 17
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java | 9
modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java | 6
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java | 6
modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationManager.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java | 17
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDistroFileStep.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/ConfirmationStep.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java | 66
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java | 23
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java | 18
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java | 56
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/Table.java | 11
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java | 47
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 43
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java | 24
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java | 50
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java | 28
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java | 134 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java | 55
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java | 109 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java | 259 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java | 79
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java | 91 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java | 254 ---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java | 88 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/event/EventCompositeDetailsView.java | 3
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 21
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java | 44
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java | 49
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 29
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java | 762 +++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java | 793 ----------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java | 4
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/client/report/operation/SubsystemOperationHistoryListView.java | 34
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java | 17
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java | 14
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java | 6
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/SeleniumUtility.java | 15
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java | 33
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java | 19
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerLocal.java | 9
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java | 45
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java | 17
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java | 70
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerRemote.java | 24
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 58
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java | 11
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 6
modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java | 185 +-
modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliSender.java | 162 +-
modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml | 24
84 files changed, 2410 insertions(+), 1718 deletions(-)
New commits:
commit d5beb73759a02a407a609856c4c641c0ff6fd9c2
Merge: 609091a... c37617a...
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Wed Feb 2 10:00:02 2011 +0100
Merge remote branch 'origin/master' into cli-alert-notifs
commit c37617a8384f6770ba578a3f604348687ad9cfc6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Feb 1 18:25:02 2011 -0500
Fix a selenium locator issue with the top level view titles.
- use locatable layouts as opposed to standard for default views
- removethe special onDestroy() logic for LocatableToolStrip (not sure why
this was not right, not sure ToolStrip is behaving as expected).
- change other Layout onDestroy() impls to remove members prior to calling
super.onDestroy().
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 fd59cf6..beea6da 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
@@ -259,10 +259,13 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
}
public static void setContent(Canvas newContent) {
- Canvas contentCanvas = Canvas.getById(CONTENT_CANVAS_ID);
- for (Canvas child : contentCanvas.getChildren()) {
- child.destroy();
+ if (content != null) {
+ content.removeFromParent();
+ content.destroy();
+ content = null;
}
+
+ Canvas contentCanvas = Canvas.getById(CONTENT_CANVAS_ID);
if (newContent != null) {
content = newContent;
contentCanvas.addChild(newContent);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 723d87d..b0078d6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -37,6 +37,7 @@ import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* The Administration top-level view.
@@ -90,7 +91,7 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
}
protected VLayout defaultView() {
- VLayout vLayout = new VLayout();
+ LocatableVLayout vLayout = new LocatableVLayout(this.extendLocatorId("Default"));
vLayout.setWidth100();
// TODO: Admin icon.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
index 2e3d919..b32775f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
@@ -26,7 +26,6 @@ import java.util.Set;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.measurement.AvailabilityType;
@@ -47,6 +46,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions.GroupD
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.ResourceAutodiscoveryView;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* The Inventory top-level view.
@@ -101,7 +101,7 @@ public class InventoryView extends AbstractSectionedLeftNavigationView {
}
protected Canvas defaultView() {
- VLayout vLayout = new VLayout();
+ LocatableVLayout vLayout = new LocatableVLayout(this.extendLocatorId("Default"));
vLayout.setWidth100();
// TODO: Admin icon.
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 5b0cd5c..4349039 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
@@ -48,6 +48,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configura
import org.rhq.enterprise.gui.coregui.client.report.measurement.MeasurementOOBView;
import org.rhq.enterprise.gui.coregui.client.report.operation.SubsystemOperationHistoryListView;
import org.rhq.enterprise.gui.coregui.client.report.tag.TaggedView;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* The Reports top-level view.
@@ -82,7 +83,7 @@ public class ReportTopView extends AbstractSectionedLeftNavigationView {
@Override
protected VLayout defaultView() {
- VLayout vLayout = new VLayout();
+ LocatableVLayout vLayout = new LocatableVLayout(this.extendLocatorId("Default"));
vLayout.setWidth100();
// TODO: Admin icon.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
index 8a72774..6729210 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
@@ -53,9 +53,8 @@ public class LocatableHLayout extends HLayout implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
index 8f8311c..efe2894 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
@@ -37,9 +37,8 @@ public class LocatableLayout extends Layout implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
index 13db7f8..6e7a2ac 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
@@ -35,11 +35,14 @@ public class LocatableToolStrip extends ToolStrip implements Locatable {
SeleniumUtility.destroyMembers(this);
}
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- destroyMembers();
- }
+ // It was my understanding that Layouts needed explicit removal of members but it seems
+ // that ToolStrip may treat its members differently. The logic below actually caused issues because
+ // the member was being destroyed automatically.
+ //
+ //@Override
+ //protected void onDestroy() {
+ // destroyMembers();
+ // super.onDestroy();
+ //}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
index d91f9cd..54f081c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
@@ -53,9 +53,8 @@ public class LocatableVLayout extends VLayout implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
index c6dfafd..4a86ee4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
@@ -53,9 +53,8 @@ public class LocatableVStack extends VStack implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
commit 10d1fa32b0ff009576ea6e901c308f5c8d0aeec2
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Feb 1 14:07:44 2011 -0500
Selenium Work - provide dashboard save with a callback signature. This way
we can take post-save action and perform some necessary widget cleanup
after a portlet drag-drop.
- Also, fix dashboard redraw to not blow away the edit form.
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 078f483..5a19688 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
@@ -107,19 +107,19 @@ public class DashboardView extends LocatableVLayout {
@Override
protected void onInit() {
- super.onInit();
if (!isInitialized) {
+ super.onInit();
addMember(buildEditForm());
isInitialized = true;
}
}
public void redraw() {
- for (Canvas c : getChildren()) {
- c.removeFromParent();
- c.destroy();
- }
+ // destroy all of the portlets and recreate from scratch
+ portalLayout.removeFromParent();
+ portalLayout.destroy();
+ portalLayout = null;
buildPortlets();
}
@@ -328,8 +328,8 @@ public class DashboardView extends LocatableVLayout {
for (int i = 0; i < storedDashboard.getColumns(); i++) {
for (DashboardPortlet storedPortlet : storedDashboard.getPortlets(i)) {
- final PortletWindow portletWindow = new PortletWindow(portalLayout
- .extendLocatorId(getPortletLocatorId(storedPortlet)), this, storedPortlet);
+ String locatorId = getPortletLocatorId(portalLayout, storedPortlet);
+ final PortletWindow portletWindow = new PortletWindow(locatorId, this, storedPortlet);
portletWindows.add(portletWindow);
portletWindow.setTitle(storedPortlet.getName());
@@ -349,30 +349,30 @@ public class DashboardView extends LocatableVLayout {
* is one tuple that is guaranteed unique and useful for a repeatable locator Id: DashBoard-Position. This
* means that the on a single dashboard each portlet has a unique column-columnIndex pair. Although portlets
* can move, and the positions can change at runtime, it's still valid for a locatorId because it is
- * unique and repeatable fpr test purposes. We also add the portletKey for an easier visual cue.
+ * unique and repeatable for test purposes. We also add the portletKey for an easier visual cue.
+ * The portalLayout's locatorId already incorporates the dashboardName, so we need only extend it with the
+ * positioning information.
*
+ * @param portalLayout
* @param dashboardPortlet
* @return The locatorId for the portlet. Form PortleyKey_DashboardId_Column_ColumnIndex
*/
- private String getPortletLocatorId(DashboardPortlet dashboardPortlet) {
+ private String getPortletLocatorId(PortalLayout portalLayout, DashboardPortlet dashboardPortlet) {
StringBuilder locatorId = new StringBuilder(dashboardPortlet.getPortletKey());
locatorId.append("_");
- locatorId.append(dashboardPortlet.getDashboard().getId());
- locatorId.append("_");
locatorId.append(dashboardPortlet.getColumn());
locatorId.append("_");
locatorId.append(dashboardPortlet.getIndex());
- return locatorId.toString();
+ return portalLayout.extendLocatorId(locatorId.toString());
}
private void addPortlet(String portletKey, String portletName) {
DashboardPortlet storedPortlet = new DashboardPortlet(portletName, portletKey, 250);
storedDashboard.addPortlet(storedPortlet);
- String locatorId = getPortletLocatorId(storedPortlet);
- final PortletWindow newPortletWindow = new PortletWindow(portalLayout.extendLocatorId(locatorId), this,
- storedPortlet);
+ String locatorId = getPortletLocatorId(portalLayout, storedPortlet);
+ final PortletWindow newPortletWindow = new PortletWindow(locatorId, this, storedPortlet);
newPortletWindow.setTitle(portletName);
newPortletWindow.setHeight(350);
newPortletWindow.setVisible(false);
@@ -422,6 +422,10 @@ public class DashboardView extends LocatableVLayout {
}
public void save() {
+ save((AsyncCallback<Dashboard>) null);
+ }
+
+ public void save(final AsyncCallback<Dashboard> callback) {
// since we reset storedDashboard after the async update completes, block modification of the dashboard
// during that interval.
DashboardView.this.disable();
@@ -430,6 +434,10 @@ public class DashboardView extends LocatableVLayout {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_dashboardManager_error(), caught);
DashboardView.this.enable();
+
+ if (null != callback) {
+ callback.onFailure(caught);
+ }
}
public void onSuccess(Dashboard result) {
@@ -440,6 +448,11 @@ public class DashboardView extends LocatableVLayout {
// up to date portlets.
updatePortletWindows(result);
storedDashboard = result;
+
+ if (null != callback) {
+ callback.onSuccess(result);
+ }
+
DashboardView.this.enable();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
index 8b92e5a..930b4a9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
@@ -21,6 +21,8 @@ package org.rhq.enterprise.gui.coregui.client.dashboard;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.layout.VStack;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
+
/**
* @author Greg Hinkle
*/
@@ -52,4 +54,12 @@ public class PortalColumn extends VStack {
placeHolderProperties.setBorder("2px solid #4A5D75");
setPlaceHolderProperties(placeHolderProperties);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ SeleniumUtility.destroyMembers(this);
+ }
+
}
\ No newline at end of file
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 2b23f95..025e92e 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,13 +22,16 @@
*/
package org.rhq.enterprise.gui.coregui.client.dashboard;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.EventHandler;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.events.DropEvent;
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.util.selenium.LocatableHLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* @author Greg Hinkle
@@ -57,9 +60,9 @@ public class PortalLayout extends LocatableHLayout {
int dropPosition = column.getDropPosition();
int dropColumn = columnNumber;
- Canvas target = EventHandler.getDragTarget();
- ((PortletWindow) target).getStoredPortlet().setIndex(dropPosition);
- ((PortletWindow) target).getStoredPortlet().setColumn(dropColumn);
+ final PortletWindow target = (PortletWindow) EventHandler.getDragTarget();
+ target.getStoredPortlet().setIndex(dropPosition);
+ target.getStoredPortlet().setColumn(dropColumn);
int colNum = 0;
for (Canvas pcc : getMembers()) {
@@ -80,7 +83,31 @@ public class PortalLayout extends LocatableHLayout {
colNum++;
}
- save();
+
+ // 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.
+ AsyncCallback<Dashboard> callback = SeleniumUtility.getUseDefaultIds() ? null
+ : new AsyncCallback<Dashboard>() {
+
+ @Override
+ public void onFailure(Throwable caught) {
+ redraw();
+ }
+
+ @Override
+ public void onSuccess(Dashboard result) {
+ // for some reason the drag drop operation is leaving the target widget (the
+ // portlet window) in the DOM, detached from its original parent (the PortalLayout),
+ // and therefore not destroyed in the redraw(). So, kill it off manually to
+ // avoid ID conflicts if the portlet is again dragged back its original position.
+ target.removeFromParent();
+ target.destroy();
+
+ redraw();
+ }
+ };
+ save(callback);
+
com.allen_sauer.gwt.log.client.Log.info("Rearranged column indexes");
}
});
@@ -99,8 +126,12 @@ public class PortalLayout extends LocatableHLayout {
return portalColumn;
}
- public void save() {
- this.dashboardView.save();
+ public void save(AsyncCallback<Dashboard> callback) {
+ this.dashboardView.save(callback);
+ }
+
+ public void redraw() {
+ this.dashboardView.redraw();
}
public void resize() {
@@ -117,4 +148,11 @@ public class PortalLayout extends LocatableHLayout {
}
}
}
+
+ // @Override
+ // protected void onDestroy() {
+ // destroyMembers();
+ // super.onDestroy();
+ // }
+
}
\ No newline at end of file
commit 44d2b7cf757d6b094431d83140a6f14b2978a5d1
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Feb 1 14:04:59 2011 -0500
Selenium Work - Locator conflict work
It seems that smartgwt2.4 along with our own architecture changes have
brought to the surface a significant amount ID conflict. Addressing the
conflicts requires diligence in the destroy/onDestroy logic and call
chains.
- Added onDestroy() methods to all of the Locatable Layout classes in order
to provide cleanup of members across the board, at destroy time. Note that
children are typically destroyed automatically but members are not. (Members
are managed by the layout and children are not).
-- removed redundant or incomplete onDestroy() impls from locatable Layout
subclasses.
- Added ability to "hide" Tabs in our TwoLevelTab infrastructure. Hiding a
tab is not provided by smartgwt (why?) so we were just removing the Tab from the
TabSet. This was leaving ghost widgets around as the Tab, SubTab, SubTab
Canvas's etc were not being handled correctly. Also, since Tab does not have
a destroy() method (why?) it must be cleaned up carefully, by addingt it to
a TabSet that is then itself destroyed.
-- Added onDestroy() callChain to the TwoLevelTabViews.
- Views using non-locatable Layouts (VLayout, HLayout, Layout, VStack etc)
with members added, may need to add onDestroy() logic that wipes those
members. I added this to ActvityView2 but this may be in other places as
well. Somthing to keep an eye out for.
-- Also in ActivityView2, removed redundant call to setID(), this should
not be called in general. ID assignment is typically performed by the
Locatable infrastructure. The redundant call can (and did) generate errors
for illegal ID (re)assignment.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
index 062a47f..f88c8b0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
@@ -65,7 +65,6 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTransferImgButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* @author Greg Hinkle
@@ -203,11 +202,6 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
addMember(this.hlayout);
}
- @Override
- protected void onDestroy() {
- SeleniumUtility.destroyMembers(hlayout);
- }
-
private SectionStack buildAvailableItemsStack() {
SectionStack availableSectionStack = new SectionStack();
availableSectionStack.setWidth(300);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
index 90b605d..01076f8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
@@ -18,6 +18,11 @@
*/
package org.rhq.enterprise.gui.coregui.client.components.sorter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
import com.google.gwt.event.shared.HandlerRegistration;
import com.smartgwt.client.types.Cursor;
import com.smartgwt.client.types.ListGridFieldType;
@@ -29,14 +34,10 @@ import com.smartgwt.client.widgets.grid.events.RecordDropHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
+
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
/**
* @author Ian Springer
*/
@@ -59,7 +60,8 @@ public class ReorderableList extends LocatableVLayout {
this(locatorId, false, records, itemTitle, itemIcon);
}
- public ReorderableList(String locatorId, boolean isReadOnly, ListGridRecord[] records, String itemTitle, String itemIcon) {
+ public ReorderableList(String locatorId, boolean isReadOnly, ListGridRecord[] records, String itemTitle,
+ String itemIcon) {
super(locatorId);
this.isReadOnly = isReadOnly;
@@ -180,11 +182,4 @@ public class ReorderableList extends LocatableVLayout {
return itemIcon;
}
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- this.listGrid.destroy();
- }
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
index 9833e80..c8ce710 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
@@ -37,7 +37,7 @@ public class NamedTab extends LocatableTab {
return viewName.getTitle();
}
- protected void destroy() {
+ public void destroy() {
Canvas pane = getPane();
if (null != pane) {
pane.destroy();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
index d0a0b9e..62c8a2d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
@@ -54,7 +54,6 @@ public class NamedTabSet extends LocatableTabSet {
@Override
protected void onDestroy() {
-
for (NamedTab tab : getTabs()) {
tab.destroy();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java
index b6296d7..3492891 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java
@@ -26,7 +26,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableButton;
/**
- * Simple class to provide a SubTab a locatorId.
+ * A Locatable SubTab associating a Button with a Canvas.
*
* @author Jay Shaughnessy
*/
@@ -75,6 +75,27 @@ public class SubTab implements Locatable {
return viewName.getTitle();
}
+ public void destroyButton() {
+ if (null != button) {
+ button.removeFromParent();
+ button.destroy();
+ button = null;
+ }
+ }
+
+ public void destroyCanvas() {
+ if (null != canvas) {
+ canvas.removeFromParent();
+ canvas.destroy();
+ canvas = null;
+ }
+ }
+
+ public void destroy() {
+ destroyCanvas();
+ destroyButton();
+ }
+
@Override
public String extendLocatorId(String extension) {
return this.locatorId + "_" + extension;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java
index 4797641..70751b5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java
@@ -90,7 +90,7 @@ public class SubTabLayout extends LocatableVLayout {
}
/**
- * Make subTab visible.
+ * Make subTab visible.
*
* @param subTab not null
*/
@@ -105,17 +105,12 @@ public class SubTabLayout extends LocatableVLayout {
}
/**
- * Make subTab not visible.
+ * Make subTab not visible. Keeps any associated Canvas.
*
* @param subTab not null
*/
public void hideSubTab(SubTab subTab) {
- Button button = subTab.getButton();
- if (null != button) {
- buttonBar.removeMember(button);
- button.destroy();
- subTab.setButton(null);
- }
+ subTab.destroyButton();
}
public boolean isSubTabVisible(SubTab subTab) {
@@ -292,12 +287,9 @@ public class SubTabLayout extends LocatableVLayout {
/**
* Destroy all the currently held views so that they can be replaced with new versions
*/
- public void destroyViews() {
+ void destroyViews() {
for (SubTab subTab : subTabs.values()) {
- if (subTab.getCanvas() != null) {
- subTab.getCanvas().destroy();
- subTab.setCanvas(null);
- }
+ subTab.destroyCanvas();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
index e256299..f8f0f32 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
@@ -18,8 +18,12 @@
*/
package org.rhq.enterprise.gui.coregui.client.components.tab;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
+import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.events.TabSelectedEvent;
import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;
@@ -31,6 +35,9 @@ import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;
*/
public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, TwoLevelTabSelectedHandler {
+ /** maps Tab locator IDs to Tabs. */
+ private Map<String, TwoLevelTab> hiddenTabs = new LinkedHashMap<String, TwoLevelTab>();
+
public TwoLevelTabSet(String locatorId) {
super(locatorId);
}
@@ -58,6 +65,41 @@ public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, T
return twoLevelTabs;
}
+ // Smartgwt does not currently offer the ability to hide a Tab (why!) so we fake it here. This allows us to keep
+ // the Tab structure in place while removing it from the TabSet
+ public void setTabHidden(TwoLevelTab tab, boolean hidden) {
+ if (hidden) {
+ if (hiddenTabs.containsKey(tab.getLocatorId())) {
+ return;
+ }
+
+ // don't let the removeTab() destroy the pane
+ Canvas contentPane = tab.getPane();
+ updateTab(tab, null);
+ removeTab(tab);
+ // Reset the pane on the tab, since the call to updateTab() above nulled it out.
+ tab.setPane(contentPane);
+
+ hiddenTabs.put(tab.getLocatorId(), tab);
+ } else {
+ if (!hiddenTabs.containsKey(tab.getLocatorId())) {
+ return;
+ }
+
+ hiddenTabs.remove(tab.getLocatorId());
+ addTab(tab);
+ }
+ }
+
+ public void destroyViews() {
+ for (TwoLevelTab tab : getTabs()) {
+ tab.getLayout().destroyViews();
+ }
+ for (TwoLevelTab tab : hiddenTabs.values()) {
+ tab.getLayout().destroyViews();
+ }
+ }
+
// ------- Event support -------
// Done with a separate handler manager from parent class on purpose (compatibility issue)
@@ -113,4 +155,18 @@ public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, T
disableTab(tab);
}
}
+
+ @Override
+ protected void onDestroy() {
+ // add the hidden tabs back under the TabSet. This will get them destroyed by smartgwt when the tabset
+ // goes away. There is no explicit Tab.destroy().
+ for (TwoLevelTab tab : hiddenTabs.values()) {
+ addTab(tab);
+ }
+ for (TwoLevelTab tab : getTabs()) {
+ tab.getLayout().destroyViews();
+ }
+ super.onDestroy();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
index 2242211..9cf6a6a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
@@ -105,27 +105,11 @@ public abstract class AbstractTwoLevelTabSetView<T, U extends Layout> extends Lo
}
protected boolean updateTab(TwoLevelTab tab, boolean visible, boolean enabled) {
- TwoLevelTab attachedTab = getTabSet().getTabByLocatorId(tab.getLocatorId());
if (visible) {
- if (attachedTab == null) {
- getTabSet().addTab(tab);
- attachedTab = getTabSet().getTabByLocatorId(tab.getLocatorId());
- }
- getTabSet().setTabEnabled(attachedTab, enabled);
+ getTabSet().setTabHidden(tab, false);
+ getTabSet().setTabEnabled(tab, enabled);
} else {
- if (attachedTab != null) {
- // NOTE: If the currently selected tab is going away then switch to the default
- // prior to the removeTab call.
- if (attachedTab.equals(getTabSet().getSelectedTab())) {
- selectDefaultTabAndSubTab();
- }
- // NOTE: We need to remove the tab, because SmartGWT tabset doesn't support hiding tabs.
- Canvas contentPane = attachedTab.getPane();
- getTabSet().updateTab(attachedTab, null);
- getTabSet().removeTab(attachedTab);
- // Reset the pane on the tab, since the call to updateTab() above nulled it out.
- attachedTab.setPane(contentPane);
- }
+ getTabSet().setTabHidden(tab, true);
}
return (visible && enabled);
@@ -280,4 +264,10 @@ public abstract class AbstractTwoLevelTabSetView<T, U extends Layout> extends Lo
return baseViewPath;
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ tabSet.destroy();
+ }
+
}
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 d46a5f4..14f71e6 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
@@ -25,7 +25,6 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.tab.Tab;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
@@ -224,9 +223,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
int groupId = group.getId();
getTitleBar().setGroup(groupComposite);
- for (Tab top : this.getTabSet().getTabs()) {
- ((TwoLevelTab) top).getLayout().destroyViews();
- }
+ // wipe the canvas views for the current set of subtabs.
+ this.getTabSet().destroyViews();
GroupCategory groupCategory = groupComposite.getResourceGroup().getGroupCategory();
Set<ResourceTypeFacet> facets = groupComposite.getResourceFacets().getFacets();
@@ -297,11 +295,10 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
private void updateOperationsTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
if (updateTab(this.operationsTab, groupCategory == GroupCategory.COMPATIBLE
&& facets.contains(ResourceTypeFacet.OPERATION), true)) {
- updateSubTab(this.operationsTab, this.operationsSchedules,
- new GroupOperationScheduleListView(this.operationsSchedules.extendLocatorId("View"),
- this.groupComposite), true, true);
+ updateSubTab(this.operationsTab, this.operationsSchedules, new GroupOperationScheduleListView(
+ this.operationsSchedules.extendLocatorId("View"), this.groupComposite), true, true);
updateSubTab(this.operationsTab, this.operationsHistory, new GroupOperationHistoryListView(
- this.operationsHistory.extendLocatorId("View"), this.groupComposite), true, true);
+ this.operationsHistory.extendLocatorId("View"), this.groupComposite), true, true);
}
}
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 a4a5172..732f046 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
@@ -25,7 +25,6 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.tab.Tab;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.ResourceCriteria;
@@ -232,9 +231,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
Resource resource = this.resourceComposite.getResource();
getTitleBar().setResource(this.resourceComposite);
- for (Tab top : this.getTabSet().getTabs()) {
- ((TwoLevelTab) top).getLayout().destroyViews();
- }
+ // wipe the canvas views for the current set of subtabs.
+ this.getTabSet().destroyViews();
ResourcePermission resourcePermissions = this.resourceComposite.getResourcePermission();
Set<ResourceTypeFacet> facets = this.resourceComposite.getResourceFacets().getFacets();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
index ca6c27d..6e3e580 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
@@ -298,7 +298,7 @@ public class LiveGraphView extends LocatableVLayout {
@Override
protected void onDestroy() {
super.onDestroy();
- dataLoader.cancel();
- hoverLabel.destroy();
+
+ stop();
}
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
index db74e71..faa3ab1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
@@ -380,6 +380,7 @@ public class SmallGraphView extends LocatableVLayout {
@Override
protected void onDestroy() {
super.onDestroy();
+
hoverLabel.destroy();
}
}
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 f95591a..17b4e5c 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
@@ -63,6 +63,7 @@ import org.rhq.enterprise.gui.coregui.client.util.measurement.GwtMonitorUtils;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableCanvas;
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.SeleniumUtility;
/**
* The content pane of the Resource Summary>Activity tab.
@@ -72,8 +73,8 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
public class ActivityView extends LocatableHLayout implements RefreshableView {
//Locatable ui references
- private VLayout leftPane = new VLayout();;
- private VLayout rightPane = new VLayout();;
+ private VLayout leftPane = new VLayout();
+ private VLayout rightPane = new VLayout();
private LocatableCanvas recentMeasurementsContent = new LocatableCanvas(extendLocatorId("RecentMetrics"));
private LocatableCanvas recentAlertsContent = new LocatableCanvas(extendLocatorId("RecentAlerts"));
private LocatableCanvas recentOobContent = new LocatableCanvas(extendLocatorId("RecentOobs"));
@@ -103,7 +104,6 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
public ActivityView(String locatorId, ResourceComposite resourceComposite) {
super(locatorId);
this.resourceComposite = resourceComposite;
- setID(locatorId);
initializeUi();
}
@@ -177,6 +177,10 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
rightPane.addMember(recentPkgHistoryTitle);
rightPane.addMember(recentPkgHistoryContent);
recentPkgHistoryContent.setHeight(20);
+
+ addMember(leftPane);
+ addMember(rightPane);
+
loadData();
}
@@ -195,8 +199,16 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
@Override
protected void onDraw() {
super.onDraw();
- addMember(leftPane);
- addMember(rightPane);
+ refresh();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ // destroy members of non-locatable layouts
+ SeleniumUtility.destroyMembers(leftPane);
+ SeleniumUtility.destroyMembers(rightPane);
}
@Override
@@ -221,6 +233,13 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
addMember(titleElement);
setMembersMargin(10);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ SeleniumUtility.destroyMembers(this);
+ }
}
/** Fetches alerts and updates the DynamicForm instance with the latest
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
index 5064527..8a72774 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
@@ -51,4 +51,11 @@ public class LocatableHLayout extends HLayout implements Locatable {
SeleniumUtility.destroyMembers(this);
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
index 17c1f9c..8f8311c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
@@ -35,4 +35,11 @@ public class LocatableLayout extends Layout implements Locatable {
SeleniumUtility.destroyMembers(this);
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
index fa24d45..13db7f8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
@@ -31,4 +31,15 @@ public class LocatableToolStrip extends ToolStrip implements Locatable {
return this.locatorId + "_" + extension;
}
+ public void destroyMembers() {
+ SeleniumUtility.destroyMembers(this);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
index 61991c4..d91f9cd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
@@ -50,4 +50,12 @@ public class LocatableVLayout extends VLayout implements Locatable {
public void destroyMembers() {
SeleniumUtility.destroyMembers(this);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
index bb9093b..c6dfafd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
@@ -51,4 +51,11 @@ public class LocatableVStack extends VStack implements Locatable {
SeleniumUtility.destroyMembers(this);
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
commit 950b560c8a957f3bba1467747fe8a233fa2745df
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 31 11:48:18 2011 -0500
Fix bookmarkable dashboard urls to use dash ids as opposed to localizable
titles.
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 431f873..fd59cf6 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
@@ -391,7 +391,7 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
((BookmarkableView) currentCanvas).renderView(viewPath.next());
} else {
long elapsedMillis = System.currentTimeMillis() - startTime;
- if (elapsedMillis < 5000) {
+ if (elapsedMillis < 10000) {
schedule(100); // Reschedule the timer.
}
}
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 0322d2d..ff43a66 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
@@ -154,7 +154,7 @@ public class LinkManager {
}
}
- public static String getDashboardLink() {
+ public static String getDashboardsLink() {
if (GWT) {
return "#Dashboards";
} else {
@@ -162,6 +162,14 @@ public class LinkManager {
}
}
+ public static String getDashboardLink(int dashboardId) {
+ if (GWT) {
+ return "#Dashboards/" + dashboardId;
+ } else {
+ return "/Dashboard.do";
+ }
+ }
+
public static String getHubAllResourcesLink() {
if (GWT) {
return "#Inventory";
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 f652874..9a4970e 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
@@ -28,7 +28,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.util.BooleanCallback;
@@ -51,6 +50,7 @@ import org.rhq.core.domain.dashboard.DashboardPortlet;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.InitializableView;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
import org.rhq.enterprise.gui.coregui.client.PermissionsLoader;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
@@ -209,11 +209,11 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
/*
* do not record history item if initially loading the DashboardsView. if the selectedDashboardView is
- * null, suppression will prevent redirection from #Dashboard to #Dashboard/<id>, which would require
- * the user to hit the back button twice to return to the previous page.
+ * null, suppression will prevent redirection from #Dashboards to #Dashboards/dashboardId,
+ * which would require the user to hit the back button twice to return to the previous page.
*/
if (selectedDashboardView != null) {
- History.newItem("Dashboard/" + selectedTab.getName(), false);
+ CoreGUI.goToView(LinkManager.getDashboardLink(Integer.valueOf(selectedTab.getName())));
}
selectedDashboardView = (DashboardView) selectedTab.getPane();
@@ -224,11 +224,12 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
});
for (Dashboard dashboard : dashboards) {
- String dashboardName = dashboard.getName();
- String dashboardLocatorId = getDashboardLocatorId(dashboardName);
+ String dashboardName = String.valueOf(dashboard.getId());
+ String dashboardTitle = dashboard.getName();
+ String dashboardLocatorId = getDashboardLocatorId(dashboardTitle);
String locatorId = extendLocatorId(dashboardLocatorId);
DashboardView dashboardView = new DashboardView(locatorId, this, dashboard);
- Tab tab = new NamedTab(locatorId, new ViewName(dashboardName, dashboardName), null);
+ Tab tab = new NamedTab(locatorId, new ViewName(dashboardName, dashboardTitle), null);
tab.setPane(dashboardView);
tab.setCanClose(true);
@@ -365,13 +366,14 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
}
public void onSuccess(Dashboard result) {
- String dashboardName = result.getName();
- dashboardsByName.put(dashboardName, result); // update map so name can not be reused
- String dashboardLocatorId = getDashboardLocatorId(dashboardName);
+ String dashboardName = String.valueOf(result.getId());
+ String dashboardTitle = result.getName();
+ dashboardsByName.put(dashboardTitle, result); // update map so name can not be reused
+ String dashboardLocatorId = getDashboardLocatorId(dashboardTitle);
DashboardView dashboardView = new DashboardView(extendLocatorId(dashboardLocatorId),
DashboardsView.this, result);
NamedTab tab = new NamedTab(extendLocatorId(dashboardLocatorId), new ViewName(dashboardName,
- dashboardName), null);
+ dashboardTitle), null);
tab.setPane(dashboardView);
tab.setCanClose(true);
commit 609091aa7ba91f773512c3603c663702659885c5
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Tue Feb 1 17:46:49 2011 +0100
Adding support for meaningful SenderResult and configuration preview, adding repoId as the required parameter to the CLI alert script so that it is clear what repo should be used to get the package from.
This brought with it some reshuffling in the server APIs (just to have a "meaningful" SLSB define the needed methods).
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
index 8b7735d..ba30f9a 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersion.java
@@ -240,8 +240,12 @@ import org.rhq.core.domain.util.OSGiVersionComparator;
@NamedQuery(name = PackageVersion.QUERY_FIND_BY_ID, query = "SELECT pv FROM PackageVersion pv WHERE pv.id = :id"),
@NamedQuery(name = PackageVersion.QUERY_FIND_PACKAGE_BY_FILENAME, query = "SELECT p FROM Package p "
+ "WHERE p.id IN (SELECT pv.generalPackage.id FROM PackageVersion AS pv WHERE pv.fileName = :rpmName)"),
- @NamedQuery(name = PackageVersion.QUERY_FIND_PACKAGEVERSION_BY_FILENAME, query = "SELECT pv FROM PackageVersion AS pv WHERE pv.fileName = :rpmName)")
-
+ @NamedQuery(name = PackageVersion.QUERY_FIND_PACKAGEVERSION_BY_FILENAME, query = "SELECT pv FROM PackageVersion AS pv WHERE pv.fileName = :rpmName)"),
+ @NamedQuery(name = PackageVersion.QUERY_FIND_BY_PACKAGE_AND_REPO_ID, query = "SELECT pv"
+ + " FROM PackageVersion pv"
+ + " JOIN pv.repoPackageVersions rpv"
+ + " WHERE pv.generalPackage.id = :packageId"
+ + " AND rpv.repo.id = :repoId")
})
@SequenceGenerator(name = "SEQ", sequenceName = "RHQ_PACKAGE_VERSION_ID_SEQ")
@Table(name = "RHQ_PACKAGE_VERSION")
@@ -260,6 +264,7 @@ public class PackageVersion implements Serializable {
public static final String QUERY_FIND_BY_REPO_ID = "PackageVersion.findByRepoId";
public static final String QUERY_FIND_BY_REPO_ID_FILTERED = "PackageVersion.findByRepoIdFiltered";
public static final String QUERY_FIND_BY_PACKAGE_ID = "PackageVersion.findByPackageId";
+ public static final String QUERY_FIND_BY_PACKAGE_AND_REPO_ID = "PackageVersion.findByPackageAndRepoId";
public static final String QUERY_FIND_BY_REPO_ID_WITH_PACKAGE = "PackageVersion.findByRepoIdWithPackage";
public static final String QUERY_FIND_BY_REPO_ID_WITH_PACKAGE_FILTERED = "PackageVersion.findByRepoIdWithPackageFiltered";
public static final String QUERY_FIND_METADATA_BY_RESOURCE_ID = "PackageVersion.findMetadataByResourceId";
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
index 1120774..04607ee 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/content/PackageVersionContentSource.java
@@ -45,6 +45,11 @@ import javax.persistence.Table;
+ " FROM PackageVersionContentSource pvcs " + " WHERE pvcs.contentSource.id = :id "),
@NamedQuery(name = PackageVersionContentSource.QUERY_FIND_BY_PACKAGE_VERSION_ID_NO_FETCH, query = "SELECT pvcs "
+ " FROM PackageVersionContentSource pvcs WHERE pvcs.packageVersion.id = :id"),
+ @NamedQuery(name = PackageVersionContentSource.QUERY_FIND_BY_PACKAGE_AND_REPO_ID_NO_FETCH, query = "SELECT pvcs "
+ + " FROM PackageVersionContentSource pvcs"
+ + " JOIN pvcs.packageVersion.repoPackageVersions rpv"
+ + " WHERE pvcs.packageVersion.generalPackage.id = :package_id"
+ + " AND rpv.repo.id = :repo_id"),
@NamedQuery(name = PackageVersionContentSource.QUERY_FIND_BY_CONTENT_SOURCE_ID, query = "SELECT pvcs "
+ " FROM PackageVersionContentSource pvcs " //
+ " LEFT JOIN FETCH pvcs.packageVersion pv " //
@@ -116,6 +121,7 @@ public class PackageVersionContentSource implements Serializable {
public static final String QUERY_FIND_BY_PKG_VER_ID_AND_RES_ID = "PackageVersionContentSource.findByPkgVerIdAndResId";
public static final String DELETE_BY_CONTENT_SOURCE_ID = "PackageVersionContentSource.deleteByContentSourceId";
public static final String QUERY_FIND_BY_PACKAGE_VERSION_ID_NO_FETCH = "PackageVersionContentSource.findByPackageVersionIdNoFetch";
+ public static final String QUERY_FIND_BY_PACKAGE_AND_REPO_ID_NO_FETCH = "PackageVersionContentSource.findByPackageAndRepoId";
private static final long serialVersionUID = 1L;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
index a9fae13..225d562 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerBean.java
@@ -950,51 +950,6 @@ public class ContentSourceManagerBean implements ContentSourceManagerLocal {
return packageBits;
}
- public PackageVersion getLatestPackageVersion(int packageId, Comparator<PackageVersion> versionComparator) {
- if (versionComparator == null) {
- Query pvcsQ = entityManager.createNamedQuery(PackageVersionContentSource.QUERY_FIND_BY_PACKAGE_VERSION_ID_NO_FETCH);
-
- @SuppressWarnings("unchecked")
- List<PackageVersionContentSource> pvcss = (List<PackageVersionContentSource>) pvcsQ.getResultList();
-
- try {
- ContentProviderManager manager = ContentManagerHelper.getPluginContainer().getAdapterManager();
- for(PackageVersionContentSource pvcs : pvcss) {
- ContentProvider provider = manager.getIsolatedContentProvider(pvcs.getPackageVersionContentSourcePK().getContentSource().getId());
-
- if (provider instanceof PackageSource) {
- versionComparator = ((PackageSource)provider).getPackageVersionComparator();
-
- if (versionComparator != null) {
- //ok, we found one non-default, let's go with that.
- break;
- }
- }
- }
- } catch (Exception e) {
- log.warn("Searching package sources for a version comparator failed. Will use the default comparator.", e);
- }
-
- if (versionComparator == null) {
- versionComparator = PackageVersion.DEFAULT_COMPARATOR;
- }
- }
-
- Query q = entityManager.createNamedQuery(PackageVersion.QUERY_FIND_BY_PACKAGE_ID);
-
- @SuppressWarnings("unchecked")
- List<PackageVersion> results = (List<PackageVersion>) q.getResultList();
-
- if (results.size() > 0) {
- Comparator<PackageVersion> descending = Collections.reverseOrder(versionComparator);
- Collections.sort(results, descending);
-
- return results.get(0);
- }
-
- return null;
- }
-
/**
* This creates a new PackageBits entity initialized to EMPTY_BLOB for the associated PackageBitsBlob.
* Note that PackageBits and PackageBitsBlob are two entities that *share* the same db row. This is
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java
index fa87526..726d2d1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/ContentSourceManagerLocal.java
@@ -633,20 +633,5 @@ public interface ContentSourceManagerLocal {
* @throws ContentSourceException if the content source cannot be created, such as if the data in
* the given object are not valid
*/
- ContentSource simpleCreateContentSource(Subject subject, ContentSource contentSource) throws ContentSourceException;
-
- /**
- * Returns the latest package version of the supplied package as deemed by the supplied comparator.
- * The supplied comparator is taken as an override to the default one to use.
- * The default comparator is determined using the following algorithm:
- * <ol>
- * <li>Find the first content provider defining the package that defines a non-null comparator and return that
- * <li>If no content provider provides explicit comparator, use {@link PackageVersion#DEFAULT_COMPARATOR}
- * </ol>
- *
- * @param packageId the id of the package to find the latest version for.
- * @param versionComparator if left null, the comparator to use is determined by the rules above
- * @return
- */
- PackageVersion getLatestPackageVersion(int packageId, Comparator<PackageVersion> versionComparator);
+ ContentSource simpleCreateContentSource(Subject subject, ContentSource contentSource) throws ContentSourceException;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
index e7f2527..985c3e7 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerBean.java
@@ -20,7 +20,10 @@ package org.rhq.enterprise.server.content;
import java.text.ParseException;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -74,8 +77,10 @@ import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.AuthorizationManagerLocal;
import org.rhq.enterprise.server.authz.PermissionException;
import org.rhq.enterprise.server.authz.RequiredPermission;
+import org.rhq.enterprise.server.plugin.pc.content.ContentProvider;
import org.rhq.enterprise.server.plugin.pc.content.ContentProviderManager;
import org.rhq.enterprise.server.plugin.pc.content.ContentServerPluginContainer;
+import org.rhq.enterprise.server.plugin.pc.content.PackageSource;
import org.rhq.enterprise.server.plugin.pc.content.RepoDetails;
import org.rhq.enterprise.server.plugin.pc.content.RepoGroupDetails;
import org.rhq.enterprise.server.plugin.pc.content.RepoImportReport;
@@ -320,6 +325,71 @@ public class RepoManagerBean implements RepoManagerLocal, RepoManagerRemote {
}
@RequiredPermission(Permission.MANAGE_INVENTORY)
+ public PackageVersion getLatestPackageVersion(Subject subject, int packageId, int repoId, Comparator<PackageVersion> versionComparator) {
+ if (versionComparator == null) {
+ Query pvcsQ = entityManager.createNamedQuery(PackageVersionContentSource.QUERY_FIND_BY_PACKAGE_AND_REPO_ID_NO_FETCH);
+ pvcsQ.setParameter("package_id", packageId);
+ pvcsQ.setParameter("repo_id", repoId);
+
+ @SuppressWarnings("unchecked")
+ List<PackageVersionContentSource> pvcss = (List<PackageVersionContentSource>) pvcsQ.getResultList();
+
+ try {
+ ContentProviderManager manager = ContentManagerHelper.getPluginContainer().getAdapterManager();
+ for(PackageVersionContentSource pvcs : pvcss) {
+ ContentProvider provider = manager.getIsolatedContentProvider(pvcs.getPackageVersionContentSourcePK().getContentSource().getId());
+
+ if (provider instanceof PackageSource) {
+ versionComparator = ((PackageSource)provider).getPackageVersionComparator();
+
+ if (versionComparator != null) {
+ //ok, we found one non-default, let's go with that.
+ break;
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.warn("Searching package sources for a version comparator failed. Will use the default comparator.", e);
+ }
+
+ if (versionComparator == null) {
+ versionComparator = PackageVersion.DEFAULT_COMPARATOR;
+ }
+
+ //even though we can obtain the package versions from the pvcss elements, we can't
+ //use just these, because these are not all the package versions there might be present
+ //in the repo for this package. Some package versions can have no content source.
+ //therefore we need to query the database again in the code below to obtain the full
+ //list of package versions.
+ }
+
+ Query q = entityManager.createNamedQuery(PackageVersion.QUERY_FIND_BY_PACKAGE_AND_REPO_ID);
+ q.setParameter("packageId", packageId);
+ q.setParameter("repoId", repoId);
+
+ @SuppressWarnings("unchecked")
+ List<PackageVersion> results = (List<PackageVersion>) q.getResultList();
+
+ if (results.size() == 0) {
+ return null;
+ } else if (results.size() == 1) {
+ return results.get(0);
+ }
+
+ PackageVersion latest = results.get(0);
+ Iterator<PackageVersion> it = results.iterator();
+ it.next(); //skip the first element, we don't have to compare it with itself
+ while(it.hasNext()) {
+ PackageVersion current = it.next();
+ if (versionComparator.compare(latest, current) < 0) {
+ latest = current;
+ }
+ }
+
+ return latest;
+ }
+
+ @RequiredPermission(Permission.MANAGE_INVENTORY)
public Repo updateRepo(Subject subject, Repo repo) throws RepoException {
validateFields(repo);
// HHH-2864 - Leave this in until we move to hibernate > 3.2.r14201-2
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
index ac9e890..e5b8a38 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerLocal.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.content;
+import java.util.Comparator;
import java.util.List;
import javax.ejb.Local;
@@ -109,6 +110,11 @@ public interface RepoManagerLocal {
PageList<PackageVersion> findPackageVersionsInRepo(Subject subject, int repoId, String filter, PageControl pc);
/**
+ * @see RepoManagerRemote#getLatestPackageVersion(Subject, int, int, Comparator)
+ */
+ PackageVersion getLatestPackageVersion(Subject subject, int packageId, int repoId, Comparator<PackageVersion> versionComparator);
+
+ /**
* Get the overall sync status of this Repository. This is a summation of all the syncs.
*
* There is a weight to the status since this returns the most 'relevant' status:
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerRemote.java
index 4337203..66d3b2f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/content/RepoManagerRemote.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.server.content;
+import java.util.Comparator;
import java.util.List;
import javax.ejb.Remote;
@@ -131,6 +132,29 @@ public interface RepoManagerRemote {
@WebParam(name = "criteria") PackageVersionCriteria criteria);
/**
+ * Returns the latest package version of the supplied package as deemed by the supplied comparator.
+ * The supplied comparator is taken as an override to the default one to use.
+ * The default comparator is determined using the following algorithm:
+ * <ol>
+ * <li>Find the first content provider defining the package connected to given repo
+ * that defines a non-null comparator and return that
+ * <li>If no content provider provides explicit comparator, use {@link PackageVersion#DEFAULT_COMPARATOR}
+ * </ol>
+ *
+ * @param subject the authenticated user
+ * @param packageId the id of the package to find the latest version for.
+ * @param repoId the repo where to take the package versions of the package from
+ * @param versionComparator if left null, the comparator to use is determined by the rules above
+ * @return
+ */
+ @WebMethod
+ PackageVersion getLatestPackageVersion(
+ @WebParam(name = "subject") Subject subject,
+ @WebParam(name = "packageId") int packageId,
+ @WebParam(name = "repoId") int repoId,
+ @WebParam(name = "versionComparator") Comparator<PackageVersion> versionComparator);
+
+ /**
* Update an existing {@link Repo} object's basic fields, like name, description, etc. Note that the given <code>
* repo</code>'s relationships will be ignored and not merged with the existing repo (e.g. is subscribed
* resources will not be changed, regardless of what the given repo's subscribed resources set it).
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java
index 5bdfd4b..a5c7bae 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/plugin/pc/content/PackageSource.java
@@ -34,6 +34,7 @@ import org.rhq.core.domain.content.PackageVersion;
* passed into the plugin through {@link ContentProvider#initialize(org.rhq.core.domain.configuration.Configuration)}
*
* @author Jason Dobies
+ * @author Lukas Krejci
*/
public interface PackageSource {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
index 056582f..27d06d3 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java
@@ -25,6 +25,7 @@ package org.rhq.enterprise.server.webservices;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
+import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -779,6 +780,11 @@ public class WebservicesManagerBean implements WebservicesRemote {
return repoManager.findPackageVersionsInRepoByCriteria(subject, criteria);
}
+ public PackageVersion getLatestPackageVersion(Subject subject, int packageId, int repoId,
+ Comparator<PackageVersion> versionComparator) {
+ return repoManager.getLatestPackageVersion(subject, packageId, repoId, versionComparator);
+ }
+
public PageList<Resource> findSubscribedResources(Subject subject, int repoId, PageControl pc) {
return repoManager.findSubscribedResources(subject, repoId, pc);
}
diff --git a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
index 431d356..87cefa2 100644
--- a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
+++ b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
@@ -70,9 +70,11 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
private static final String PROP_ALERT_DEFINITION_ID = "alertDefinitionId";
private static final String PROP_USER_NAME = "userName";
private static final String PROP_ALERT_DEF_IDS = "alertDefIds";
+ private static final String PROP_REPO_NAME = "repoName";
private Set<String> scriptPackageTypes;
private String pluginName;
+ private String repoName;
public void initialize(ServerPluginContext context) throws Exception {
scriptPackageTypes = new HashSet<String>();
@@ -83,8 +85,18 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
scriptPackageTypes.add(value.getStringValue());
}
+
+ repoName = context.getPluginConfiguration().getSimpleValue(PROP_REPO_NAME, null);
}
+ public Set<String> getScriptPackageTypes() {
+ return scriptPackageTypes;
+ }
+
+ public String getRepoName() {
+ return repoName;
+ }
+
public void start() {
}
diff --git a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliSender.java b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliSender.java
index b094beb..6d7f30c 100644
--- a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliSender.java
+++ b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliSender.java
@@ -29,9 +29,9 @@ import java.io.OutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintWriter;
-import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.util.Collections;
+import java.util.List;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
@@ -47,9 +47,12 @@ import org.rhq.core.domain.alert.notification.SenderResult;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.content.PackageVersion;
+import org.rhq.core.domain.content.Repo;
+import org.rhq.core.domain.criteria.RepoCriteria;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.enterprise.client.LocalClient;
import org.rhq.enterprise.server.content.ContentSourceManagerLocal;
+import org.rhq.enterprise.server.content.RepoManagerLocal;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.alert.AlertSender;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -62,48 +65,54 @@ import org.rhq.enterprise.server.util.LookupUtil;
public class CliSender extends AlertSender<ServerPluginComponent> {
public static final String PROP_PACKAGE_ID = "packageId";
+ public static final String PROP_REPO_ID = "repoId";
public static final String PROP_USER_ID = "userId";
private static final Log LOG = LogFactory.getLog(CliSender.class);
+ private static final String SUMMARY_TEMPLATE = "Ran script $packageName in version $packageVersion from repo $repoName as user $userName.";
+ private static final String PREVIEW_TEMPLATE = "Run script $packageName from repo $repoName as user $userName.";
+
+ /**
+ * Simple strongly typed representation of the alert configuration
+ */
+ private static class Config {
+ Subject subject;
+ int packageId;
+ int repoId;
+ }
+
public SenderResult send(Alert alert) {
SenderResult result = new SenderResult();
BufferedReader reader = null;
try {
- ByteArrayOutputStream scriptOutputStream = new ByteArrayOutputStream();
-
- ScriptEngine engine = getScriptEngine(alert, scriptOutputStream);
-
- PropertySimple packageIdProp = alertParameters.getSimple(PROP_PACKAGE_ID);
-
- if (packageIdProp == null) {
- return SenderResult
- .getSimpleFailure("The configuration doesn't contain the mandatory 'packageId' property. This should not happen.");
- }
+ Config config = getConfig();
+ result.setSummary(createSummary(config, SUMMARY_TEMPLATE));
- Integer packageId = packageIdProp.getIntegerValue();
+ ByteArrayOutputStream scriptOutputStream = new ByteArrayOutputStream();
- if (packageId == null) {
- return SenderResult.getSimpleFailure("No script defined.");
- }
+ ScriptEngine engine = getScriptEngine(alert, scriptOutputStream, config);
- InputStream packageBits = getPackageBits(packageId);
+ InputStream packageBits = getPackageBits(config.packageId, config.repoId);
reader = new BufferedReader(new InputStreamReader(packageBits));
engine.eval(reader);
String scriptOutput = scriptOutputStream.toString(Charset.defaultCharset().name());
+
+ if (scriptOutput.length() == 0) {
+ scriptOutput = "Script generated no output.";
+ }
- result.setSummary(scriptOutput);
-
- result.addSuccessMessage("The script executed successfully. Its output is stored in the summary.");
-
+ result.addSuccessMessage(scriptOutput);
+
return result;
} catch (IllegalArgumentException e) {
return SenderResult.getSimpleFailure(e.getMessage());
} catch (Exception e) {
- return SenderResult.getSimpleFailure(ThrowableUtil.getAllMessages(e));
+ result.addFailureMessage(ThrowableUtil.getAllMessages(e));
+ return result;
} finally {
if (reader != null) {
try {
@@ -115,15 +124,21 @@ public class CliSender extends AlertSender<ServerPluginComponent> {
}
}
- private ScriptEngine getScriptEngine(Alert alert, OutputStream scriptOutput) throws ScriptException, IOException, IllegalArgumentException {
- int userId = alertParameters.getSimple(PROP_USER_ID).getIntegerValue();
-
- Subject user = LookupUtil.getSubjectManager().getSubjectById(userId);
-
- if (user == null) {
- throw new IllegalArgumentException("The script cannot run because the user (id " + userId + ") configured to run it doesn't exist anymore.");
+ @Override
+ public String previewConfiguration() {
+ try {
+ Config c = getConfig();
+ return createSummary(c, PREVIEW_TEMPLATE);
+ } catch (Exception e) {
+ LOG.warn("Failed to get the configuration preview.", e);
+ return "Failed to get configuration preview: " + e.getMessage();
}
-
+ }
+
+ private static ScriptEngine getScriptEngine(Alert alert, OutputStream scriptOutput, Config config) throws ScriptException,
+ IOException {
+ Subject user = config.subject;
+
LocalClient client = new LocalClient(user);
PrintWriter output = new PrintWriter(scriptOutput);
@@ -134,9 +149,10 @@ public class CliSender extends AlertSender<ServerPluginComponent> {
bindings);
}
- private InputStream getPackageBits(int packageId) throws IOException {
+ private static InputStream getPackageBits(int packageId, int repoId) throws IOException {
final ContentSourceManagerLocal csm = LookupUtil.getContentSourceManager();
- final PackageVersion versionToUse = csm.getLatestPackageVersion(packageId, null);
+ RepoManagerLocal rm = LookupUtil.getRepoManagerLocal();
+ final PackageVersion versionToUse = rm.getLatestPackageVersion(LookupUtil.getSubjectManager().getOverlord(), packageId, repoId, null);
PipedInputStream ret = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(ret);
@@ -167,4 +183,88 @@ public class CliSender extends AlertSender<ServerPluginComponent> {
return ret;
}
+
+ /**
+ * Possible replacements are:
+ * <ul>
+ * <li><code>$userName</code>
+ * <li><code>$packageName</code>
+ * <li><code>$packageVersion</code>
+ * <li><code>$repoName</code>
+ * </ul>
+ * @param config
+ * @param template
+ * @return
+ */
+ private static String createSummary(Config config, String template) {
+ try {
+ String ret = template;
+
+ ret = ret.replace("$userName", config.subject.getName());
+
+ //now get the package and repo info
+ Subject overlord = LookupUtil.getSubjectManager().getOverlord();
+ RepoManagerLocal rm = LookupUtil.getRepoManagerLocal();
+ PackageVersion versionToUse = rm.getLatestPackageVersion(overlord, config.packageId, config.repoId, null);
+
+ ret = ret.replace("$packageName", versionToUse.getDisplayName());
+ ret = ret.replace("$pacakgeVersion", versionToUse.getDisplayVersion() == null ? versionToUse.getVersion()
+ : versionToUse.getDisplayVersion());
+
+ RepoManagerLocal rm = LookupUtil.getRepoManagerLocal();
+ RepoCriteria criteria = new RepoCriteria();
+ criteria.addFilterId(config.repoId);
+
+ List<Repo> repos = rm.findReposByCriteria(overlord, criteria);
+
+ String repoName;
+
+ if (repos.size() > 0) {
+ repoName = repos.get(0).getName();
+ } else {
+ repoName = "unknown repo with id " + config.repoId;
+ }
+
+ ret = ret.replace("$repoName", repoName);
+
+ return ret;
+ } catch (Exception e) {
+ LOG.info("Failed to create alert sender summary.", e);
+ return "Failed to create summary: " + e.getMessage();
+ }
+ }
+
+ private Config getConfig() throws IllegalArgumentException {
+ Config ret = new Config();
+
+ int subjectId = getIntFromConfiguration(PROP_USER_ID, "User id not specified.", "Failed to read subject id property: ");
+ int packageId = getIntFromConfiguration(PROP_PACKAGE_ID, "Package id of the script not specified.", "Failed to read the package id property: ");
+ int repoId = getIntFromConfiguration(PROP_REPO_ID, "Repo to download the script package from not specified.", "Failed to read the repo id property: ");
+
+ Subject subject = LookupUtil.getSubjectManager().getSubjectById(subjectId);
+
+ if (subject == null) {
+ throw new IllegalArgumentException("User with id " + subjectId + " doesn't exist anymore.");
+ }
+
+ ret.subject = subject;
+ ret.packageId = packageId;
+ ret.repoId = repoId;
+
+ return ret;
+ }
+
+ private int getIntFromConfiguration(String propName, String errorMessage, String convertErrorMessage) throws IllegalArgumentException {
+ PropertySimple prop = alertParameters.getSimple(propName);
+
+ if (prop == null) {
+ throw new IllegalArgumentException(errorMessage);
+ }
+
+ try {
+ return prop.getIntegerValue();
+ } catch (Exception e) {
+ throw new IllegalArgumentException(convertErrorMessage + e.getMessage(), e);
+ }
+ }
}
diff --git a/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml
index 5d7dcbd..43785ff 100644
--- a/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -58,6 +58,11 @@
<c:description>
The list of package types that will be considered scripts. Any package of those types in any repo will be
considered a script and will be available for choosing as an alert script.
+ The package type can be one of those defined by different agent plugins and can be applicable
+ to some resource type (i.e. you might use such package type to "stream" the packages down to resources
+ on different agents using the content subsystem) but it doesn't have to.
+
+ A good choice is something like 'seversideCLIScript'.
</c:description>
<c:simple-property name="packageType" displayName="Package Type" type="string" required="true"/>
</c:list-property>
@@ -71,6 +76,7 @@
<alert-configuration>
<c:simple-property name="packageId" type="integer" required="true" description="The id of the package containing the script to execute."/>
+ <c:simple-property name="repoId" type="integer" required="true" description="The id of the repo to download the package from."/>
<c:simple-property name="userId" type="integer" required="true" description="The user the script will be run as."/>
</alert-configuration>
</alert-plugin>
\ No newline at end of file
commit d7de3626f87972f5a4a3ec705a576face3a958ff
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Tue Feb 1 11:21:02 2011 -0500
fix the scLocators so they are selenium-testable
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
index 3241cd5..21af1a6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/agent/install/RemoteAgentInstallView.java
@@ -355,7 +355,7 @@ public class RemoteAgentInstallView extends LocatableVLayout {
}
private void buildInstallInfoCanvas(VLayout installInfo, AgentInstallInfo info) {
- DynamicForm infoForm = new DynamicForm();
+ DynamicForm infoForm = new LocatableDynamicForm(extendLocatorId("infoForm"));
infoForm.setMargin(20);
infoForm.setWidth100();
infoForm.setHeight100();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
index 265167a..49b2484 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/AlertDetailsView.java
@@ -44,9 +44,13 @@ 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.tab.NamedTab;
+import org.rhq.enterprise.gui.coregui.client.components.tab.NamedTabSet;
import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
+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.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -95,15 +99,18 @@ public class AlertDetailsView extends LocatableVLayout implements BookmarkableVi
}
private TabSet getDetailsTabSet(Record record) {
- TabSet tabset = new TabSet();
+ TabSet tabset = new NamedTabSet(extendLocatorId("detailsTabSet"));
- Tab generalTab = new Tab(MSG.view_alert_common_tab_general());
+ Tab generalTab = new NamedTab(extendLocatorId("general"), new ViewName("general", MSG
+ .view_alert_common_tab_general()));
generalTab.setPane(getDetailsTableForAlert(record));
- Tab conditionsTab = new Tab(MSG.view_alert_common_tab_conditions());
+ Tab conditionsTab = new NamedTab(extendLocatorId("conditions"), new ViewName("conditions", MSG
+ .view_alert_common_tab_conditions()));
conditionsTab.setPane(getConditionsForAlert(record));
- Tab notificationsTab = new Tab(MSG.view_alert_common_tab_notifications());
+ Tab notificationsTab = new NamedTab(extendLocatorId("notifications"), new ViewName("notifications", MSG
+ .view_alert_common_tab_notifications()));
notificationsTab.setPane(getNotificationsForAlert(record));
tabset.addTab(generalTab);
@@ -114,7 +121,7 @@ public class AlertDetailsView extends LocatableVLayout implements BookmarkableVi
}
private DynamicForm getDetailsTableForAlert(Record record) {
- DynamicForm form = new DynamicForm();
+ DynamicForm form = new LocatableDynamicForm(extendLocatorId("detailsForm"));
form.setNumCols(4);
form.setHeight("15%");
form.setWrapItemTitles(false);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java
index 5b0c30c..c4de0d7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleSelector.java
@@ -35,6 +35,7 @@ import org.rhq.enterprise.gui.coregui.client.components.selector.AbstractSelecto
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
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.LocatableDynamicForm;
/**
* @author Jay Shaughnessy
@@ -48,7 +49,7 @@ public class BundleSelector extends AbstractSelector<Bundle> {
}
protected DynamicForm getAvailableFilterForm() {
- DynamicForm availableFilterForm = new DynamicForm();
+ DynamicForm availableFilterForm = new LocatableDynamicForm(extendLocatorId("availableForm"));
availableFilterForm.setNumCols(4);
final TextItem search = new TextItem("search", MSG.common_title_search());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDistroFileStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDistroFileStep.java
index 3ed578a..c188a42 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDistroFileStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDistroFileStep.java
@@ -76,7 +76,12 @@ public class BundleUploadDistroFileStep extends AbstractWizardStep {
radioItems.put(UPLOAD_OPTION, createUploadForm());
radioItems.put(RECIPE_OPTION, createRecipeForm());
- mainCanvasForm = new DynamicForm();
+ if (parent != null) {
+ mainCanvasForm = new LocatableDynamicForm(parent.extendLocatorId("mainCanvasForm"));
+ } else {
+ mainCanvasForm = new LocatableDynamicForm("mainCanvasForm");
+ }
+
radioGroup = new RadioGroupWithComponentsItem("bundleDistRadioGroup", MSG
.view_bundle_createWizard_bundleDistro(), radioItems, mainCanvasForm);
radioGroup.setShowTitle(false);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
index b6c081b..4a7b5ac 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java
@@ -39,6 +39,7 @@ 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.Locatable;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
public class GetDestinationStep extends AbstractWizardStep {
@@ -46,7 +47,7 @@ public class GetDestinationStep extends AbstractWizardStep {
private final BundleGWTServiceAsync bundleServer = GWTServiceLookup.getBundleService();
private final BundleDeployWizard wizard;
private VLayout form;
- DynamicForm valForm = new DynamicForm();
+ DynamicForm valForm = new LocatableDynamicForm("GetDestinationStepValForm");
private SinglePlatformResourceGroupSelector selector;
private BundleDestination dest = new BundleDestination();
private boolean createInProgress = false;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/ConfirmationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/ConfirmationStep.java
index c8abfb5..3d298c2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/ConfirmationStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/ConfirmationStep.java
@@ -38,6 +38,7 @@ import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
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.selenium.Locatable;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -126,7 +127,7 @@ public class ConfirmationStep extends AbstractWizardStep {
liveHeader.setWidth100();
layout.addMember(liveHeader);
- DynamicForm liveForm = new DynamicForm();
+ DynamicForm liveForm = new LocatableDynamicForm(this.wizard.getView().extendLocatorId("liveForm"));
liveForm.setNumCols(2);
StaticTextItem liveNameItem = new StaticTextItem("liveName", MSG.common_title_name());
@@ -162,7 +163,7 @@ public class ConfirmationStep extends AbstractWizardStep {
layout.addMember(prevHeader);
if (prev != null) {
- final DynamicForm prevForm = new DynamicForm();
+ final DynamicForm prevForm = new LocatableDynamicForm(this.wizard.getView().extendLocatorId("previousForm"));
prevForm.setNumCols(2);
StaticTextItem prevNameItem = new StaticTextItem("prevName", MSG.common_title_name());
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
index 7f7a77f..9833e80 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
@@ -15,6 +15,11 @@ public class NamedTab extends LocatableTab {
private ViewName viewName;
+ public NamedTab(String locatorId, ViewName viewName) {
+ super(locatorId, viewName.getTitle());
+ this.viewName = viewName;
+ }
+
public NamedTab(String locatorId, ViewName viewName, String icon) {
super(locatorId, viewName.getTitle(), icon);
this.viewName = viewName;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/event/EventCompositeDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/event/EventCompositeDetailsView.java
index f90af80..ea01164 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/event/EventCompositeDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/event/EventCompositeDetailsView.java
@@ -36,6 +36,7 @@ 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.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -79,7 +80,7 @@ public class EventCompositeDetailsView extends LocatableVLayout implements Bookm
removeChild(child);
}
- DynamicForm form = new DynamicForm();
+ DynamicForm form = new LocatableDynamicForm(extendLocatorId("form"));
form.setWidth100();
form.setHeight100();
commit f521a87edf7545349eea812a64953065b7f80337
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Jan 31 20:59:06 2011 -0500
various improvements to ops scheduling GUI as recommended by UXD
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
index b0b1214..90b605d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.gui.coregui.client.components.sorter;
import com.google.gwt.event.shared.HandlerRegistration;
+import com.smartgwt.client.types.Cursor;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.widgets.grid.ListGridField;
@@ -48,6 +49,7 @@ public class ReorderableList extends LocatableVLayout {
private String itemIcon;
/** the item title (i.e. display name), which should be plural and capitalized, e.g. "Resource Groups", "Roles". */
private String itemTitle;
+ private String nameFieldTitle = MSG.common_title_name();
private Set<ListOrderChangedHandler> listOrderChangedHandlers = new HashSet<ListOrderChangedHandler>();
@@ -91,22 +93,10 @@ public class ReorderableList extends LocatableVLayout {
protected void onInit() {
super.onInit();
- SectionStack itemsStack = buildItemsSectionStack();
- hlayout.addMember(itemsStack);
-
- addMember(this.hlayout);
- }
-
- private SectionStack buildItemsSectionStack() {
- SectionStack itemsSectionStack = new SectionStack();
- itemsSectionStack.setWidth(300);
- itemsSectionStack.setHeight(250);
-
- SectionStackSection itemsSection = new SectionStackSection(getItemTitle());
- itemsSection.setCanCollapse(false);
- itemsSection.setExpanded(true);
-
+ this.listGrid.setWidth(300);
+ this.listGrid.setHeight(250);
this.listGrid.setCanReorderRecords(true);
+ // TODO: Change cursor to hand or something like that when user hovers over a record in the grid.
this.listGrid.setLoadingMessage(MSG.common_msg_loading());
this.listGrid.setEmptyMessage(MSG.common_msg_noItemsToShow());
this.listGrid.addRecordDropHandler(new RecordDropHandler() {
@@ -125,11 +115,30 @@ public class ReorderableList extends LocatableVLayout {
iconField.setShowDefaultContextMenu(false);
fields.add(iconField);
}
- ListGridField nameField = new ListGridField(getNameField(), MSG.common_title_name());
+ ListGridField nameField = new ListGridField(getNameField(), this.nameFieldTitle);
fields.add(nameField);
this.listGrid.setFields(fields.toArray(new ListGridField[fields.size()]));
+ if (getItemTitle() != null) {
+ SectionStack itemsStack = buildItemsSectionStack();
+ this.hlayout.addMember(itemsStack);
+ } else {
+ this.hlayout.addMember(this.listGrid);
+ }
+
+ addMember(this.hlayout);
+ }
+
+ private SectionStack buildItemsSectionStack() {
+ SectionStack itemsSectionStack = new SectionStack();
+ itemsSectionStack.setWidth(300);
+ itemsSectionStack.setHeight(250);
+
+ SectionStackSection itemsSection = new SectionStackSection(getItemTitle());
+ itemsSection.setCanCollapse(false);
+ itemsSection.setExpanded(true);
itemsSection.setItems(this.listGrid);
+
itemsSectionStack.addSection(itemsSection);
return itemsSectionStack;
@@ -159,6 +168,10 @@ public class ReorderableList extends LocatableVLayout {
return "name";
}
+ public void setNameFieldTitle(String nameFieldTitle) {
+ this.nameFieldTitle = nameFieldTitle;
+ }
+
public String getItemTitle() {
return itemTitle;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java
index b5182e9..d2089a8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java
@@ -26,7 +26,6 @@ import java.util.LinkedHashMap;
import java.util.Map;
import com.smartgwt.client.types.Visibility;
-import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.events.ClickEvent;
@@ -48,6 +47,7 @@ import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import org.rhq.core.domain.common.JobTrigger;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
@@ -132,13 +132,14 @@ public class JobTriggerEditor extends LocatableVLayout {
protected void onDraw() {
super.onDraw();
- DynamicForm modeForm = new DynamicForm();
+ EnhancedDynamicForm modeForm = new EnhancedDynamicForm(extendLocatorId("ModeForm"));
+ modeForm.setNumCols(3);
+ modeForm.setColWidths("140", "220", "*");
RadioGroupItem modeItem = new RadioGroupItem("mode", "Schedule using");
- modeItem.setWidth(220);
LinkedHashMap<String, String> modeValueMap = new LinkedHashMap<String, String>();
modeValueMap.put("calendar", "Calendar");
- modeValueMap.put("cron", "Cron Mode");
+ modeValueMap.put("cron", "Cron Expression");
modeItem.setValueMap(modeValueMap);
modeItem.setVertical(false);
@@ -540,7 +541,7 @@ public class JobTriggerEditor extends LocatableVLayout {
private DynamicForm createRepeatForm() {
final DynamicForm repeatForm = new DynamicForm();
repeatForm.setNumCols(6);
- repeatForm.setColWidths(130, 130, 130, 130, 130);
+ repeatForm.setColWidths(140, 130, 130, 130, 130);
TextItem repeatIntervalItem = new TextItem(FIELD_REPEAT_INTERVAL, "Run now and every");
repeatIntervalItem.setRequired(true);
@@ -619,7 +620,7 @@ public class JobTriggerEditor extends LocatableVLayout {
private DynamicForm createLaterForm() {
final DynamicForm laterForm = new DynamicForm();
laterForm.setNumCols(4);
- laterForm.setColWidths(130, 130, 130);
+ laterForm.setColWidths(140, 130, 130);
RadioGroupItem startTypeItem = new RadioGroupItem(FIELD_START_TYPE, "Run");
LinkedHashMap<String, String> startTypeValueMap = new LinkedHashMap<String, String>();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index c938f18..1ea15db 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -22,6 +22,7 @@ package org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -30,14 +31,16 @@ import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
+import com.smartgwt.client.widgets.form.fields.ComboBoxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.IntegerItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.TextAreaItem;
-import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
+import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.auth.Subject;
@@ -73,6 +76,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
private JobTriggerEditor triggerEditor;
private Configuration parameters;
private EnhancedDynamicForm notesForm;
+ private EnhancedDynamicForm timeoutForm;
public AbstractOperationScheduleDetailsView(String locatorId, AbstractOperationScheduleDataSource dataSource,
ResourceType resourceType, int scheduleId) {
@@ -99,8 +103,8 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
protected EnhancedDynamicForm buildForm() {
EnhancedDynamicForm form = super.buildForm();
- form.setNumCols(2);
- form.setColWidths("165", "*");
+ form.setNumCols(3);
+ form.setColWidths("140", "140", "*");
return form;
}
@@ -114,7 +118,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
items.add(idItem);
}
- SelectItem operationNameItem = new SelectItem(ResourceOperationScheduleDataSource.Field.OPERATION_NAME);
+ SelectItem operationNameItem = new SelectItem(ResourceOperationScheduleDataSource.Field.OPERATION_NAME, "Name");
items.add(operationNameItem);
operationNameItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
@@ -123,10 +127,12 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
}
});
- this.operationDescriptionItem = new StaticTextItem(FIELD_OPERATION_DESCRIPTION, "Operation Description");
+ this.operationDescriptionItem = new StaticTextItem(FIELD_OPERATION_DESCRIPTION, "Description");
+ this.operationDescriptionItem.setShowTitle(false);
items.add(this.operationDescriptionItem);
- this.operationParametersItem = new StaticTextItem(FIELD_OPERATION_PARAMETERS, "Operation Parameters");
+ this.operationParametersItem = new StaticTextItem(FIELD_OPERATION_PARAMETERS, "Parameters");
+ this.operationParametersItem.setColSpan(2);
items.add(this.operationParametersItem);
return items;
@@ -150,9 +156,31 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
contentPane.addMember(hr);
}
+ this.timeoutForm = new EnhancedDynamicForm(extendLocatorId("TimeoutForm"), isReadOnly(), isNewRecord());
+ this.timeoutForm.setNumCols(4);
+ this.timeoutForm.setColWidths("140", "90", "105", "*");
+
+ IntegerItem timeoutItem = new IntegerItem("timeoutValue", "Timeout");
+ IntegerRangeValidator integerRangeValidator = new IntegerRangeValidator();
+ integerRangeValidator.setMin(1);
+ timeoutItem.setValidators(integerRangeValidator);
+ ComboBoxItem timeoutUnitsItem = new ComboBoxItem("timeoutUnits");
+ timeoutUnitsItem.setShowTitle(false);
+ LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>(3);
+ valueMap.put("seconds", "seconds");
+ valueMap.put("minutes", "minutes");
+ valueMap.put("hours", "hours");
+ timeoutUnitsItem.setValueMap(valueMap);
+ timeoutUnitsItem.setDefaultValue("minutes");
+ FormUtility.addContextualHelp(timeoutUnitsItem, "a time duration - if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was initiated");
+ this.timeoutForm.setFields(timeoutItem, timeoutUnitsItem);
+ timeoutItem.setWidth(90);
+ timeoutUnitsItem.setWidth(105);
+ contentPane.addMember(this.timeoutForm);
+
this.notesForm = new EnhancedDynamicForm(extendLocatorId("NotesForm"), isReadOnly(),
isNewRecord());
- this.notesForm.setWidth100();
+ this.notesForm.setColWidths("140", "50%", "140", "50%");
List<FormItem> notesFields = new ArrayList<FormItem>();
@@ -161,10 +189,6 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
notesFields.add(nextFireTimeItem);
}
- TextItem timeoutItem = new TextItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout (in seconds)");
- FormUtility.addContextualHelp(timeoutItem, "a time duration in seconds; if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was initiated");
- notesFields.add(timeoutItem);
-
TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes");
notesItem.setWidth(450);
notesItem.setHeight(60);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
index 8bb7f38..a397553 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
@@ -12,6 +12,8 @@ import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
@@ -69,12 +71,13 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
contentPane.addMember(hr);
this.executionModeForm = new DynamicForm();
- executionModeForm.setColWidths("250", "*");
+ this.executionModeForm.setNumCols(2);
+ this.executionModeForm.setColWidths("140", "*");
- RadioGroupItem executionModeItem = new RadioGroupItem("executionMode", "Member Resource Execution Order");
+ RadioGroupItem executionModeItem = new RadioGroupItem("executionMode", "Execute");
LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>(2);
- valueMap.put("parallel", "Execute in parallel");
- valueMap.put("sequential", "Execute in the order specified below");
+ valueMap.put("parallel", "in parallel");
+ valueMap.put("sequential", "in the order specified below (drag and drop member Resources to change order)");
executionModeItem.setValueMap(valueMap);
executionModeItem.setDefaultValue("parallel");
@@ -83,26 +86,35 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
haltOnFailureItem.setVisible(false);
haltOnFailureItem.setLabelAsTitle(true);
+ executionModeForm.setFields(executionModeItem, haltOnFailureItem);
+
+ contentPane.addMember(executionModeForm);
+
+ HLayout hLayout = new HLayout();
+ VLayout horizontalSpacer = new VLayout();
+ horizontalSpacer.setWidth(140);
+ hLayout.addMember(horizontalSpacer);
+ ResourceCategory resourceCategory = this.groupComposite.getResourceGroup().getResourceType().getCategory();
+ String memberIcon = ImageManager.getResourceIcon(resourceCategory);
+ final ReorderableList memberExecutionOrderer = new ReorderableList(extendLocatorId("MemberExecutionOrderer"),
+ this.memberResourceRecords, null, memberIcon);
+ memberExecutionOrderer.setVisible(false);
+ memberExecutionOrderer.setNameFieldTitle("Member Resource");
+ hLayout.addMember(memberExecutionOrderer);
+ contentPane.addMember(hLayout);
+
executionModeItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
if (event.getValue().equals("parallel")) {
haltOnFailureItem.hide();
+ memberExecutionOrderer.hide();
} else {
haltOnFailureItem.show();
+ memberExecutionOrderer.show();
}
}
});
- executionModeForm.setFields(executionModeItem, haltOnFailureItem);
-
- contentPane.addMember(executionModeForm);
-
- ResourceCategory resourceCategory = this.groupComposite.getResourceGroup().getResourceType().getCategory();
- String memberIcon = ImageManager.getResourceIcon(resourceCategory);
- ReorderableList memberExecutionOrderer = new ReorderableList(extendLocatorId("MemberExecutionOrderer"),
- this.memberResourceRecords, "Member Resources", memberIcon);
- contentPane.addMember(memberExecutionOrderer);
-
return contentPane;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
index 50455b4..1097bf1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
@@ -49,12 +49,14 @@ public class FormUtility {
}
public static void addContextualHelp(FormItem item, final String helpText) {
- FormItemIcon helpIcon = new FormItemIcon();
+ final FormItemIcon helpIcon = new FormItemIcon();
helpIcon.setSrc("[SKIN]/actions/help.png");
item.setIcons(helpIcon);
item.addIconClickHandler(new IconClickHandler() {
public void onIconClick(IconClickEvent event) {
- SC.say(helpText);
+ if (event.getIcon().equals(helpIcon)) {
+ SC.say(helpText);
+ }
}
});
}
commit 63aceed0c63ca74ebfaa1b431ae88e967d3b09f7
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Jan 31 13:40:33 2011 -0500
fix another bug with recurring operation schedules
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index 8248b21..308f459 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -2011,10 +2011,13 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
simpleTrigger.setStartTime(startTime);
if (jobTrigger.getRecurrenceType() == JobTrigger.RecurrenceType.REPEAT_INTERVAL) {
simpleTrigger.setRepeatInterval(jobTrigger.getRepeatInterval());
- if (jobTrigger.getEndType() == JobTrigger.EndType.DATETIME) {
- simpleTrigger.setEndTime(jobTrigger.getEndDate());
- } else if (jobTrigger.getEndType() == JobTrigger.EndType.REPEAT_COUNT) {
+ if (jobTrigger.getEndType() == JobTrigger.EndType.REPEAT_COUNT) {
simpleTrigger.setRepeatCount(jobTrigger.getRepeatCount());
+ } else {
+ simpleTrigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
+ if (jobTrigger.getEndType() == JobTrigger.EndType.DATETIME) {
+ simpleTrigger.setEndTime(jobTrigger.getEndDate());
+ }
}
}
commit dcf43f0221b12d24fc31c5e7d2fad3e7664baa71
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Jan 31 13:13:27 2011 -0500
make several changes to ops GUI recommended by UXD; fix bug where recurring op schedules did not work
diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationManager.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationManager.java
index ec1817c..d87f5c1 100644
--- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationManager.java
+++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/operation/OperationManager.java
@@ -232,8 +232,11 @@ public class OperationManager extends AgentService implements OperationAgentServ
PropertySimple timeoutProperty = paramConfig.getSimple(OperationDefinition.TIMEOUT_PARAM_NAME);
if (timeoutProperty != null) {
try {
- paramConfig.remove(timeoutProperty.getName()); // we have to remove it since resources are not expecting it
- return timeoutProperty.getLongValue().longValue() * 1000L;
+ paramConfig.remove(timeoutProperty.getName()); // we have to remove it since ResourceComponents are not expecting it
+ Long timeout = timeoutProperty.getLongValue();
+ if (timeout != null) {
+ return timeout * 1000L;
+ }
} catch (Exception e) {
throw new PluginContainerException("The timeout specified in the configuration was invalid: "
+ timeoutProperty);
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 199ca19..e846a1d 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
@@ -66,7 +66,8 @@ public class EnhancedDynamicForm extends LocatableDynamicForm {
// Layout Settings
//setWidth(640);
//setWidth100();
- //setPadding(13);
+ setCellPadding(3);
+
// Default to 4 columns, i.e.: itemOneTitle | itemOneValue | itemTwoTitle | itemTwoValue
setNumCols(4);
setColWidths(75, 200, 75, 200);
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 071bff3..b1541d0 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
@@ -574,7 +574,9 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
ListGridField[] newFields = new ListGridField[fields.length + dataSourceFieldNamesSet.size()];
int destIndex = 0;
if (dataSourceFieldNamesSet.contains(FIELD_ID)) {
- listGridIdField = new ListGridField(FIELD_ID, MSG.common_title_id(), 55);
+ String datasourceFieldTitle = this.dataSource.getField(FIELD_ID).getTitle();
+ String listGridFieldTitle = (datasourceFieldTitle != null) ? datasourceFieldTitle : MSG.common_title_id();
+ listGridIdField = new ListGridField(FIELD_ID, listGridFieldTitle, 55);
// Override the DataSource id field metadata for consistent display across all Tables.
listGridIdField.setType(ListGridFieldType.INTEGER);
listGridIdField.setCanEdit(false);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
index 20b84fa..56e7d52 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
@@ -84,7 +84,7 @@ public abstract class AbstractOperationScheduleDataSource<T extends OperationSch
protected List<DataSourceField> addDataSourceFields() {
List<DataSourceField> fields = super.addDataSourceFields();
- DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, "ID");
+ DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, "Schedule ID");
idField.setPrimaryKey(true);
idField.setCanEdit(false);
fields.add(idField);
@@ -134,15 +134,18 @@ public abstract class AbstractOperationScheduleDataSource<T extends OperationSch
SubjectRecord subjectRecord = (SubjectRecord) from.getAttributeAsRecord(Field.SUBJECT);
to.setSubject(subjectRecord.toSubject());
Configuration parameters = (Configuration) from.getAttributeAsObject(Field.PARAMETERS);
+ Integer timeout = from.getAttributeAsInt(Field.TIMEOUT);
+ if (timeout != null) {
+ if (parameters == null) {
+ parameters = new Configuration();
+ }
+ parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, timeout));
+ }
to.setParameters(parameters);
to.setOperationName(from.getAttribute(Field.OPERATION_NAME));
to.setOperationDisplayName(from.getAttribute(Field.OPERATION_DISPLAY_NAME));
to.setDescription(from.getAttribute(Field.DESCRIPTION));
to.setNextFireTime(from.getAttributeAsDate(Field.NEXT_FIRE_TIME));
- if (parameters != null) {
- parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, from.getAttributeAsInt(Field.TIMEOUT)));
- }
-
to.setJobTrigger(createJobTrigger(from.getAttributeAsRecord("jobTrigger")));
return to;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index 2195d35..c938f18 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -39,6 +39,7 @@ import com.smartgwt.client.widgets.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
@@ -95,9 +96,24 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
}
@Override
+ protected EnhancedDynamicForm buildForm() {
+ EnhancedDynamicForm form = super.buildForm();
+
+ form.setNumCols(2);
+ form.setColWidths("165", "*");
+
+ return form;
+ }
+
+ @Override
protected List<FormItem> createFormItems(EnhancedDynamicForm form) {
List<FormItem> items = new ArrayList<FormItem>();
+ if (!isNewRecord()) {
+ StaticTextItem idItem = new StaticTextItem(ResourceOperationScheduleDataSource.Field.ID);
+ items.add(idItem);
+ }
+
SelectItem operationNameItem = new SelectItem(ResourceOperationScheduleDataSource.Field.OPERATION_NAME);
items.add(operationNameItem);
operationNameItem.addChangedHandler(new ChangedHandler() {
@@ -141,7 +157,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
List<FormItem> notesFields = new ArrayList<FormItem>();
if (!isNewRecord()) {
- StaticTextItem nextFireTimeItem = new StaticTextItem(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME);
+ StaticTextItem nextFireTimeItem = new StaticTextItem(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME, "Next Fire Time");
notesFields.add(nextFireTimeItem);
}
@@ -151,7 +167,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes");
notesItem.setWidth(450);
- notesItem.setHeight(120);
+ notesItem.setHeight(60);
FormUtility.addContextualHelp(notesItem, "an optional description of this scheduled operation (e.g. \"nightly maintenance app server restart\")");
notesFields.add(notesItem);
@@ -266,6 +282,12 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
for (Canvas child : this.operationParametersConfigurationHolder.getChildren()) {
child.destroy();
}
+
+ // Add spacer so params are indented.
+ VLayout horizontalSpacer = new VLayout();
+ horizontalSpacer.setWidth(165);
+ this.operationParametersConfigurationHolder.addMember(horizontalSpacer);
+
Configuration defaultConfiguration = (parametersDefinition.getDefaultTemplate() != null) ?
parametersDefinition.getDefaultTemplate().createConfiguration() : new Configuration();
ConfigurationEditor configurationEditor = new ConfigurationEditor("ParametersEditor", parametersDefinition,
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
index 3819b4a..59f58e6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
@@ -39,10 +39,13 @@ public abstract class AbstractOperationScheduleListView extends TableSection<Abs
protected abstract boolean hasControlPermission();
+
@Override
protected void configureTable() {
super.configureTable();
+ ListGridField idField = new ListGridField(AbstractOperationScheduleDataSource.Field.ID, 70);
+
ListGridField operationField = new ListGridField(AbstractOperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME, 180);
ListGridField subjectField = new ListGridField(AbstractOperationScheduleDataSource.Field.SUBJECT, 110);
@@ -55,7 +58,7 @@ public abstract class AbstractOperationScheduleListView extends TableSection<Abs
ListGridField descriptionField = new ListGridField(AbstractOperationScheduleDataSource.Field.DESCRIPTION);
- setListGridFields(operationField, subjectField, nextFireTimeField, descriptionField);
+ setListGridFields(true, idField, operationField, subjectField, nextFireTimeField, descriptionField);
addTableAction(extendLocatorId("New"), MSG.common_button_new(), new TableAction() {
public boolean isEnabled(ListGridRecord[] selection) {
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 3105aab..d46a5f4 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
@@ -96,7 +96,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
private SubTab inventoryConn;
private SubTab inventoryConnHistory;
private SubTab operationsHistory;
- private SubTab operationsSchedule;
+ private SubTab operationsSchedules;
private SubTab alertHistory;
private SubTab alertDef;
private SubTab configCurrent;
@@ -199,11 +199,11 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
operationsTab = new TwoLevelTab(getTabSet().extendLocatorId("Operations"), new ViewName("Operations", MSG
.view_tabs_common_operations()), "/images/icons/Operation_grey_16.png");
- this.operationsSchedule = new SubTab(operationsTab.extendLocatorId("Schedule"), new ViewName("Schedule", MSG
- .view_tabs_common_schedule()), null);
+ this.operationsSchedules = new SubTab(operationsTab.extendLocatorId("Schedules"), new ViewName("Schedules", MSG
+ .view_tabs_common_schedules()), null);
this.operationsHistory = new SubTab(operationsTab.extendLocatorId("History"), new ViewName("History", MSG
.view_tabs_common_history()), null);
- operationsTab.registerSubTabs(this.operationsSchedule, this.operationsHistory);
+ operationsTab.registerSubTabs(this.operationsSchedules, this.operationsHistory);
tabs.add(operationsTab);
configurationTab = new TwoLevelTab(getTabSet().extendLocatorId("Configuration"), new ViewName("Configuration",
@@ -297,8 +297,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
private void updateOperationsTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
if (updateTab(this.operationsTab, groupCategory == GroupCategory.COMPATIBLE
&& facets.contains(ResourceTypeFacet.OPERATION), true)) {
- updateSubTab(this.operationsTab, this.operationsSchedule,
- new GroupOperationScheduleListView(this.operationsSchedule.extendLocatorId("View"),
+ updateSubTab(this.operationsTab, this.operationsSchedules,
+ new GroupOperationScheduleListView(this.operationsSchedules.extendLocatorId("View"),
this.groupComposite), true, true);
updateSubTab(this.operationsTab, this.operationsHistory, new GroupOperationHistoryListView(
this.operationsHistory.extendLocatorId("View"), this.groupComposite), true, true);
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 7fcf561..a4a5172 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
@@ -106,7 +106,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
private SubTab inventoryGroups;
private SubTab inventoryAgent;
private SubTab operationsHistory;
- private SubTab operationsSchedule;
+ private SubTab operationsSchedules;
private SubTab alertHistory;
private SubTab alertDef;
private SubTab configCurrent;
@@ -188,11 +188,11 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
operationsTab = new TwoLevelTab(getTabSet().extendLocatorId("Operations"), new ViewName("Operations", MSG
.view_tabs_common_operations()), "/images/icons/Operation_grey_16.png");
- this.operationsSchedule = new SubTab(operationsTab.extendLocatorId("Schedule"), new ViewName("Schedule", MSG
- .view_tabs_common_schedule()), null);
+ this.operationsSchedules = new SubTab(operationsTab.extendLocatorId("Schedules"), new ViewName("Schedules", MSG
+ .view_tabs_common_schedules()), null);
this.operationsHistory = new SubTab(operationsTab.extendLocatorId("History"), new ViewName("History", MSG
.view_tabs_common_history()), null);
- operationsTab.registerSubTabs(this.operationsHistory, this.operationsSchedule);
+ operationsTab.registerSubTabs(this.operationsSchedules, this.operationsHistory);
tabs.add(operationsTab);
configurationTab = new TwoLevelTab(getTabSet().extendLocatorId("Configuration"), new ViewName("Configuration",
@@ -344,11 +344,11 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
// 4) user can navigate to the group operation that spawned this resource operation history, if appropriate
// note: enabled operation execution/schedules from left-nav, if it doesn't already exist
+ updateSubTab(this.operationsTab, this.operationsSchedules, new ResourceOperationScheduleListView(
+ operationsTab.extendLocatorId("SchedulesView"), this.resourceComposite), true, true);
+
updateSubTab(this.operationsTab, this.operationsHistory, new ResourceOperationHistoryListView(operationsTab
.extendLocatorId("HistoryView"), this.resourceComposite), true, true);
-
- updateSubTab(this.operationsTab, this.operationsSchedule, new ResourceOperationScheduleListView(
- operationsTab.extendLocatorId("SchedulesView"), this.resourceComposite), true, true);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
index 7a9b1a9..d194adf 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
@@ -93,9 +93,9 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O
public void scheduleResourceOperation(int resourceId, String operationName, Configuration parameters,
String description, int timeout, String cronString) throws RuntimeException {
try {
- CronTrigger ct = new CronTrigger("resource " + resourceId + "_" + operationName, "group", cronString);
+ CronTrigger cronTrigger = new CronTrigger("resource " + resourceId + "_" + operationName, "group", cronString);
ResourceOperationSchedule opSchedule = operationManager.scheduleResourceOperation(getSessionSubject(),
- resourceId, operationName, parameters, ct, description);
+ resourceId, operationName, parameters, cronTrigger, description);
} catch (Throwable t) {
throw new RuntimeException(ThrowableUtil.getAllMessages(t));
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index 1623dd1..8248b21 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -2001,16 +2001,22 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
SimpleTrigger simpleTrigger = new SimpleTrigger();
Date startTime = null;
switch (jobTrigger.getStartType()) {
- case NOW:
- startTime = new Date();
- break;
- case DATETIME:
- startTime = jobTrigger.getStartDate();
- break;
+ case NOW:
+ startTime = new Date();
+ break;
+ case DATETIME:
+ startTime = jobTrigger.getStartDate();
+ break;
}
simpleTrigger.setStartTime(startTime);
-
- // TODO (ips): Finish implementing this.
+ if (jobTrigger.getRecurrenceType() == JobTrigger.RecurrenceType.REPEAT_INTERVAL) {
+ simpleTrigger.setRepeatInterval(jobTrigger.getRepeatInterval());
+ if (jobTrigger.getEndType() == JobTrigger.EndType.DATETIME) {
+ simpleTrigger.setEndTime(jobTrigger.getEndDate());
+ } else if (jobTrigger.getEndType() == JobTrigger.EndType.REPEAT_COUNT) {
+ simpleTrigger.setRepeatCount(jobTrigger.getRepeatCount());
+ }
+ }
trigger = simpleTrigger;
}
commit 9ae2df48e3057d2f3aaeab2b903cbc84e5131ef2
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Mon Jan 31 15:02:22 2011 +0100
implemented re-assigning of cli alert notifications to different users.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotification.java b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotification.java
index d93c81b..ec3e849 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotification.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/alert/notification/AlertNotification.java
@@ -74,8 +74,18 @@ import org.rhq.core.domain.configuration.Property;
+ " AND notifParam.name = :propertyName" //
+ " AND locate(:paramValue,notifParam.stringValue) <> 0" //
+ ")"
-
- ) })
+ ),
+ @NamedQuery(name = AlertNotification.QUERY_UPDATE_PARAMETER_FOR_NOTIFICATIONS, query = "" //
+ + " UPDATE Property property" //
+ + " SET stringValue = :propertyValue" //
+ + " WHERE id IN ( "
+ + " SELECT notifParam.id" //
+ + " FROM AlertNotification notif" //
+ + " JOIN notif.configuration.properties notifParam" //
+ + " WHERE notif.id IN ( :alertNotificationIds )" //
+ + " AND notifParam.name = :propertyName" //
+ + ")"
+ )})
@SequenceGenerator(name = "RHQ_ALERT_NOTIFICATION_ID_SEQ", sequenceName = "RHQ_ALERT_NOTIFICATION_ID_SEQ")
@Table(name = "RHQ_ALERT_NOTIFICATION")
public class AlertNotification implements Serializable {
@@ -87,7 +97,8 @@ public class AlertNotification implements Serializable {
public static final String QUERY_DELETE_ORPHANED = "AlertNotification.deleteOrphaned";
public static final String QUERY_DELETE_BY_ROLE_ID = "AlertNotification.deleteByRoleId";
public static final String QUERY_CLEANSE_PARAMETER_VALUE_FOR_ALERT_SENDER = "AlertNotification.cleanseParameterValueForAlertSender";
-
+ public static final String QUERY_UPDATE_PARAMETER_FOR_NOTIFICATIONS = "AlertNotification.updateParameterForNotifications";
+
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO, generator = "RHQ_ALERT_NOTIFICATION_ID_SEQ")
@Id
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
index c329527..e38a452 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/AlertDefinitionCriteria.java
@@ -43,6 +43,7 @@ public class AlertDefinitionCriteria extends Criteria {
private static final long serialVersionUID = 1L;
private Integer filterId;
+ private List<Integer> filterIds;
private String filterName;
private String filterDescription;
private AlertPriority filterPriority;
@@ -70,6 +71,7 @@ public class AlertDefinitionCriteria extends Criteria {
filterOverrides.put("resourceIds", "resource.id IN ( ? )");
filterOverrides.put("resourceGroupIds", "resourceGroup.id IN ( ? )");
filterOverrides.put("notificationSenderNames", "alertNotifications.senderName IN ( ? )");
+ filterOverrides.put("filterIds", "id IN ( ? )");
}
@Override
@@ -81,6 +83,10 @@ public class AlertDefinitionCriteria extends Criteria {
this.filterId = filterId;
}
+ public void addFilterIds(Integer... filterIds) {
+ this.filterIds = Arrays.asList(filterIds);
+ }
+
public void addFilterName(String filterName) {
this.filterName = filterName;
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
index 030b586..13f356b 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerBean.java
@@ -326,14 +326,27 @@ public class AlertNotificationManagerBean implements AlertNotificationManagerLoc
}
public int cleanseAlertNotificationBySubject(int subjectId) {
- return cleanseParmaeterValueForAlertSender("System Users", "subjectId", String.valueOf(subjectId));
+ return cleanseParameterValueForAlertSender("System Users", "subjectId", String.valueOf(subjectId));
}
public int cleanseAlertNotificationByRole(int roleId) {
- return cleanseParmaeterValueForAlertSender("System Roles", "roleId", String.valueOf(roleId));
+ return cleanseParameterValueForAlertSender("System Roles", "roleId", String.valueOf(roleId));
}
- private int cleanseParmaeterValueForAlertSender(String senderName, String propertyName, String valueToCleanse) {
+ public void massReconfigure(List<Integer> alertNotificationIds, Map<String, String> newConfigurationValues) {
+ Query query = entityManager.createNamedQuery(AlertNotification.QUERY_UPDATE_PARAMETER_FOR_NOTIFICATIONS);
+
+ query.setParameter("alertNotificationIds", alertNotificationIds);
+
+ for(Map.Entry<String, String> entry : newConfigurationValues.entrySet()) {
+ query.setParameter("propertyName", entry.getKey());
+ query.setParameter("propertyValue", entry.getValue());
+
+ query.executeUpdate();
+ }
+ }
+
+ private int cleanseParameterValueForAlertSender(String senderName, String propertyName, String valueToCleanse) {
Query query = entityManager.createNamedQuery(AlertNotification.QUERY_CLEANSE_PARAMETER_VALUE_FOR_ALERT_SENDER);
query.setParameter("senderName", senderName);
query.setParameter("propertyName", propertyName);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerLocal.java
index ff222fc..43a8215 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertNotificationManagerLocal.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.alert;
import java.util.List;
+import java.util.Map;
import javax.ejb.Local;
@@ -118,4 +119,12 @@ public interface AlertNotificationManagerLocal {
int cleanseAlertNotificationBySubject(int subjectId);
int cleanseAlertNotificationByRole(int roleId);
+
+ /**
+ * This method can be used to reconfigure a number of notifications en-masse.
+ *
+ * @param alertNotificationIds the alert notifications to update
+ * @param newConfigurationValues a map where keys are the property names and values are the new property values
+ */
+ void massReconfigure(List<Integer> alertNotificationIds, Map<String, String> newConfigurationValues);
}
diff --git a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
index 09f9abd..431d356 100644
--- a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
+++ b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
@@ -19,8 +19,12 @@
package org.rhq.enterprise.server.plugins.alertCli;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.rhq.core.domain.alert.AlertDefinition;
@@ -37,6 +41,7 @@ import org.rhq.core.domain.util.DisambiguationReportRenderer;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.util.IntExtractor;
import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal;
+import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.plugin.pc.ControlFacet;
import org.rhq.enterprise.server.plugin.pc.ControlResults;
@@ -62,6 +67,9 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
private static final String PROP_RESOURCE_ID = "resourceId";
private static final String PROP_MISCONFIGURED_ALERT_DEFS = "misconfiguredAlertDefs";
private static final String PROP_ALERT_DEFINITION = "alertDefinition";
+ private static final String PROP_ALERT_DEFINITION_ID = "alertDefinitionId";
+ private static final String PROP_USER_NAME = "userName";
+ private static final String PROP_ALERT_DEF_IDS = "alertDefIds";
private Set<String> scriptPackageTypes;
private String pluginName;
@@ -103,52 +111,26 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
}
private void checkAlertsValidity(ControlResults results, Configuration parameters) {
- AlertDefinitionManagerLocal manager = LookupUtil.getAlertDefinitionManager();
- SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
-
- Subject overlord = subjectManager.getOverlord();
-
- AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
- criteria.addFilterNotificationNames(pluginName);
- criteria.setPageControl(PageControl.getUnlimitedInstance());
-
- List<AlertDefinition> defs = manager.findAlertDefinitionsByCriteria(overlord, criteria);
+ List<AlertNotification> invalidNotifs = getAllCliNotificationsWithInvalidUser();
- for(AlertDefinition def : defs) {
- List<AlertNotification> notifications = def.getAlertNotifications();
+ for(AlertNotification cliNotification : invalidNotifs) {
+ AlertDefinition def = cliNotification.getAlertDefinition();
- AlertNotification cliNotification = getCliNotification(notifications);
+ Configuration resConfig = results.getComplexResults();
- if (cliNotification == null) {
- //we alway should find this but a little bit of paranoia never hurt anyone
- continue;
+ PropertyList misconfigured = resConfig.getList(PROP_MISCONFIGURED_ALERT_DEFS);
+ if (misconfigured == null) {
+ misconfigured = new PropertyList(PROP_MISCONFIGURED_ALERT_DEFS);
+ resConfig.put(misconfigured);
}
- Subject checkSubject = null;
+ PropertyMap alertDefinitionMap = new PropertyMap(PROP_ALERT_DEFINITION);
- PropertySimple subjectIdProperty = cliNotification.getConfiguration().getSimple(CliSender.PROP_USER_ID);
- if (subjectIdProperty != null) {
- int subjectId = subjectIdProperty.getIntegerValue();
-
- checkSubject = subjectManager.getSubjectById(subjectId);
- }
+ alertDefinitionMap.put(new PropertySimple(PROP_ALERT_DEFINITION_ID, def.getId()));
+ alertDefinitionMap.put(new PropertySimple(PROP_ALERT_DEFINITION_NAME, def.getName()));
+ alertDefinitionMap.put(new PropertySimple(PROP_RESOURCE_ID, def.getResource().getId()));
- if (checkSubject == null) {
- Configuration resConfig = results.getComplexResults();
-
- PropertyList misconfigured = resConfig.getList(PROP_MISCONFIGURED_ALERT_DEFS);
- if (misconfigured == null) {
- misconfigured = new PropertyList(PROP_MISCONFIGURED_ALERT_DEFS);
- resConfig.put(misconfigured);
- }
-
- PropertyMap alertDefinitionMap = new PropertyMap(PROP_ALERT_DEFINITION);
-
- alertDefinitionMap.put(new PropertySimple(PROP_ALERT_DEFINITION_NAME, def.getName()));
- alertDefinitionMap.put(new PropertySimple(PROP_RESOURCE_ID, def.getResource().getId()));
-
- misconfigured.add(alertDefinitionMap);
- }
+ misconfigured.add(alertDefinitionMap);
}
//ok, now we have to obtain the resource paths. doing it out of the above loop reduces the number
@@ -179,10 +161,46 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
}
private void reassignAlerts(ControlResults results, Configuration parameters) {
- //TODO implement
+ PropertySimple userNameProp = parameters.getSimple(PROP_USER_NAME);
+ PropertySimple alertDefIdsProp = parameters.getSimple(PROP_ALERT_DEF_IDS);
+
+ if (userNameProp == null) {
+ throw new IllegalArgumentException("User name not specified.");
+ }
+
+ String userName = userNameProp.getStringValue();
+ SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ Subject subject = subjectManager.getSubjectByName(userName);
+
+ if (subject == null) {
+ throw new IllegalArgumentException("User '" + userName + "' doesn't exist.");
+ }
+
+ //now get the list of the alert notifications to update
+ List<AlertNotification> notifsToReAssign = null;
+ if (alertDefIdsProp == null || alertDefIdsProp.getStringValue().trim().length() == 0) {
+ notifsToReAssign = getAllCliNotificationsWithInvalidUser();
+ } else {
+ List<Integer> alertDefIds = asIdList(alertDefIdsProp.getStringValue().split("\\s*,\\s*"));
+ List<AlertDefinition> defs = getAlertDefinitionsWithCliNotifications(alertDefIds);
+
+ notifsToReAssign = new ArrayList<AlertNotification>();
+ for(AlertDefinition def : defs) {
+ AlertNotification cliNotif = getCliNotification(def.getAlertNotifications());
+ if (cliNotif != null) {
+ notifsToReAssign.add(cliNotif);
+ }
+ }
+ }
+
+ AlertNotificationManagerLocal notificationManager = LookupUtil.getAlertNotificationManager();
+
+ List<Integer> notifIds = asIdList(notifsToReAssign);
+ Map<String, String> updates = Collections.singletonMap(CliSender.PROP_USER_ID, Integer.toString(subject.getId()));
+ notificationManager.massReconfigure(notifIds, updates);
}
- AlertNotification getCliNotification(List<AlertNotification> notifications) {
+ private AlertNotification getCliNotification(List<AlertNotification> notifications) {
for(AlertNotification n : notifications) {
if (pluginName.equals(n.getSenderName())) {
return n;
@@ -191,4 +209,74 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
return null;
}
+
+ private List<AlertDefinition> getAlertDefinitionsWithCliNotifications(Collection<Integer> ids) {
+ SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+ AlertDefinitionManagerLocal manager = LookupUtil.getAlertDefinitionManager();
+
+ Subject overlord = subjectManager.getOverlord();
+
+ AlertDefinitionCriteria criteria = new AlertDefinitionCriteria();
+ criteria.addFilterNotificationNames(pluginName);
+ criteria.setPageControl(PageControl.getUnlimitedInstance());
+ criteria.fetchAlertNotifications(true);
+ if (ids != null) {
+ criteria.addFilterIds(ids.toArray(new Integer[ids.size()]));
+ }
+
+ return manager.findAlertDefinitionsByCriteria(overlord, criteria);
+ }
+
+ private List<AlertNotification> getAllCliNotificationsWithInvalidUser() {
+ List<AlertNotification> ret = new ArrayList<AlertNotification>();
+
+ SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager();
+
+ List<AlertDefinition> defs = getAlertDefinitionsWithCliNotifications(null);
+
+ for(AlertDefinition def : defs) {
+ List<AlertNotification> notifications = def.getAlertNotifications();
+
+ AlertNotification cliNotification = getCliNotification(notifications);
+
+ if (cliNotification == null) {
+ //we always should find this but a little bit of paranoia never hurt anyone
+ continue;
+ }
+
+ Subject checkSubject = null;
+
+ PropertySimple subjectIdProperty = cliNotification.getConfiguration().getSimple(CliSender.PROP_USER_ID);
+ if (subjectIdProperty != null) {
+ int subjectId = subjectIdProperty.getIntegerValue();
+
+ checkSubject = subjectManager.getSubjectById(subjectId);
+ }
+
+ if (checkSubject == null) {
+ ret.add(cliNotification);
+ }
+ }
+
+ return ret;
+ }
+
+ private List<Integer> asIdList(String... ids) {
+ List<Integer> ret = new ArrayList<Integer>();
+ for(String id : ids) {
+ ret.add(Integer.parseInt(id));
+ }
+
+ return ret;
+ }
+
+ private List<Integer> asIdList(Collection<AlertNotification> notifs) {
+ ArrayList<Integer> ret = new ArrayList<Integer>();
+
+ for(AlertNotification n : notifs) {
+ ret.add(n.getId());
+ }
+
+ return ret;
+ }
}
diff --git a/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml b/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml
index cb3ed60..5d7dcbd 100644
--- a/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml
+++ b/modules/enterprise/server/plugins/alert-cli/src/main/resources/META-INF/rhq-serverplugin.xml
@@ -24,16 +24,28 @@
This operation returns a list of such misconfigured alert definitions.
</c:description>
<c:map-property name="alertDefinition">
+ <c:simple-property name="alertDefinitionId" />
+ <c:simple-property name="alertDefinitionName" />
<c:simple-property name="resourceId" />
<c:simple-property name="resourcePath" />
- <c:simple-property name="alertDefinitionName" />
</c:map-property>
</c:list-property>
</serverplugin:results>
</serverplugin:control>
- <!-- TODO define the args and results of this operation -->
- <serverplugin:control name="reassignAlerts" description="Re-assign alerts to run as different users" />
+ <serverplugin:control name="reassignAlerts" description="Re-assign alerts to run as different users">
+ <serverplugin:parameters>
+ <c:simple-property name="userName" displayName="User Name" description="The name of the user to re-assign the alerts to." />
+ <c:simple-property name="alertDefIds" displayName="Alert Definition IDs" required="false">
+ <c:description>
+ The comma-separated list of the alert definition ids to re-assign.
+ If left empty, all the alert definitions with the CLI notifications that have
+ an invalid user assigned, will be re-assigned to the provided user.
+ </c:description>
+ <c:constraint><c:regex-constraint expression="(\d+(\s*,\s*\d+)*)?"/></c:constraint>
+ </c:simple-property>
+ </serverplugin:parameters>
+ </serverplugin:control>
</serverplugin:plugin-component>
<serverplugin:plugin-configuration>
commit 2f77ae3b3f9bb4ab748466a97fad2be9d3ac6223
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Mon Jan 31 12:37:45 2011 +0100
consider cli notifications with no userId property at all invalid (these should never exist, but one never knows).
diff --git a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
index f0ba8aa..09f9abd 100644
--- a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
+++ b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
@@ -124,17 +124,16 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
continue;
}
+ Subject checkSubject = null;
+
PropertySimple subjectIdProperty = cliNotification.getConfiguration().getSimple(CliSender.PROP_USER_ID);
- if (subjectIdProperty == null) {
- continue;
+ if (subjectIdProperty != null) {
+ int subjectId = subjectIdProperty.getIntegerValue();
+
+ checkSubject = subjectManager.getSubjectById(subjectId);
}
- int subjectId = subjectIdProperty.getIntegerValue();
-
- Subject checkSubject = subjectManager.getSubjectById(subjectId);
-
if (checkSubject == null) {
- //TODO this is the invalid user we're after.. let's store the info about the alert
Configuration resConfig = results.getComplexResults();
PropertyList misconfigured = resConfig.getList(PROP_MISCONFIGURED_ALERT_DEFS);
commit 8dac9334905eb046d5c935d6b4a2c7a394928da2
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Mon Jan 31 12:16:23 2011 +0100
Specifically ask for full path while asking the disambiguate() method to generate the resource paths.
diff --git a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
index 584d8cd..f0ba8aa 100644
--- a/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
+++ b/modules/enterprise/server/plugins/alert-cli/src/main/java/org/rhq/enterprise/server/plugins/alertCli/CliComponent.java
@@ -164,7 +164,7 @@ public class CliComponent implements ServerPluginComponent, ControlFacet {
return map.getSimple(PROP_RESOURCE_ID).getIntegerValue();
};
},
- DefaultDisambiguationUpdateStrategies.getDefault());
+ DefaultDisambiguationUpdateStrategies.KEEP_ALL_PARENTS);
DisambiguationReportRenderer renderer = new DisambiguationReportRenderer();
commit 336fd7732a56ae6e6632f822408d20943d67e6cf
Author: Simeon Pinder <spinder(a)redhat.com>
Date: Fri Jan 28 13:41:06 2011 -0500
i)fix activityView refresh issue ii)replace old portwar Activity page with gwt version.
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 0c61ed0..7fcf561 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
@@ -63,7 +63,6 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitorin
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.history.ResourceOperationHistoryListView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleListView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.summary.ActivityView;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.summary.ActivityView2;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
@@ -93,7 +92,6 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
private TwoLevelTab contentTab;
private SubTab summaryActivity;
- private SubTab summaryActivity2;
private SubTab summaryTimeline;
private SubTab monitorGraphs;
private SubTab monitorTables;
@@ -131,12 +129,9 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
.view_tabs_common_summary()), ImageManager.getResourceIcon(ResourceCategory.SERVICE, Boolean.TRUE));
summaryActivity = new SubTab(summaryTab.extendLocatorId("Activity"), new ViewName("Activity", MSG
.view_tabs_common_activity()), null);
- summaryActivity2 = new SubTab(summaryTab.extendLocatorId("Activity2"), new ViewName("Activity2", MSG
- .view_tabs_common_activity() + 2), null);
summaryTimeline = new SubTab(summaryTab.extendLocatorId("Timeline"), new ViewName("Timeline", MSG
.view_tabs_common_timeline()), null);
- // summaryTab.registerSubTabs(summaryActivity, summaryTimeline);
- summaryTab.registerSubTabs(summaryActivity, summaryActivity2, summaryTimeline);
+ summaryTab.registerSubTabs(summaryActivity, summaryTimeline);
tabs.add(summaryTab);
inventoryTab = new TwoLevelTab(getTabSet().extendLocatorId("Inventory"), new ViewName("Inventory", MSG
@@ -260,8 +255,6 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
private void updateSummaryTabContent(Resource resource) {
updateSubTab(this.summaryTab, this.summaryActivity, new ActivityView(this.summaryActivity
.extendLocatorId("View"), this.resourceComposite), true, true);
- updateSubTab(this.summaryTab, this.summaryActivity2, new ActivityView2(this.summaryActivity2
- .extendLocatorId("View"), this.resourceComposite), true, true);
updateSubTab(this.summaryTab, this.summaryTimeline, new FullHTMLPane(this.summaryTimeline
.extendLocatorId("View"), "/rhq/resource/summary/timeline-plain.xhtml?id=" + resource.getId()), true, true);
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 c7b6dee..f95591a 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
@@ -18,42 +18,759 @@
*/
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.summary;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.allen_sauer.gwt.log.client.Log;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.ContentsType;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.HTMLFlow;
+import com.smartgwt.client.widgets.Img;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
+import com.smartgwt.client.widgets.form.fields.FormItemIcon;
+import com.smartgwt.client.widgets.form.fields.LinkItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+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.configuration.ResourceConfigurationUpdate;
+import org.rhq.core.domain.content.InstalledPackageHistory;
+import org.rhq.core.domain.criteria.AlertCriteria;
+import org.rhq.core.domain.criteria.InstalledPackageCriteria;
+import org.rhq.core.domain.event.EventSeverity;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
+import org.rhq.core.domain.measurement.composite.MeasurementOOBComposite;
+import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite;
+import org.rhq.core.domain.resource.composite.DisambiguationReport;
import org.rhq.core.domain.resource.composite.ResourceComposite;
+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.RefreshableView;
-import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.resource.disambiguation.ReportDecorator;
+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.LocatableCanvas;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
/**
* The content pane of the Resource Summary>Activity tab.
*
- * @author Ian Springer
+ * @author Simeon Pinder
*/
-// TODO: Implement this.
-public class ActivityView extends LocatableVLayout implements RefreshableView {
+public class ActivityView extends LocatableHLayout implements RefreshableView {
+
+ //Locatable ui references
+ private VLayout leftPane = new VLayout();;
+ private VLayout rightPane = new VLayout();;
+ private LocatableCanvas recentMeasurementsContent = new LocatableCanvas(extendLocatorId("RecentMetrics"));
+ private LocatableCanvas recentAlertsContent = new LocatableCanvas(extendLocatorId("RecentAlerts"));
+ private LocatableCanvas recentOobContent = new LocatableCanvas(extendLocatorId("RecentOobs"));
+ private LocatableCanvas recentConfigurationContent = new LocatableCanvas(extendLocatorId("RecentConfig"));
+ private LocatableCanvas recentOperationsContent = new LocatableCanvas(extendLocatorId("RecentOperations"));
+ private LocatableCanvas recentEventsContent = new LocatableCanvas(extendLocatorId("RecentEvents"));
+ private LocatableCanvas recentPkgHistoryContent = new LocatableCanvas(extendLocatorId("RecentPkgHistory"));
+
+ //retrieve localized text
+ private String RECENT_MEASUREMENTS = MSG.common_title_recent_measurements();
+ private String RECENT_MEASUREMENTS_NONE = MSG.view_resource_inventory_activity_no_recent_metrics();
+ private String RECENT_ALERTS = MSG.common_title_recent_alerts();
+ private String RECENT_ALERTS_NONE = MSG.view_resource_inventory_activity_no_recent_alerts();
+ private String RECENT_OOB = MSG.common_title_recent_oob_metrics();
+ private String RECENT_OOB_NONE = MSG.view_resource_inventory_activity_no_recent_oob();
+ private String RECENT_CONFIGURATIONS = MSG.common_title_recent_configuration_updates();
+ private String RECENT_CONFIGURATIONS_NONE = MSG.view_resource_inventory_activity_no_recent_config_history();
+ private String RECENT_OPERATIONS = MSG.common_title_recent_operations();
+ private String RECENT_OPERATIONS_NONE = MSG.view_resource_inventory_activity_no_recent_operations();
+ private String RECENT_EVENTS = MSG.common_title_recent_event_counts();
+ private String RECENT_EVENTS_NONE = MSG.view_resource_inventory_activity_no_recent_events();
+ private String RECENT_PKG_HISTORY = MSG.common_title_recent_pkg_history();
+ private String RECENT_PKG_HISTORY_NONE = MSG.view_resource_inventory_activity_no_recent_pkg_history();
private ResourceComposite resourceComposite;
- private FullHTMLPane iFrame;
public ActivityView(String locatorId, ResourceComposite resourceComposite) {
super(locatorId);
this.resourceComposite = resourceComposite;
+ setID(locatorId);
+ initializeUi();
+ }
+
+ /**Defines layout for the Activity page.
+ */
+ private void initializeUi() {
+ setPadding(5);
+ setMembersMargin(5);
+ //dividers definition
+ HTMLFlow divider1 = new HTMLFlow("<hr/>");
+ HTMLFlow divider2 = new HTMLFlow("<hr/>");
+ HTMLFlow divider3 = new HTMLFlow("<hr/>");
+ HTMLFlow divider4 = new HTMLFlow("<hr/>");
+ HTMLFlow divider5 = new HTMLFlow("<hr/>");
+ divider1.setWidth("50%");
+ divider2.setWidth("50%");
+ divider3.setWidth("50%");
+ divider4.setWidth("50%");
+ divider5.setWidth("50%");
+
+ //leftPane
+ leftPane.setWidth("50%");
+ leftPane.setPadding(5);
+ leftPane.setMembersMargin(5);
+ leftPane.setAutoHeight();
+
+ //recentMetrics.xhtml
+ HLayout recentMetricsTitle = new TitleWithIcon("subsystems/monitor/Monitor_24.png", RECENT_MEASUREMENTS);
+ leftPane.addMember(recentMetricsTitle);
+ leftPane.addMember(recentMeasurementsContent);
+ recentMeasurementsContent.setHeight(20);
+ leftPane.addMember(divider1);
+ //recentAlerts.xhtml
+ HLayout recentAlertsTitle = new TitleWithIcon("subsystems/alert/Flag_blue_24.png", RECENT_ALERTS);
+ leftPane.addMember(recentAlertsTitle);
+ leftPane.addMember(recentAlertsContent);
+ recentAlertsContent.setHeight(20);
+ leftPane.addMember(divider2);
+ //recentOOBs.xhtml
+ HLayout recentOobsTitle = new TitleWithIcon("subsystems/monitor/Monitor_failed_24.png", RECENT_OOB);
+ leftPane.addMember(recentOobsTitle);
+ leftPane.addMember(recentOobContent);
+ recentOobContent.setHeight(20);
+
+ //rightPane
+ rightPane.setWidth("50%");
+ rightPane.setPadding(5);
+ rightPane.setMembersMargin(5);
+ rightPane.setAutoHeight();
+ //recentConfigUpdates.xhtml
+ HLayout recentConfigUpdatesTitle = new TitleWithIcon("subsystems/configure/Configure_24.png",
+ RECENT_CONFIGURATIONS);
+ rightPane.addMember(recentConfigUpdatesTitle);
+ rightPane.addMember(recentConfigurationContent);
+ recentConfigurationContent.setHeight(20);
+ rightPane.addMember(divider3);
+ //recentOperations.xhtml
+ HLayout recentOperationsTitle = new TitleWithIcon("subsystems/control/Operation_24.png", RECENT_OPERATIONS);
+ rightPane.addMember(recentOperationsTitle);
+ rightPane.addMember(recentOperationsContent);
+ recentOperationsContent.setHeight(20);
+ rightPane.addMember(divider4);
+ //recentEventCounts.xhtml
+ HLayout recentEventsTitle = new TitleWithIcon("subsystems/event/Events_24.png", RECENT_EVENTS);
+ rightPane.addMember(recentEventsTitle);
+ rightPane.addMember(recentEventsContent);
+ recentEventsContent.setHeight(20);
+ rightPane.addMember(divider5);
+ //recentPackageHistory.xhtml
+ HLayout recentPkgHistoryTitle = new TitleWithIcon("subsystems/content/Content_24.png", RECENT_PKG_HISTORY);
+ rightPane.addMember(recentPkgHistoryTitle);
+ rightPane.addMember(recentPkgHistoryContent);
+ recentPkgHistoryContent.setHeight(20);
+ loadData();
+ }
+
+ /**Initiates data request.
+ */
+ private void loadData() {
+ getRecentAlerts();
+ getRecentOperations();
+ getRecentConfigurationUpdates();
+ getRecentEventUpdates();
+ getRecentOobs();
+ getRecentPkgHistory();
+ getRecentMetrics();
}
@Override
protected void onDraw() {
super.onDraw();
-
- this.iFrame = new FullHTMLPane(extendLocatorId("IFrame"), null);
- addMember(this.iFrame);
-
- refresh();
+ addMember(leftPane);
+ addMember(rightPane);
}
@Override
public void refresh() {
- int resourceId = this.resourceComposite.getResource().getId();
- this.iFrame.setContentsURL("/rhq/resource/summary/overview-plain.xhtml?id=" + resourceId);
+ markForRedraw();
+ //call out to 3rd party javascript lib
+ graphSparkLines();
+ }
+
+ /**Creates the section top titles with icon for regions of Activity page.
+ */
+ class TitleWithIcon extends HLayout {
+
+ public TitleWithIcon(String imageUrl, String title) {
+ super();
+ Img titleImage = new Img(imageUrl, 24, 24);
+ HTMLFlow titleElement = new HTMLFlow();
+ titleElement.setWidth("*");
+ titleElement.setContents(title);
+ titleElement.setStyleName("HeaderLabel");
+ addMember(titleImage);
+ addMember(titleElement);
+ setMembersMargin(10);
+ }
}
-
+
+ /** Fetches alerts and updates the DynamicForm instance with the latest
+ * alert information.
+ */
+ private void getRecentAlerts() {
+ final int resourceId = this.resourceComposite.getResource().getId();
+ //fetches last five alerts for this resource
+ AlertCriteria criteria = new AlertCriteria();
+ PageControl pageControl = new PageControl(0, 5);
+ pageControl.initDefaultOrderingField("ctime", PageOrdering.DESC);
+ criteria.setPageControl(pageControl);
+ criteria.addFilterResourceIds(resourceId);
+ GWTServiceLookup.getAlertService().findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
+ @Override
+ public void onSuccess(PageList<Alert> result) {
+ VLayout column = new VLayout();
+ column.setHeight(10);
+ if (!result.isEmpty()) {
+ int rowNum = 0;
+ for (Alert alert : result) {
+ // alert history records do not have a usable locatorId, we'll use rownum, which is unique and
+ // may be repeatable.
+ LocatableDynamicForm row = new LocatableDynamicForm(recentAlertsContent.extendLocatorId(String
+ .valueOf(rowNum++)));
+ row.setNumCols(3);
+
+ StaticTextItem iconItem = newTextItemIcon(ImageManager.getAlertIcon(alert.getAlertDefinition()
+ .getPriority()), alert.getAlertDefinition().getPriority().getDisplayName());
+ LinkItem link = newLinkItem(alert.getAlertDefinition().getName() + ": ",
+ ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Alerts/History/" + alert.getId());
+ StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(alert.getCtime()));
+ row.setItems(iconItem, link, time);
+
+ column.addMember(row);
+ }
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentAlertsContent.extendLocatorId("None"),
+ RECENT_ALERTS_NONE);
+ column.addMember(row);
+ }
+ for (Canvas child : recentAlertsContent.getChildren()) {
+ child.destroy();
+ }
+ recentAlertsContent.addChild(column);
+ recentAlertsContent.markForRedraw();
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving recent alerts for resource [" + resourceId + "]:" + caught.getMessage());
+ }
+ });
+ }
+
+ /** Fetches operations and updates the DynamicForm instance with the latest
+ * operation information.
+ */
+ private void getRecentOperations() {
+ final int resourceId = this.resourceComposite.getResource().getId();
+ //fetches five most recent operations.
+ PageControl pageControl = new PageControl(0, 5);
+ pageControl.initDefaultOrderingField("ro.createdTime", PageOrdering.DESC);
+ GWTServiceLookup.getOperationService().findRecentCompletedOperations(resourceId, pageControl,
+ new AsyncCallback<List<DisambiguationReport<ResourceOperationLastCompletedComposite>>>() {
+
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving recent operations for resource [" + resourceId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(List<DisambiguationReport<ResourceOperationLastCompletedComposite>> result) {
+ VLayout column = new VLayout();
+ column.setHeight(10);
+ if (!result.isEmpty()) {
+ int rowNum = 0;
+ for (DisambiguationReport<ResourceOperationLastCompletedComposite> report : result) {
+ // operation history records do not have a usable locatorId, we'll use rownum, which is unique and
+ // may be repeatable.
+ LocatableDynamicForm row = new LocatableDynamicForm(recentOperationsContent
+ .extendLocatorId(String.valueOf(rowNum)));
+ row.setNumCols(3);
+
+ 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());
+ StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(report.getOriginal()
+ .getOperationStartTime()));
+ row.setItems(iconItem, link, time);
+
+ column.addMember(row);
+ }
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentOperationsContent
+ .extendLocatorId("None"), RECENT_OPERATIONS_NONE);
+ column.addMember(row);
+ }
+ for (Canvas child : recentOperationsContent.getChildren()) {
+ child.destroy();
+ }
+ recentOperationsContent.addChild(column);
+ recentOperationsContent.markForRedraw();
+ }
+ });
+ }
+
+ /** Fetches configuration updates and updates the DynamicForm instance with the latest
+ * config change information.
+ */
+ private void getRecentConfigurationUpdates() {
+ final int resourceId = this.resourceComposite.getResource().getId();
+
+ PageControl lastFive = new PageControl(0, 5);
+ lastFive.initDefaultOrderingField("cu.createdTime", PageOrdering.DESC);
+
+ GWTServiceLookup.getConfigurationService().findResourceConfigurationUpdates(resourceId, null, null, true,
+ lastFive, new AsyncCallback<PageList<ResourceConfigurationUpdate>>() {
+
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving recent configuration updates for resource [" + resourceId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(PageList<ResourceConfigurationUpdate> result) {
+ VLayout column = new VLayout();
+ column.setHeight(10);
+ if (!result.isEmpty()) {
+ int rowNum = 0;
+ for (ResourceConfigurationUpdate update : result) {
+ // config update history records do not have a usable locatorId, we'll use rownum, which is unique and
+ // may be repeatable.
+ LocatableDynamicForm row = new LocatableDynamicForm(recentConfigurationContent
+ .extendLocatorId(String.valueOf(rowNum)));
+ row.setNumCols(3);
+
+ StaticTextItem iconItem = newTextItemIcon(ImageManager.getResourceConfigurationIcon(update
+ .getStatus()), null);
+ String linkTitle = MSG.view_resource_inventory_activity_changed_by() + " "
+ + update.getSubjectName() + ":";
+ if ((update.getSubjectName() == null) || (update.getSubjectName().trim().isEmpty())) {
+ linkTitle = MSG.common_msg_changeAutoDetected();
+ }
+ LinkItem link = newLinkItem(linkTitle, ReportDecorator.GWT_RESOURCE_URL + resourceId
+ + "/Configuration/History/" + update.getId());
+ StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(update
+ .getCreatedTime()));
+
+ row.setItems(iconItem, link, time);
+ column.addMember(row);
+ }
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentConfigurationContent
+ .extendLocatorId("None"), RECENT_CONFIGURATIONS_NONE);
+ column.addMember(row);
+ }
+ //cleanup
+ for (Canvas child : recentConfigurationContent.getChildren()) {
+ child.destroy();
+ }
+ recentConfigurationContent.addChild(column);
+ recentConfigurationContent.markForRedraw();
+ }
+ });
+ }
+
+ /** Fetches recent events and updates the DynamicForm instance with the latest
+ * event information over last 24hrs.
+ */
+ private void getRecentEventUpdates() {
+
+ final int resourceId = this.resourceComposite.getResource().getId();
+ long now = System.currentTimeMillis();
+ long nowMinus24Hours = now - (24 * 60 * 60 * 1000);
+
+ GWTServiceLookup.getEventService().getEventCountsBySeverity(resourceId, nowMinus24Hours, now,
+ new AsyncCallback<Map<EventSeverity, Integer>>() {
+
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving recent event counts for resource [" + resourceId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(Map<EventSeverity, Integer> eventCounts) {
+ //Now populated Tuples
+ List<GwtTuple<EventSeverity, Integer>> results = new ArrayList<GwtTuple<EventSeverity, Integer>>();
+ for (EventSeverity severity : eventCounts.keySet()) {
+ int count = eventCounts.get(severity);
+ if (count > 0) {
+ results.add(new GwtTuple<EventSeverity, Integer>(severity, count));
+ }
+ }
+ //build display
+ VLayout column = new VLayout();
+ column.setHeight(10);
+
+ if (!results.isEmpty()) {
+ int rowNum = 0;
+ for (GwtTuple<EventSeverity, Integer> tuple : results) {
+ // event history records do not have a usable locatorId, we'll use rownum, which is unique and
+ // may be repeatable.
+ LocatableDynamicForm row = new LocatableDynamicForm(recentEventsContent
+ .extendLocatorId(String.valueOf(rowNum)));
+ row.setNumCols(2);
+ row.setWidth(10);//pack.
+
+ //icon
+ StaticTextItem iconItem = newTextItemIcon(ImageManager.getEventSeverityIcon(tuple
+ .getLefty()), tuple.getLefty().name());
+ //count
+ StaticTextItem count = newTextItem(String.valueOf(tuple.righty));
+ row.setItems(iconItem, count);
+
+ column.addMember(row);
+ }
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentEventsContent.extendLocatorId("None"),
+ RECENT_EVENTS_NONE);
+ column.addMember(row);
+ }
+ //cleanup
+ for (Canvas child : recentEventsContent.getChildren()) {
+ child.destroy();
+ }
+ recentEventsContent.addChild(column);
+ recentEventsContent.markForRedraw();
+ }
+ });
+ }
+
+ /** Fetches OOB measurements and updates the DynamicForm instance with the latest 5
+ * oob change details.
+ */
+ private void getRecentOobs() {
+ final int resourceId = this.resourceComposite.getResource().getId();
+ GWTServiceLookup.getMeasurementDataService().getHighestNOOBsForResource(resourceId, 5,
+ new AsyncCallback<PageList<MeasurementOOBComposite>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving recent out of bound metrics for resource [" + resourceId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(PageList<MeasurementOOBComposite> result) {
+ VLayout column = new VLayout();
+ column.setHeight(10);
+ if (!result.isEmpty()) {
+ for (MeasurementOOBComposite oob : result) {
+ LocatableDynamicForm row = new LocatableDynamicForm(recentOobContent.extendLocatorId(oob
+ .getScheduleName()));
+ row.setNumCols(2);
+
+ String title = oob.getScheduleName() + ":";
+ String destination = "/resource/common/monitor/Visibility.do?m=" + oob.getDefinitionId()
+ + "&id=" + resourceId + "&mode=chartSingleMetricSingleResource";
+ LinkItem link = newLinkItem(title, destination);
+ StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(oob.getTimestamp()));
+
+ row.setItems(link, time);
+ column.addMember(row);
+ }
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentOobContent.extendLocatorId("None"),
+ RECENT_OOB_NONE);
+ column.addMember(row);
+ }
+ recentOobContent.setContents("");
+ for (Canvas child : recentOobContent.getChildren()) {
+ child.destroy();
+ }
+ recentOobContent.addChild(column);
+ recentOobContent.markForRedraw();
+ }
+ });
+ }
+
+ /** Fetches recent package history information and updates the DynamicForm instance with details.
+ */
+ private void getRecentPkgHistory() {
+ final int resourceId = this.resourceComposite.getResource().getId();
+ InstalledPackageCriteria criteria = new InstalledPackageCriteria();
+ criteria.addFilterResourceId(resourceId);
+ PageControl pageControl = new PageControl(0, 5);
+ criteria.setPageControl(pageControl);
+
+ 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 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
+ * digits.
+ */
+ private void getRecentMetrics() {
+ //display container
+ final VLayout column = new VLayout();
+ column.setHeight(10);//pack
+ final int resourceId = this.resourceComposite.getResource().getId();
+
+ //retrieve all relevant measurement definition ids.
+ Set<MeasurementDefinition> definitions = this.resourceComposite.getResource().getResourceType()
+ .getMetricDefinitions();
+
+ //build id mapping for measurementDefinition instances Ex. Free Memory -> MeasurementDefinition[100071]
+ final HashMap<String, MeasurementDefinition> measurementDefMap = new HashMap<String, MeasurementDefinition>();
+ for (MeasurementDefinition definition : definitions) {
+ measurementDefMap.put(definition.getDisplayName(), definition);
+ }
+
+ //bundle definition ids for asynch call.
+ int[] definitionArrayIds = new int[definitions.size()];
+ final String[] displayOrder = new String[definitions.size()];
+ measurementDefMap.keySet().toArray(displayOrder);
+ //sort the charting data ex. Free Memory, Free Swap Space,..System Load
+ Arrays.sort(displayOrder);
+
+ //organize definitionArrayIds for ordered request on server.
+ int index = 0;
+ for (String definitionToDisplay : displayOrder) {
+ definitionArrayIds[index++] = measurementDefMap.get(definitionToDisplay).getId();
+ }
+ //make the asynchronous call for all the measurement data
+ GWTServiceLookup.getMeasurementDataService().findDataForResource(resourceId, definitionArrayIds,
+ System.currentTimeMillis() - (1000L * 60 * 60 * 8), System.currentTimeMillis(), 60,
+ new AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
+ @Override
+ public void onFailure(Throwable caught) {
+ Log.debug("Error retrieving recent metrics charting data for resource [" + resourceId + "]:"
+ + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(List<List<MeasurementDataNumericHighLowComposite>> results) {
+ if (!results.isEmpty()) {
+ boolean someChartedData = false;
+ //iterate over the retrieved charting data
+ for (int index = 0; index < displayOrder.length; index++) {
+
+ //retrieve the correct measurement definition
+ MeasurementDefinition md = measurementDefMap.get(displayOrder[index]);
+
+ //load the data results for the given metric definition
+ List<MeasurementDataNumericHighLowComposite> data = results.get(index);
+
+ //locate last and minimum values.
+ double lastValue = -1;
+ double minValue = Double.MAX_VALUE;//
+ for (MeasurementDataNumericHighLowComposite d : data) {
+ if ((!Double.isNaN(d.getValue()))
+ && (String.valueOf(d.getValue()).indexOf("NaN") == -1)) {
+ if (d.getValue() < minValue) {
+ minValue = d.getValue();
+ }
+ lastValue = d.getValue();
+ }
+ }
+
+ //collapse the data into comma delimited list for consumption by third party javascript library(jquery.sparkline)
+ String commaDelimitedList = "";
+
+ for (MeasurementDataNumericHighLowComposite d : data) {
+ if ((!Double.isNaN(d.getValue()))
+ && (String.valueOf(d.getValue()).indexOf("NaN") == -1)) {
+ commaDelimitedList += d.getValue() + ",";
+ }
+ }
+ LocatableDynamicForm row = new LocatableDynamicForm(recentMeasurementsContent
+ .extendLocatorId(md.getName()));
+ row.setNumCols(3);
+ HTMLFlow graph = new HTMLFlow();
+ // String contents = "<span id='sparkline_" + index + "' class='dynamicsparkline' width='0'>"
+ // + commaDelimitedList + "</span>";
+ String contents = "<span id='sparkline_" + index + "' class='dynamicsparkline' width='0' "
+ + "values='" + commaDelimitedList + "'>...</span>";
+ graph.setContents(contents);
+ graph.setContentsType(ContentsType.PAGE);
+ //diable scrollbars on span
+ graph.setScrollbarSize(0);
+
+ CanvasItem graphContainer = new CanvasItem();
+ graphContainer.setShowTitle(false);
+ graphContainer.setHeight(16);
+ graphContainer.setWidth(60);
+ graphContainer.setCanvas(graph);
+
+ //Link/title element
+ //TODO: spinder, change link whenever portal.war/graphing is removed.
+ String title = md.getDisplayName() + ":";
+ String destination = "/resource/common/monitor/Visibility.do?mode=chartSingleMetricSingleResource&id="
+ + resourceId + "&m=" + md.getId();
+ LinkItem link = newLinkItem(title, destination);
+
+ //Value
+ String convertedValue = lastValue + " " + md.getUnits();
+ convertedValue = convertLastValueForDisplay(lastValue, md);
+ StaticTextItem value = newTextItem(convertedValue);
+
+ row.setItems(graphContainer, link, value);
+ //if graph content returned
+ if ((md.getName().trim().indexOf("Trait.") == -1) && (lastValue != -1)) {
+ column.addMember(row);
+ someChartedData = true;
+ }
+ }
+ if (!someChartedData) {// when there are results but no chartable entries.
+ LocatableDynamicForm row = createEmptyDisplayRow(recentMeasurementsContent
+ .extendLocatorId("None"), RECENT_MEASUREMENTS_NONE);
+ column.addMember(row);
+ }
+ //call out to 3rd party javascript lib
+ graphSparkLines();
+ } else {
+ LocatableDynamicForm row = createEmptyDisplayRow(recentMeasurementsContent
+ .extendLocatorId("None"), RECENT_MEASUREMENTS_NONE);
+ column.addMember(row);
+ }
+ }
+ });
+
+ //cleanup
+ for (Canvas child : recentMeasurementsContent.getChildren()) {
+ child.destroy();
+ }
+ 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;
+ }
+
+ /** Create empty display row(LocatableDynamicForm) that is constently defined and displayed.
+ *
+ * @param column Locatable parent colum.
+ * @param emptyMessage Contents of the empty region
+ * @return
+ */
+ private LocatableDynamicForm createEmptyDisplayRow(String locatorId, String emptyMessage) {
+ LocatableDynamicForm row = null;
+ row = new LocatableDynamicForm(locatorId);
+
+ row.setNumCols(3);
+ StaticTextItem none = new StaticTextItem();
+ none.setShowTitle(false);
+ none.setDefaultValue(emptyMessage);
+ none.setWrap(false);
+ row.setItems(none);
+ return row;
+ }
+
+ private StaticTextItem newTextItemIcon(String imageSrc, String mouseOver) {
+ StaticTextItem iconItem = new StaticTextItem();
+ FormItemIcon img = new FormItemIcon();
+ img.setSrc(imageSrc);
+ img.setWidth(16);
+ img.setHeight(16);
+ if (mouseOver != null) {
+ img.setPrompt(mouseOver);
+ }
+ iconItem.setIcons(img);
+ iconItem.setShowTitle(false);
+ return iconItem;
+ }
+
+ private LinkItem newLinkItem(String title, String destination) {
+ LinkItem link = new LinkItem();
+ link.setLinkTitle(title);
+ link.setTitle(title);
+ link.setValue(destination);
+ link.setTarget("_self");
+ link.setShowTitle(false);
+ return link;
+ }
+
+ private StaticTextItem newTextItem(String contents) {
+ StaticTextItem item = new StaticTextItem();
+ item.setDefaultValue(contents);
+ item.setShowTitle(false);
+ item.setShowPickerIcon(false);
+ item.setWrap(false);
+ return item;
+ }
+
+ //This is a JSNI call out to the third party javascript lib to execute on the data inserted into the DOM.
+ public static native void graphSparkLines()
+ /*-{
+ //find all elements where attribute class contains 'dynamicsparkline' and graph their contents
+ $wnd.jQuery('.dynamicsparkline').sparkline();
+ }-*/;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java
deleted file mode 100644
index 442dfce..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView2.java
+++ /dev/null
@@ -1,793 +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.summary;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import com.allen_sauer.gwt.log.client.Log;
-import com.google.gwt.user.client.Timer;
-import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.types.ContentsType;
-import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.HTMLFlow;
-import com.smartgwt.client.widgets.Img;
-import com.smartgwt.client.widgets.form.fields.CanvasItem;
-import com.smartgwt.client.widgets.form.fields.FormItemIcon;
-import com.smartgwt.client.widgets.form.fields.LinkItem;
-import com.smartgwt.client.widgets.form.fields.StaticTextItem;
-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.configuration.ResourceConfigurationUpdate;
-import org.rhq.core.domain.content.InstalledPackageHistory;
-import org.rhq.core.domain.criteria.AlertCriteria;
-import org.rhq.core.domain.criteria.InstalledPackageCriteria;
-import org.rhq.core.domain.event.EventSeverity;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
-import org.rhq.core.domain.measurement.composite.MeasurementOOBComposite;
-import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite;
-import org.rhq.core.domain.resource.composite.DisambiguationReport;
-import org.rhq.core.domain.resource.composite.ResourceComposite;
-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.RefreshableView;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.resource.disambiguation.ReportDecorator;
-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.LocatableCanvas;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
-
-/**
- * The content pane of the Resource Summary>Activity tab.
- *
- * @author Simeon Pinder
- */
-public class ActivityView2 extends LocatableHLayout implements RefreshableView {
-
- //Locatable ui references
- private VLayout leftPane = new VLayout();;
- private VLayout rightPane = new VLayout();;
- private LocatableCanvas recentMeasurementsContent = new LocatableCanvas(extendLocatorId("RecentMetrics"));
- private LocatableCanvas recentAlertsContent = new LocatableCanvas(extendLocatorId("RecentAlerts"));
- private LocatableCanvas recentOobContent = new LocatableCanvas(extendLocatorId("RecentOobs"));
- private LocatableCanvas recentConfigurationContent = new LocatableCanvas(extendLocatorId("RecentConfig"));
- private LocatableCanvas recentOperationsContent = new LocatableCanvas(extendLocatorId("RecentOperations"));
- private LocatableCanvas recentEventsContent = new LocatableCanvas(extendLocatorId("RecentEvents"));
- private LocatableCanvas recentPkgHistoryContent = new LocatableCanvas(extendLocatorId("RecentPkgHistory"));
-
- //retrieve localized text
- private String RECENT_MEASUREMENTS = MSG.common_title_recent_measurements();
- private String RECENT_MEASUREMENTS_NONE = MSG.view_resource_inventory_activity_no_recent_metrics();
- private String RECENT_ALERTS = MSG.common_title_recent_alerts();
- private String RECENT_ALERTS_NONE = MSG.view_resource_inventory_activity_no_recent_alerts();
- private String RECENT_OOB = MSG.common_title_recent_oob_metrics();
- private String RECENT_OOB_NONE = MSG.view_resource_inventory_activity_no_recent_oob();
- private String RECENT_CONFIGURATIONS = MSG.common_title_recent_configuration_updates();
- private String RECENT_CONFIGURATIONS_NONE = MSG.view_resource_inventory_activity_no_recent_config_history();
- private String RECENT_OPERATIONS = MSG.common_title_recent_operations();
- private String RECENT_OPERATIONS_NONE = MSG.view_resource_inventory_activity_no_recent_operations();
- private String RECENT_EVENTS = MSG.common_title_recent_event_counts();
- private String RECENT_EVENTS_NONE = MSG.view_resource_inventory_activity_no_recent_events();
- private String RECENT_PKG_HISTORY = MSG.common_title_recent_pkg_history();
- private String RECENT_PKG_HISTORY_NONE = MSG.view_resource_inventory_activity_no_recent_pkg_history();
-
- private Timer sparklineReloader = null;
- private ResourceComposite resourceComposite;
-
- public ActivityView2(String locatorId, ResourceComposite resourceComposite) {
- super(locatorId);
- this.resourceComposite = resourceComposite;
- setID(locatorId);
- initializeUi();
- }
-
- /**Defines layout for the Activity page.
- */
- private void initializeUi() {
- setPadding(5);
- setMembersMargin(5);
- //dividers definition
- HTMLFlow divider1 = new HTMLFlow("<hr/>");
- HTMLFlow divider2 = new HTMLFlow("<hr/>");
- HTMLFlow divider3 = new HTMLFlow("<hr/>");
- HTMLFlow divider4 = new HTMLFlow("<hr/>");
- HTMLFlow divider5 = new HTMLFlow("<hr/>");
- divider1.setWidth("50%");
- divider2.setWidth("50%");
- divider3.setWidth("50%");
- divider4.setWidth("50%");
- divider5.setWidth("50%");
-
- //leftPane
- leftPane.setWidth("50%");
- leftPane.setPadding(5);
- leftPane.setMembersMargin(5);
- leftPane.setAutoHeight();
-
- //recentMetrics.xhtml
- HLayout recentMetricsTitle = new TitleWithIcon("subsystems/monitor/Monitor_24.png", RECENT_MEASUREMENTS);
- leftPane.addMember(recentMetricsTitle);
- leftPane.addMember(recentMeasurementsContent);
- recentMeasurementsContent.setHeight(20);
- leftPane.addMember(divider1);
- //recentAlerts.xhtml
- HLayout recentAlertsTitle = new TitleWithIcon("subsystems/alert/Flag_blue_24.png", RECENT_ALERTS);
- leftPane.addMember(recentAlertsTitle);
- leftPane.addMember(recentAlertsContent);
- recentAlertsContent.setHeight(20);
- leftPane.addMember(divider2);
- //recentOOBs.xhtml
- HLayout recentOobsTitle = new TitleWithIcon("subsystems/monitor/Monitor_failed_24.png", RECENT_OOB);
- leftPane.addMember(recentOobsTitle);
- leftPane.addMember(recentOobContent);
- recentOobContent.setHeight(20);
-
- //rightPane
- rightPane.setWidth("50%");
- rightPane.setPadding(5);
- rightPane.setMembersMargin(5);
- rightPane.setAutoHeight();
- //recentConfigUpdates.xhtml
- HLayout recentConfigUpdatesTitle = new TitleWithIcon("subsystems/configure/Configure_24.png",
- RECENT_CONFIGURATIONS);
- rightPane.addMember(recentConfigUpdatesTitle);
- rightPane.addMember(recentConfigurationContent);
- recentConfigurationContent.setHeight(20);
- rightPane.addMember(divider3);
- //recentOperations.xhtml
- HLayout recentOperationsTitle = new TitleWithIcon("subsystems/control/Operation_24.png", RECENT_OPERATIONS);
- rightPane.addMember(recentOperationsTitle);
- rightPane.addMember(recentOperationsContent);
- recentOperationsContent.setHeight(20);
- rightPane.addMember(divider4);
- //recentEventCounts.xhtml
- HLayout recentEventsTitle = new TitleWithIcon("subsystems/event/Events_24.png", RECENT_EVENTS);
- rightPane.addMember(recentEventsTitle);
- rightPane.addMember(recentEventsContent);
- recentEventsContent.setHeight(20);
- rightPane.addMember(divider5);
- //recentPackageHistory.xhtml
- HLayout recentPkgHistoryTitle = new TitleWithIcon("subsystems/content/Content_24.png", RECENT_PKG_HISTORY);
- rightPane.addMember(recentPkgHistoryTitle);
- rightPane.addMember(recentPkgHistoryContent);
- recentPkgHistoryContent.setHeight(20);
- loadData();
- }
-
- /**Initiates data request.
- */
- private void loadData() {
- getRecentAlerts();
- getRecentOperations();
- getRecentConfigurationUpdates();
- getRecentEventUpdates();
- getRecentOobs();
- getRecentPkgHistory();
- getRecentMetrics();
- }
-
- @Override
- protected void onDraw() {
- super.onDraw();
-
- //TODO:spinder cleanup members before on draw?
- addMember(leftPane);
- addMember(rightPane);
- refresh();
- }
-
- @Override
- public void refresh() {
- // int resourceId = this.resourceComposite.getResource().getId();
- // this.iFrame.setContentsURL("/rhq/resource/summary/overview-plain.xhtml?id=" + resourceId);
- markForRedraw();
- //call out to 3rd party javascript lib
- graphSparkLines();
- }
-
- /**Creates the section top titles with icon for regions of Activity page.
- */
- class TitleWithIcon extends HLayout {
-
- public TitleWithIcon(String imageUrl, String title) {
- super();
- Img titleImage = new Img(imageUrl, 24, 24);
- HTMLFlow titleElement = new HTMLFlow();
- titleElement.setWidth("*");
- titleElement.setContents(title);
- titleElement.setStyleName("HeaderLabel");
- addMember(titleImage);
- addMember(titleElement);
- setMembersMargin(10);
- }
- }
-
- /** Fetches alerts and updates the DynamicForm instance with the latest
- * alert information.
- */
- private void getRecentAlerts() {
- final int resourceId = this.resourceComposite.getResource().getId();
- //fetches last five alerts for this resource
- AlertCriteria criteria = new AlertCriteria();
- PageControl pageControl = new PageControl(0, 5);
- pageControl.initDefaultOrderingField("ctime", PageOrdering.DESC);
- criteria.setPageControl(pageControl);
- criteria.addFilterResourceIds(resourceId);
- GWTServiceLookup.getAlertService().findAlertsByCriteria(criteria, new AsyncCallback<PageList<Alert>>() {
- @Override
- public void onSuccess(PageList<Alert> result) {
- VLayout column = new VLayout();
- column.setHeight(10);
- if (!result.isEmpty()) {
- int rowNum = 0;
- for (Alert alert : result) {
- // alert history records do not have a usable locatorId, we'll use rownum, which is unique and
- // may be repeatable.
- LocatableDynamicForm row = new LocatableDynamicForm(recentAlertsContent.extendLocatorId(String
- .valueOf(rowNum++)));
- row.setNumCols(3);
-
- StaticTextItem iconItem = newTextItemIcon(ImageManager.getAlertIcon(alert.getAlertDefinition()
- .getPriority()), alert.getAlertDefinition().getPriority().getDisplayName());
- LinkItem link = newLinkItem(alert.getAlertDefinition().getName() + ": ",
- ReportDecorator.GWT_RESOURCE_URL + resourceId + "/Alerts/History/" + alert.getId());
- StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(alert.getCtime()));
- row.setItems(iconItem, link, time);
-
- column.addMember(row);
- }
- } else {
- LocatableDynamicForm row = createEmptyDisplayRow(recentAlertsContent.extendLocatorId("None"),
- RECENT_ALERTS_NONE);
- column.addMember(row);
- }
- for (Canvas child : recentAlertsContent.getChildren()) {
- child.destroy();
- }
- recentAlertsContent.addChild(column);
- recentAlertsContent.markForRedraw();
- }
-
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent alerts for resource [" + resourceId + "]:" + caught.getMessage());
- }
- });
- }
-
- /** Fetches operations and updates the DynamicForm instance with the latest
- * operation information.
- */
- private void getRecentOperations() {
- final int resourceId = this.resourceComposite.getResource().getId();
- //fetches five most recent operations.
- PageControl pageControl = new PageControl(0, 5);
- pageControl.initDefaultOrderingField("ro.createdTime", PageOrdering.DESC);
- GWTServiceLookup.getOperationService().findRecentCompletedOperations(resourceId, pageControl,
- new AsyncCallback<List<DisambiguationReport<ResourceOperationLastCompletedComposite>>>() {
-
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent operations for resource [" + resourceId + "]:"
- + caught.getMessage());
- }
-
- @Override
- public void onSuccess(List<DisambiguationReport<ResourceOperationLastCompletedComposite>> result) {
- VLayout column = new VLayout();
- column.setHeight(10);
- if (!result.isEmpty()) {
- int rowNum = 0;
- for (DisambiguationReport<ResourceOperationLastCompletedComposite> report : result) {
- // operation history records do not have a usable locatorId, we'll use rownum, which is unique and
- // may be repeatable.
- LocatableDynamicForm row = new LocatableDynamicForm(recentOperationsContent
- .extendLocatorId(String.valueOf(rowNum)));
- row.setNumCols(3);
-
- 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());
- StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(report.getOriginal()
- .getOperationStartTime()));
- row.setItems(iconItem, link, time);
-
- column.addMember(row);
- }
- } else {
- LocatableDynamicForm row = createEmptyDisplayRow(recentOperationsContent
- .extendLocatorId("None"), RECENT_OPERATIONS_NONE);
- column.addMember(row);
- }
- for (Canvas child : recentOperationsContent.getChildren()) {
- child.destroy();
- }
- recentOperationsContent.addChild(column);
- recentOperationsContent.markForRedraw();
- }
- });
- }
-
- /** Fetches configuration updates and updates the DynamicForm instance with the latest
- * config change information.
- */
- private void getRecentConfigurationUpdates() {
- final int resourceId = this.resourceComposite.getResource().getId();
-
- PageControl lastFive = new PageControl(0, 5);
- lastFive.initDefaultOrderingField("cu.createdTime", PageOrdering.DESC);
-
- GWTServiceLookup.getConfigurationService().findResourceConfigurationUpdates(resourceId, null, null, true,
- lastFive, new AsyncCallback<PageList<ResourceConfigurationUpdate>>() {
-
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent configuration updates for resource [" + resourceId + "]:"
- + caught.getMessage());
- }
-
- @Override
- public void onSuccess(PageList<ResourceConfigurationUpdate> result) {
- VLayout column = new VLayout();
- column.setHeight(10);
- if (!result.isEmpty()) {
- int rowNum = 0;
- for (ResourceConfigurationUpdate update : result) {
- // config update history records do not have a usable locatorId, we'll use rownum, which is unique and
- // may be repeatable.
- LocatableDynamicForm row = new LocatableDynamicForm(recentConfigurationContent
- .extendLocatorId(String.valueOf(rowNum)));
- row.setNumCols(3);
-
- StaticTextItem iconItem = newTextItemIcon(ImageManager.getResourceConfigurationIcon(update
- .getStatus()), null);
- String linkTitle = MSG.view_resource_inventory_activity_changed_by() + " "
- + update.getSubjectName() + ":";
- if ((update.getSubjectName() == null) || (update.getSubjectName().trim().isEmpty())) {
- linkTitle = MSG.common_msg_changeAutoDetected();
- }
- LinkItem link = newLinkItem(linkTitle, ReportDecorator.GWT_RESOURCE_URL + resourceId
- + "/Configuration/History/" + update.getId());
- StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(update
- .getCreatedTime()));
-
- row.setItems(iconItem, link, time);
- column.addMember(row);
- }
- } else {
- LocatableDynamicForm row = createEmptyDisplayRow(recentConfigurationContent
- .extendLocatorId("None"), RECENT_CONFIGURATIONS_NONE);
- column.addMember(row);
- }
- //cleanup
- for (Canvas child : recentConfigurationContent.getChildren()) {
- child.destroy();
- }
- recentConfigurationContent.addChild(column);
- recentConfigurationContent.markForRedraw();
- }
- });
- }
-
- /** Fetches recent events and updates the DynamicForm instance with the latest
- * event information over last 24hrs.
- */
- private void getRecentEventUpdates() {
-
- final int resourceId = this.resourceComposite.getResource().getId();
- long now = System.currentTimeMillis();
- long nowMinus24Hours = now - (24 * 60 * 60 * 1000);
-
- GWTServiceLookup.getEventService().getEventCountsBySeverity(resourceId, nowMinus24Hours, now,
- new AsyncCallback<Map<EventSeverity, Integer>>() {
-
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent event counts for resource [" + resourceId + "]:"
- + caught.getMessage());
- }
-
- @Override
- public void onSuccess(Map<EventSeverity, Integer> eventCounts) {
- //Now populated Tuples
- List<GwtTuple<EventSeverity, Integer>> results = new ArrayList<GwtTuple<EventSeverity, Integer>>();
- for (EventSeverity severity : eventCounts.keySet()) {
- int count = eventCounts.get(severity);
- if (count > 0) {
- results.add(new GwtTuple<EventSeverity, Integer>(severity, count));
- }
- }
- //build display
- VLayout column = new VLayout();
- column.setHeight(10);
-
- if (!results.isEmpty()) {
- int rowNum = 0;
- for (GwtTuple<EventSeverity, Integer> tuple : results) {
- // event history records do not have a usable locatorId, we'll use rownum, which is unique and
- // may be repeatable.
- LocatableDynamicForm row = new LocatableDynamicForm(recentEventsContent
- .extendLocatorId(String.valueOf(rowNum)));
- row.setNumCols(2);
- row.setWidth(10);//pack.
-
- //icon
- StaticTextItem iconItem = newTextItemIcon(ImageManager.getEventSeverityIcon(tuple
- .getLefty()), tuple.getLefty().name());
- //count
- StaticTextItem count = newTextItem(String.valueOf(tuple.righty));
- row.setItems(iconItem, count);
-
- column.addMember(row);
- }
- } else {
- LocatableDynamicForm row = createEmptyDisplayRow(recentEventsContent.extendLocatorId("None"),
- RECENT_EVENTS_NONE);
- column.addMember(row);
- }
- //cleanup
- for (Canvas child : recentEventsContent.getChildren()) {
- child.destroy();
- }
- recentEventsContent.addChild(column);
- recentEventsContent.markForRedraw();
- }
- });
- }
-
- /** Fetches OOB measurements and updates the DynamicForm instance with the latest 5
- * oob change details.
- */
- private void getRecentOobs() {
- final int resourceId = this.resourceComposite.getResource().getId();
- GWTServiceLookup.getMeasurementDataService().getHighestNOOBsForResource(resourceId, 5,
- new AsyncCallback<PageList<MeasurementOOBComposite>>() {
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent out of bound metrics for resource [" + resourceId + "]:"
- + caught.getMessage());
- }
-
- @Override
- public void onSuccess(PageList<MeasurementOOBComposite> result) {
- VLayout column = new VLayout();
- column.setHeight(10);
- if (!result.isEmpty()) {
- for (MeasurementOOBComposite oob : result) {
- LocatableDynamicForm row = new LocatableDynamicForm(recentOobContent.extendLocatorId(oob
- .getScheduleName()));
- row.setNumCols(2);
-
- String title = oob.getScheduleName() + ":";
- String destination = "/resource/common/monitor/Visibility.do?m=" + oob.getDefinitionId()
- + "&id=" + resourceId + "&mode=chartSingleMetricSingleResource";
- LinkItem link = newLinkItem(title, destination);
- StaticTextItem time = newTextItem(GwtRelativeDurationConverter.format(oob.getTimestamp()));
-
- row.setItems(link, time);
- column.addMember(row);
- }
- } else {
- LocatableDynamicForm row = createEmptyDisplayRow(recentOobContent.extendLocatorId("None"),
- RECENT_OOB_NONE);
- column.addMember(row);
- }
- recentOobContent.setContents("");
- for (Canvas child : recentOobContent.getChildren()) {
- child.destroy();
- }
- recentOobContent.addChild(column);
- recentOobContent.markForRedraw();
- }
- });
- }
-
- /** Fetches recent package history information and updates the DynamicForm instance with details.
- */
- private void getRecentPkgHistory() {
- final int resourceId = this.resourceComposite.getResource().getId();
- InstalledPackageCriteria criteria = new InstalledPackageCriteria();
- criteria.addFilterResourceId(resourceId);
- PageControl pageControl = new PageControl(0, 5);
- criteria.setPageControl(pageControl);
-
- 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 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
- * digits.
- */
- private void getRecentMetrics() {
- //display container
- final VLayout column = new VLayout();
- column.setHeight(10);//pack
- final int resourceId = this.resourceComposite.getResource().getId();
-
- //retrieve all relevant measurement definition ids.
- Set<MeasurementDefinition> definitions = this.resourceComposite.getResource().getResourceType()
- .getMetricDefinitions();
-
- //build id mapping for measurementDefinition instances Ex. Free Memory -> MeasurementDefinition[100071]
- final HashMap<String, MeasurementDefinition> measurementDefMap = new HashMap<String, MeasurementDefinition>();
- for (MeasurementDefinition definition : definitions) {
- measurementDefMap.put(definition.getDisplayName(), definition);
- }
-
- //bundle definition ids for asynch call.
- int[] definitionArrayIds = new int[definitions.size()];
- final String[] displayOrder = new String[definitions.size()];
- measurementDefMap.keySet().toArray(displayOrder);
- //sort the charting data ex. Free Memory, Free Swap Space,..System Load
- Arrays.sort(displayOrder);
-
- //organize definitionArrayIds for ordered request on server.
- int index = 0;
- for (String definitionToDisplay : displayOrder) {
- definitionArrayIds[index++] = measurementDefMap.get(definitionToDisplay).getId();
- }
-
- //make the asynchronous call for all the measurement data
- GWTServiceLookup.getMeasurementDataService().findDataForResource(resourceId, definitionArrayIds,
- System.currentTimeMillis() - (1000L * 60 * 60 * 8), System.currentTimeMillis(), 60,
- new AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
- @Override
- public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent metrics charting data for resource [" + resourceId + "]:"
- + caught.getMessage());
- }
-
- @Override
- public void onSuccess(List<List<MeasurementDataNumericHighLowComposite>> results) {
- if (!results.isEmpty()) {
- boolean someChartedData = false;
- //iterate over the retrieved charting data
- for (int index = 0; index < displayOrder.length; index++) {
-
- //retrieve the correct measurement definition
- MeasurementDefinition md = measurementDefMap.get(displayOrder[index]);
-
- //load the data results for the given metric definition
- List<MeasurementDataNumericHighLowComposite> data = results.get(index);
-
- //locate last and minimum values.
- double lastValue = -1;
- double minValue = Double.MAX_VALUE;//
- for (MeasurementDataNumericHighLowComposite d : data) {
- if ((!Double.isNaN(d.getValue()))
- && (String.valueOf(d.getValue()).indexOf("NaN") == -1)) {
- if (d.getValue() < minValue) {
- minValue = d.getValue();
- }
- lastValue = d.getValue();
- }
- }
-
- //collapse the data into comma delimited list for consumption by third party javascript library(jquery.sparkline)
- String commaDelimitedList = "";
-
- for (MeasurementDataNumericHighLowComposite d : data) {
- if ((!Double.isNaN(d.getValue()))
- && (String.valueOf(d.getValue()).indexOf("NaN") == -1)) {
- commaDelimitedList += d.getValue() + ",";
- }
- }
- LocatableDynamicForm row = new LocatableDynamicForm(recentMeasurementsContent
- .extendLocatorId(md.getName()));
- row.setNumCols(3);
- HTMLFlow graph = new HTMLFlow();
- // String contents = "<span id='sparkline_" + index + "' class='dynamicsparkline' width='0'>"
- // + commaDelimitedList + "</span>";
- String contents = "<span id='sparkline_" + index + "' class='dynamicsparkline' width='0' "
- + "values='" + commaDelimitedList + "'>...</span>";
- graph.setContents(contents);
- graph.setContentsType(ContentsType.PAGE);
- //diable scrollbars on span
- graph.setScrollbarSize(0);
-
- CanvasItem graphContainer = new CanvasItem();
- graphContainer.setShowTitle(false);
- graphContainer.setHeight(16);
- graphContainer.setWidth(60);
- graphContainer.setCanvas(graph);
-
- //Link/title element
- //TODO: spinder, change link whenever portal.war/graphing is removed.
- String title = md.getDisplayName() + ":";
- String destination = "/resource/common/monitor/Visibility.do?mode=chartSingleMetricSingleResource&id="
- + resourceId + "&m=" + md.getId();
- LinkItem link = newLinkItem(title, destination);
-
- //Value
- String convertedValue = lastValue + " " + md.getUnits();
- convertedValue = convertLastValueForDisplay(lastValue, md);
- StaticTextItem value = newTextItem(convertedValue);
-
- row.setItems(graphContainer, link, value);
- //if graph content returned
- if ((md.getName().trim().indexOf("Trait.") == -1) && (lastValue != -1)) {
- column.addMember(row);
- someChartedData = true;
- }
- }
- if (!someChartedData) {// when there are results but no chartable entries.
- LocatableDynamicForm row = createEmptyDisplayRow(recentMeasurementsContent
- .extendLocatorId("None"), RECENT_MEASUREMENTS_NONE);
- column.addMember(row);
- }
- //call out to 3rd party javascript lib
- graphSparkLines();
- } else {
- LocatableDynamicForm row = createEmptyDisplayRow(recentMeasurementsContent
- .extendLocatorId("None"), RECENT_MEASUREMENTS_NONE);
- column.addMember(row);
- }
- }
- });
-
- //cleanup
- for (Canvas child : recentMeasurementsContent.getChildren()) {
- child.destroy();
- }
- recentMeasurementsContent.addChild(column);
- // graphSparkLines();
- recentMeasurementsContent.markForRedraw();
- if (sparklineReloader == null) {
- sparklineReloader = new Timer() {
- public void run() {
- refresh();
- }
- };
- sparklineReloader.schedule(750);
- }
- }
-
- /** 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;
- }
-
- /** Create empty display row(LocatableDynamicForm) that is constently defined and displayed.
- *
- * @param column Locatable parent colum.
- * @param emptyMessage Contents of the empty region
- * @return
- */
- private LocatableDynamicForm createEmptyDisplayRow(String locatorId, String emptyMessage) {
- LocatableDynamicForm row = null;
- row = new LocatableDynamicForm(locatorId);
-
- row.setNumCols(3);
- StaticTextItem none = new StaticTextItem();
- none.setShowTitle(false);
- none.setDefaultValue(emptyMessage);
- none.setWrap(false);
- row.setItems(none);
- return row;
- }
-
- private StaticTextItem newTextItemIcon(String imageSrc, String mouseOver) {
- StaticTextItem iconItem = new StaticTextItem();
- FormItemIcon img = new FormItemIcon();
- img.setSrc(imageSrc);
- img.setWidth(16);
- img.setHeight(16);
- if (mouseOver != null) {
- img.setPrompt(mouseOver);
- }
- iconItem.setIcons(img);
- iconItem.setShowTitle(false);
- return iconItem;
- }
-
- private LinkItem newLinkItem(String title, String destination) {
- LinkItem link = new LinkItem();
- link.setLinkTitle(title);
- link.setTitle(title);
- link.setValue(destination);
- link.setTarget("_self");
- link.setShowTitle(false);
- return link;
- }
-
- private StaticTextItem newTextItem(String contents) {
- StaticTextItem item = new StaticTextItem();
- item.setDefaultValue(contents);
- item.setShowTitle(false);
- item.setShowPickerIcon(false);
- item.setWrap(false);
- return item;
- }
-
- //This is a JSNI call out to the third party javascript lib to execute on the data inserted into the DOM.
- public static native void graphSparkLines()
- /*-{
- //find all elements where attribute class contains 'dynamicsparkline' and graph their contents
- $wnd.jQuery('.dynamicsparkline').sparkline();
- }-*/;
-}
commit be699782d80642062a34b850c9431c53fc2a5634
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Fri Jan 28 13:16:38 2011 -0500
various improvements to operation scheduling GUI
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java
index efcf37e..b5182e9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java
@@ -48,6 +48,7 @@ import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import org.rhq.core.domain.common.JobTrigger;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -544,15 +545,8 @@ public class JobTriggerEditor extends LocatableVLayout {
TextItem repeatIntervalItem = new TextItem(FIELD_REPEAT_INTERVAL, "Run now and every");
repeatIntervalItem.setRequired(true);
- // Configure context-sensitive help.
- FormItemIcon helpIcon = new FormItemIcon();
- helpIcon.setSrc("[SKIN]/actions/help.png");
- repeatIntervalItem.setIcons(helpIcon);
- repeatIntervalItem.addIconClickHandler(new IconClickHandler() {
- public void onIconClick(IconClickEvent event) {
- SC.say("N UNITS (where N is a positive integer and UNITS is \"seconds\", \"minutes\", \"hours\", \"days\", \"weeks\", \"months\", \"quarters\", or \"years\", e.g. \"30 seconds\" or \"6 weeks\")");
- }
- });
+ FormUtility.addContextualHelp(repeatIntervalItem,
+ "N UNITS (where N is a positive integer and UNITS is \"seconds\", \"minutes\", \"hours\", \"days\", \"weeks\", \"months\", \"quarters\", or \"years\", e.g. \"30 seconds\" or \"6 weeks\")");
// Configure validation.
RegExpValidator repeatIntervalValidator = new RegExpValidator("[1-9][0-9]*[ ]*(seconds|s|minutes|m|hours|h|days|d|weeks|w|months|M|quarters|q|years|y)");
@@ -572,15 +566,8 @@ public class JobTriggerEditor extends LocatableVLayout {
repeatDurationItem.setShowTitle(false);
repeatDurationItem.setVisible(false);
- // Configure context-sensitive help.
- helpIcon = new FormItemIcon();
- helpIcon.setSrc("[SKIN]/actions/help.png");
- repeatDurationItem.setIcons(helpIcon);
- repeatDurationItem.addIconClickHandler(new IconClickHandler() {
- public void onIconClick(IconClickEvent event) {
- SC.say("N UNITS (where N is a positive integer and UNITS is \"times\", \"seconds\", \"minutes\", \"hours\", \"days\", \"weeks\", \"months\", \"quarters\", or \"years\", e.g. \"30 seconds\" or \"5 repetitions\")");
- }
- });
+ FormUtility.addContextualHelp(repeatDurationItem,
+ "N UNITS (where N is a positive integer and UNITS is \"times\", \"seconds\", \"minutes\", \"hours\", \"days\", \"weeks\", \"months\", \"quarters\", or \"years\", e.g. \"30 seconds\" or \"5 repetitions\")");
// Configure validation.
RegExpValidator repeatDurationValidator = new RegExpValidator("[1-9][0-9]*[ ]*(times|repetitions|seconds|s|minutes|m|hours|h|days|d|weeks|w|months|M|quarters|q|years|y)");
@@ -646,15 +633,8 @@ public class JobTriggerEditor extends LocatableVLayout {
startDelayItem.setShowTitle(false);
startDelayItem.setVisible(false);
- // Configure context-sensitive help.
- FormItemIcon icon = new FormItemIcon();
- icon.setSrc("[SKIN]/actions/help.png");
- startDelayItem.setIcons(icon);
- startDelayItem.addIconClickHandler(new IconClickHandler() {
- public void onIconClick(IconClickEvent event) {
- SC.say("N UNITS (where N is a positive integer and UNITS is \"seconds\", \"minutes\", \"hours\", \"days\", \"weeks\", \"months\", \"quarters\", or \"years\", e.g. \"30 seconds\" or \"6 weeks\")");
- }
- });
+ FormUtility.addContextualHelp(startDelayItem,
+ "N UNITS (where N is a positive integer and UNITS is \"seconds\", \"minutes\", \"hours\", \"days\", \"weeks\", \"months\", \"quarters\", or \"years\", e.g. \"30 seconds\" or \"6 weeks\")");
// Configure validation.
RegExpValidator startDelayValidator = new RegExpValidator("[1-9][0-9]*([ ]+(seconds|minutes|hours|days|weeks|months|quarters|years)|(s|m|h|d|w|M|q|y))");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index bc27926..2195d35 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -51,6 +51,7 @@ import org.rhq.enterprise.gui.coregui.client.components.form.AbstractRecordEdito
import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm;
import org.rhq.enterprise.gui.coregui.client.components.trigger.JobTriggerEditor;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.FormUtility;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
@@ -145,11 +146,13 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
}
TextItem timeoutItem = new TextItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout (in seconds)");
+ FormUtility.addContextualHelp(timeoutItem, "a time duration in seconds; if specified, if the duration elapses before a scheduled operation execution has completed, the RHQ Server will timeout the operation and consider it to have failed; note, it is usually not possible to abort the underlying managed resource operation if it was initiated");
notesFields.add(timeoutItem);
TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes");
notesItem.setWidth(450);
- notesItem.setHeight(150);
+ notesItem.setHeight(120);
+ FormUtility.addContextualHelp(notesItem, "an optional description of this scheduled operation (e.g. \"nightly maintenance app server restart\")");
notesFields.add(notesItem);
this.notesForm.setFields(notesFields.toArray(new FormItem[notesFields.size()]));
@@ -236,7 +239,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
String operationName = getSelectedOperationName();
String value;
if (operationName == null) {
- value = "<i>Select an operation.</i>";
+ value = "<i>Select an operation to see its description.</i>";
} else {
value = this.operationNameToDescriptionMap.get(operationName);
}
@@ -247,7 +250,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
String operationName = getSelectedOperationName();
String value;
if (operationName == null) {
- value = "<i>Select an operation.</i>";
+ value = "<i>Select an operation to see its parameters.</i>";
} else {
ConfigurationDefinition parametersDefinition = this.operationNameToParametersDefinitionMap.get(operationName);
if (parametersDefinition == null || parametersDefinition.getPropertyDefinitions().isEmpty()) {
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 cca83f5..3105aab 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
@@ -203,7 +203,7 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
.view_tabs_common_schedule()), null);
this.operationsHistory = new SubTab(operationsTab.extendLocatorId("History"), new ViewName("History", MSG
.view_tabs_common_history()), null);
- operationsTab.registerSubTabs(this.operationsHistory, this.operationsSchedule);
+ operationsTab.registerSubTabs(this.operationsSchedule, this.operationsHistory);
tabs.add(operationsTab);
configurationTab = new TwoLevelTab(getTabSet().extendLocatorId("Configuration"), new ViewName("Configuration",
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
index 7603a45..188a892 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
@@ -23,6 +23,7 @@ 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.widgets.grid.ListGridRecord;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
@@ -38,6 +39,11 @@ import java.util.List;
*/
public class GroupOperationScheduleDataSource extends AbstractOperationScheduleDataSource<GroupOperationSchedule> {
+ public static abstract class Field extends AbstractOperationScheduleDataSource.Field {
+ public static final String HALT_ON_FAILURE = "haltOnFailure";
+ public static final String EXECUTION_ORDER = "executionOrder";
+ }
+
private ResourceGroupComposite groupComposite;
public GroupOperationScheduleDataSource(ResourceGroupComposite groupComposite) {
@@ -102,4 +108,24 @@ public class GroupOperationScheduleDataSource extends AbstractOperationScheduleD
});
}
+ @Override
+ public ListGridRecord copyValues(GroupOperationSchedule from) {
+ ListGridRecord record = super.copyValues(from);
+
+ record.setAttribute(Field.HALT_ON_FAILURE, from.getHaltOnFailure());
+ // TODO: set executionOrder field
+
+ return record;
+ }
+
+ @Override
+ public GroupOperationSchedule copyValues(Record from) {
+ GroupOperationSchedule groupOperationSchedule = super.copyValues(from);
+
+ groupOperationSchedule.setHaltOnFailure(from.getAttributeAsBoolean(Field.HALT_ON_FAILURE));
+ // TODO: set executionOrder field
+
+ return groupOperationSchedule;
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
index 59cb90c..8bb7f38 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDetailsView.java
@@ -29,6 +29,7 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
private ResourceGroupComposite groupComposite;
private ListGridRecord[] memberResourceRecords;
+ private DynamicForm executionModeForm;
public GroupOperationScheduleDetailsView(String locatorId, ResourceGroupComposite groupComposite, int scheduleId) {
super(locatorId, new GroupOperationScheduleDataSource(groupComposite),
@@ -67,7 +68,7 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
HTMLFlow hr = new HTMLFlow("<p/><hr/><p/>");
contentPane.addMember(hr);
- DynamicForm executionModeForm = new DynamicForm();
+ this.executionModeForm = new DynamicForm();
executionModeForm.setColWidths("250", "*");
RadioGroupItem executionModeItem = new RadioGroupItem("executionMode", "Member Resource Execution Order");
@@ -104,4 +105,12 @@ public class GroupOperationScheduleDetailsView extends AbstractOperationSchedule
return contentPane;
}
+
+ @Override
+ protected void save(DSRequest requestProperties) {
+ Boolean haltOnFailure = (Boolean) this.executionModeForm.getValue(GroupOperationScheduleDataSource.Field.HALT_ON_FAILURE);
+ getForm().setValue(GroupOperationScheduleDataSource.Field.HALT_ON_FAILURE, haltOnFailure);
+
+ super.save(requestProperties);
+ }
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
index 26e67a8..50455b4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/FormUtility.java
@@ -18,8 +18,12 @@
*/
package org.rhq.enterprise.gui.coregui.client.util;
+import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.FormItem;
+import com.smartgwt.client.widgets.form.fields.FormItemIcon;
+import com.smartgwt.client.widgets.form.fields.events.IconClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.IconClickHandler;
/**
* A collection of utility methods for working with SmartGWT {@link DynamicForm}s.
@@ -44,4 +48,15 @@ public class FormUtility {
}
}
+ public static void addContextualHelp(FormItem item, final String helpText) {
+ FormItemIcon helpIcon = new FormItemIcon();
+ helpIcon.setSrc("[SKIN]/actions/help.png");
+ item.setIcons(helpIcon);
+ item.addIconClickHandler(new IconClickHandler() {
+ public void onIconClick(IconClickEvent event) {
+ SC.say(helpText);
+ }
+ });
+ }
+
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index efe8cc4..1623dd1 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -582,6 +582,8 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
}
}
+ boolean haltOnFailure = jobDataMap.getBooleanValueFromString(GroupOperationJob.DATAMAP_BOOL_HALT_ON_FAILURE);
+
Integer entityId = getOperationScheduleEntityId(jobDetail);
GroupOperationSchedule sched = new GroupOperationSchedule();
@@ -595,10 +597,11 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
sched.setParameters(parameters);
sched.setExecutionOrder(executionOrder);
sched.setDescription(description);
- sched.setHaltOnFailure(jobDataMap.getBooleanValueFromString(GroupOperationJob.DATAMAP_BOOL_HALT_ON_FAILURE));
+ sched.setHaltOnFailure(haltOnFailure);
Trigger trigger = getTriggerOfJob(jobDetail);
JobTrigger jobTrigger = convertToJobTrigger(trigger);
sched.setJobTrigger(jobTrigger);
+ sched.setNextFireTime(trigger.getNextFireTime());
return sched;
}
commit 09b2f640e9eda9b96ac37c1d44891c18da5e48e9
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Wed Jan 26 16:45:47 2011 -0500
partial impl of resource and group op history delete, as well as group op schedule/unschedule
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java
index 42cb182..6160158 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java
@@ -35,7 +35,7 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message.Option;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
/**
- * Provides convienence methods that loads permissions and notifies you via a callback when done.
+ * Provides convenience methods that loads permissions and notifies you via a callback when done.
* If an error occurs, the error will be logged in the message center.
* This stores the last error received, in case a caller wants more information on failures.
*
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java
index 7a45f5a..dc3b8f5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/table/SubjectRecordCellFormatter.java
@@ -5,11 +5,9 @@ import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.grid.CellFormatter;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.auth.Subject;
-import org.rhq.enterprise.gui.coregui.client.ImageManager;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource;
/**
- * Formats a {@link org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource.SubjectRecord}
+ * Formats a {@link org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDataSource.SubjectRecord}
* (the SmartGWT {@link Record} representation of a {@link Subject}).
*
* @author Ian Springer
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 7cfb393..071bff3 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
@@ -686,6 +686,10 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
}
protected void deleteSelectedRecords() {
+ deleteSelectedRecords(null);
+ }
+
+ protected void deleteSelectedRecords(DSRequest requestProperties) {
ListGrid listGrid = getListGrid();
final int selectedRecordCount = listGrid.getSelection().length;
final List<String> deletedRecordNames = new ArrayList<String>(selectedRecordCount);
@@ -704,11 +708,12 @@ public class Table<DS extends RPCDataSource> extends LocatableHLayout implements
.widget_recordEditor_info_recordsDeletedDetailed(String.valueOf(deletedRecordNames.size()),
getDataTypeNamePlural(), deletedRecordNames.toString()));
CoreGUI.getMessageCenter().notify(message);
+ refresh();
}
}
// TODO: Print error messages for failures or partial failures.
}
- }, null);
+ }, requestProperties);
}
protected String getDataTypeName() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java
index a23a8d1..194c921 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java
@@ -46,6 +46,8 @@ public interface OperationGWTService extends RemoteService {
PageList<GroupOperationHistory> findGroupOperationHistoriesByCriteria(GroupOperationHistoryCriteria criteria)
throws RuntimeException;
+ void deleteOperationHistory(int operationHistoryId, boolean deleteEvenIfInProgress) throws RuntimeException;
+
List<DisambiguationReport<ResourceOperationLastCompletedComposite>> findRecentCompletedOperations(int resourceId,
PageControl pageControl) throws RuntimeException;
@@ -57,8 +59,12 @@ public interface OperationGWTService extends RemoteService {
int scheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule) throws RuntimeException;
+ int scheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException;
+
void unscheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule) throws RuntimeException;
+ void unscheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException;
+
void scheduleResourceOperation(int resourceId, String operationName, Configuration parameters, String description,
int timeout, String cronString) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java
new file mode 100644
index 0000000..5ddebb5
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryDataSource.java
@@ -0,0 +1,134 @@
+/*
+ * 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.common.detail.operation.history;
+
+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.DataSourceTextField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import org.rhq.core.domain.operation.OperationHistory;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Greg Hinkle
+ * @author Ian Springer
+ */
+public abstract class AbstractOperationHistoryDataSource<T extends OperationHistory> extends RPCDataSource<T> {
+
+ private T currentOperationHistory;
+
+ public static abstract class Field {
+ public static final String ID = "id";
+ public static final String OPERATION_NAME = "operationName";
+ public static final String RESOURCE = "resource";
+ public static final String STATUS = "status";
+ public static final String STARTED_TIME = "startedTime";
+ public static final String CREATED_TIME = "createdTime";
+ public static final String DURATION = "duration";
+ public static final String SUBJECT = "subject";
+ public static final String OPERATION_DEFINITION = "operationDefinition";
+ public static final String ERROR_MESSAGE = "errorMessage";
+ public static final String PARAMETERS = "parameters";
+ }
+
+ protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService();
+
+ public AbstractOperationHistoryDataSource() {
+ List<DataSourceField> fields = addDataSourceFields();
+ addFields(fields);
+ }
+
+ @Override
+ protected void executeRemove(Record recordToRemove, DSRequest request, DSResponse response) {
+ final OperationHistory operationHistoryToRemove = copyValues(recordToRemove);
+ Boolean forceValue = request.getAttributeAsBoolean("force");
+ boolean force = ((forceValue != null) && forceValue);
+ operationService.deleteOperationHistory(operationHistoryToRemove.getId(), force, new AsyncCallback<Void>() {
+ public void onSuccess(Void result) {
+ return;
+ }
+
+ public void onFailure(Throwable caught) {
+ throw new RuntimeException("Failed to delete " + operationHistoryToRemove + ".", caught);
+ }
+ });
+ }
+
+ @Override
+ protected List<DataSourceField> addDataSourceFields() {
+ List<DataSourceField> fields = super.addDataSourceFields();
+
+ /*
+ DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID);
+ idField.setPrimaryKey(true);
+ fields.add(idField);
+ */
+
+ DataSourceTextField nameField = new DataSourceTextField(Field.OPERATION_NAME);
+ fields.add(nameField);
+
+ /*
+ DataSourceTextField resourceField = new DataSourceTextField(Field.RESOURCE);
+ fields.add(resourceField);
+
+ DataSourceTextField statusField = new DataSourceTextField(Field.STATUS);
+ fields.add(statusField);
+
+ DataSourceTextField startedField = new DataSourceTextField(Field.STARTED_TIME);
+ startedField.setType(FieldType.DATETIME);
+ fields.add(startedField);
+ */
+
+ return fields;
+ }
+
+ @Override
+ public T copyValues(Record from) {
+ return this.currentOperationHistory;
+ }
+
+ @Override
+ public ListGridRecord copyValues(T from) {
+ this.currentOperationHistory = from;
+
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute(Field.ID, from.getId());
+ record.setAttribute(Field.CREATED_TIME, from.getCreatedTime());
+ record.setAttribute(Field.STARTED_TIME, new Date(from.getStartedTime()));
+ record.setAttribute(Field.DURATION, from.getDuration());
+ record.setAttribute(Field.SUBJECT, from.getSubjectName());
+ record.setAttribute(Field.OPERATION_DEFINITION, from.getOperationDefinition());
+ record.setAttribute(Field.OPERATION_NAME, from.getOperationDefinition().getDisplayName());
+ record.setAttribute(Field.ERROR_MESSAGE, from.getErrorMessage());
+ record.setAttribute(Field.STATUS, from.getStatus().name());
+ record.setAttribute(Field.PARAMETERS, from.getParameters());
+
+ return record;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java
index bc22921..a010a23 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/AbstractOperationHistoryListView.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.List;
import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DateDisplayFormat;
@@ -40,6 +41,7 @@ import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.enterprise.gui.coregui.client.ImageManager;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
import org.rhq.enterprise.gui.coregui.client.components.table.TableSection;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHTMLPane;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
@@ -48,48 +50,77 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableWindow;
* @author Greg Hinkle
* @author John Mazzitelli
*/
-public abstract class AbstractOperationHistoryListView extends TableSection<OperationHistoryDataSource> {
+public abstract class AbstractOperationHistoryListView extends TableSection<AbstractOperationHistoryDataSource> {
private static final String HEADER_ICON = "subsystems/control/Operation_24.png";
- public AbstractOperationHistoryListView(String locatorId, OperationHistoryDataSource dataSource, String title) {
+ public AbstractOperationHistoryListView(String locatorId, AbstractOperationHistoryDataSource dataSource, String title) {
super(locatorId, title);
setDataSource(dataSource);
setHeaderIcon(HEADER_ICON);
}
- public AbstractOperationHistoryListView(String locatorId, OperationHistoryDataSource dataSource, String title,
+ public AbstractOperationHistoryListView(String locatorId, AbstractOperationHistoryDataSource dataSource, String title,
Criteria criteria) {
super(locatorId, title, criteria);
setDataSource(dataSource);
}
+ protected abstract boolean hasControlPermission();
+
@Override
protected void configureTable() {
super.configureTable();
List<ListGridField> fields = createFields();
setListGridFields(fields.toArray(new ListGridField[fields.size()]));
+
+ addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), getDeleteConfirmMessage(),
+ new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ int count = selection.length;
+ return (count >= 1 && hasControlPermission());
+ }
+
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ deleteSelectedRecords();
+ }
+ });
+
+ // TODO: i18n
+ addTableAction(extendLocatorId("ForceDelete"), "Force Delete", getDeleteConfirmMessage(),
+ new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ int count = selection.length;
+ return (count >= 1 && hasControlPermission());
+ }
+
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ DSRequest requestProperties = new DSRequest();
+ requestProperties.setAttribute("force", true);
+ deleteSelectedRecords(requestProperties);
+ }
+ });
}
protected List<ListGridField> createFields() {
List<ListGridField> fields = new ArrayList<ListGridField>();
- ListGridField idField = new ListGridField(OperationHistoryDataSource.Field.ID, MSG.common_title_id());
+ ListGridField idField = new ListGridField(AbstractOperationHistoryDataSource.Field.ID, MSG.common_title_id());
idField.setWidth(38);
fields.add(idField);
- ListGridField opNameField = new ListGridField(OperationHistoryDataSource.Field.OPERATION_NAME,
+ ListGridField opNameField = new ListGridField(AbstractOperationHistoryDataSource.Field.OPERATION_NAME,
MSG.dataSource_operationHistory_operationName());
opNameField.setWidth("34%");
fields.add(opNameField);
- ListGridField subjectField = new ListGridField(OperationHistoryDataSource.Field.SUBJECT,
+ ListGridField subjectField = new ListGridField(AbstractOperationHistoryDataSource.Field.SUBJECT,
MSG.common_title_user());
subjectField.setWidth("33%");
fields.add(subjectField);
- ListGridField statusField = new ListGridField(OperationHistoryDataSource.Field.STATUS,
+ ListGridField statusField = new ListGridField(AbstractOperationHistoryDataSource.Field.STATUS,
MSG.common_title_status());
statusField.setAlign(Alignment.CENTER);
statusField.setCellAlign(Alignment.CENTER);
@@ -97,7 +128,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper
statusField.setHoverCustomizer(new HoverCustomizer() {
@Override
public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
- String statusStr = record.getAttribute(OperationHistoryDataSource.Field.STATUS);
+ String statusStr = record.getAttribute(AbstractOperationHistoryDataSource.Field.STATUS);
OperationRequestStatus status = OperationRequestStatus.valueOf(statusStr);
switch (status) {
case SUCCESS: {
@@ -127,7 +158,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper
@Override
public void onRecordClick(RecordClickEvent event) {
Record record = event.getRecord();
- String statusStr = record.getAttribute(OperationHistoryDataSource.Field.STATUS);
+ String statusStr = record.getAttribute(AbstractOperationHistoryDataSource.Field.STATUS);
OperationRequestStatus status = OperationRequestStatus.valueOf(statusStr);
if (status == OperationRequestStatus.FAILURE) {
final Window winModal = new LocatableWindow(AbstractOperationHistoryListView.this
@@ -155,7 +186,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper
htmlPane.setMargin(10);
htmlPane.setDefaultWidth(500);
htmlPane.setDefaultHeight(400);
- String errorMsg = record.getAttribute(OperationHistoryDataSource.Field.ERROR_MESSAGE);
+ String errorMsg = record.getAttribute(AbstractOperationHistoryDataSource.Field.ERROR_MESSAGE);
if (errorMsg == null) {
errorMsg = MSG.common_status_failed();
}
@@ -168,7 +199,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper
statusField.setWidth(44);
fields.add(statusField);
- ListGridField startedTimeField = new ListGridField(OperationHistoryDataSource.Field.STARTED_TIME,
+ ListGridField startedTimeField = new ListGridField(AbstractOperationHistoryDataSource.Field.STARTED_TIME,
MSG.dataSource_operationHistory_startedTime());
startedTimeField.setType(ListGridFieldType.DATE);
startedTimeField.setDateFormatter(DateDisplayFormat.TOLOCALESTRING);
@@ -182,7 +213,7 @@ public abstract class AbstractOperationHistoryListView extends TableSection<Oper
@Override
protected String getDetailsLinkColumnName() {
- return OperationHistoryDataSource.Field.OPERATION_NAME;
+ return AbstractOperationHistoryDataSource.Field.OPERATION_NAME;
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java
deleted file mode 100644
index c320d10..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/OperationHistoryDataSource.java
+++ /dev/null
@@ -1,109 +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.common.detail.operation.history;
-
-import com.smartgwt.client.data.DataSourceField;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.data.fields.DataSourceTextField;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-import org.rhq.core.domain.operation.OperationHistory;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * @author Greg Hinkle
- */
-public abstract class OperationHistoryDataSource<T extends OperationHistory> extends RPCDataSource<T> {
-
- public static abstract class Field {
- public static final String ID = "id";
- public static final String OPERATION_NAME = "operationName";
- public static final String RESOURCE = "resource";
- public static final String STATUS = "status";
- public static final String STARTED_TIME = "startedTime";
- public static final String CREATED_TIME = "createdTime";
- public static final String DURATION = "duration";
- public static final String SUBJECT = "subject";
- public static final String OPERATION_DEFINITION = "operationDefinition";
- public static final String ERROR_MESSAGE = "errorMessage";
- public static final String PARAMETERS = "parameters";
- }
-
- protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService();
-
- public OperationHistoryDataSource() {
- List<DataSourceField> fields = addDataSourceFields();
- addFields(fields);
- }
-
- @Override
- protected List<DataSourceField> addDataSourceFields() {
- List<DataSourceField> fields = super.addDataSourceFields();
-
- /*
- DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID);
- idField.setPrimaryKey(true);
- fields.add(idField);
- */
-
- DataSourceTextField nameField = new DataSourceTextField(Field.OPERATION_NAME);
- fields.add(nameField);
-
- /*
- DataSourceTextField resourceField = new DataSourceTextField(Field.RESOURCE);
- fields.add(resourceField);
-
- DataSourceTextField statusField = new DataSourceTextField(Field.STATUS);
- fields.add(statusField);
-
- DataSourceTextField startedField = new DataSourceTextField(Field.STARTED_TIME);
- startedField.setType(FieldType.DATETIME);
- fields.add(startedField);
- */
-
- return fields;
- }
-
- @Override
- public T copyValues(Record from) {
- throw new UnsupportedOperationException("OperationHistory is read only.");
- }
-
- @Override
- public ListGridRecord copyValues(T from) {
- ListGridRecord record = new ListGridRecord();
- record.setAttribute(Field.ID, from.getId());
- record.setAttribute(Field.CREATED_TIME, from.getCreatedTime());
- record.setAttribute(Field.STARTED_TIME, new Date(from.getStartedTime()));
- record.setAttribute(Field.DURATION, from.getDuration());
- record.setAttribute(Field.SUBJECT, from.getSubjectName());
- record.setAttribute(Field.OPERATION_DEFINITION, from.getOperationDefinition());
- record.setAttribute(Field.OPERATION_NAME, from.getOperationDefinition().getDisplayName());
- record.setAttribute(Field.ERROR_MESSAGE, from.getErrorMessage());
- record.setAttribute(Field.STATUS, from.getStatus().name());
- record.setAttribute(Field.PARAMETERS, from.getParameters());
-
- return record;
- }
-
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java
index 9d5c382..09fc8d2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java
@@ -98,11 +98,11 @@ public class ResourceOperationHistoryDetailsView extends LocatableVLayout implem
OperationRequestStatus status = operationHistory.getStatus();
- StaticTextItem operationItem = new StaticTextItem(OperationHistoryDataSource.Field.OPERATION_NAME, MSG
+ StaticTextItem operationItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.OPERATION_NAME, MSG
.view_operationHistoryDetails_operation());
operationItem.setValue(definition.getDisplayName());
- StaticTextItem submittedItem = new StaticTextItem(OperationHistoryDataSource.Field.STARTED_TIME, MSG
+ StaticTextItem submittedItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.STARTED_TIME, MSG
.view_operationHistoryDetails_dateSubmitted());
submittedItem.setValue(new Date(operationHistory.getStartedTime()));
@@ -115,13 +115,13 @@ public class ResourceOperationHistoryDetailsView extends LocatableVLayout implem
completedItem.setValue(new Date(operationHistory.getStartedTime() + operationHistory.getDuration()));
}
- StaticTextItem requesterItem = new StaticTextItem(OperationHistoryDataSource.Field.SUBJECT, MSG
+ StaticTextItem requesterItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.SUBJECT, MSG
.view_operationHistoryDetails_requestor());
requesterItem.setValue(operationHistory.getSubjectName());
LinkItem errorLinkItem = null;
- StaticTextItem statusItem = new StaticTextItem(OperationHistoryDataSource.Field.STATUS, MSG
+ StaticTextItem statusItem = new StaticTextItem(AbstractOperationHistoryDataSource.Field.STATUS, MSG
.view_operationHistoryDetails_status());
String icon = ImageManager.getFullImagePath(ImageManager.getOperationResultsIcon(status));
statusItem.setValue("<img src='" + icon + "'/>");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
new file mode 100644
index 0000000..20b84fa
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDataSource.java
@@ -0,0 +1,256 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.common.detail.operation.schedule;
+
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Set;
+
+import com.smartgwt.client.data.DataSourceField;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.data.fields.DataSourceDateTimeField;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.types.FieldType;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.common.JobTrigger;
+import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.operation.OperationDefinition;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
+import org.rhq.core.domain.resource.ResourceType;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author Ian Springer
+ */
+public abstract class AbstractOperationScheduleDataSource<T extends OperationSchedule> extends RPCDataSource<T> {
+
+ public static abstract class Field {
+ public static final String ID = "id";
+ public static final String JOB_NAME = "jobName";
+ public static final String JOB_GROUP = "jobGroup";
+ public static final String OPERATION_NAME = "operationName";
+ public static final String OPERATION_DISPLAY_NAME = "operationDisplayName";
+ public static final String PARAMETERS = "parameters";
+ public static final String SUBJECT = "subject";
+ public static final String DESCRIPTION = "description";
+ public static final String NEXT_FIRE_TIME = "nextFireTime";
+ public static final String TIMEOUT = "timeout";
+
+ // job trigger fields
+ public static final String START_TIME = "startTime";
+ public static final String REPEAT_INTERVAL = "repeatInterval";
+ public static final String REPEAT_COUNT = "repeatCount";
+ public static final String END_TIME = "endTime";
+ public static final String CRON_EXPRESSION = "cronExpression";
+ }
+
+ protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService();
+
+ private ResourceType resourceType;
+
+ public AbstractOperationScheduleDataSource(ResourceType resourceType) {
+ super();
+ this.resourceType = resourceType;
+ List<DataSourceField> fields = addDataSourceFields();
+ addFields(fields);
+ }
+
+ // TODO: i18n
+ @Override
+ protected List<DataSourceField> addDataSourceFields() {
+ List<DataSourceField> fields = super.addDataSourceFields();
+
+ DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, "ID");
+ idField.setPrimaryKey(true);
+ idField.setCanEdit(false);
+ fields.add(idField);
+
+ DataSourceTextField operationNameField = createTextField(Field.OPERATION_NAME, "Operation Name", null, 100,
+ true);
+ fields.add(operationNameField);
+
+ DataSourceTextField operationDisplayNameField = createTextField(Field.OPERATION_DISPLAY_NAME, "Operation", null,
+ 100, true);
+ fields.add(operationDisplayNameField);
+
+ Set<OperationDefinition> operationDefinitions = this.resourceType.getOperationDefinitions();
+ LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
+ for (OperationDefinition operationDefinition : operationDefinitions) {
+ valueMap.put(operationDefinition.getName(), operationDefinition.getDisplayName());
+ }
+ operationNameField.setValueMap(valueMap);
+
+ DataSourceField subjectField = new DataSourceField(Field.SUBJECT, FieldType.ANY, "Owner");
+ subjectField.setCanEdit(false);
+ fields.add(subjectField);
+
+ DataSourceTextField descriptionField = createTextField(Field.DESCRIPTION, "Notes", null, 100, false);
+ fields.add(descriptionField);
+
+ DataSourceDateTimeField nextFireTimeField = new DataSourceDateTimeField(Field.NEXT_FIRE_TIME,
+ "Next Scheduled Execution");
+ nextFireTimeField.setCanEdit(false);
+ fields.add(nextFireTimeField);
+
+ DataSourceIntegerField timeoutField = createIntegerField(Field.TIMEOUT, "Timeout (in seconds)", 30, null, false);
+ fields.add(timeoutField);
+
+ return fields;
+ }
+
+ protected abstract T createOperationSchedule();
+
+ @Override
+ public T copyValues(Record from) {
+ T to = createOperationSchedule();
+
+ to.setId(from.getAttributeAsInt(Field.ID));
+ to.setJobName(from.getAttribute(Field.JOB_NAME));
+ to.setJobGroup(from.getAttribute(Field.JOB_GROUP));
+ SubjectRecord subjectRecord = (SubjectRecord) from.getAttributeAsRecord(Field.SUBJECT);
+ to.setSubject(subjectRecord.toSubject());
+ Configuration parameters = (Configuration) from.getAttributeAsObject(Field.PARAMETERS);
+ to.setParameters(parameters);
+ to.setOperationName(from.getAttribute(Field.OPERATION_NAME));
+ to.setOperationDisplayName(from.getAttribute(Field.OPERATION_DISPLAY_NAME));
+ to.setDescription(from.getAttribute(Field.DESCRIPTION));
+ to.setNextFireTime(from.getAttributeAsDate(Field.NEXT_FIRE_TIME));
+ if (parameters != null) {
+ parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, from.getAttributeAsInt(Field.TIMEOUT)));
+ }
+
+ to.setJobTrigger(createJobTrigger(from.getAttributeAsRecord("jobTrigger")));
+
+ return to;
+ }
+
+ @Override
+ public ListGridRecord copyValues(T from) {
+ ListGridRecord to = new ListGridRecord();
+
+ to.setAttribute(Field.ID, from.getId());
+ to.setAttribute(Field.JOB_NAME, from.getJobName());
+ to.setAttribute(Field.JOB_GROUP, from.getJobGroup());
+ SubjectRecord subjectRecord = new SubjectRecord(from.getSubject());
+ to.setAttribute(Field.SUBJECT, subjectRecord);
+ Configuration parameters = from.getParameters();
+ to.setAttribute(Field.PARAMETERS, parameters);
+ to.setAttribute(Field.OPERATION_NAME, from.getOperationName());
+ to.setAttribute(Field.OPERATION_DISPLAY_NAME, from.getOperationDisplayName());
+ to.setAttribute(Field.DESCRIPTION, from.getDescription());
+ to.setAttribute(Field.NEXT_FIRE_TIME, from.getNextFireTime());
+ to.setAttribute(Field.TIMEOUT, (parameters != null) ?
+ parameters.getSimpleValue(OperationDefinition.TIMEOUT_PARAM_NAME, null) : null);
+
+ JobTrigger jobTrigger = from.getJobTrigger();
+ Record jobTriggerRecord = new ListGridRecord();
+ jobTriggerRecord.setAttribute(Field.START_TIME, jobTrigger.getStartDate());
+ jobTriggerRecord.setAttribute(Field.REPEAT_INTERVAL, jobTrigger.getRepeatInterval());
+ jobTriggerRecord.setAttribute(Field.REPEAT_COUNT, jobTrigger.getRepeatCount());
+ jobTriggerRecord.setAttribute(Field.END_TIME, jobTrigger.getEndDate());
+ jobTriggerRecord.setAttribute(Field.CRON_EXPRESSION, jobTrigger.getCronExpression());
+ to.setAttribute("jobTrigger", jobTriggerRecord);
+
+ return to;
+ }
+
+ public JobTrigger createJobTrigger(Record jobTriggerRecord) {
+ JobTrigger jobTrigger;
+
+ String cronExpression = jobTriggerRecord.getAttribute(Field.CRON_EXPRESSION);
+ if (cronExpression != null) {
+ jobTrigger = JobTrigger.createCronTrigger(cronExpression);
+ } else {
+ // calendar mode
+ Date startTime = jobTriggerRecord.getAttributeAsDate(Field.START_TIME);
+ Long repeatInterval = (Long)jobTriggerRecord.getAttributeAsObject(Field.REPEAT_INTERVAL);
+ Integer repeatCount = jobTriggerRecord.getAttributeAsInt(Field.REPEAT_COUNT);
+ Date endTime = jobTriggerRecord.getAttributeAsDate(Field.END_TIME);
+
+ if (startTime != null) {
+ // LATER
+
+ if (repeatInterval != null) {
+ // LATER AND REPEAT
+
+ if (repeatCount != null) {
+ jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, repeatCount);
+ } else {
+ jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, endTime);
+ }
+ } else {
+ // LATER ONCE
+
+ jobTrigger = JobTrigger.createLaterTrigger(startTime);
+ }
+ } else {
+ // NOW
+ if (repeatInterval != null) {
+ // NOW AND REPEAT
+
+ if (repeatCount != null) {
+ jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, repeatCount);
+ } else {
+ jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, endTime);
+ }
+ } else {
+ // NOW ONCE
+
+ jobTrigger = JobTrigger.createNowTrigger();
+ }
+ }
+ }
+
+ return jobTrigger;
+ }
+
+ public static class SubjectRecord extends ListGridRecord {
+ static final String FIELD_ID = "id";
+ static final String FIELD_NAME = "name";
+
+ public SubjectRecord(Subject subject) {
+ setAttribute(FIELD_ID, subject.getId());
+ setAttribute(FIELD_NAME, subject.getName());
+ }
+
+ public int getId() {
+ return getAttributeAsInt(FIELD_ID);
+ }
+
+ public String getName() {
+ return getAttribute(FIELD_NAME);
+ }
+
+ public Subject toSubject() {
+ Subject subject = new Subject();
+ subject.setId(getId());
+ subject.setName(getName());
+ return subject;
+ }
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
index db32a81..bc27926 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleDetailsView.java
@@ -72,7 +72,7 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
private Configuration parameters;
private EnhancedDynamicForm notesForm;
- public AbstractOperationScheduleDetailsView(String locatorId, OperationScheduleDataSource dataSource,
+ public AbstractOperationScheduleDetailsView(String locatorId, AbstractOperationScheduleDataSource dataSource,
ResourceType resourceType, int scheduleId) {
super(locatorId, dataSource, scheduleId, "Scheduled Operation", null);
@@ -140,11 +140,11 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
List<FormItem> notesFields = new ArrayList<FormItem>();
if (!isNewRecord()) {
- StaticTextItem nextFireTimeItem = new StaticTextItem(OperationScheduleDataSource.Field.NEXT_FIRE_TIME);
+ StaticTextItem nextFireTimeItem = new StaticTextItem(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME);
notesFields.add(nextFireTimeItem);
}
- TextItem timeoutItem = new TextItem(OperationScheduleDataSource.Field.TIMEOUT, "Timeout (in seconds)");
+ TextItem timeoutItem = new TextItem(AbstractOperationScheduleDataSource.Field.TIMEOUT, "Timeout (in seconds)");
notesFields.add(timeoutItem);
TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes");
@@ -175,8 +175,8 @@ public abstract class AbstractOperationScheduleDetailsView extends AbstractRecor
protected Record createNewRecord() {
Record record = super.createNewRecord();
Subject sessionSubject = UserSessionManager.getSessionSubject();
- OperationScheduleDataSource.SubjectRecord subjectRecord =
- new OperationScheduleDataSource.SubjectRecord(sessionSubject);
+ AbstractOperationScheduleDataSource.SubjectRecord subjectRecord =
+ new AbstractOperationScheduleDataSource.SubjectRecord(sessionSubject);
record.setAttribute(ResourceOperationScheduleDataSource.Field.SUBJECT, subjectRecord);
return record;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
new file mode 100644
index 0000000..3819b4a
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/AbstractOperationScheduleListView.java
@@ -0,0 +1,88 @@
+/*
+ * RHQ Management Platform
+ * Copyright 2010, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * 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.common.detail.operation.schedule;
+
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.enterprise.gui.coregui.client.components.table.SubjectRecordCellFormatter;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
+import org.rhq.enterprise.gui.coregui.client.components.table.TableSection;
+
+/**
+ * @author Ian Springer
+ */
+public abstract class AbstractOperationScheduleListView extends TableSection<AbstractOperationScheduleDataSource> {
+
+ public AbstractOperationScheduleListView(String locatorId, AbstractOperationScheduleDataSource dataSource, String title) {
+ super(locatorId, title);
+
+ setDataSource(dataSource);
+ }
+
+ protected abstract boolean hasControlPermission();
+
+ @Override
+ protected void configureTable() {
+ super.configureTable();
+
+ ListGridField operationField = new ListGridField(AbstractOperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME, 180);
+
+ ListGridField subjectField = new ListGridField(AbstractOperationScheduleDataSource.Field.SUBJECT, 110);
+ subjectField.setCellFormatter(new SubjectRecordCellFormatter());
+
+ //ListGridField jobTriggerField = new ListGridField(OperationScheduleDataSource.Field.JOB_TRIGGER, 300);
+
+ ListGridField nextFireTimeField = new ListGridField(AbstractOperationScheduleDataSource.Field.NEXT_FIRE_TIME,
+ "Next Scheduled Execution", 190);
+
+ ListGridField descriptionField = new ListGridField(AbstractOperationScheduleDataSource.Field.DESCRIPTION);
+
+ setListGridFields(operationField, subjectField, nextFireTimeField, descriptionField);
+
+ addTableAction(extendLocatorId("New"), MSG.common_button_new(), new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ return hasControlPermission();
+ }
+
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ newDetails();
+ }
+ });
+
+ addTableAction(extendLocatorId("Unschedule"), MSG.common_button_delete(), getDeleteConfirmMessage(),
+ new TableAction() {
+ public boolean isEnabled(ListGridRecord[] selection) {
+ int count = selection.length;
+ return ((count >= 1) && hasControlPermission());
+ }
+
+ public void executeAction(ListGridRecord[] selection, Object actionValue) {
+ deleteSelectedRecords();
+ }
+ });
+ }
+
+ @Override
+ protected String getDetailsLinkColumnName() {
+ return AbstractOperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME;
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java
deleted file mode 100644
index 3813b98..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleDataSource.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.common.detail.operation.schedule;
-
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Set;
-
-import com.smartgwt.client.data.DataSourceField;
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.data.fields.DataSourceDateTimeField;
-import com.smartgwt.client.data.fields.DataSourceIntegerField;
-import com.smartgwt.client.data.fields.DataSourceTextField;
-import com.smartgwt.client.types.FieldType;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-
-import org.rhq.core.domain.auth.Subject;
-import org.rhq.core.domain.common.JobTrigger;
-import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.operation.OperationDefinition;
-import org.rhq.core.domain.operation.bean.OperationSchedule;
-import org.rhq.core.domain.resource.ResourceType;
-import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.gwt.OperationGWTServiceAsync;
-import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
-
-/**
- * @author Ian Springer
- */
-public abstract class OperationScheduleDataSource<T extends OperationSchedule> extends RPCDataSource<T> {
-
- public static abstract class Field {
- public static final String ID = "id";
- public static final String JOB_NAME = "jobName";
- public static final String JOB_GROUP = "jobGroup";
- public static final String OPERATION_NAME = "operationName";
- public static final String OPERATION_DISPLAY_NAME = "operationDisplayName";
- public static final String PARAMETERS = "parameters";
- public static final String SUBJECT = "subject";
- public static final String DESCRIPTION = "description";
- public static final String NEXT_FIRE_TIME = "nextFireTime";
- public static final String TIMEOUT = "timeout";
-
- // job trigger fields
- public static final String START_TIME = "startTime";
- public static final String REPEAT_INTERVAL = "repeatInterval";
- public static final String REPEAT_COUNT = "repeatCount";
- public static final String END_TIME = "endTime";
- public static final String CRON_EXPRESSION = "cronExpression";
- }
-
- protected OperationGWTServiceAsync operationService = GWTServiceLookup.getOperationService();
-
- private ResourceType resourceType;
-
- public OperationScheduleDataSource(ResourceType resourceType) {
- super();
- this.resourceType = resourceType;
- List<DataSourceField> fields = addDataSourceFields();
- addFields(fields);
- }
-
- // TODO: i18n
- @Override
- protected List<DataSourceField> addDataSourceFields() {
- List<DataSourceField> fields = super.addDataSourceFields();
-
- DataSourceIntegerField idField = new DataSourceIntegerField(Field.ID, "ID");
- idField.setPrimaryKey(true);
- idField.setCanEdit(false);
- fields.add(idField);
-
- DataSourceTextField operationNameField = createTextField(Field.OPERATION_NAME, "Operation Name", null, 100,
- true);
- fields.add(operationNameField);
-
- DataSourceTextField operationDisplayNameField = createTextField(Field.OPERATION_DISPLAY_NAME, "Operation", null,
- 100, true);
- fields.add(operationDisplayNameField);
-
- Set<OperationDefinition> operationDefinitions = this.resourceType.getOperationDefinitions();
- LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
- for (OperationDefinition operationDefinition : operationDefinitions) {
- valueMap.put(operationDefinition.getName(), operationDefinition.getDisplayName());
- }
- operationNameField.setValueMap(valueMap);
-
- DataSourceField subjectField = new DataSourceField(Field.SUBJECT, FieldType.ANY, "Owner");
- subjectField.setCanEdit(false);
- fields.add(subjectField);
-
- DataSourceTextField descriptionField = createTextField(Field.DESCRIPTION, "Notes", null, 100, false);
- fields.add(descriptionField);
-
- DataSourceDateTimeField nextFireTimeField = new DataSourceDateTimeField(Field.NEXT_FIRE_TIME,
- "Next Scheduled Execution");
- nextFireTimeField.setCanEdit(false);
- fields.add(nextFireTimeField);
-
- DataSourceIntegerField timeoutField = createIntegerField(Field.TIMEOUT, "Timeout (in seconds)", 30, null, false);
- fields.add(timeoutField);
-
- return fields;
- }
-
- protected abstract T createOperationSchedule();
-
- @Override
- public T copyValues(Record from) {
- T to = createOperationSchedule();
-
- to.setId(from.getAttributeAsInt(Field.ID));
- to.setJobName(from.getAttribute(Field.JOB_NAME));
- to.setJobGroup(from.getAttribute(Field.JOB_GROUP));
- SubjectRecord subjectRecord = (SubjectRecord) from.getAttributeAsRecord(Field.SUBJECT);
- to.setSubject(subjectRecord.toSubject());
- Configuration parameters = (Configuration) from.getAttributeAsObject(Field.PARAMETERS);
- to.setParameters(parameters);
- to.setOperationName(from.getAttribute(Field.OPERATION_NAME));
- to.setOperationDisplayName(from.getAttribute(Field.OPERATION_DISPLAY_NAME));
- to.setDescription(from.getAttribute(Field.DESCRIPTION));
- to.setNextFireTime(from.getAttributeAsDate(Field.NEXT_FIRE_TIME));
- if (parameters != null) {
- parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, from.getAttributeAsInt(Field.TIMEOUT)));
- }
-
- to.setJobTrigger(createJobTrigger(from.getAttributeAsRecord("jobTrigger")));
-
- return to;
- }
-
- @Override
- public ListGridRecord copyValues(T from) {
- ListGridRecord to = new ListGridRecord();
-
- to.setAttribute(Field.ID, from.getId());
- to.setAttribute(Field.JOB_NAME, from.getJobName());
- to.setAttribute(Field.JOB_GROUP, from.getJobGroup());
- SubjectRecord subjectRecord = new SubjectRecord(from.getSubject());
- to.setAttribute(Field.SUBJECT, subjectRecord);
- to.setAttribute(Field.PARAMETERS, from.getParameters());
- to.setAttribute(Field.OPERATION_NAME, from.getOperationName());
- to.setAttribute(Field.OPERATION_DISPLAY_NAME, from.getOperationDisplayName());
- to.setAttribute(Field.DESCRIPTION, from.getDescription());
- to.setAttribute(Field.NEXT_FIRE_TIME, from.getNextFireTime());
- to.setAttribute(Field.TIMEOUT, from.getParameters().getSimpleValue(OperationDefinition.TIMEOUT_PARAM_NAME, null));
-
- JobTrigger jobTrigger = from.getJobTrigger();
- Record jobTriggerRecord = new ListGridRecord();
- jobTriggerRecord.setAttribute(Field.START_TIME, jobTrigger.getStartDate());
- jobTriggerRecord.setAttribute(Field.REPEAT_INTERVAL, jobTrigger.getRepeatInterval());
- jobTriggerRecord.setAttribute(Field.REPEAT_COUNT, jobTrigger.getRepeatCount());
- jobTriggerRecord.setAttribute(Field.END_TIME, jobTrigger.getEndDate());
- jobTriggerRecord.setAttribute(Field.CRON_EXPRESSION, jobTrigger.getCronExpression());
- to.setAttribute("jobTrigger", jobTriggerRecord);
-
- return to;
- }
-
- public JobTrigger createJobTrigger(Record jobTriggerRecord) {
- JobTrigger jobTrigger;
-
- String cronExpression = jobTriggerRecord.getAttribute(Field.CRON_EXPRESSION);
- if (cronExpression != null) {
- jobTrigger = JobTrigger.createCronTrigger(cronExpression);
- } else {
- // calendar mode
- Date startTime = jobTriggerRecord.getAttributeAsDate(Field.START_TIME);
- Long repeatInterval = (Long)jobTriggerRecord.getAttributeAsObject(Field.REPEAT_INTERVAL);
- Integer repeatCount = jobTriggerRecord.getAttributeAsInt(Field.REPEAT_COUNT);
- Date endTime = jobTriggerRecord.getAttributeAsDate(Field.END_TIME);
-
- if (startTime != null) {
- // LATER
-
- if (repeatInterval != null) {
- // LATER AND REPEAT
-
- if (repeatCount != null) {
- jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, repeatCount);
- } else {
- jobTrigger = JobTrigger.createLaterAndRepeatTrigger(startTime, repeatInterval, endTime);
- }
- } else {
- // LATER ONCE
-
- jobTrigger = JobTrigger.createLaterTrigger(startTime);
- }
- } else {
- // NOW
- if (repeatInterval != null) {
- // NOW AND REPEAT
-
- if (repeatCount != null) {
- jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, repeatCount);
- } else {
- jobTrigger = JobTrigger.createNowAndRepeatTrigger(repeatInterval, endTime);
- }
- } else {
- // NOW ONCE
-
- jobTrigger = JobTrigger.createNowTrigger();
- }
- }
- }
-
- return jobTrigger;
- }
-
- public static class SubjectRecord extends ListGridRecord {
- static final String FIELD_ID = "id";
- static final String FIELD_NAME = "name";
-
- public SubjectRecord(Subject subject) {
- setAttribute(FIELD_ID, subject.getId());
- setAttribute(FIELD_NAME, subject.getName());
- }
-
- public int getId() {
- return getAttributeAsInt(FIELD_ID);
- }
-
- public String getName() {
- return getAttribute(FIELD_NAME);
- }
-
- public Subject toSubject() {
- Subject subject = new Subject();
- subject.setId(getId());
- subject.setName(getName());
- return subject;
- }
- }
-
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java
deleted file mode 100644
index 3d8fd6d..0000000
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/OperationScheduleListView.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright 2010, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * 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.common.detail.operation.schedule;
-
-import com.smartgwt.client.widgets.grid.ListGridField;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-
-import org.rhq.enterprise.gui.coregui.client.components.table.SubjectRecordCellFormatter;
-import org.rhq.enterprise.gui.coregui.client.components.table.TableAction;
-import org.rhq.enterprise.gui.coregui.client.components.table.TableSection;
-
-/**
- * @author Ian Springer
- */
-public abstract class OperationScheduleListView extends TableSection<OperationScheduleDataSource> {
-
- public OperationScheduleListView(String locatorId, OperationScheduleDataSource dataSource, String title) {
- super(locatorId, title);
-
- setDataSource(dataSource);
- }
-
- protected abstract boolean hasControlPermission();
-
- @Override
- protected void configureTable() {
- super.configureTable();
-
- ListGridField operationField = new ListGridField(OperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME, 180);
-
- ListGridField subjectField = new ListGridField(OperationScheduleDataSource.Field.SUBJECT, 110);
- subjectField.setCellFormatter(new SubjectRecordCellFormatter());
-
- //ListGridField jobTriggerField = new ListGridField(OperationScheduleDataSource.Field.JOB_TRIGGER, 300);
-
- ListGridField nextFireTimeField = new ListGridField(OperationScheduleDataSource.Field.NEXT_FIRE_TIME,
- "Next Scheduled Execution", 190);
-
- ListGridField descriptionField = new ListGridField(OperationScheduleDataSource.Field.DESCRIPTION);
-
- setListGridFields(operationField, subjectField, nextFireTimeField, descriptionField);
-
- addTableAction(extendLocatorId("New"), MSG.common_button_new(), new TableAction() {
- public boolean isEnabled(ListGridRecord[] selection) {
- return hasControlPermission();
- }
-
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- newDetails();
- }
- });
-
- addTableAction(extendLocatorId("Unschedule"), MSG.common_button_delete(), getDeleteConfirmMessage(),
- new TableAction() {
- public boolean isEnabled(ListGridRecord[] selection) {
- int count = selection.length;
- return ((count >= 1) && hasControlPermission());
- }
-
- public void executeAction(ListGridRecord[] selection, Object actionValue) {
- deleteSelectedRecords();
- }
- });
- }
-
- @Override
- protected String getDetailsLinkColumnName() {
- return OperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME;
- }
-
-}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java
index d02949a..ff90336 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryDataSource.java
@@ -27,16 +27,16 @@ import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria;
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.OperationHistoryDataSource;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryDataSource;
import java.util.Arrays;
/**
* @author Ian Springer
*/
-public class GroupOperationHistoryDataSource extends OperationHistoryDataSource<GroupOperationHistory> {
+public class GroupOperationHistoryDataSource extends AbstractOperationHistoryDataSource<GroupOperationHistory> {
- public static abstract class Field extends OperationHistoryDataSource.Field {
+ public static abstract class Field extends AbstractOperationHistoryDataSource.Field {
public static final String GROUP = "group";
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java
index 9206e4f..887e313 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/history/GroupOperationHistoryListView.java
@@ -23,7 +23,6 @@ import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.widgets.Canvas;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryListView;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.history.ResourceOperationHistoryDataSource;
/**
* @author Ian Springer
@@ -33,17 +32,15 @@ public class GroupOperationHistoryListView extends AbstractOperationHistoryListV
private ResourceGroupComposite groupComposite;
public GroupOperationHistoryListView(String locatorId, ResourceGroupComposite groupComposite) {
- super(locatorId, new ResourceOperationHistoryDataSource(), null,
+ super(locatorId, new GroupOperationHistoryDataSource(), null,
new Criteria(GroupOperationHistoryDataSource.CriteriaField.GROUP_ID,
String.valueOf(groupComposite.getResourceGroup().getId())));
this.groupComposite = groupComposite;
}
@Override
- protected void configureTable() {
- super.configureTable();
-
- // TODO: Add Delete button.
+ protected boolean hasControlPermission() {
+ return this.groupComposite.getResourcePermission().isControl();
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
index d104eb2..7603a45 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleDataSource.java
@@ -26,7 +26,7 @@ import com.smartgwt.client.data.Record;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDataSource;
import java.util.List;
@@ -36,7 +36,7 @@ import java.util.List;
*
* @author Ian Springer
*/
-public class GroupOperationScheduleDataSource extends OperationScheduleDataSource<GroupOperationSchedule> {
+public class GroupOperationScheduleDataSource extends AbstractOperationScheduleDataSource<GroupOperationSchedule> {
private ResourceGroupComposite groupComposite;
@@ -74,8 +74,8 @@ public class GroupOperationScheduleDataSource extends OperationScheduleDataSourc
Configuration parameters = (Configuration) request.getAttributeAsObject("parameters");
recordToAdd.setAttribute(Field.PARAMETERS, parameters);
final GroupOperationSchedule scheduleToAdd = copyValues(recordToAdd);
- // TODO
- /*operationService.scheduleResourceOperation(scheduleToAdd, new AsyncCallback<Integer>() {
+
+ operationService.scheduleGroupOperation(scheduleToAdd, new AsyncCallback<Integer>() {
public void onSuccess(Integer scheduleId) {
scheduleToAdd.setId(scheduleId);
sendSuccessResponse(request, response, scheduleToAdd);
@@ -84,22 +84,22 @@ public class GroupOperationScheduleDataSource extends OperationScheduleDataSourc
public void onFailure(Throwable caught) {
throw new RuntimeException("Failed to add " + scheduleToAdd, caught);
}
- });*/
+ });
}
@Override
protected void executeRemove(Record recordToRemove, final DSRequest request, final DSResponse response) {
final GroupOperationSchedule scheduleToRemove = copyValues(recordToRemove);
- // TODO
- /*operationService.unscheduleResourceOperation(scheduleToRemove, new AsyncCallback<Void>() {
+
+ operationService.unscheduleGroupOperation(scheduleToRemove, new AsyncCallback<Void>() {
public void onSuccess(Void result) {
sendSuccessResponse(request, response, scheduleToRemove);
}
public void onFailure(Throwable caught) {
- throw new RuntimeException(caught);
+ throw new RuntimeException("Failed to remove " + scheduleToRemove, caught);
}
- });*/
+ });
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java
index f3b376b..f2183af 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/operation/schedule/GroupOperationScheduleListView.java
@@ -21,15 +21,12 @@ package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.operation.
import com.smartgwt.client.widgets.Canvas;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDetailsView;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleListView;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleListView;
/**
* @author Ian Springer
*/
-public class GroupOperationScheduleListView extends OperationScheduleListView {
+public class GroupOperationScheduleListView extends AbstractOperationScheduleListView {
private static final String TITLE = null;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java
index 447ec17..ca53ba0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryDataSource.java
@@ -23,22 +23,19 @@ 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.widgets.grid.ListGridRecord;
import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria;
-import org.rhq.core.domain.operation.OperationHistory;
import org.rhq.core.domain.operation.ResourceOperationHistory;
-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.inventory.common.detail.operation.history.OperationHistoryDataSource;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryDataSource;
/**
* @author Ian Springer
*/
-public class ResourceOperationHistoryDataSource extends OperationHistoryDataSource<ResourceOperationHistory> {
+public class ResourceOperationHistoryDataSource extends AbstractOperationHistoryDataSource<ResourceOperationHistory> {
- public static abstract class Field extends OperationHistoryDataSource.Field {
+ public static abstract class Field extends AbstractOperationHistoryDataSource.Field {
public static final String RESOURCE = "resource";
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java
index 086b39d..3b0f747 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/history/ResourceOperationHistoryListView.java
@@ -40,10 +40,8 @@ public class ResourceOperationHistoryListView extends AbstractOperationHistoryLi
}
@Override
- protected void configureTable() {
- super.configureTable();
-
- // TODO: Add Delete button.
+ protected boolean hasControlPermission() {
+ return this.resourceComposite.getResourcePermission().isControl();
}
@Override
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java
index c122bfb..0950a70 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDataSource.java
@@ -30,14 +30,14 @@ import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDataSource;
/**
* A DataSource for {@link ResourceOperationSchedule}s for a given {@link Resource}.
*
* @author Ian Springer
*/
-public class ResourceOperationScheduleDataSource extends OperationScheduleDataSource<ResourceOperationSchedule> {
+public class ResourceOperationScheduleDataSource extends AbstractOperationScheduleDataSource<ResourceOperationSchedule> {
private ResourceComposite resourceComposite;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
index 70f2c18..483f97d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
@@ -1,9 +1,7 @@
package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule;
-import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.ResourceComposite;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDetailsView;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleDataSource;
/**
*
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java
index 0e362f0..1f37161 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/operation/schedule/ResourceOperationScheduleListView.java
@@ -22,13 +22,12 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operatio
import com.smartgwt.client.widgets.Canvas;
import org.rhq.core.domain.resource.composite.ResourceComposite;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.OperationScheduleListView;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleDetailsView;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.schedule.AbstractOperationScheduleListView;
/**
* @author Ian Springer
*/
-public class ResourceOperationScheduleListView extends OperationScheduleListView {
+public class ResourceOperationScheduleListView extends AbstractOperationScheduleListView {
private static final String TITLE = null;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java
index af46041..81ebb94 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/operation/SubsystemOperationHistoryListView.java
@@ -19,7 +19,9 @@
*/
package org.rhq.enterprise.gui.coregui.client.report.operation;
+import java.util.EnumSet;
import java.util.List;
+import java.util.Set;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.Canvas;
@@ -27,11 +29,14 @@ 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.authz.Permission;
import org.rhq.core.domain.resource.Resource;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoader;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
+import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryDataSource;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.AbstractOperationHistoryListView;
-import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.OperationHistoryDataSource;
import org.rhq.enterprise.gui.coregui.client.inventory.common.detail.operation.history.ResourceOperationHistoryDetailsView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.history.ResourceOperationHistoryDataSource;
@@ -42,8 +47,27 @@ public class SubsystemOperationHistoryListView extends AbstractOperationHistoryL
public static final ViewName VIEW_ID = new ViewName("RecentOperations", MSG.common_title_recent_operations());
+ private Set<Permission> globalPermissions;
+
public SubsystemOperationHistoryListView(String locatorId) {
super(locatorId, new ResourceOperationHistoryDataSource(), VIEW_ID.getTitle());
+
+ this.globalPermissions = EnumSet.noneOf(Permission.class);
+ loadGlobalPermissions();
+ }
+
+ @Override
+ protected boolean hasControlPermission() {
+ loadGlobalPermissions();
+ return this.globalPermissions.contains(Permission.MANAGE_INVENTORY);
+ }
+
+ private void loadGlobalPermissions() {
+ new PermissionsLoader().loadExplicitGlobalPermissions(new PermissionsLoadedListener() {
+ public void onPermissionsLoaded(Set<Permission> permissions) {
+ globalPermissions = permissions;
+ }
+ });
}
@Override
@@ -52,14 +76,14 @@ public class SubsystemOperationHistoryListView extends AbstractOperationHistoryL
for (ListGridField field : fields) {
String fieldName = field.getName();
- if (fieldName.equals(OperationHistoryDataSource.Field.OPERATION_NAME) ||
- fieldName.equals(OperationHistoryDataSource.Field.SUBJECT) ||
- fieldName.equals(OperationHistoryDataSource.Field.STARTED_TIME)) {
+ if (fieldName.equals(AbstractOperationHistoryDataSource.Field.OPERATION_NAME) ||
+ fieldName.equals(AbstractOperationHistoryDataSource.Field.SUBJECT) ||
+ fieldName.equals(AbstractOperationHistoryDataSource.Field.STARTED_TIME)) {
field.setWidth("25%");
}
}
- ListGridField resourceField = new ListGridField(OperationHistoryDataSource.Field.RESOURCE,
+ ListGridField resourceField = new ListGridField(AbstractOperationHistoryDataSource.Field.RESOURCE,
MSG.common_title_resource());
resourceField.setAlign(Alignment.LEFT);
resourceField.setCellAlign(Alignment.LEFT);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
index 5fc3c0d..7a9b1a9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java
@@ -45,6 +45,7 @@ import org.rhq.enterprise.server.util.LookupUtil;
/**
* @author Greg Hinkle
+ * @author Ian Springer
*/
public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements OperationGWTService {
@@ -71,6 +72,14 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O
}
}
+ public void deleteOperationHistory(int operationHistoryId, boolean deleteEvenIfInProgress) {
+ try {
+ operationManager.deleteOperationHistory(getSessionSubject(), operationHistoryId, deleteEvenIfInProgress);
+ } catch (RuntimeException e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public void invokeResourceOperation(int resourceId, String operationName, Configuration parameters,
String description, int timeout) throws RuntimeException {
try {
@@ -101,6 +110,15 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O
}
}
+ public int scheduleGroupOperation(GroupOperationSchedule groupOperationSchedule) throws RuntimeException {
+ try {
+ return operationManager.scheduleGroupOperation(getSessionSubject(), groupOperationSchedule);
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public void unscheduleResourceOperation(ResourceOperationSchedule resourceOperationSchedule)
throws RuntimeException {
try {
@@ -112,6 +130,17 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O
}
}
+ public void unscheduleGroupOperation(GroupOperationSchedule groupOperationSchedule)
+ throws RuntimeException {
+ try {
+ operationManager.unscheduleGroupOperation(getSessionSubject(), groupOperationSchedule.getJobId()
+ .toString(), groupOperationSchedule.getGroup().getId());
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
/** Find recently completed operations, disambiguate them and return that list.
*
*/
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index 45f7832..efe8cc4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -66,6 +66,7 @@ import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.operation.ResourceOperationScheduleEntity;
import org.rhq.core.domain.operation.ScheduleJobId;
import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.OperationSchedule;
import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.operation.composite.GroupOperationLastCompletedComposite;
import org.rhq.core.domain.operation.composite.GroupOperationScheduleComposite;
@@ -179,6 +180,30 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
}
}
+ public int scheduleGroupOperation(Subject subject, GroupOperationSchedule schedule) throws ScheduleException {
+ JobTrigger jobTrigger = schedule.getJobTrigger();
+ Trigger trigger = convertToTrigger(jobTrigger);
+ try {
+ List<Resource> executionOrderResources = schedule.getExecutionOrder();
+ int[] executionOrderResourceIds;
+ if (executionOrderResources == null) {
+ executionOrderResourceIds = null;
+ } else {
+ executionOrderResourceIds = new int[executionOrderResources.size()];
+ for (int i = 0, executionOrderResourcesSize = executionOrderResources.size(); i < executionOrderResourcesSize; i++) {
+ Resource executionOrderResource = executionOrderResources.get(i);
+ executionOrderResourceIds[i] = executionOrderResource.getId();
+ }
+ }
+ GroupOperationSchedule groupOperationSchedule = scheduleGroupOperation(subject, schedule
+ .getGroup().getId(), executionOrderResourceIds, schedule.getHaltOnFailure(),
+ schedule.getOperationName(), schedule.getParameters(), trigger, schedule.getDescription());
+ return groupOperationSchedule.getId();
+ } catch (SchedulerException e) {
+ throw new ScheduleException(e);
+ }
+ }
+
public ResourceOperationSchedule scheduleResourceOperation(Subject subject, int resourceId, String operationName,
Configuration parameters, Trigger trigger, String notes) throws SchedulerException {
Resource resource = getResourceIfAuthorized(subject, resourceId);
@@ -557,7 +582,10 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
}
}
+ Integer entityId = getOperationScheduleEntityId(jobDetail);
+
GroupOperationSchedule sched = new GroupOperationSchedule();
+ sched.setId(entityId);
sched.setJobName(jobDetail.getName());
sched.setJobGroup(jobDetail.getGroup());
sched.setGroup(group);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
index a48a385..846b54d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java
@@ -74,6 +74,17 @@ public interface OperationManagerLocal {
int scheduleResourceOperation(Subject subject, ResourceOperationSchedule schedule);
/**
+ * Schedules a Resource group operation for execution.
+ *
+ * @param subject the user who is asking to schedule the job
+ * @param schedule the information describing the operation to be scheduled along with the schedule to be used
+ *
+ * @return the id of the {@link org.rhq.core.domain.operation.GroupOperationScheduleEntity} created to track the
+ * scheduled operation
+ */
+ int scheduleGroupOperation(Subject subject, GroupOperationSchedule schedule) throws ScheduleException;
+
+ /**
* Schedules an operation for execution on the given resource.
*
* @param subject the user who is asking to schedule the job
commit 4b9236698335f78b081e313040c725d459a9d06d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jan 26 16:18:30 2011 -0500
Fix LogOut menu option to have non-localized html id. Remove related
selenium utility that assigned potentially localized ids for Hyperlink
widgets.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
index 1b3bc8c..2c9e761 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/menu/MenuBarView.java
@@ -52,6 +52,7 @@ public class MenuBarView extends LocatableVLayout {
public static final ViewName[] SECTIONS = { DashboardsView.VIEW_ID, InventoryView.VIEW_ID, ReportTopView.VIEW_ID,
BundleTopView.VIEW_ID, AdministrationView.VIEW_ID, HelpView.VIEW_ID };
+ public static final ViewName LOGOUT_VIEW_ID = new ViewName("LogOut", MSG.view_menuBar_logout());
private String currentlySelectedSection = DashboardsView.VIEW_ID.getName();
private LocatableLabel userLabel;
@@ -160,7 +161,8 @@ public class MenuBarView extends LocatableVLayout {
lineLabel.setWidth("10px");
lineLabel.setAlign(Alignment.CENTER);
- Hyperlink logoutLink = SeleniumUtility.setHtmlId(new Hyperlink(MSG.view_menuBar_logout(), "LogOut"));
+ Hyperlink logoutLink = SeleniumUtility.setHtmlId(new Hyperlink(LOGOUT_VIEW_ID.getTitle(), LOGOUT_VIEW_ID
+ .getName()), LOGOUT_VIEW_ID.getName());
logoutLink.setWidth("50px");
layout.addMember(userLabel);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/SeleniumUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/SeleniumUtility.java
index 43893a6..60291bc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/SeleniumUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/SeleniumUtility.java
@@ -1,6 +1,5 @@
package org.rhq.enterprise.gui.coregui.client.util.selenium;
-import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.UIObject;
import com.smartgwt.client.widgets.BaseWidget;
import com.smartgwt.client.widgets.Canvas;
@@ -99,20 +98,6 @@ public class SeleniumUtility {
}
/**
- * A utility for assigning an ID to a gwt Hyperlink. For a smartgwt widget
- * use {@link setId(BaseWidget)}. Any current ID will be overwritten. The algorithm is:
- * <pre>
- * Equivalent to setHtmlId(hyperlink, hyperlink.getText());
- * </pre>
- *
- * @param hyperlink
- * @return the updated hyperlink
- */
- static public <T extends Hyperlink> T setHtmlId(final T hyperlink) {
- return setHtmlId(hyperlink, hyperlink.getText());
- }
-
- /**
* Use only if you are sure the unsafeId is not null or empty, or if DEFAULT_ID is acceptable.
* <pre>
* Equivalent to:
13 years, 4 months
[rhq] modules/enterprise
by Jay Shaughnessy
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 9 ++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java | 3 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java | 4 +-
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/client/util/selenium/LocatableHLayout.java | 3 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java | 3 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java | 15 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java | 3 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java | 3 --
9 files changed, 25 insertions(+), 21 deletions(-)
New commits:
commit c37617a8384f6770ba578a3f604348687ad9cfc6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Feb 1 18:25:02 2011 -0500
Fix a selenium locator issue with the top level view titles.
- use locatable layouts as opposed to standard for default views
- removethe special onDestroy() logic for LocatableToolStrip (not sure why
this was not right, not sure ToolStrip is behaving as expected).
- change other Layout onDestroy() impls to remove members prior to calling
super.onDestroy().
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 fd59cf6..beea6da 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
@@ -259,10 +259,13 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
}
public static void setContent(Canvas newContent) {
- Canvas contentCanvas = Canvas.getById(CONTENT_CANVAS_ID);
- for (Canvas child : contentCanvas.getChildren()) {
- child.destroy();
+ if (content != null) {
+ content.removeFromParent();
+ content.destroy();
+ content = null;
}
+
+ Canvas contentCanvas = Canvas.getById(CONTENT_CANVAS_ID);
if (newContent != null) {
content = newContent;
contentCanvas.addChild(newContent);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
index 723d87d..b0078d6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
@@ -37,6 +37,7 @@ import org.rhq.enterprise.gui.coregui.client.components.view.NavigationItem;
import org.rhq.enterprise.gui.coregui.client.components.view.NavigationSection;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewFactory;
import org.rhq.enterprise.gui.coregui.client.components.view.ViewName;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* The Administration top-level view.
@@ -90,7 +91,7 @@ public class AdministrationView extends AbstractSectionedLeftNavigationView {
}
protected VLayout defaultView() {
- VLayout vLayout = new VLayout();
+ LocatableVLayout vLayout = new LocatableVLayout(this.extendLocatorId("Default"));
vLayout.setWidth100();
// TODO: Admin icon.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
index 2e3d919..b32775f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/InventoryView.java
@@ -26,7 +26,6 @@ import java.util.Set;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.measurement.AvailabilityType;
@@ -47,6 +46,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.groups.definitions.GroupD
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.discovery.ResourceAutodiscoveryView;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* The Inventory top-level view.
@@ -101,7 +101,7 @@ public class InventoryView extends AbstractSectionedLeftNavigationView {
}
protected Canvas defaultView() {
- VLayout vLayout = new VLayout();
+ LocatableVLayout vLayout = new LocatableVLayout(this.extendLocatorId("Default"));
vLayout.setWidth100();
// TODO: Admin icon.
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 5b0cd5c..4349039 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
@@ -48,6 +48,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configura
import org.rhq.enterprise.gui.coregui.client.report.measurement.MeasurementOOBView;
import org.rhq.enterprise.gui.coregui.client.report.operation.SubsystemOperationHistoryListView;
import org.rhq.enterprise.gui.coregui.client.report.tag.TaggedView;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* The Reports top-level view.
@@ -82,7 +83,7 @@ public class ReportTopView extends AbstractSectionedLeftNavigationView {
@Override
protected VLayout defaultView() {
- VLayout vLayout = new VLayout();
+ LocatableVLayout vLayout = new LocatableVLayout(this.extendLocatorId("Default"));
vLayout.setWidth100();
// TODO: Admin icon.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
index 8a72774..6729210 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
@@ -53,9 +53,8 @@ public class LocatableHLayout extends HLayout implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
index 8f8311c..efe2894 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
@@ -37,9 +37,8 @@ public class LocatableLayout extends Layout implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
index 13db7f8..6e7a2ac 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
@@ -35,11 +35,14 @@ public class LocatableToolStrip extends ToolStrip implements Locatable {
SeleniumUtility.destroyMembers(this);
}
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- destroyMembers();
- }
+ // It was my understanding that Layouts needed explicit removal of members but it seems
+ // that ToolStrip may treat its members differently. The logic below actually caused issues because
+ // the member was being destroyed automatically.
+ //
+ //@Override
+ //protected void onDestroy() {
+ // destroyMembers();
+ // super.onDestroy();
+ //}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
index d91f9cd..54f081c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
@@ -53,9 +53,8 @@ public class LocatableVLayout extends VLayout implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
index c6dfafd..4a86ee4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
@@ -53,9 +53,8 @@ public class LocatableVStack extends VStack implements Locatable {
@Override
protected void onDestroy() {
- super.onDestroy();
-
destroyMembers();
+ super.onDestroy();
}
}
13 years, 4 months
[rhq] 3 commits - modules/enterprise
by Jay Shaughnessy
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 10 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java | 6 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java | 21 +--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java | 23 +++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java | 18 ---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java | 56 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java | 43 +++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java | 24 ++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java | 10 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalLayout.java | 50 +++++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java | 28 +----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 13 --
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 6 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java | 1
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/summary/ActivityView.java | 29 ++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java | 7 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java | 7 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java | 11 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java | 8 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java | 7 +
24 files changed, 280 insertions(+), 107 deletions(-)
New commits:
commit 10d1fa32b0ff009576ea6e901c308f5c8d0aeec2
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Feb 1 14:07:44 2011 -0500
Selenium Work - provide dashboard save with a callback signature. This way
we can take post-save action and perform some necessary widget cleanup
after a portlet drag-drop.
- Also, fix dashboard redraw to not blow away the edit form.
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 078f483..5a19688 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
@@ -107,19 +107,19 @@ public class DashboardView extends LocatableVLayout {
@Override
protected void onInit() {
- super.onInit();
if (!isInitialized) {
+ super.onInit();
addMember(buildEditForm());
isInitialized = true;
}
}
public void redraw() {
- for (Canvas c : getChildren()) {
- c.removeFromParent();
- c.destroy();
- }
+ // destroy all of the portlets and recreate from scratch
+ portalLayout.removeFromParent();
+ portalLayout.destroy();
+ portalLayout = null;
buildPortlets();
}
@@ -328,8 +328,8 @@ public class DashboardView extends LocatableVLayout {
for (int i = 0; i < storedDashboard.getColumns(); i++) {
for (DashboardPortlet storedPortlet : storedDashboard.getPortlets(i)) {
- final PortletWindow portletWindow = new PortletWindow(portalLayout
- .extendLocatorId(getPortletLocatorId(storedPortlet)), this, storedPortlet);
+ String locatorId = getPortletLocatorId(portalLayout, storedPortlet);
+ final PortletWindow portletWindow = new PortletWindow(locatorId, this, storedPortlet);
portletWindows.add(portletWindow);
portletWindow.setTitle(storedPortlet.getName());
@@ -349,30 +349,30 @@ public class DashboardView extends LocatableVLayout {
* is one tuple that is guaranteed unique and useful for a repeatable locator Id: DashBoard-Position. This
* means that the on a single dashboard each portlet has a unique column-columnIndex pair. Although portlets
* can move, and the positions can change at runtime, it's still valid for a locatorId because it is
- * unique and repeatable fpr test purposes. We also add the portletKey for an easier visual cue.
+ * unique and repeatable for test purposes. We also add the portletKey for an easier visual cue.
+ * The portalLayout's locatorId already incorporates the dashboardName, so we need only extend it with the
+ * positioning information.
*
+ * @param portalLayout
* @param dashboardPortlet
* @return The locatorId for the portlet. Form PortleyKey_DashboardId_Column_ColumnIndex
*/
- private String getPortletLocatorId(DashboardPortlet dashboardPortlet) {
+ private String getPortletLocatorId(PortalLayout portalLayout, DashboardPortlet dashboardPortlet) {
StringBuilder locatorId = new StringBuilder(dashboardPortlet.getPortletKey());
locatorId.append("_");
- locatorId.append(dashboardPortlet.getDashboard().getId());
- locatorId.append("_");
locatorId.append(dashboardPortlet.getColumn());
locatorId.append("_");
locatorId.append(dashboardPortlet.getIndex());
- return locatorId.toString();
+ return portalLayout.extendLocatorId(locatorId.toString());
}
private void addPortlet(String portletKey, String portletName) {
DashboardPortlet storedPortlet = new DashboardPortlet(portletName, portletKey, 250);
storedDashboard.addPortlet(storedPortlet);
- String locatorId = getPortletLocatorId(storedPortlet);
- final PortletWindow newPortletWindow = new PortletWindow(portalLayout.extendLocatorId(locatorId), this,
- storedPortlet);
+ String locatorId = getPortletLocatorId(portalLayout, storedPortlet);
+ final PortletWindow newPortletWindow = new PortletWindow(locatorId, this, storedPortlet);
newPortletWindow.setTitle(portletName);
newPortletWindow.setHeight(350);
newPortletWindow.setVisible(false);
@@ -422,6 +422,10 @@ public class DashboardView extends LocatableVLayout {
}
public void save() {
+ save((AsyncCallback<Dashboard>) null);
+ }
+
+ public void save(final AsyncCallback<Dashboard> callback) {
// since we reset storedDashboard after the async update completes, block modification of the dashboard
// during that interval.
DashboardView.this.disable();
@@ -430,6 +434,10 @@ public class DashboardView extends LocatableVLayout {
public void onFailure(Throwable caught) {
CoreGUI.getErrorHandler().handleError(MSG.view_dashboardManager_error(), caught);
DashboardView.this.enable();
+
+ if (null != callback) {
+ callback.onFailure(caught);
+ }
}
public void onSuccess(Dashboard result) {
@@ -440,6 +448,11 @@ public class DashboardView extends LocatableVLayout {
// up to date portlets.
updatePortletWindows(result);
storedDashboard = result;
+
+ if (null != callback) {
+ callback.onSuccess(result);
+ }
+
DashboardView.this.enable();
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
index 8b92e5a..930b4a9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortalColumn.java
@@ -21,6 +21,8 @@ package org.rhq.enterprise.gui.coregui.client.dashboard;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.layout.VStack;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
+
/**
* @author Greg Hinkle
*/
@@ -52,4 +54,12 @@ public class PortalColumn extends VStack {
placeHolderProperties.setBorder("2px solid #4A5D75");
setPlaceHolderProperties(placeHolderProperties);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ SeleniumUtility.destroyMembers(this);
+ }
+
}
\ No newline at end of file
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 2b23f95..025e92e 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,13 +22,16 @@
*/
package org.rhq.enterprise.gui.coregui.client.dashboard;
+import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.util.EventHandler;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.events.DropEvent;
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.util.selenium.LocatableHLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* @author Greg Hinkle
@@ -57,9 +60,9 @@ public class PortalLayout extends LocatableHLayout {
int dropPosition = column.getDropPosition();
int dropColumn = columnNumber;
- Canvas target = EventHandler.getDragTarget();
- ((PortletWindow) target).getStoredPortlet().setIndex(dropPosition);
- ((PortletWindow) target).getStoredPortlet().setColumn(dropColumn);
+ final PortletWindow target = (PortletWindow) EventHandler.getDragTarget();
+ target.getStoredPortlet().setIndex(dropPosition);
+ target.getStoredPortlet().setColumn(dropColumn);
int colNum = 0;
for (Canvas pcc : getMembers()) {
@@ -80,7 +83,31 @@ public class PortalLayout extends LocatableHLayout {
colNum++;
}
- save();
+
+ // 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.
+ AsyncCallback<Dashboard> callback = SeleniumUtility.getUseDefaultIds() ? null
+ : new AsyncCallback<Dashboard>() {
+
+ @Override
+ public void onFailure(Throwable caught) {
+ redraw();
+ }
+
+ @Override
+ public void onSuccess(Dashboard result) {
+ // for some reason the drag drop operation is leaving the target widget (the
+ // portlet window) in the DOM, detached from its original parent (the PortalLayout),
+ // and therefore not destroyed in the redraw(). So, kill it off manually to
+ // avoid ID conflicts if the portlet is again dragged back its original position.
+ target.removeFromParent();
+ target.destroy();
+
+ redraw();
+ }
+ };
+ save(callback);
+
com.allen_sauer.gwt.log.client.Log.info("Rearranged column indexes");
}
});
@@ -99,8 +126,12 @@ public class PortalLayout extends LocatableHLayout {
return portalColumn;
}
- public void save() {
- this.dashboardView.save();
+ public void save(AsyncCallback<Dashboard> callback) {
+ this.dashboardView.save(callback);
+ }
+
+ public void redraw() {
+ this.dashboardView.redraw();
}
public void resize() {
@@ -117,4 +148,11 @@ public class PortalLayout extends LocatableHLayout {
}
}
}
+
+ // @Override
+ // protected void onDestroy() {
+ // destroyMembers();
+ // super.onDestroy();
+ // }
+
}
\ No newline at end of file
commit 44d2b7cf757d6b094431d83140a6f14b2978a5d1
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Tue Feb 1 14:04:59 2011 -0500
Selenium Work - Locator conflict work
It seems that smartgwt2.4 along with our own architecture changes have
brought to the surface a significant amount ID conflict. Addressing the
conflicts requires diligence in the destroy/onDestroy logic and call
chains.
- Added onDestroy() methods to all of the Locatable Layout classes in order
to provide cleanup of members across the board, at destroy time. Note that
children are typically destroyed automatically but members are not. (Members
are managed by the layout and children are not).
-- removed redundant or incomplete onDestroy() impls from locatable Layout
subclasses.
- Added ability to "hide" Tabs in our TwoLevelTab infrastructure. Hiding a
tab is not provided by smartgwt (why?) so we were just removing the Tab from the
TabSet. This was leaving ghost widgets around as the Tab, SubTab, SubTab
Canvas's etc were not being handled correctly. Also, since Tab does not have
a destroy() method (why?) it must be cleaned up carefully, by addingt it to
a TabSet that is then itself destroyed.
-- Added onDestroy() callChain to the TwoLevelTabViews.
- Views using non-locatable Layouts (VLayout, HLayout, Layout, VStack etc)
with members added, may need to add onDestroy() logic that wipes those
members. I added this to ActvityView2 but this may be in other places as
well. Somthing to keep an eye out for.
-- Also in ActivityView2, removed redundant call to setID(), this should
not be called in general. ID assignment is typically performed by the
Locatable infrastructure. The redundant call can (and did) generate errors
for illegal ID (re)assignment.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
index 062a47f..f88c8b0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/selector/AbstractSelector.java
@@ -65,7 +65,6 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTransferImgButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/**
* @author Greg Hinkle
@@ -203,11 +202,6 @@ public abstract class AbstractSelector<T> extends LocatableVLayout {
addMember(this.hlayout);
}
- @Override
- protected void onDestroy() {
- SeleniumUtility.destroyMembers(hlayout);
- }
-
private SectionStack buildAvailableItemsStack() {
SectionStack availableSectionStack = new SectionStack();
availableSectionStack.setWidth(300);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
index 90b605d..01076f8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/sorter/ReorderableList.java
@@ -18,6 +18,11 @@
*/
package org.rhq.enterprise.gui.coregui.client.components.sorter;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
import com.google.gwt.event.shared.HandlerRegistration;
import com.smartgwt.client.types.Cursor;
import com.smartgwt.client.types.ListGridFieldType;
@@ -29,14 +34,10 @@ import com.smartgwt.client.widgets.grid.events.RecordDropHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;
+
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableListGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
/**
* @author Ian Springer
*/
@@ -59,7 +60,8 @@ public class ReorderableList extends LocatableVLayout {
this(locatorId, false, records, itemTitle, itemIcon);
}
- public ReorderableList(String locatorId, boolean isReadOnly, ListGridRecord[] records, String itemTitle, String itemIcon) {
+ public ReorderableList(String locatorId, boolean isReadOnly, ListGridRecord[] records, String itemTitle,
+ String itemIcon) {
super(locatorId);
this.isReadOnly = isReadOnly;
@@ -180,11 +182,4 @@ public class ReorderableList extends LocatableVLayout {
return itemIcon;
}
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- this.listGrid.destroy();
- }
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
index 9833e80..c8ce710 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTab.java
@@ -37,7 +37,7 @@ public class NamedTab extends LocatableTab {
return viewName.getTitle();
}
- protected void destroy() {
+ public void destroy() {
Canvas pane = getPane();
if (null != pane) {
pane.destroy();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
index d0a0b9e..62c8a2d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/NamedTabSet.java
@@ -54,7 +54,6 @@ public class NamedTabSet extends LocatableTabSet {
@Override
protected void onDestroy() {
-
for (NamedTab tab : getTabs()) {
tab.destroy();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java
index b6296d7..3492891 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTab.java
@@ -26,7 +26,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableButton;
/**
- * Simple class to provide a SubTab a locatorId.
+ * A Locatable SubTab associating a Button with a Canvas.
*
* @author Jay Shaughnessy
*/
@@ -75,6 +75,27 @@ public class SubTab implements Locatable {
return viewName.getTitle();
}
+ public void destroyButton() {
+ if (null != button) {
+ button.removeFromParent();
+ button.destroy();
+ button = null;
+ }
+ }
+
+ public void destroyCanvas() {
+ if (null != canvas) {
+ canvas.removeFromParent();
+ canvas.destroy();
+ canvas = null;
+ }
+ }
+
+ public void destroy() {
+ destroyCanvas();
+ destroyButton();
+ }
+
@Override
public String extendLocatorId(String extension) {
return this.locatorId + "_" + extension;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java
index 4797641..70751b5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/SubTabLayout.java
@@ -90,7 +90,7 @@ public class SubTabLayout extends LocatableVLayout {
}
/**
- * Make subTab visible.
+ * Make subTab visible.
*
* @param subTab not null
*/
@@ -105,17 +105,12 @@ public class SubTabLayout extends LocatableVLayout {
}
/**
- * Make subTab not visible.
+ * Make subTab not visible. Keeps any associated Canvas.
*
* @param subTab not null
*/
public void hideSubTab(SubTab subTab) {
- Button button = subTab.getButton();
- if (null != button) {
- buttonBar.removeMember(button);
- button.destroy();
- subTab.setButton(null);
- }
+ subTab.destroyButton();
}
public boolean isSubTabVisible(SubTab subTab) {
@@ -292,12 +287,9 @@ public class SubTabLayout extends LocatableVLayout {
/**
* Destroy all the currently held views so that they can be replaced with new versions
*/
- public void destroyViews() {
+ void destroyViews() {
for (SubTab subTab : subTabs.values()) {
- if (subTab.getCanvas() != null) {
- subTab.getCanvas().destroy();
- subTab.setCanvas(null);
- }
+ subTab.destroyCanvas();
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
index e256299..f8f0f32 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/tab/TwoLevelTabSet.java
@@ -18,8 +18,12 @@
*/
package org.rhq.enterprise.gui.coregui.client.components.tab;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.event.shared.HandlerRegistration;
+import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.events.TabSelectedEvent;
import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;
@@ -31,6 +35,9 @@ import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;
*/
public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, TwoLevelTabSelectedHandler {
+ /** maps Tab locator IDs to Tabs. */
+ private Map<String, TwoLevelTab> hiddenTabs = new LinkedHashMap<String, TwoLevelTab>();
+
public TwoLevelTabSet(String locatorId) {
super(locatorId);
}
@@ -58,6 +65,41 @@ public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, T
return twoLevelTabs;
}
+ // Smartgwt does not currently offer the ability to hide a Tab (why!) so we fake it here. This allows us to keep
+ // the Tab structure in place while removing it from the TabSet
+ public void setTabHidden(TwoLevelTab tab, boolean hidden) {
+ if (hidden) {
+ if (hiddenTabs.containsKey(tab.getLocatorId())) {
+ return;
+ }
+
+ // don't let the removeTab() destroy the pane
+ Canvas contentPane = tab.getPane();
+ updateTab(tab, null);
+ removeTab(tab);
+ // Reset the pane on the tab, since the call to updateTab() above nulled it out.
+ tab.setPane(contentPane);
+
+ hiddenTabs.put(tab.getLocatorId(), tab);
+ } else {
+ if (!hiddenTabs.containsKey(tab.getLocatorId())) {
+ return;
+ }
+
+ hiddenTabs.remove(tab.getLocatorId());
+ addTab(tab);
+ }
+ }
+
+ public void destroyViews() {
+ for (TwoLevelTab tab : getTabs()) {
+ tab.getLayout().destroyViews();
+ }
+ for (TwoLevelTab tab : hiddenTabs.values()) {
+ tab.getLayout().destroyViews();
+ }
+ }
+
// ------- Event support -------
// Done with a separate handler manager from parent class on purpose (compatibility issue)
@@ -113,4 +155,18 @@ public class TwoLevelTabSet extends NamedTabSet implements TabSelectedHandler, T
disableTab(tab);
}
}
+
+ @Override
+ protected void onDestroy() {
+ // add the hidden tabs back under the TabSet. This will get them destroyed by smartgwt when the tabset
+ // goes away. There is no explicit Tab.destroy().
+ for (TwoLevelTab tab : hiddenTabs.values()) {
+ addTab(tab);
+ }
+ for (TwoLevelTab tab : getTabs()) {
+ tab.getLayout().destroyViews();
+ }
+ super.onDestroy();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
index 2242211..9cf6a6a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/AbstractTwoLevelTabSetView.java
@@ -105,27 +105,11 @@ public abstract class AbstractTwoLevelTabSetView<T, U extends Layout> extends Lo
}
protected boolean updateTab(TwoLevelTab tab, boolean visible, boolean enabled) {
- TwoLevelTab attachedTab = getTabSet().getTabByLocatorId(tab.getLocatorId());
if (visible) {
- if (attachedTab == null) {
- getTabSet().addTab(tab);
- attachedTab = getTabSet().getTabByLocatorId(tab.getLocatorId());
- }
- getTabSet().setTabEnabled(attachedTab, enabled);
+ getTabSet().setTabHidden(tab, false);
+ getTabSet().setTabEnabled(tab, enabled);
} else {
- if (attachedTab != null) {
- // NOTE: If the currently selected tab is going away then switch to the default
- // prior to the removeTab call.
- if (attachedTab.equals(getTabSet().getSelectedTab())) {
- selectDefaultTabAndSubTab();
- }
- // NOTE: We need to remove the tab, because SmartGWT tabset doesn't support hiding tabs.
- Canvas contentPane = attachedTab.getPane();
- getTabSet().updateTab(attachedTab, null);
- getTabSet().removeTab(attachedTab);
- // Reset the pane on the tab, since the call to updateTab() above nulled it out.
- attachedTab.setPane(contentPane);
- }
+ getTabSet().setTabHidden(tab, true);
}
return (visible && enabled);
@@ -280,4 +264,10 @@ public abstract class AbstractTwoLevelTabSetView<T, U extends Layout> extends Lo
return baseViewPath;
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ tabSet.destroy();
+ }
+
}
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 d46a5f4..14f71e6 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
@@ -25,7 +25,6 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.tab.Tab;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.ResourceGroupCriteria;
@@ -224,9 +223,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
int groupId = group.getId();
getTitleBar().setGroup(groupComposite);
- for (Tab top : this.getTabSet().getTabs()) {
- ((TwoLevelTab) top).getLayout().destroyViews();
- }
+ // wipe the canvas views for the current set of subtabs.
+ this.getTabSet().destroyViews();
GroupCategory groupCategory = groupComposite.getResourceGroup().getGroupCategory();
Set<ResourceTypeFacet> facets = groupComposite.getResourceFacets().getFacets();
@@ -297,11 +295,10 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
private void updateOperationsTab(GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
if (updateTab(this.operationsTab, groupCategory == GroupCategory.COMPATIBLE
&& facets.contains(ResourceTypeFacet.OPERATION), true)) {
- updateSubTab(this.operationsTab, this.operationsSchedules,
- new GroupOperationScheduleListView(this.operationsSchedules.extendLocatorId("View"),
- this.groupComposite), true, true);
+ updateSubTab(this.operationsTab, this.operationsSchedules, new GroupOperationScheduleListView(
+ this.operationsSchedules.extendLocatorId("View"), this.groupComposite), true, true);
updateSubTab(this.operationsTab, this.operationsHistory, new GroupOperationHistoryListView(
- this.operationsHistory.extendLocatorId("View"), this.groupComposite), true, true);
+ this.operationsHistory.extendLocatorId("View"), this.groupComposite), true, true);
}
}
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 a4a5172..732f046 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
@@ -25,7 +25,6 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.tab.Tab;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.criteria.ResourceCriteria;
@@ -232,9 +231,8 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo
Resource resource = this.resourceComposite.getResource();
getTitleBar().setResource(this.resourceComposite);
- for (Tab top : this.getTabSet().getTabs()) {
- ((TwoLevelTab) top).getLayout().destroyViews();
- }
+ // wipe the canvas views for the current set of subtabs.
+ this.getTabSet().destroyViews();
ResourcePermission resourcePermissions = this.resourceComposite.getResourcePermission();
Set<ResourceTypeFacet> facets = this.resourceComposite.getResourceFacets().getFacets();
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
index ca6c27d..6e3e580 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/LiveGraphView.java
@@ -298,7 +298,7 @@ public class LiveGraphView extends LocatableVLayout {
@Override
protected void onDestroy() {
super.onDestroy();
- dataLoader.cancel();
- hoverLabel.destroy();
+
+ stop();
}
}
\ No newline at end of file
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
index db74e71..faa3ab1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
@@ -380,6 +380,7 @@ public class SmallGraphView extends LocatableVLayout {
@Override
protected void onDestroy() {
super.onDestroy();
+
hoverLabel.destroy();
}
}
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 f95591a..17b4e5c 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
@@ -63,6 +63,7 @@ import org.rhq.enterprise.gui.coregui.client.util.measurement.GwtMonitorUtils;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableCanvas;
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.SeleniumUtility;
/**
* The content pane of the Resource Summary>Activity tab.
@@ -72,8 +73,8 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
public class ActivityView extends LocatableHLayout implements RefreshableView {
//Locatable ui references
- private VLayout leftPane = new VLayout();;
- private VLayout rightPane = new VLayout();;
+ private VLayout leftPane = new VLayout();
+ private VLayout rightPane = new VLayout();
private LocatableCanvas recentMeasurementsContent = new LocatableCanvas(extendLocatorId("RecentMetrics"));
private LocatableCanvas recentAlertsContent = new LocatableCanvas(extendLocatorId("RecentAlerts"));
private LocatableCanvas recentOobContent = new LocatableCanvas(extendLocatorId("RecentOobs"));
@@ -103,7 +104,6 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
public ActivityView(String locatorId, ResourceComposite resourceComposite) {
super(locatorId);
this.resourceComposite = resourceComposite;
- setID(locatorId);
initializeUi();
}
@@ -177,6 +177,10 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
rightPane.addMember(recentPkgHistoryTitle);
rightPane.addMember(recentPkgHistoryContent);
recentPkgHistoryContent.setHeight(20);
+
+ addMember(leftPane);
+ addMember(rightPane);
+
loadData();
}
@@ -195,8 +199,16 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
@Override
protected void onDraw() {
super.onDraw();
- addMember(leftPane);
- addMember(rightPane);
+ refresh();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ // destroy members of non-locatable layouts
+ SeleniumUtility.destroyMembers(leftPane);
+ SeleniumUtility.destroyMembers(rightPane);
}
@Override
@@ -221,6 +233,13 @@ public class ActivityView extends LocatableHLayout implements RefreshableView {
addMember(titleElement);
setMembersMargin(10);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ SeleniumUtility.destroyMembers(this);
+ }
}
/** Fetches alerts and updates the DynamicForm instance with the latest
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
index 5064527..8a72774 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableHLayout.java
@@ -51,4 +51,11 @@ public class LocatableHLayout extends HLayout implements Locatable {
SeleniumUtility.destroyMembers(this);
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
index 17c1f9c..8f8311c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableLayout.java
@@ -35,4 +35,11 @@ public class LocatableLayout extends Layout implements Locatable {
SeleniumUtility.destroyMembers(this);
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
index fa24d45..13db7f8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableToolStrip.java
@@ -31,4 +31,15 @@ public class LocatableToolStrip extends ToolStrip implements Locatable {
return this.locatorId + "_" + extension;
}
+ public void destroyMembers() {
+ SeleniumUtility.destroyMembers(this);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
index 61991c4..d91f9cd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVLayout.java
@@ -50,4 +50,12 @@ public class LocatableVLayout extends VLayout implements Locatable {
public void destroyMembers() {
SeleniumUtility.destroyMembers(this);
}
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
index bb9093b..c6dfafd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java
@@ -51,4 +51,11 @@ public class LocatableVStack extends VStack implements Locatable {
SeleniumUtility.destroyMembers(this);
}
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ destroyMembers();
+ }
+
}
commit 950b560c8a957f3bba1467747fe8a233fa2745df
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Jan 31 11:48:18 2011 -0500
Fix bookmarkable dashboard urls to use dash ids as opposed to localizable
titles.
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 431f873..fd59cf6 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
@@ -391,7 +391,7 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> {
((BookmarkableView) currentCanvas).renderView(viewPath.next());
} else {
long elapsedMillis = System.currentTimeMillis() - startTime;
- if (elapsedMillis < 5000) {
+ if (elapsedMillis < 10000) {
schedule(100); // Reschedule the timer.
}
}
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 0322d2d..ff43a66 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
@@ -154,7 +154,7 @@ public class LinkManager {
}
}
- public static String getDashboardLink() {
+ public static String getDashboardsLink() {
if (GWT) {
return "#Dashboards";
} else {
@@ -162,6 +162,14 @@ public class LinkManager {
}
}
+ public static String getDashboardLink(int dashboardId) {
+ if (GWT) {
+ return "#Dashboards/" + dashboardId;
+ } else {
+ return "/Dashboard.do";
+ }
+ }
+
public static String getHubAllResourcesLink() {
if (GWT) {
return "#Inventory";
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 f652874..9a4970e 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
@@ -28,7 +28,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import com.google.gwt.user.client.History;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.util.BooleanCallback;
@@ -51,6 +50,7 @@ import org.rhq.core.domain.dashboard.DashboardPortlet;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.InitializableView;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
import org.rhq.enterprise.gui.coregui.client.PermissionsLoader;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
@@ -209,11 +209,11 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
/*
* do not record history item if initially loading the DashboardsView. if the selectedDashboardView is
- * null, suppression will prevent redirection from #Dashboard to #Dashboard/<id>, which would require
- * the user to hit the back button twice to return to the previous page.
+ * null, suppression will prevent redirection from #Dashboards to #Dashboards/dashboardId,
+ * which would require the user to hit the back button twice to return to the previous page.
*/
if (selectedDashboardView != null) {
- History.newItem("Dashboard/" + selectedTab.getName(), false);
+ CoreGUI.goToView(LinkManager.getDashboardLink(Integer.valueOf(selectedTab.getName())));
}
selectedDashboardView = (DashboardView) selectedTab.getPane();
@@ -224,11 +224,12 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
});
for (Dashboard dashboard : dashboards) {
- String dashboardName = dashboard.getName();
- String dashboardLocatorId = getDashboardLocatorId(dashboardName);
+ String dashboardName = String.valueOf(dashboard.getId());
+ String dashboardTitle = dashboard.getName();
+ String dashboardLocatorId = getDashboardLocatorId(dashboardTitle);
String locatorId = extendLocatorId(dashboardLocatorId);
DashboardView dashboardView = new DashboardView(locatorId, this, dashboard);
- Tab tab = new NamedTab(locatorId, new ViewName(dashboardName, dashboardName), null);
+ Tab tab = new NamedTab(locatorId, new ViewName(dashboardName, dashboardTitle), null);
tab.setPane(dashboardView);
tab.setCanClose(true);
@@ -365,13 +366,14 @@ public class DashboardsView extends LocatableVLayout implements BookmarkableView
}
public void onSuccess(Dashboard result) {
- String dashboardName = result.getName();
- dashboardsByName.put(dashboardName, result); // update map so name can not be reused
- String dashboardLocatorId = getDashboardLocatorId(dashboardName);
+ String dashboardName = String.valueOf(result.getId());
+ String dashboardTitle = result.getName();
+ dashboardsByName.put(dashboardTitle, result); // update map so name can not be reused
+ String dashboardLocatorId = getDashboardLocatorId(dashboardTitle);
DashboardView dashboardView = new DashboardView(extendLocatorId(dashboardLocatorId),
DashboardsView.this, result);
NamedTab tab = new NamedTab(extendLocatorId(dashboardLocatorId), new ViewName(dashboardName,
- dashboardName), null);
+ dashboardTitle), null);
tab.setPane(dashboardView);
tab.setCanClose(true);
13 years, 4 months