[rhq] 4 commits - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 65 +-
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java | 10
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 27 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java | 191 ++++---
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/ResourceGroupTitleBar.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java | 20
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java | 43 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java | 52 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java | 247 ++++++----
10 files changed, 432 insertions(+), 256 deletions(-)
New commits:
commit 77fdb652eb6ffd64f2a89800a3d9e03900b44f71
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Dec 20 21:50:25 2010 -0500
Group Authorization work
- enhanced AuthorizationManager to handle more group authz cases
- enhanced findResourceGroup[Composite]sByCriteria to handle more group
authz cases and to return proper resourcePermission for all cases,
for composites.
Group Context Menu work
- fixed issues in autogroup and clustergroup context menus
- added authz to the group context menus
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 4855575..e819c36 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
@@ -65,6 +65,15 @@ public class LinkManager {
}
}
+ public static String getAutoClusterTabLink(int autoClusterGroupId, String tabName, String subTabName) {
+ if (GWT) {
+ return "#ResourceGroup/AutoCluster/" + autoClusterGroupId + "/" + tabName
+ + ((null == subTabName) ? "" : ("/" + subTabName));
+ } else {
+ return "/rhq/group/inventory/view.xhtml?groupId=" + autoClusterGroupId;
+ }
+ }
+
public static String getResourceGroupTabLink(int resourceGroupId, String tabName, String subTabName) {
if (GWT) {
return "#ResourceGroup/" + resourceGroupId + "/" + tabName
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
index c6ce934..0b454bf 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
@@ -26,9 +26,6 @@ import java.util.EnumSet;
import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback;
-import com.smartgwt.client.widgets.Window;
-import com.smartgwt.client.widgets.events.CloseClickHandler;
-import com.smartgwt.client.widgets.events.CloseClientEvent;
import com.smartgwt.client.widgets.menu.Menu;
import com.smartgwt.client.widgets.menu.MenuItem;
import com.smartgwt.client.widgets.menu.MenuItemSeparator;
@@ -36,19 +33,19 @@ import com.smartgwt.client.widgets.menu.events.ClickHandler;
import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.criteria.ResourceTypeCriteria;
+import org.rhq.core.domain.criteria.ResourceGroupCriteria;
import org.rhq.core.domain.dashboard.Dashboard;
import org.rhq.core.domain.dashboard.DashboardPortlet;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.inventory.resource.graph.GraphPortlet;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
-import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
@@ -58,37 +55,70 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
*/
public class ResourceGroupContextMenu extends LocatableMenu {
+ private ResourceGroupComposite groupComposite;
+ private ResourceGroup group;
+ private ResourceType groupMemberType;
+
+ private boolean isAutoCluster = false;
private boolean isAutoGroup = false;
public ResourceGroupContextMenu(String locatorId) {
super(locatorId);
}
- public ResourceGroupContextMenu(String locatorId, boolean isAutoGroup) {
- super(locatorId);
- this.isAutoGroup = isAutoGroup;
- }
+ public void showContextMenu(final ResourceGroup group) {
+ // we need the group composite to access permissions for context menu authz, so get it now
+ ResourceGroupCriteria criteria = new ResourceGroupCriteria();
+ criteria.addFilterId(group.getId());
+
+ // for autoclusters and private groups (autogroups) we need to add more criteria
+ isAutoCluster = (null != group.getClusterResourceGroup());
+ isAutoGroup = (null != group.getSubject());
+
+ if (isAutoCluster) {
+ criteria.addFilterVisible(false);
+
+ } else if (isAutoGroup) {
+ criteria.addFilterVisible(false);
+ criteria.addFilterPrivate(true);
+ }
- private ResourceType currentType;
- //private ResourceGroup group;
- private ResourceGroup currentGroup;
+ GWTServiceLookup.getResourceGroupService().findResourceGroupCompositesByCriteria(criteria,
+ new AsyncCallback<PageList<ResourceGroupComposite>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_group_detail_failLoadComp(String.valueOf(group.getId())), caught);
+ }
+
+ public void onSuccess(PageList<ResourceGroupComposite> result) {
+ if (result.isEmpty()) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_group_detail_failLoadComp(String.valueOf(group.getId())));
+ } else {
+ showContextMenu(result.get(0));
+ }
+ }
+ });
+ }
- public void showContextMenu(ResourceGroup compatibleGroup) {
- this.currentType = compatibleGroup.getResourceType();
- this.currentGroup = compatibleGroup;
+ public void showContextMenu(ResourceGroupComposite groupComposite) {
+ this.groupComposite = groupComposite;
+ group = groupComposite.getResourceGroup();
+ groupMemberType = group.getResourceType();
+ isAutoCluster = (null != group.getClusterResourceGroup());
+ isAutoGroup = (null != group.getSubject());
ResourceTypeRepository.Cache.getInstance().getResourceTypes(
- currentType.getId(),
+ groupMemberType.getId(),
EnumSet.of(ResourceTypeRepository.MetadataType.operations, ResourceTypeRepository.MetadataType.children,
ResourceTypeRepository.MetadataType.subCategory,
ResourceTypeRepository.MetadataType.pluginConfigurationDefinition,
ResourceTypeRepository.MetadataType.resourceConfigurationDefinition),
new ResourceTypeRepository.TypeLoadedCallback() {
public void onTypesLoaded(ResourceType type) {
+ groupMemberType = type;
- currentType = type;
-
- buildResourceGroupContextMenu(currentGroup, type);
+ buildResourceGroupContextMenu(group, type);
showContextMenu();
}
});
@@ -105,87 +135,67 @@ public class ResourceGroupContextMenu extends LocatableMenu {
addItem(new MenuItemSeparator());
// plugin config
- MenuItem editPluginConfiguration = new MenuItem(MSG.view_tabs_common_connectionSettings());
- editPluginConfiguration.addClickHandler(new ClickHandler() {
+ MenuItem pluginConfiguration = new MenuItem(MSG.view_tabs_common_connectionSettings());
+ pluginConfiguration.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
if (isAutoGroup) {
CoreGUI.goToView(LinkManager.getAutoGroupTabLink(group.getId(), "Inventory", "ConnectionSettings"));
+ } else if (isAutoCluster) {
+ CoreGUI.goToView(LinkManager
+ .getAutoClusterTabLink(group.getId(), "Inventory", "ConnectionSettings"));
} else {
CoreGUI.goToView(LinkManager.getResourceGroupTabLink(group.getId(), "Inventory",
"ConnectionSettings"));
}
}
});
- editPluginConfiguration.setEnabled(resourceType.getPluginConfigurationDefinition() != null);
- addItem(editPluginConfiguration);
-
- MenuItem editResourceConfiguration = new MenuItem(MSG.view_tree_common_contextMenu_resourceConfiguration());
- editResourceConfiguration.addClickHandler(new ClickHandler() {
- public void onClick(MenuItemClickEvent event) {
- int groupId = group.getId();
- int resourceTypeId = resourceType.getId();
-
- final Window configEditor = new Window();
- configEditor.setTitle(MSG.view_tree_common_contextMenu_editResourceConfiguration(group.getName()));
- configEditor.setWidth(800);
- configEditor.setHeight(800);
- configEditor.setIsModal(true);
- configEditor.setShowModalMask(true);
- configEditor.setCanDragResize(true);
- configEditor.setShowResizer(true);
- configEditor.centerInPage();
- configEditor.addCloseClickHandler(new CloseClickHandler() {
- public void onCloseClick(CloseClientEvent closeClientEvent) {
- configEditor.destroy();
+ pluginConfiguration.setEnabled(resourceType.getPluginConfigurationDefinition() != null);
+ addItem(pluginConfiguration);
+
+ MenuItem resourceConfiguration = new MenuItem(MSG.view_tree_common_contextMenu_resourceConfiguration());
+ boolean enabled = groupComposite.getResourcePermission().isConfigureRead()
+ && resourceType.getResourceConfigurationDefinition() != null;
+ resourceConfiguration.setEnabled(enabled);
+ if (enabled) {
+ resourceConfiguration.addClickHandler(new ClickHandler() {
+ public void onClick(MenuItemClickEvent event) {
+ if (isAutoGroup) {
+ CoreGUI.goToView(LinkManager.getAutoGroupTabLink(group.getId(), "Configuration", "Current"));
+ } else if (isAutoCluster) {
+ CoreGUI.goToView(LinkManager.getAutoClusterTabLink(group.getId(), "Configuration", "Current"));
+ } else {
+ CoreGUI.goToView(LinkManager.getResourceGroupTabLink(group.getId(), "Inventory",
+ "ConnectionSettings"));
}
- });
- // TODO group config editor
- // configEditor.addItem(new ConfigurationEditor(resourceId, resourceTypeId,
- // ConfigurationEditor.ConfigType.resource));
- configEditor.show();
-
- }
- });
- editResourceConfiguration.setEnabled(resourceType.getResourceConfigurationDefinition() != null);
- addItem(editResourceConfiguration);
+ }
+ });
+ }
+ addItem(resourceConfiguration);
+ // separator
addItem(new MenuItemSeparator());
// Operations Menu
MenuItem operations = new MenuItem(MSG.view_tree_common_contextMenu_operations());
- Menu opSubMenu = new Menu();
- if (resourceType.getOperationDefinitions() != null) {
+ enabled = (groupComposite.getResourcePermission().isControl() && null != resourceType.getOperationDefinitions() && !resourceType
+ .getOperationDefinitions().isEmpty());
+ operations.setEnabled(enabled);
+ if (enabled) {
+ Menu opSubMenu = new Menu();
for (final OperationDefinition operationDefinition : resourceType.getOperationDefinitions()) {
MenuItem operationItem = new MenuItem(operationDefinition.getDisplayName());
operationItem.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
-
- // TODO Group version
- // ResourceCriteria criteria = new ResourceCriteria();
- // criteria.addFilterId(selectedResourceId);
- //
- // GWTServiceLookup.getResourceService().findResourcesByCriteria(criteria,
- // new AsyncCallback<PageList<Resource>>() {
- // public void onFailure(Throwable caught) {
- // CoreGUI.getErrorHandler()
- // .handleError("Failed to get resource to run operation", caught);
- // }
- //
- // public void onSuccess(PageList<Resource> result) {
- // new OperationCreateWizard(result.get(0), operationDefinition).startOperationWizard();
- // }
- // });
-
+ // TODO Group version, wizard invoke or tab nav?
}
});
opSubMenu.addItem(operationItem);
}
+ operations.setSubmenu(opSubMenu);
}
- operations.setEnabled(resourceType.getOperationDefinitions() != null
- && !resourceType.getOperationDefinitions().isEmpty());
- operations.setSubmenu(opSubMenu);
addItem(operations);
+ // Metric graph addition menu
addItem(buildMetricsMenu(resourceType));
/* TODO: We don't support group factory create
@@ -227,6 +237,7 @@ public class ResourceGroupContextMenu extends LocatableMenu {
*/
}
+ /*
private void loadManuallyAddServersToPlatforms(final Menu manuallyAddMenu) {
ResourceTypeGWTServiceAsync rts = GWTServiceLookup.getResourceTypeGWTService();
@@ -248,6 +259,7 @@ public class ResourceGroupContextMenu extends LocatableMenu {
}
});
}
+ */
private MenuItem buildMetricsMenu(final ResourceType type) {
MenuItem measurements = new MenuItem(MSG.view_tree_common_contextMenu_measurements());
@@ -279,7 +291,7 @@ public class ResourceGroupContextMenu extends LocatableMenu {
DashboardPortlet p = new DashboardPortlet(def.getDisplayName() + " "
+ MSG.view_tree_common_contextMenu_chart(), GraphPortlet.KEY, 250);
p.getConfiguration().put(
- new PropertySimple(GraphPortlet.CFG_RESOURCE_GROUP_ID, currentGroup.getId()));
+ new PropertySimple(GraphPortlet.CFG_RESOURCE_GROUP_ID, group.getId()));
p.getConfiguration().put(
new PropertySimple(GraphPortlet.CFG_DEFINITION_ID, def.getId()));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java
index de0f1ea..a056ca1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java
@@ -74,6 +74,7 @@ public class ResourceGroupTreeView extends LocatableVLayout implements Bookmarka
private ViewId currentViewId;
private int rootGroupId;
private int selectedGroupId;
+ private String selectedNodeId;
private ResourceGroupTreeContextMenu contextMenu;
@@ -111,8 +112,9 @@ public class ResourceGroupTreeView extends LocatableVLayout implements Bookmarka
treeGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
@Override
public void onSelectionChanged(SelectionEvent selectionEvent) {
- if (selectionEvent.getState()) {
+ if (!selectionEvent.isRightButtonDown() && selectionEvent.getState()) {
Record selectedNode = selectionEvent.getRecord();
+ selectedNodeId = selectedNode.getAttribute("id");
com.allen_sauer.gwt.log.client.Log.info("Node selected in tree: " + selectedNode);
ResourceType type = (ResourceType) selectedNode.getAttributeAsObject("resourceType");
if (type != null) {
@@ -138,9 +140,15 @@ public class ResourceGroupTreeView extends LocatableVLayout implements Bookmarka
treeGrid.addNodeContextClickHandler(new NodeContextClickHandler() {
public void onNodeContextClick(final NodeContextClickEvent event) {
- event.getNode();
+ // stop the browser right-click menu
event.cancel();
+ // don't select the node on a right click, since we're not navigating to it
+ treeGrid.deselectRecord(event.getNode());
+ if (null != selectedNodeId) {
+ treeGrid.selectRecord(treeGrid.getTree().findById(selectedNodeId));
+ }
+
contextMenu.showContextMenu(event.getNode());
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
index b636b38..9cebc97 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
@@ -85,6 +85,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.factory.Resource
import org.rhq.enterprise.gui.coregui.client.inventory.resource.factory.ResourceFactoryImportWizard;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -136,8 +137,8 @@ public class ResourceTreeView extends LocatableVLayout {
treeGrid.setLeaveScrollbarGap(false);
- resourceContextMenu = new Menu();
- autoGroupContextMenu = new ResourceGroupContextMenu(extendLocatorId("autoGroupContextMenu"), true);
+ resourceContextMenu = new LocatableMenu(extendLocatorId("resourceContextMenu"));
+ autoGroupContextMenu = new ResourceGroupContextMenu(extendLocatorId("autoGroupContextMenu"));
treeGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
@@ -383,35 +384,36 @@ public class ResourceTreeView extends LocatableVLayout {
resourceContextMenu.addItem(new MenuItemSeparator());
// plugin config
- MenuItem editPluginConfiguration = new MenuItem(MSG.view_tabs_common_connectionSettings());
- editPluginConfiguration.addClickHandler(new ClickHandler() {
+ MenuItem pluginConfiguration = new MenuItem(MSG.view_tabs_common_connectionSettings());
+ pluginConfiguration.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
CoreGUI.goToView(LinkManager.getResourceTabLink(resource.getId(), "Inventory", "ConnectionSettings"));
}
});
- editPluginConfiguration.setEnabled(resourceType.getPluginConfigurationDefinition() != null);
- resourceContextMenu.addItem(editPluginConfiguration);
+ pluginConfiguration.setEnabled(resourceType.getPluginConfigurationDefinition() != null);
+ resourceContextMenu.addItem(pluginConfiguration);
// resource config
- MenuItem editResourceConfiguration = new MenuItem(MSG.view_tree_common_contextMenu_resourceConfiguration());
+ MenuItem resourceConfiguration = new MenuItem(MSG.view_tree_common_contextMenu_resourceConfiguration());
boolean enabled = resourcePermission.isConfigureRead()
&& resourceType.getResourceConfigurationDefinition() != null;
- editResourceConfiguration.setEnabled(enabled);
+ resourceConfiguration.setEnabled(enabled);
if (enabled) {
- editResourceConfiguration.addClickHandler(new ClickHandler() {
+ resourceConfiguration.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
CoreGUI.goToView(LinkManager.getResourceTabLink(resource.getId(), "Configuration", "Current"));
}
});
}
- resourceContextMenu.addItem(editResourceConfiguration);
+ resourceContextMenu.addItem(resourceConfiguration);
// separator
resourceContextMenu.addItem(new MenuItemSeparator());
// Operations Menu
MenuItem operations = new MenuItem(MSG.view_tree_common_contextMenu_operations());
- enabled = (resourcePermission.isControl() && !resourceType.getOperationDefinitions().isEmpty());
+ enabled = (resourcePermission.isControl() && null == resourceType.getOperationDefinitions() && !resourceType
+ .getOperationDefinitions().isEmpty());
operations.setEnabled(enabled);
if (enabled) {
Menu opSubMenu = new Menu();
@@ -419,29 +421,10 @@ public class ResourceTreeView extends LocatableVLayout {
MenuItem operationItem = new MenuItem(operationDefinition.getDisplayName());
operationItem.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
- int resourceId = ((ResourceTreeNode) treeGrid.getTree().findById(selectedNodeId)).getResource()
- .getId();
-
- ResourceCriteria criteria = new ResourceCriteria();
- criteria.addFilterId(resourceId);
-
- GWTServiceLookup.getResourceService().findResourcesByCriteria(criteria,
- new AsyncCallback<PageList<Resource>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_tree_common_contextMenu_operations_loadFailed(), caught);
- }
-
- public void onSuccess(PageList<Resource> result) {
- new OperationCreateWizard(result.get(0), operationDefinition)
- .startOperationWizard();
- }
- });
-
+ new OperationCreateWizard(resource, operationDefinition).startOperationWizard();
}
});
opSubMenu.addItem(operationItem);
- // todo action
}
operations.setSubmenu(opSubMenu);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
index 1da673c..d7eb82f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
@@ -18,7 +18,6 @@
*/
package org.rhq.enterprise.server.authz;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
@@ -33,7 +32,6 @@ import javax.persistence.Query;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Permission.Target;
-import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.server.RHQConstants;
@@ -69,16 +67,35 @@ public class AuthorizationManagerBean implements AuthorizationManagerLocal {
@SuppressWarnings("unchecked")
public Set<Permission> getExplicitGroupPermissions(Subject subject, int groupId) {
- Query query = entityManager.createNamedQuery(Subject.QUERY_GET_PERMISSIONS_BY_GROUP_ID);
- query.setParameter("subject", subject);
- query.setParameter("groupId", groupId);
- List<Permission> intermediate = query.getResultList();
- Set<Permission> results = new HashSet<Permission>();
- for (Permission permission : intermediate) {
- results.add(permission);
+ Set<Permission> result = new HashSet<Permission>();
+
+ ResourceGroup group = entityManager.find(ResourceGroup.class, groupId);
+ Subject owner = group.getSubject();
+
+ if (null == owner) {
+ // role-owned group
+ Query query = entityManager.createNamedQuery(Subject.QUERY_GET_PERMISSIONS_BY_GROUP_ID);
+ query.setParameter("subject", subject);
+ query.setParameter("groupId", groupId);
+ List<Permission> resultList = query.getResultList();
+ for (Permission permission : resultList) {
+ result.add(permission);
+ }
+
+ } else {
+ // don't let a user other than the owner do anything with this group
+ if (subject.equals(owner)) {
+ Query query = entityManager.createNamedQuery(Subject.QUERY_GET_PERMISSIONS_BY_PRIVATE_GROUP_ID);
+ query.setParameter("subjectId", subject.getId());
+ query.setParameter("privateGroupId", groupId);
+ List<Object[]> resultList = query.getResultList();
+ for (Object[] row : resultList) {
+ result.add((Permission) row[0]);
+ }
+ }
}
- return results;
+ return result;
}
public Set<Permission> getImplicitGroupPermissions(Subject subject, int groupId) {
@@ -119,6 +136,7 @@ public class AuthorizationManagerBean implements AuthorizationManagerLocal {
return (count != 0);
}
+ @SuppressWarnings("unchecked")
public boolean hasGroupPermission(Subject subject, Permission permission, int groupId) {
if (isInventoryManager(subject)) {
return true;
@@ -142,14 +160,12 @@ public class AuthorizationManagerBean implements AuthorizationManagerLocal {
return false;
}
- // subject-owned group, requires perm check against each group member
- Set<Resource> members = group.getExplicitResources();
- List<Integer> memberIds = new ArrayList<Integer>(members.size());
- for (Resource member : members) {
- memberIds.add(member.getId());
- }
-
- return hasResourcePermission(owner, permission, memberIds);
+ Query query = entityManager.createNamedQuery(Subject.QUERY_HAS_PRIVATE_GROUP_PERMISSION);
+ query.setParameter("subjectId", subject.getId());
+ query.setParameter("permission", permission);
+ query.setParameter("privateGroupId", groupId);
+ List<Object[]> resultList = query.getResultList();
+ return (!resultList.isEmpty());
}
}
commit bd452aa44978444ceb728ea14ba166656744f995
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Mon Dec 20 12:20:32 2010 -0500
Fix longstanding bug where authz to resources could be denied if any of the
resources were available via multiple groups to the user.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index f870539..182b74b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -153,12 +153,11 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
+ " JOIN r.permissions p " //
+ " JOIN r.subjects s " //
+ " WHERE s.id = :subjectId and p = :permission ) ) "),
-
@NamedQuery(name = Subject.QUERY_CAN_VIEW_RESOURCE, query = "SELECT COUNT(res) "
+ "FROM Resource res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.subjects) s "
+ "WHERE s = :subject AND res.id = :resourceId"),
- @NamedQuery(name = Subject.QUERY_CAN_VIEW_RESOURCES, query = "SELECT DISTINCT COUNT(res) "
+ @NamedQuery(name = Subject.QUERY_CAN_VIEW_RESOURCES, query = "SELECT COUNT(DISTINCT res) "
+ "FROM Resource res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.subjects) s "
+ "WHERE s = :subject AND res.id IN (:resourceIds)"),
@@ -247,6 +246,7 @@ public class Subject implements Serializable {
public static final String QUERY_HAS_RESOURCE_PERMISSION = "Subject.hasResourcePermission";
public static final String QUERY_HAS_AUTO_GROUP_PERMISSION = "Subject.hasAutoGroupPermission";
+ /** This query can return more than 1 if the resource is accessible via separate groups */
public static final String QUERY_CAN_VIEW_RESOURCE = "Subject.canViewResource";
public static final String QUERY_CAN_VIEW_RESOURCES = "Subject.canViewResources";
public static final String QUERY_CAN_VIEW_GROUP = "Subject.canViewGroup";
commit 45752848315ab7ddb587566059558ab77523c5f7
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Dec 17 17:56:12 2010 -0500
Work for autogroup and autocluster context menu rendering, navigation and
authorization.
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 46b4e41..4855575 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
@@ -56,6 +56,24 @@ public class LinkManager {
}
}
+ public static String getAutoGroupTabLink(int autoGroupId, String tabName, String subTabName) {
+ if (GWT) {
+ return "#Resource/AutoGroup/" + autoGroupId + "/" + tabName
+ + ((null == subTabName) ? "" : ("/" + subTabName));
+ } else {
+ return "/rhq/group/inventory/view.xhtml?groupId=" + autoGroupId;
+ }
+ }
+
+ public static String getResourceGroupTabLink(int resourceGroupId, String tabName, String subTabName) {
+ if (GWT) {
+ return "#ResourceGroup/" + resourceGroupId + "/" + tabName
+ + ((null == subTabName) ? "" : ("/" + subTabName));
+ } else {
+ return "/rhq/group/inventory/view.xhtml?groupId=" + resourceGroupId;
+ }
+ }
+
public static String getGroupPluginConfigurationUpdateHistoryLink(int groupId) {
return getResourceGroupLink(groupId) + "/Inventory/ConnectionSettingsHistory";
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
index 972ba73..c6ce934 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupContextMenu.java
@@ -45,6 +45,7 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.inventory.resource.graph.GraphPortlet;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.ResourceTypeGWTServiceAsync;
@@ -57,10 +58,17 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableMenu;
*/
public class ResourceGroupContextMenu extends LocatableMenu {
+ private boolean isAutoGroup = false;
+
public ResourceGroupContextMenu(String locatorId) {
super(locatorId);
}
+ public ResourceGroupContextMenu(String locatorId, boolean isAutoGroup) {
+ super(locatorId);
+ this.isAutoGroup = isAutoGroup;
+ }
+
private ResourceType currentType;
//private ResourceGroup group;
private ResourceGroup currentGroup;
@@ -84,33 +92,28 @@ public class ResourceGroupContextMenu extends LocatableMenu {
showContextMenu();
}
});
-
}
private void buildResourceGroupContextMenu(final ResourceGroup group, final ResourceType resourceType) {
+ // name
setItems(new MenuItem(group.getName()));
+ // type name
addItem(new MenuItem("Type: " + resourceType.getName()));
+ // separator
+ addItem(new MenuItemSeparator());
+
+ // plugin config
MenuItem editPluginConfiguration = new MenuItem(MSG.view_tabs_common_connectionSettings());
editPluginConfiguration.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
- int groupId = group.getId();
- int resourceTypeId = resourceType.getId();
-
- Window configEditor = new Window();
- // configEditor.setTitle("Edit " + group.getName() + " plugin configuration");
- configEditor.setWidth(800);
- configEditor.setHeight(800);
- configEditor.setIsModal(true);
- configEditor.setShowModalMask(true);
- configEditor.setCanDragResize(true);
- configEditor.centerInPage();
- // TODO Group config editor
- // configEditor.addItem(new ConfigurationEditor(resourceId, resourceTypeId,
- // ConfigurationEditor.ConfigType.plugin));
- configEditor.show();
-
+ if (isAutoGroup) {
+ CoreGUI.goToView(LinkManager.getAutoGroupTabLink(group.getId(), "Inventory", "ConnectionSettings"));
+ } else {
+ CoreGUI.goToView(LinkManager.getResourceGroupTabLink(group.getId(), "Inventory",
+ "ConnectionSettings"));
+ }
}
});
editPluginConfiguration.setEnabled(resourceType.getPluginConfigurationDefinition() != null);
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 9cd3ded..8c4d6a2 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
@@ -280,8 +280,8 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
private void updateInventoryTab(int groupId, Set<ResourceTypeFacet> facets) {
// Inventory tab is always visible and enabled.
- boolean canModifyMembers = (!isAutoGroup() && !isAutoCluster()
- && globalPermissions.contains(Permission.MANAGE_INVENTORY));
+ boolean canModifyMembers = (!isAutoGroup() && !isAutoCluster() && globalPermissions
+ .contains(Permission.MANAGE_INVENTORY));
updateSubTab(this.inventoryTab, this.inventoryMembers, new MembersView(this.inventoryMembers
.extendLocatorId("View"), groupId, canModifyMembers), true, true);
updateSubTab(this.inventoryTab, this.inventoryConn, new CurrentGroupPluginConfigurationView(this.inventoryConn
@@ -310,14 +310,15 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
.extendLocatorId("View"), groupComposite), true, true);
// but alert definitions can only be created on compatible groups
boolean visible = (groupCategory == GroupCategory.COMPATIBLE);
- Canvas canvas = (visible) ? new GroupAlertDefinitionsView(alertDef.extendLocatorId("View"), this.groupComposite)
- : null;
+ Canvas canvas = (visible) ? new GroupAlertDefinitionsView(alertDef.extendLocatorId("View"),
+ this.groupComposite) : null;
updateSubTab(this.alertsTab, this.alertDef, canvas, visible, true);
}
}
private void updateConfigurationTab(int groupId, GroupCategory groupCategory, Set<ResourceTypeFacet> facets) {
- boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.CONFIGURATION));
+ boolean visible = (groupCategory == GroupCategory.COMPATIBLE && facets
+ .contains(ResourceTypeFacet.CONFIGURATION));
Set<Permission> groupPermissions = this.groupComposite.getResourcePermission().getPermissions();
if (updateTab(this.configurationTab, visible, visible && groupPermissions.contains(Permission.CONFIGURE_READ))) {
//updateSubTab(this.configurationTab, this.configCurrent, new FullHTMLPane(
@@ -331,10 +332,10 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
}
private void updateEventsTab(ResourceGroupComposite groupComposite, GroupCategory groupCategory,
- Set<ResourceTypeFacet> facets) {
+ Set<ResourceTypeFacet> facets) {
// allow mixed groups to show events from supporting resources
- boolean visible = (groupCategory == GroupCategory.MIXED
- || (groupCategory == GroupCategory.COMPATIBLE && facets.contains(ResourceTypeFacet.EVENT)));
+ boolean visible = (groupCategory == GroupCategory.MIXED || (groupCategory == GroupCategory.COMPATIBLE && facets
+ .contains(ResourceTypeFacet.EVENT)));
if (updateTab(this.eventsTab, visible, true)) {
updateSubTab(this.eventsTab, this.eventHistory, EventCompositeHistoryView.get(this.eventHistory
.extendLocatorId("View"), groupComposite), true, true);
@@ -354,10 +355,10 @@ public class ResourceGroupDetailView extends AbstractTwoLevelTabSetView<Resource
// for autoclusters and autogroups we need to add more criteria
if (isAutoCluster()) {
- criteria.addFilterVisible(null);
+ criteria.addFilterVisible(false);
} else if (isAutoGroup()) {
- criteria.addFilterVisible(null);
+ criteria.addFilterVisible(false);
criteria.addFilterPrivate(true);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
index 3940108..042311b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTitleBar.java
@@ -113,9 +113,9 @@ public class ResourceGroupTitleBar extends LocatableVLayout {
criteria.addFilterId(this.group.getId());
// for autoclusters and autogroups we need to add more criteria
if (isAutoCluster) {
- criteria.addFilterVisible(null);
+ criteria.addFilterVisible(false);
} else if (isAutoGroup) {
- criteria.addFilterVisible(null);
+ criteria.addFilterVisible(false);
criteria.addFilterPrivate(true);
}
@@ -200,7 +200,13 @@ public class ResourceGroupTitleBar extends LocatableVLayout {
private void loadTags(final TagEditorView tagEditorView) {
ResourceGroupCriteria criteria = new ResourceGroupCriteria();
criteria.addFilterId(group.getId());
- criteria.addFilterVisible(null); // default is only visible groups, null to support auto-cluster-groups
+ // for autoclusters and autogroups we need to add more criteria
+ if (isAutoCluster) {
+ criteria.addFilterVisible(false);
+ } else if (isAutoGroup) {
+ criteria.addFilterVisible(false);
+ criteria.addFilterPrivate(true);
+ }
criteria.fetchTags(true);
GWTServiceLookup.getResourceGroupService().findResourceGroupsByCriteria(criteria,
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java
index 0684946..de0f1ea 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupTreeView.java
@@ -147,12 +147,12 @@ public class ResourceGroupTreeView extends LocatableVLayout implements Bookmarka
}
- public void setSelectedGroup(final int groupId) {
+ public void setSelectedGroup(final int groupId, boolean isAutoCluster) {
this.selectedGroupId = groupId;
ResourceGroupCriteria criteria = new ResourceGroupCriteria();
criteria.addFilterId(groupId);
- criteria.addFilterVisible(null);
+ criteria.addFilterVisible(Boolean.valueOf(!isAutoCluster));
criteria.fetchResourceType(true);
GWTServiceLookup.getResourceGroupService().findResourceGroupsByCriteria(criteria,
@@ -422,11 +422,11 @@ public class ResourceGroupTreeView extends LocatableVLayout implements Bookmarka
currentViewId = viewPath.getNext();
String clusterGroupIdString = currentViewId.getPath();
Integer clusterGroupId = Integer.parseInt(clusterGroupIdString);
- setSelectedGroup(clusterGroupId);
+ setSelectedGroup(clusterGroupId, true);
} else {
String groupIdString = currentViewId.getPath();
int groupId = Integer.parseInt(groupIdString);
- setSelectedGroup(groupId);
+ setSelectedGroup(groupId, false);
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
index a0d233d..b636b38 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
@@ -137,7 +137,7 @@ public class ResourceTreeView extends LocatableVLayout {
treeGrid.setLeaveScrollbarGap(false);
resourceContextMenu = new Menu();
- autoGroupContextMenu = new ResourceGroupContextMenu(extendLocatorId("autoGroupContextMenu"));
+ autoGroupContextMenu = new ResourceGroupContextMenu(extendLocatorId("autoGroupContextMenu"), true);
treeGrid.addSelectionChangedHandler(new SelectionChangedHandler() {
public void onSelectionChanged(SelectionEvent selectionEvent) {
commit e6bd91db98a6a711979d6d22cb8b221ebe532a9d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Dec 17 17:55:17 2010 -0500
Group Authz work to cover role-owned (typical), subject-owned (private,
like an auto-group backing group, and auto-cluster backing groups
(role-owned, but by the root clusterResourceGroup (i.e. the recursive
compatible resource group)).
This includes work in AuthorizationManager and ResourceGroupManager. It depends on
pending work in CriteriaQueryGenerator.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index e2447cd..f870539 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -63,14 +63,17 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
+ " WHERE s.id IN ( :ids ) " //
+ " AND s.fsystem = FALSE " //
+ " AND s.factive = TRUE"),
+
@NamedQuery(name = Subject.QUERY_FIND_ALL, query = "" //
+ "SELECT s " //
+ " FROM Subject s " //
+ " WHERE s.fsystem = false"),
+
@NamedQuery(name = Subject.QUERY_FIND_BY_NAME, query = "" //
+ "SELECT s " //
+ " FROM Subject s " //
+ " WHERE s.name = :name"),
+
@NamedQuery(name = Subject.QUERY_GET_SUBJECTS_ASSIGNED_TO_ROLE, query = "" //
+ "SELECT s " //
+ " FROM Subject s " //
@@ -94,18 +97,41 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
+ "FROM Role r JOIN r.subjects s JOIN r.permissions p "
+ "WHERE "
+ " ("
- + " r in (SELECT r2 from ResourceGroup g JOIN g.roles r2 WHERE g.id = :groupId) "
+ + " r in (SELECT r2 from ResourceGroup g JOIN g.roles r2 WHERE g.id = :groupId) "
+ " OR r in (SELECT r3 from ResourceGroup g JOIN g.clusterResourceGroup crg JOIN crg.roles r3 WHERE g.id = :groupId AND crg.recursive = true) "
+ " ) " + " AND s = :subject"),
+ @NamedQuery(name = Subject.QUERY_GET_PERMISSIONS_BY_PRIVATE_GROUP_ID, query = "" //
+ + "SELECT p, count(distinct res.id) " //
+ + " FROM ResourceGroup rg, IN (rg.explicitResources) res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.permissions) p " //
+ + " WHERE rg.id = :privateGroupId " //
+ + " AND rg.subject.id = :subjectId " //
+ + " GROUP BY p " //
+ + " HAVING count(distinct res.id) = " //
+ + " ( SELECT count(*) " //
+ + " FROM ResourceGroup g2 JOIN g2.explicitResources res2 " //
+ + " WHERE g2.id = :privateGroupId )"),
+
@NamedQuery(name = Subject.QUERY_HAS_GROUP_PERMISSION, query = "SELECT count(r) "
+ "FROM Role r JOIN r.subjects s JOIN r.permissions p "
+ "WHERE "
+ " ("
- + " r in (SELECT r2 from ResourceGroup g JOIN g.roles r2 WHERE g.id = :groupId) "
+ + " r in (SELECT r2 from ResourceGroup g JOIN g.roles r2 WHERE g.id = :groupId) "
+ " OR r in (SELECT r3 from ResourceGroup g JOIN g.clusterResourceGroup crg JOIN crg.roles r3 WHERE g.id = :groupId AND crg.recursive = true) "
+ " ) " + " AND s = :subject " + " AND p = :permission"),
+ @NamedQuery(name = Subject.QUERY_HAS_PRIVATE_GROUP_PERMISSION, query = "" //
+ + "SELECT p, count(distinct res.id) " //
+ + " FROM ResourceGroup rg, IN (rg.explicitResources) res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.permissions) p " //
+ + " WHERE rg.id = :privateGroupId " //
+ + " AND rg.subject.id = :subjectId " //
+ + " AND p = :permission " //
+ + " GROUP BY p " //
+ + " HAVING count(distinct res.id) = " //
+ + " ( SELECT count(*) " //
+ + " FROM ResourceGroup g2 JOIN g2.explicitResources res2 " //
+ + " WHERE g2.id = :privateGroupId )"),
+
@NamedQuery(name = Subject.QUERY_GET_PERMISSIONS_BY_RESOURCE_ID, query = "SELECT distinct p "
+ "FROM Resource res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.subjects) s, IN (r.permissions) p "
+ "WHERE s = :subject AND res.id = :resourceId"),
@@ -114,6 +140,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
+ "FROM Resource res, IN (res.implicitGroups) g, IN (g.roles) r, IN (r.subjects) s, IN (r.permissions) p "
+ "WHERE s = :subject AND res.id = :resourceId AND p = :permission"),
+ //@Deprecated
@NamedQuery(name = Subject.QUERY_HAS_AUTO_GROUP_PERMISSION, query = "" //
+ "SELECT COUNT(res.id) " //
+ " FROM Resource res " //
@@ -138,19 +165,20 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
@NamedQuery(name = Subject.QUERY_CAN_VIEW_GROUP, query = "" //
+ "SELECT count(g) " //
+ " FROM ResourceGroup g " //
- + " WHERE (g.id IN (SELECT rg.id " //
- + " FROM ResourceGroup rg " //
- + " JOIN rg.roles r " //
- + " JOIN r.subjects s " //
- + " WHERE s = :subject) " //
- + " OR g.id IN (SELECT rg.id " //
- + " FROM ResourceGroup rg " //
- + " JOIN rg.clusterResourceGroup crg " //
- + " JOIN crg.roles r " //
- + " JOIN r.subjects s " //
- + " WHERE crg.recursive = true AND s = :subject)) " //
- + " AND g.id = :groupId"),
-
+ + " WHERE g.id = :groupId " //
+ + " AND ( g.subject = :subject " // private group case (autogroup backing group)
+ + " OR g.id IN (SELECT rg.id " // role-associated group case
+ + " FROM ResourceGroup rg " //
+ + " JOIN rg.roles r " //
+ + " JOIN r.subjects s " //
+ + " WHERE s = :subject) " //
+ + " OR g.id IN (SELECT rg.id " // autocluster backing group case
+ + " FROM ResourceGroup rg " //
+ + " JOIN rg.clusterResourceGroup crg " //
+ + " JOIN crg.roles r " //
+ + " JOIN r.subjects s " //
+ + " WHERE crg.recursive = true AND s = :subject))"),
+ // @Deprecated
@NamedQuery(name = Subject.QUERY_CAN_VIEW_AUTO_GROUP, query = "" //
+ "SELECT COUNT(res.id) " //
+ " FROM Resource res " //
@@ -209,10 +237,13 @@ public class Subject implements Serializable {
public static final String QUERY_GET_GLOBAL_PERMISSIONS = "Subject.getGlobalPermissions";
public static final String QUERY_GET_PERMISSIONS_BY_GROUP_ID = "Subject.getPermissionsByGroup";
+ public static final String QUERY_GET_PERMISSIONS_BY_PRIVATE_GROUP_ID = "Subject.getPermissionsByPrivateGroup";
public static final String QUERY_GET_PERMISSIONS_BY_RESOURCE_ID = "Subject.getPermissionsByResource";
+ public static final String QUERY_ROLES_BY_RESOURCE_IDS = "Subject.getRolesByResources";
public static final String QUERY_HAS_GLOBAL_PERMISSION = "Subject.hasGlobalPermission";
public static final String QUERY_HAS_GROUP_PERMISSION = "Subject.hasGroupPermission";
+ public static final String QUERY_HAS_PRIVATE_GROUP_PERMISSION = "Subject.hasPrivateGroupPermission";
public static final String QUERY_HAS_RESOURCE_PERMISSION = "Subject.hasResourcePermission";
public static final String QUERY_HAS_AUTO_GROUP_PERMISSION = "Subject.hasAutoGroupPermission";
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
index 09eccfc..6f99a24 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/ResourceGroupCriteria.java
@@ -220,10 +220,20 @@ public class ResourceGroupCriteria extends TaggedCriteria {
return (Boolean.TRUE.equals(this.filterPrivate));
}
+ /**
+ * @param filterVisible not null. A single fetch may be for visible or invisible groups, but not both.
+ */
public void addFilterVisible(Boolean filterVisible) {
+ if (null == filterVisible) {
+ throw new IllegalArgumentException("A single fetch may be for visible or invisible groups, but not both.");
+ }
this.filterVisible = filterVisible;
}
+ public boolean isFilterVisible() {
+ return (Boolean.TRUE.equals(this.filterVisible));
+ }
+
public void addFilterIds(Integer... filterIds) {
this.filterIds = CriteriaUtils.getListIgnoringNulls(filterIds);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
index 3208c7e..a6c26e2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -1003,82 +1004,6 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
return (int) count;
}
- /**
- * This method adheres to all of the regular semantics of {@link Criteria}-based queries. In other words,
- * all of the methods on the {@link Criteria} object - including paging, sorting, filtering, fetching - will
- * work with this method. The only thing that differs is the ResultSet which, instead of being a collection
- * of {@link ResourceGroup} objects is a collection of {@link ResourceGroupComposite} objects.
- *
- * The extended data in the composite object, however, is treated differently:
- *
- * 1) It is always fetched
- * 2) It can not be a candidate for filtering
- * 3) It must be sorted by using the zero-based positional ordinal within the projection
- *
- * This method offers 4 new aggregates that you can sort on. The
- *
- * explicitCount (ordinal 0) - the count of the number of children in the group
- * explicitAvail (ordinal 1) - decimal percentage representing the number of UP children relative to the total
- * number of children in the group
- * implicitCount (ordinal 2) - the count of the number of descendents in the group
- * implicitAvail (ordinal 3) - decimal percentage representing the number of UP descendents relative to the total
- * number of descendents in the group
- */
- public PageList<ResourceGroupComposite> findResourceGroupCompositesByCriteria(Subject subject,
- ResourceGroupCriteria criteria) {
-
- Set<Permission> userGlobalPermissions = authorizationManager.getExplicitGlobalPermissions(subject);
-
- String compositeProjection;
- if (userGlobalPermissions.contains(Permission.MANAGE_INVENTORY)) {
- compositeProjection = ""
- + " new org.rhq.core.domain.resource.group.composite.ResourceGroupComposite( "
- + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitCount," // explicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitAvail," // explicit member availability
- + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitCount," // implicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitAvail," // implicit member availability
- + " %alias% ) "; // ResourceGroup
- } else {
- compositeProjection = ""
- + " new org.rhq.core.domain.resource.group.composite.ResourceGroupComposite( "
- + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitCount," // explicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitAvail," // explicit member availability
- + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitCount," // implicit member count
- + " ( SELECT AVG(avail.availabilityType) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitAvail," // implicit member availability
- + " %alias%, " // ResourceGroup
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 8 ), " // MANAGE_MEASUREMENTS
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 4 ), " // MODIFY_RESOURCE
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 10 ), " // CONTROL
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 7 ), " // MANAGE_ALERTS
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 14 ), " // MANAGE_EVENTS
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 13 ), " // CONFIGURE_READ
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 11 ), " // CONFIGURE_WRITE
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 9 ), " // MANAGE_CONTENT
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 6 ), " // CREATE_CHILD_RESOURCES
- + " ( SELECT count(p) FROM %alias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 5 ))"; // DELETE_RESOURCES
- compositeProjection = compositeProjection.replace("%subjectId%", String.valueOf(subject.getId()));
- }
- compositeProjection = compositeProjection.replace("%alias%", criteria.getAlias());
-
- CriteriaQueryGenerator generator = getCriteriaQueryGenerator(subject, criteria, userGlobalPermissions);
- generator.alterProjection(compositeProjection);
-
- CriteriaQueryRunner<ResourceGroupComposite> queryRunner = new CriteriaQueryRunner<ResourceGroupComposite>(
- criteria, generator, entityManager, false); // don't auto-init bags, we're returning composites not entities
- PageList<ResourceGroupComposite> results = queryRunner.execute();
-
- for (ResourceGroupComposite composite : results) {
- ResourceGroup group = composite.getResourceGroup();
- ResourceType type = group.getResourceType();
- ResourceFacets facets = (type != null) ? resourceTypeManager.getResourceFacets(type.getId())
- : ResourceFacets.NONE;
-
- queryRunner.initFetchFields(group); // manual field fetch for composite-wrapped entity
- composite.setResourceFacets(facets);
- }
- return results;
- }
-
// note, resourceId and groupId can both be NULL, and so must use the numeric wrapper classes
public PageList<ResourceGroupComposite> findResourceGroupComposites(Subject subject, GroupCategory groupCategory,
ResourceCategory resourceCategory, String resourceTypeName, String pluginName, String nameFilter,
@@ -1503,32 +1428,151 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
@SuppressWarnings("unchecked")
public PageList<ResourceGroup> findResourceGroupsByCriteria(Subject subject, ResourceGroupCriteria criteria) {
- Set<Permission> globalUserPerms = authorizationManager.getExplicitGlobalPermissions(subject);
- CriteriaQueryGenerator generator = getCriteriaQueryGenerator(subject, criteria, globalUserPerms);
+ CriteriaAuthzType authzType = getCriteriaAuthzType(subject, criteria);
+
+ CriteriaQueryGenerator generator = getCriteriaQueryGenerator(subject, criteria, authzType);
CriteriaQueryRunner<ResourceGroup> queryRunner = new CriteriaQueryRunner(criteria, generator, entityManager);
+
PageList<ResourceGroup> result = queryRunner.execute();
+
return result;
}
- private CriteriaQueryGenerator getCriteriaQueryGenerator(Subject subject, ResourceGroupCriteria criteria,
- Set<Permission> globalUserPerms) {
+ /**
+ * This method adheres to all of the regular semantics of {@link Criteria}-based queries. In other words,
+ * all of the methods on the {@link Criteria} object - including paging, sorting, filtering, fetching - will
+ * work with this method. The only thing that differs is the ResultSet which, instead of being a collection
+ * of {@link ResourceGroup} objects is a collection of {@link ResourceGroupComposite} objects.
+ *
+ * The extended data in the composite object, however, is treated differently:
+ *
+ * 1) It is always fetched
+ * 2) It can not be a candidate for filtering
+ * 3) It must be sorted by using the zero-based positional ordinal within the projection
+ *
+ * This method offers 4 new aggregates that you can sort on. The
+ *
+ * explicitCount (ordinal 0) - the count of the number of children in the group
+ * explicitAvail (ordinal 1) - decimal percentage representing the number of UP children relative to the total
+ * number of children in the group
+ * implicitCount (ordinal 2) - the count of the number of descendents in the group
+ * implicitAvail (ordinal 3) - decimal percentage representing the number of UP descendents relative to the total
+ * number of descendents in the group
+ */
+ public PageList<ResourceGroupComposite> findResourceGroupCompositesByCriteria(Subject subject,
+ ResourceGroupCriteria criteria) {
+
+ CriteriaAuthzType authzType = getCriteriaAuthzType(subject, criteria);
+
+ String compositeProjection = null;
+ switch (authzType) {
+ case NONE:
+ case SUBJECT_OWNED:
+ compositeProjection = ""
+ + " new org.rhq.core.domain.resource.group.composite.ResourceGroupComposite( "
+ + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitCount," // explicit member count
+ + " ( SELECT AVG(avail.availabilityType) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitAvail," // explicit member availability
+ + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitCount," // implicit member count
+ + " ( SELECT AVG(avail.availabilityType) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitAvail," // implicit member availability
+ + " %alias% ) "; // ResourceGroup
+ break;
+ case ROLE_OWNED:
+ case AUTO_CLUSTER:
+ compositeProjection = ""
+ + " new org.rhq.core.domain.resource.group.composite.ResourceGroupComposite( "
+ + " ( SELECT COUNT(avail) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitCount," // explicit member count
+ + " ( SELECT AVG(avail.availabilityType) FROM %alias%.explicitResources res JOIN res.currentAvailability avail ) AS explicitAvail," // explicit member availability
+ + " ( SELECT COUNT(avail) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitCount," // implicit member count
+ + " ( SELECT AVG(avail.availabilityType) FROM %alias%.implicitResources res JOIN res.currentAvailability avail ) AS implicitAvail," // implicit member availability
+ + " %alias%, " // ResourceGroup
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 8 ), " // MANAGE_MEASUREMENTS
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 4 ), " // MODIFY_RESOURCE
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 10 ), " // CONTROL
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 7 ), " // MANAGE_ALERTS
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 14 ), " // MANAGE_EVENTS
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 13 ), " // CONFIGURE_READ
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 11 ), " // CONFIGURE_WRITE
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 9 ), " // MANAGE_CONTENT
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 6 ), " // CREATE_CHILD_RESOURCES
+ + " ( SELECT count(p) FROM %permAlias%.roles r JOIN r.subjects s JOIN r.permissions p WHERE s.id = %subjectId% AND p = 5 ))"; // DELETE_RESOURCES
+ compositeProjection = compositeProjection.replace("%subjectId%", String.valueOf(subject.getId()));
+ break;
+ default:
+ throw new IllegalStateException("Unexpected CriteriaAuthzType: " + authzType);
+ }
+
+ String alias = criteria.getAlias();
+ compositeProjection = compositeProjection.replace("%alias%", alias);
+ String permAlias = alias + ((authzType == CriteriaAuthzType.AUTO_CLUSTER) ? ".clusterResourceGroup" : "");
+ compositeProjection = compositeProjection.replace("%permAlias%", permAlias);
+
+ CriteriaQueryGenerator generator = getCriteriaQueryGenerator(subject, criteria, authzType);
+ generator.alterProjection(compositeProjection);
+
+ CriteriaQueryRunner<ResourceGroupComposite> queryRunner = new CriteriaQueryRunner<ResourceGroupComposite>(
+ criteria, generator, entityManager, false); // don't auto-init bags, we're returning composites not entities
+ PageList<ResourceGroupComposite> results = queryRunner.execute();
+
+ results = getAuthorizedGroupComposites(subject, authzType, results);
+
+ for (ResourceGroupComposite composite : results) {
+ ResourceGroup group = composite.getResourceGroup();
+ ResourceType type = group.getResourceType();
+ ResourceFacets facets = (type != null) ? resourceTypeManager.getResourceFacets(type.getId())
+ : ResourceFacets.NONE;
+
+ queryRunner.initFetchFields(group); // manual field fetch for composite-wrapped entity
+ composite.setResourceFacets(facets);
+ }
+ return results;
+ }
+
+ private enum CriteriaAuthzType {
+ // inv manager / no auth required
+ NONE,
+ // standard role-subject-group auth
+ ROLE_OWNED,
+ // private group auth
+ SUBJECT_OWNED,
+ // auto cluster backing group
+ AUTO_CLUSTER
+ }
+
+ private CriteriaAuthzType getCriteriaAuthzType(Subject subject, ResourceGroupCriteria criteria) {
+ Set<Permission> globalUserPerms = authorizationManager.getExplicitGlobalPermissions(subject);
+
if (criteria.isSecurityManagerRequired() && !globalUserPerms.contains(Permission.MANAGE_SECURITY)) {
throw new PermissionException("Subject [" + subject.getName()
+ "] requires SecurityManager permission for requested query criteria.");
}
boolean isInventoryManager = globalUserPerms.contains(Permission.MANAGE_INVENTORY);
- boolean groupAuthzRequired = (!(criteria.isFilterPrivate() || isInventoryManager));
if (criteria.isInventoryManagerRequired() && !isInventoryManager) {
throw new PermissionException("Subject [" + subject.getName()
+ "] requires InventoryManager permission for requested query criteria.");
}
- // if we're searching for private groups set the subject filter to the current user's subjectId
+ CriteriaAuthzType result = CriteriaAuthzType.ROLE_OWNED;
+
+ if (isInventoryManager) {
+ result = CriteriaAuthzType.NONE;
+ } else if (criteria.isFilterPrivate()) {
+ result = CriteriaAuthzType.SUBJECT_OWNED;
+ } else if (!criteria.isFilterVisible()) {
+ result = CriteriaAuthzType.AUTO_CLUSTER;
+ }
+
+ return result;
+ }
+
+ private CriteriaQueryGenerator getCriteriaQueryGenerator(Subject subject, ResourceGroupCriteria criteria,
+ CriteriaAuthzType authzType) {
+
+ // if we're searching for private groups set the subject filter to the current user's subjectId.
// setting it here prevents the caller from spoofing a different user. This is why the subject and
- // private filters are different. The suject filter can specifiy any use and therefore requires
+ // private filters are different. The subject filter can specify any user and therefore requires
// inventory manager.
if (criteria.isFilterPrivate()) {
criteria.addFilterPrivate(null);
@@ -1536,7 +1580,7 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
}
CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
- if (groupAuthzRequired) {
+ if (authzType != CriteriaAuthzType.NONE) {
generator.setAuthorizationResourceFragment(CriteriaQueryGenerator.AuthorizationTokenType.GROUP, null,
subject.getId());
}
@@ -1544,6 +1588,41 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso
return generator;
}
+ private PageList<ResourceGroupComposite> getAuthorizedGroupComposites(Subject subject, CriteriaAuthzType authzType,
+ PageList<ResourceGroupComposite> groupComposites) {
+
+ switch (authzType) {
+ case NONE:
+ // leave resourcePermissions unset on the assumption that it will not be checked for inv managers
+ break;
+ case ROLE_OWNED:
+ // the permissions are already set by the query projection
+ break;
+ case AUTO_CLUSTER:
+ // the permissions are already set by the query projection
+ break;
+ case SUBJECT_OWNED:
+ Iterator<ResourceGroupComposite> iterator = groupComposites.iterator();
+ while (iterator.hasNext()) {
+ ResourceGroupComposite groupComposite = iterator.next();
+ ResourceGroup group = groupComposite.getResourceGroup();
+ Subject groupOwner = group.getSubject();
+ if (null != groupOwner) {
+ // private group, we need to set the group resource permissions since we couldn't do it in
+ // the projection.
+ groupComposite.setResourcePermission(new ResourcePermission(authorizationManager
+ .getExplicitGroupPermissions(groupOwner, group.getId())));
+ } else {
+ throw new IllegalStateException("Unexpected group, not subject owned: " + groupComposite);
+ }
+ }
+ break;
+ default:
+ throw new IllegalStateException("Unexpected CriteriaAuthzType: " + authzType);
+ }
+ return groupComposites;
+ }
+
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@RequiredPermission(Permission.MANAGE_INVENTORY)
public void uninventoryMembers(Subject subject, int groupId) {
13 years, 4 months
[rhq] modules/enterprise
by ips
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 234 +++-------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/history/ResourceOperationHistoryDetailsView.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/ResourceOperationScheduleDetailsView.java | 80 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java | 7
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java | 7
6 files changed, 170 insertions(+), 171 deletions(-)
New commits:
commit 1a30dca496cb0a95b0216c578c019ab7265a57da
Author: Ian Springer <ian.springer(a)redhat.com>
Date: Mon Dec 20 18:14:26 2010 -0500
add operation parameters to operation schedules details view; get rid of tabs in config editor, since we currently don't support raw config; only show collapsible section stack in config editor if the configdef includes one or more prop groups
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
index 9b6a063..c2e2626 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java
@@ -40,7 +40,6 @@ import com.smartgwt.client.types.Autofit;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.types.MultipleAppearance;
import com.smartgwt.client.types.Overflow;
-import com.smartgwt.client.types.TreeModelType;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
@@ -87,8 +86,6 @@ import com.smartgwt.client.widgets.grid.events.CellSavedEvent;
import com.smartgwt.client.widgets.grid.events.CellSavedHandler;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
-import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
-import com.smartgwt.client.widgets.grid.events.SelectionEvent;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.SectionStack;
@@ -99,12 +96,7 @@ import com.smartgwt.client.widgets.menu.MenuItem;
import com.smartgwt.client.widgets.menu.MenuItemSeparator;
import com.smartgwt.client.widgets.menu.events.ClickHandler;
import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
-import com.smartgwt.client.widgets.tab.Tab;
-import com.smartgwt.client.widgets.tab.TabSet;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
-import com.smartgwt.client.widgets.tree.Tree;
-import com.smartgwt.client.widgets.tree.TreeGrid;
-import com.smartgwt.client.widgets.tree.TreeNode;
import org.rhq.core.domain.configuration.AbstractPropertyMap;
import org.rhq.core.domain.configuration.Configuration;
@@ -112,7 +104,6 @@ import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
-import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.ConfigurationFormat;
import org.rhq.core.domain.configuration.definition.PropertyDefinition;
@@ -135,15 +126,11 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTyp
import org.rhq.enterprise.gui.coregui.client.util.CanvasUtility;
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.LocatableHLayout;
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.LocatableMenu;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableSectionStack;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTab;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTabSet;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableToolStrip;
-import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -164,16 +151,12 @@ public class ConfigurationEditor extends LocatableVLayout {
private ConfigurationGWTServiceAsync configurationService = GWTServiceLookup.getConfigurationService();
- private TabSet tabSet;
private LocatableToolStrip toolStrip;
private ConfigurationDefinition configurationDefinition;
private Configuration configuration;
private Configuration originalConfiguration;
- private String structConfigTabTitle = MSG.view_configEdit_properties();
- private String rawConfigTabTitle = MSG.view_configEdit_files();
-
private ValuesManager valuesManager = new ValuesManager();
private boolean changed = false;
@@ -236,22 +219,6 @@ public class ConfigurationEditor extends LocatableVLayout {
addMember(new Label(message));
}
- public String getRawConfigTabTitle() {
- return this.rawConfigTabTitle;
- }
-
- public void setRawConfigTabTitle(String title) {
- this.rawConfigTabTitle = title;
- }
-
- public String getStructuredConfigTabTitle() {
- return this.structConfigTabTitle;
- }
-
- public void setStructuredConfigTabTitle(String title) {
- this.structConfigTabTitle = title;
- }
-
public boolean validate() {
return this.valuesManager.validate();
}
@@ -335,36 +302,26 @@ public class ConfigurationEditor extends LocatableVLayout {
public void reload() {
if (configurationDefinition == null || configuration == null) {
- // Wait for both to load
+ // Wait for both to load.
return;
}
originalConfiguration = configuration.deepCopy();
- tabSet = new LocatableTabSet(getLocatorId());
-
- if (configurationDefinition.getConfigurationFormat() == ConfigurationFormat.RAW
- || configurationDefinition.getConfigurationFormat() == ConfigurationFormat.STRUCTURED_AND_RAW) {
- com.allen_sauer.gwt.log.client.Log.info("Loading files view...");
- Tab tab = new LocatableTab("Files", getRawConfigTabTitle());
- tab.setPane(buildRawPane());
- tabSet.addTab(tab);
+ for (Canvas childCanvas : getChildren()) {
+ childCanvas.destroy();
}
if (configurationDefinition.getConfigurationFormat() == ConfigurationFormat.STRUCTURED
|| configurationDefinition.getConfigurationFormat() == ConfigurationFormat.STRUCTURED_AND_RAW) {
- com.allen_sauer.gwt.log.client.Log.info("Loading properties view...");
- Tab tab = new LocatableTab("Properties", getStructuredConfigTabTitle());
- tab.setPane(buildStructuredPane());
- tabSet.addTab(tab);
- }
-
- for (Canvas c : getChildren()) {
- c.destroy();
+ Log.info("Building structured configuration editor...");
+ LocatableVLayout structuredConfigLayout = buildStructuredPane();
+ addMember(structuredConfigLayout);
+ } else {
+ Label label = new Label("Structured configuration is not supported.");
+ addMember(label);
}
- addMember(tabSet);
-
this.markForRedraw();
}
@@ -373,129 +330,90 @@ public class ConfigurationEditor extends LocatableVLayout {
reload();
}
- protected HLayout buildRawPane() {
-
- LocatableHLayout layout = new LocatableHLayout(extendLocatorId("Raw"));
- final HashMap<String, RawConfiguration> filesMap = new HashMap<String, RawConfiguration>();
-
- TreeGrid fileTree = new LocatableTreeGrid(layout.extendLocatorId("Files"));
- fileTree.setShowResizeBar(true);
-
- Tree files = new Tree();
- files.setModelType(TreeModelType.CHILDREN);
- TreeNode root = new TreeNode("root");
- TreeNode[] children = new TreeNode[configuration.getRawConfigurations().size()];
- int i = 0;
- for (RawConfiguration rawConfiguration : configuration.getRawConfigurations()) {
- children[i++] = new TreeNode(rawConfiguration.getPath());
- filesMap.put(rawConfiguration.getPath(), rawConfiguration);
- }
- root.setChildren(children);
- files.setRoot(root);
- fileTree.setData(files);
- fileTree.setWidth(250);
-
- DynamicForm form = new LocatableDynamicForm(layout.extendLocatorId("Editor"));
- final TextAreaItem rawEditor = new TextAreaItem();
- // rawEditor.setValue("This is a test");
- rawEditor.setShowTitle(false);
- form.setItems(rawEditor);
- form.setHeight100();
- form.setWidth100();
-
- fileTree.addSelectionChangedHandler(new SelectionChangedHandler() {
- public void onSelectionChanged(SelectionEvent selectionEvent) {
- String path = selectionEvent.getRecord().getAttribute("name");
- com.allen_sauer.gwt.log.client.Log.info("Getting Path: " + path);
- rawEditor.setValue(filesMap.get(path).getContents());
- rawEditor.redraw();
- com.allen_sauer.gwt.log.client.Log.info("Data: " + filesMap.get(path).getContents());
- }
- });
-
- if (children.length > 0) {
- fileTree.selectRecord(children[0]);
- rawEditor.setValue(filesMap.get(children[0].getName()).getContents());
- }
-
- layout.setMembers(fileTree, form);
- return layout;
- }
-
- protected VLayout buildStructuredPane() {
+ protected LocatableVLayout buildStructuredPane() {
LocatableVLayout layout = new LocatableVLayout(extendLocatorId("Structured"));
List<PropertyGroupDefinition> groupDefinitions = configurationDefinition.getGroupDefinitions();
- final SectionStack sectionStack = new LocatableSectionStack(layout.extendLocatorId("Sections"));
- sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
- sectionStack.setWidth100();
- sectionStack.setHeight100();
- sectionStack.setScrollSectionIntoView(true);
- sectionStack.setOverflow(Overflow.AUTO);
-
- if (!configurationDefinition.getNonGroupedProperties().isEmpty()) {
- sectionStack.addSection(buildGroupSection(layout.extendLocatorId("NoGroup"), null));
- }
-
- for (PropertyGroupDefinition definition : groupDefinitions) {
- // com.allen_sauer.gwt.log.client.Log.info("building: " + definition.getDisplayName());
- sectionStack.addSection(buildGroupSection(layout.extendLocatorId(definition.getName()), definition));
- }
+ if (groupDefinitions.isEmpty()) {
+ // No prop groups, so we just need a single form for the non-grouped props.
+ List<PropertyDefinition> propertyDefinitions =
+ new ArrayList<PropertyDefinition>(configurationDefinition.getNonGroupedProperties());
- // TODO GH: Save button as saveListener() or remove the buttons from this form and have
- // the container provide them?
+ DynamicForm form = buildPropertiesForm(layout.extendLocatorId("Props"), propertyDefinitions, configuration);
+ form.setBorder("1px solid #AAA");
+ layout.addMember(form);
+ } else {
+ // One or more prop groups, so create a section stack with one section per group.
+ final SectionStack sectionStack = new LocatableSectionStack(layout.extendLocatorId("Sections"));
+ sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
+ sectionStack.setWidth100();
+ sectionStack.setHeight100();
+ sectionStack.setScrollSectionIntoView(true);
+ sectionStack.setOverflow(Overflow.AUTO);
+
+ if (!configurationDefinition.getNonGroupedProperties().isEmpty()) {
+ sectionStack.addSection(buildGroupSection(layout.extendLocatorId("NoGroup"), null));
+ }
- toolStrip = new LocatableToolStrip(layout.extendLocatorId("Tools"));
- toolStrip.setBackgroundImage(null);
+ for (PropertyGroupDefinition definition : groupDefinitions) {
+ // com.allen_sauer.gwt.log.client.Log.info("building: " + definition.getDisplayName());
+ sectionStack.addSection(buildGroupSection(layout.extendLocatorId(definition.getName()), definition));
+ }
- toolStrip.setWidth100();
+ toolStrip = new LocatableToolStrip(layout.extendLocatorId("Tools"));
+ toolStrip.setBackgroundImage(null);
+ toolStrip.setWidth100();
- toolStrip.addMember(new LayoutSpacer());
- saveButton = new LocatableIButton(toolStrip.extendLocatorId("Save"), MSG.common_button_save());
- saveButton.setAlign(Alignment.CENTER);
- saveButton.setDisabled(true);
- // toolStrip.addMember(saveButton);
+ toolStrip.addMember(new LayoutSpacer());
+ saveButton = new LocatableIButton(toolStrip.extendLocatorId("Save"), MSG.common_button_save());
+ saveButton.setAlign(Alignment.CENTER);
+ saveButton.setDisabled(true);
+ //toolStrip.addMember(saveButton);
- IButton resetButton = new LocatableIButton(toolStrip.extendLocatorId("Reset"), MSG.common_button_reset());
- resetButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
- public void onClick(ClickEvent clickEvent) {
- reload();
+ IButton resetButton = new LocatableIButton(toolStrip.extendLocatorId("Reset"), MSG.common_button_reset());
+ resetButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
+ public void onClick(ClickEvent clickEvent) {
+ reload();
+ }
+ });
+ //toolStrip.addMember(resetButton);
+
+ toolStrip.addMember(new LayoutSpacer());
+
+ Menu menu = new LocatableMenu(toolStrip.extendLocatorId("JumpMenu"));
+ for (SectionStackSection section : sectionStack.getSections()) {
+ MenuItem item = new MenuItem(section.getTitle());
+ item.addClickHandler(new ClickHandler() {
+ public void onClick(MenuItemClickEvent event) {
+ int x = event.getMenu().getItemNum(event.getItem());
+ sectionStack.expandSection(x);
+ sectionStack.showSection(x);
+ }
+ });
+ menu.addItem(item);
}
- });
+ menu.addItem(new MenuItemSeparator());
- Menu menu = new LocatableMenu(toolStrip.extendLocatorId("JumpMenu"));
- for (SectionStackSection section : sectionStack.getSections()) {
- MenuItem item = new MenuItem(section.getTitle());
- item.addClickHandler(new ClickHandler() {
+ MenuItem hideAllItem = new MenuItem(MSG.view_configEdit_hideAll());
+ hideAllItem.addClickHandler(new ClickHandler() {
public void onClick(MenuItemClickEvent event) {
- int x = event.getMenu().getItemNum(event.getItem());
- sectionStack.expandSection(x);
- sectionStack.showSection(x);
+ for (int i = 0; i < sectionStack.getSections().length; i++) {
+ sectionStack.collapseSection(i);
+ }
}
});
- menu.addItem(item);
- }
- menu.addItem(new MenuItemSeparator());
-
- MenuItem hideAllItem = new MenuItem(MSG.view_configEdit_hideAll());
- hideAllItem.addClickHandler(new ClickHandler() {
- public void onClick(MenuItemClickEvent event) {
- for (int i = 0; i < sectionStack.getSections().length; i++) {
- sectionStack.collapseSection(i);
- }
- }
- });
- menu.addItem(hideAllItem);
+ menu.addItem(hideAllItem);
- // toolStrip.addMember(resetButton);
- toolStrip.addMember(new LayoutSpacer());
- toolStrip.addMember(new LocatableIMenuButton(toolStrip.extendLocatorId("Jump"), MSG
- .view_configEdit_jumpToSection(), menu));
+ // TODO GH: Save button as saveListener() or remove the buttons from this form and have
+ // the container provide them?
- layout.addMember(toolStrip);
+ toolStrip.addMember(new LocatableIMenuButton(toolStrip.extendLocatorId("Jump"), MSG
+ .view_configEdit_jumpToSection(), menu));
- layout.addMember(sectionStack);
+ layout.addMember(toolStrip);
+ layout.addMember(sectionStack);
+ }
return layout;
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
index e9fe59a..c134b69 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/AbstractRecordEditor.java
@@ -214,6 +214,10 @@ public abstract class AbstractRecordEditor<DS extends RPCDataSource> extends Loc
return this.recordId;
}
+ public boolean isNewRecord() {
+ return (getRecordId() == ID_NEW);
+ }
+
public String getListViewPath() {
return this.listViewPath;
}
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 208404f..b3e869a 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
@@ -23,6 +23,7 @@ import java.util.Date;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.CloseClientEvent;
@@ -201,18 +202,22 @@ public class ResourceOperationHistoryDetailsView extends LocatableVLayout implem
// params/results
if (operationHistory.getParameters() != null) {
+ Label title = new Label(MSG.view_operationHistoryDetails_parameters());
+ addMember(title);
+
ConfigurationEditor editor = new ConfigurationEditor(extendLocatorId("params"), definition
.getParametersConfigurationDefinition(), operationHistory.getParameters());
editor.setReadOnly(true);
- editor.setStructuredConfigTabTitle(MSG.view_operationHistoryDetails_parameters());
addMember(editor);
}
if (status == OperationRequestStatus.SUCCESS && operationHistory.getResults() != null) {
+ Label title = new Label(MSG.view_operationHistoryDetails_results());
+ addMember(title);
+
ConfigurationEditor editor = new ConfigurationEditor(extendLocatorId("results"), definition
.getResultsConfigurationDefinition(), operationHistory.getResults());
editor.setReadOnly(true);
- editor.setStructuredConfigTabTitle(MSG.view_operationHistoryDetails_results());
addMember(editor);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/ResourceOperationScheduleDetailsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
index 263c3ae..3afb1e2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/detail/operation/schedule/ResourceOperationScheduleDetailsView.java
@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
@@ -32,13 +33,18 @@ 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 org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.composite.ResourceComposite;
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.EnhancedDynamicForm;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation.schedule.ResourceOperationScheduleDataSource;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableHLayout;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
* @author Ian Springer
@@ -46,19 +52,27 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.operation
public class ResourceOperationScheduleDetailsView extends AbstractRecordEditor {
private static final String FIELD_OPERATION_DESCRIPTION = "operationDescription";
+ private static final String FIELD_OPERATION_PARAMETERS = "operationParameters";
private ResourceComposite resourceComposite;
private Map<String, String> operationNameToDescriptionMap = new HashMap<String, String>();
+ private Map<String, ConfigurationDefinition> operationNameToParametersDefinitionMap =
+ new HashMap<String, ConfigurationDefinition>();
private SelectItem operationNameItem;
private StaticTextItem operationDescriptionItem;
+ private StaticTextItem operationParametersItem;
+ private LocatableHLayout operationParametersConfigurationHolder;
public ResourceOperationScheduleDetailsView(String locatorId, ResourceComposite resourceComposite, int scheduleId) {
super(locatorId, new ResourceOperationScheduleDataSource(resourceComposite), scheduleId, "Scheduled Operation", null);
+
this.resourceComposite = resourceComposite;
ResourceType resourceType = this.resourceComposite.getResource().getResourceType();
Set<OperationDefinition> operationDefinitions = resourceType.getOperationDefinitions();
for (OperationDefinition operationDefinition : operationDefinitions) {
this.operationNameToDescriptionMap.put(operationDefinition.getName(), operationDefinition.getDescription());
+ this.operationNameToParametersDefinitionMap.put(operationDefinition.getName(),
+ operationDefinition.getParametersConfigurationDefinition());
}
}
@@ -79,24 +93,44 @@ public class ResourceOperationScheduleDetailsView extends AbstractRecordEditor {
items.add(this.operationNameItem);
this.operationNameItem.addChangedHandler(new ChangedHandler() {
public void onChanged(ChangedEvent event) {
- updateOperationDescriptionItem();
+ refreshOperationDescriptionItem();
+ refreshOperationParametersItem();
}
});
this.operationDescriptionItem = new StaticTextItem(FIELD_OPERATION_DESCRIPTION, "Operation Description");
items.add(this.operationDescriptionItem);
- TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes");
- notesItem.setColSpan(form.getNumCols());
- items.add(notesItem);
+ this.operationParametersItem = new StaticTextItem(FIELD_OPERATION_PARAMETERS, "Operation Parameters");
+ items.add(this.operationParametersItem);
return items;
}
@Override
+ protected LocatableVLayout buildContentPane() {
+ LocatableVLayout contentPane = super.buildContentPane();
+
+ this.operationParametersConfigurationHolder = new LocatableHLayout(extendLocatorId("ConfigHolder"));
+ this.operationParametersConfigurationHolder.setVisible(false);
+ contentPane.addMember(this.operationParametersConfigurationHolder);
+
+ EnhancedDynamicForm notesForm = new EnhancedDynamicForm(extendLocatorId("NotesForm"), isReadOnly(),
+ isNewRecord());
+ TextAreaItem notesItem = new TextAreaItem(ResourceOperationScheduleDataSource.Field.DESCRIPTION, "Notes");
+ notesItem.setStartRow(true);
+ notesItem.setColSpan(4);
+ notesForm.setFields(notesItem);
+ contentPane.addMember(notesForm);
+
+ return contentPane;
+ }
+
+ @Override
protected void onDraw() {
super.onDraw();
- updateOperationDescriptionItem();
+ refreshOperationDescriptionItem();
+ refreshOperationParametersItem();
}
@Override
@@ -104,15 +138,47 @@ public class ResourceOperationScheduleDetailsView extends AbstractRecordEditor {
return ResourceOperationScheduleDataSource.Field.OPERATION_DISPLAY_NAME;
}
- private void updateOperationDescriptionItem() {
+ private void refreshOperationDescriptionItem() {
String operationName = this.operationNameItem.getValueAsString();
String value;
if (operationName == null) {
- value = "<i>Select an operation to view its description.</i>";
+ value = "<i>Select an operation.</i>";
} else {
value = this.operationNameToDescriptionMap.get(operationName);
}
this.operationDescriptionItem.setValue(value);
}
+ private void refreshOperationParametersItem() {
+ String operationName = this.operationNameItem.getValueAsString();
+ String value;
+ if (operationName == null) {
+ value = "<i>Select an operation.</i>";
+ } else {
+ ConfigurationDefinition parametersDefinition = this.operationNameToParametersDefinitionMap.get(operationName);
+ if (parametersDefinition == null || parametersDefinition.getPropertyDefinitions().isEmpty()) {
+ value = "<i>" + MSG.view_operationCreateWizard_parametersStep_noParameters() + "</i>";
+
+ for (Canvas child : this.operationParametersConfigurationHolder.getChildren()) {
+ child.destroy();
+ }
+ this.operationParametersConfigurationHolder.hide();
+ } else {
+ value = "<i>Enter parameters below...</i>";
+
+ for (Canvas child : this.operationParametersConfigurationHolder.getChildren()) {
+ child.destroy();
+ }
+ Configuration defaultConfiguration = (parametersDefinition.getDefaultTemplate() != null) ?
+ parametersDefinition.getDefaultTemplate().createConfiguration() : new Configuration();
+ ConfigurationEditor configurationEditor = new ConfigurationEditor("ParametersEditor", parametersDefinition,
+ defaultConfiguration);
+ configurationEditor.setReadOnly(isReadOnly());
+ this.operationParametersConfigurationHolder.addMember(configurationEditor);
+ this.operationParametersConfigurationHolder.show();
+ }
+ }
+ this.operationParametersItem.setValue(value);
+ }
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java
index 2ad9f55..87c4179 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/CurrentGroupPluginConfigurationView.java
@@ -27,6 +27,7 @@ import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
@@ -125,12 +126,14 @@ public class CurrentGroupPluginConfigurationView extends LocatableVLayout implem
private void initEditor() {
if (this.configurationDefinition != null && this.memberConfigurations != null) {
+ Label title = new Label(MSG.view_group_pluginConfig_edit_currentGroupProperties());
+ addMember(title);
+
this.editor = new GroupConfigurationEditor(this.extendLocatorId("Editor"), this.configurationDefinition,
this.memberConfigurations);
this.editor.setOverflow(Overflow.AUTO);
this.editor.addPropertyValueChangeListener(this);
- this.editor.setReadOnly(!this.resourcePermission.isConfigureWrite());
- this.editor.setStructuredConfigTabTitle(MSG.view_group_pluginConfig_edit_currentGroupProperties());
+ this.editor.setReadOnly(!this.resourcePermission.isConfigureWrite());
addMember(this.editor);
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java
index 787e1ea..22aa7be 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/HistoryGroupPluginConfigurationSettings.java
@@ -25,6 +25,7 @@ import java.util.Map;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Overflow;
+import com.smartgwt.client.widgets.Label;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.composite.ResourceConfigurationComposite;
@@ -86,12 +87,14 @@ public class HistoryGroupPluginConfigurationSettings extends LocatableVLayout {
private void initEditor() {
if (this.configurationDefinition != null && this.memberConfigurations != null) {
+ Label title = new Label(MSG.view_group_pluginConfig_view_groupProperties() + " - "
+ + this.groupUpdateId);
+ addMember(title);
+
this.editor = new GroupConfigurationEditor(this.extendLocatorId("Editor"), this.configurationDefinition,
this.memberConfigurations);
this.editor.setOverflow(Overflow.AUTO);
this.editor.setReadOnly(true);
- this.editor.setStructuredConfigTabTitle(MSG.view_group_pluginConfig_view_groupProperties() + " - "
- + this.groupUpdateId);
addMember(this.editor);
}
}
13 years, 4 months
[rhq] 2 commits - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/ConfirmationStep.java | 101 +++++-----
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 2
2 files changed, 56 insertions(+), 47 deletions(-)
New commits:
commit eb88d3f495920873b3e469bde1d39024ed6d2f4e
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 17:46:48 2010 -0500
fix long message names that are expanding the message center too much - use concise messages
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 4580301..0f86d64 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
@@ -73,19 +73,24 @@ public class ConfirmationStep extends AbstractWizardStep {
public void onSuccess(PageList<BundleDeployment> liveDeployments) {
if (1 != liveDeployments.size()) {
nextPage = false;
+ String messageConcise = MSG.view_bundle_revertWizard_confirmStep_noLiveDeployment_concise();
String message = MSG.view_bundle_revertWizard_confirmStep_noLiveDeployment(wizard
.getDestination().toString());
wizard.getView().showMessage(message);
- CoreGUI.getMessageCenter().notify(new Message(message, Message.Severity.Warning));
+ CoreGUI.getMessageCenter().notify(
+ new Message(messageConcise, message, Message.Severity.Warning));
}
wizard.setLiveDeployment(liveDeployments.get(0));
wizard.setPreviousDeployment(wizard.getLiveDeployment().getReplacedBundleDeployment());
if (null == wizard.getPreviousDeployment()) {
nextPage = false;
+ String messageConcise = MSG
+ .view_bundle_revertWizard_confirmStep_noPriorDeployment_concise();
String message = MSG.view_bundle_revertWizard_confirmStep_noPriorDeployment(wizard
.getLiveDeployment().toString(), wizard.getDestination().toString());
wizard.getView().showMessage(message);
- CoreGUI.getMessageCenter().notify(new Message(message, Message.Severity.Warning));
+ CoreGUI.getMessageCenter().notify(
+ new Message(messageConcise, message, Message.Severity.Warning));
}
setLayout();
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index a34c71c..2c45fbb 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -922,7 +922,9 @@ view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From]\\n{0}\
view_bundle_revertWizard_getInfoStep_cleanDeploy = Clean Deployment? (this will delete an old, existing deploy directory prior to starting the revert deployment)
view_bundle_revertWizard_getInfoStep_getNameFailure = Failed to get revert deployment name
view_bundle_revertWizard_confirmStep_name = Revert Deployment Confirmation
+view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = No live deployment was found for the destination
view_bundle_revertWizard_confirmStep_noLiveDeployment = No live deployment was found for the destination [{0}]
+view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = The live deployment cannot be reverted because there is no prior deployment
view_bundle_revertWizard_confirmStep_noPriorDeployment = The live deployment [{0}] cannot be reverted because there is no prior deployment for the destination [{1}]
view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = Failed to find live deployment; cannot revert
view_bundle_revertWizard_confirmStep_liveDeployment = Live Deployment
commit 7f4a24bd14d2be5763837abab8e04ce35548ec93
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 17:46:26 2010 -0500
fix NPE
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 4053fae..4580301 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
@@ -151,54 +151,56 @@ public class ConfirmationStep extends AbstractWizardStep {
prevHeader.setWidth100();
layout.addMember(prevHeader);
- final DynamicForm prevForm = new DynamicForm();
- prevForm.setNumCols(2);
-
- StaticTextItem prevNameItem = new StaticTextItem("prevName", MSG.common_title_name());
- prevNameItem.setTitleAlign(Alignment.LEFT);
- prevNameItem.setAlign(Alignment.LEFT);
- prevNameItem.setWrap(false);
- prevNameItem.setWrapTitle(false);
- prevNameItem.setValue(prev.getName());
-
- StaticTextItem prevDescItem = new StaticTextItem("prevDesc", MSG.common_title_description());
- prevDescItem.setTitleAlign(Alignment.LEFT);
- prevDescItem.setAlign(Alignment.LEFT);
- prevDescItem.setWrap(false);
- prevDescItem.setWrapTitle(false);
- prevDescItem.setTitleVAlign(VerticalAlignment.TOP);
- prevDescItem.setValue((null != prev.getDescription()) ? prev.getDescription() : MSG.common_val_none());
-
- final StaticTextItem prevVersionItem = new StaticTextItem("prevVersion", MSG.view_bundle_bundleVersion());
- prevVersionItem.setTitleAlign(Alignment.LEFT);
- prevVersionItem.setAlign(Alignment.LEFT);
- prevVersionItem.setWrap(false);
- prevVersionItem.setWrapTitle(false);
- if (prev.getBundleVersion().getVersion() == null) {
- BundleVersionCriteria c = new BundleVersionCriteria();
- c.addFilterId(prev.getBundleVersion().getId());
- bundleServer.findBundleVersionsByCriteria(c, new AsyncCallback<PageList<BundleVersion>>() {
-
- @Override
- public void onSuccess(PageList<BundleVersion> result) {
- if (result != null && result.size() == 1) {
- prevVersionItem.setValue(result.get(0).getVersion());
+ if (prev != null) {
+ final DynamicForm prevForm = new DynamicForm();
+ prevForm.setNumCols(2);
+
+ StaticTextItem prevNameItem = new StaticTextItem("prevName", MSG.common_title_name());
+ prevNameItem.setTitleAlign(Alignment.LEFT);
+ prevNameItem.setAlign(Alignment.LEFT);
+ prevNameItem.setWrap(false);
+ prevNameItem.setWrapTitle(false);
+ prevNameItem.setValue(prev.getName());
+
+ StaticTextItem prevDescItem = new StaticTextItem("prevDesc", MSG.common_title_description());
+ prevDescItem.setTitleAlign(Alignment.LEFT);
+ prevDescItem.setAlign(Alignment.LEFT);
+ prevDescItem.setWrap(false);
+ prevDescItem.setWrapTitle(false);
+ prevDescItem.setTitleVAlign(VerticalAlignment.TOP);
+ prevDescItem.setValue((null != prev.getDescription()) ? prev.getDescription() : MSG.common_val_none());
+
+ final StaticTextItem prevVersionItem = new StaticTextItem("prevVersion", MSG.view_bundle_bundleVersion());
+ prevVersionItem.setTitleAlign(Alignment.LEFT);
+ prevVersionItem.setAlign(Alignment.LEFT);
+ prevVersionItem.setWrap(false);
+ prevVersionItem.setWrapTitle(false);
+ if (prev.getBundleVersion().getVersion() == null) {
+ BundleVersionCriteria c = new BundleVersionCriteria();
+ c.addFilterId(prev.getBundleVersion().getId());
+ bundleServer.findBundleVersionsByCriteria(c, new AsyncCallback<PageList<BundleVersion>>() {
+
+ @Override
+ public void onSuccess(PageList<BundleVersion> result) {
+ if (result != null && result.size() == 1) {
+ prevVersionItem.setValue(result.get(0).getVersion());
+ prevForm.markForRedraw();
+ }
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ prevVersionItem.setValue("?");
prevForm.markForRedraw();
}
- }
-
- @Override
- public void onFailure(Throwable caught) {
- prevVersionItem.setValue("?");
- prevForm.markForRedraw();
- }
- });
- } else {
- prevVersionItem.setValue(prev.getBundleVersion().getVersion());
- }
+ });
+ } else {
+ prevVersionItem.setValue(prev.getBundleVersion().getVersion());
+ }
- prevForm.setItems(prevNameItem, prevDescItem, prevVersionItem);
- layout.addMember(prevForm);
+ prevForm.setItems(prevNameItem, prevDescItem, prevVersionItem);
+ layout.addMember(prevForm);
+ }
Label confirmation = new Label();
confirmation.setContents("<b>" + MSG.view_bundle_revertWizard_confirmStep_confirmation() + "</b>");
13 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java | 58 +++++++++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java | 32 +++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java | 2
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 6 +
5 files changed, 95 insertions(+), 8 deletions(-)
New commits:
commit fa3e4ecacf731ef96e116c6905c8ee1522ca4c6b
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 17:24:09 2010 -0500
we can now delete bundle destinations and deployments.
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 c7cc475..46b4e41 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
@@ -325,11 +325,12 @@ public class LinkManager {
}
public static String getBundleVersionLink(int bundleId, int bundleVersionId) {
- return "#Bundles/Bundle/" + bundleId + "/versions/" + bundleVersionId;
+ return "#Bundles/Bundle/" + bundleId + "/versions" + (bundleVersionId == 0 ? "" : ("/" + bundleVersionId));
}
public static String getBundleDestinationLink(int bundleId, int bundleDestinationId) {
- return "#Bundles/Bundle/" + bundleId + "/destinations/" + bundleDestinationId;
+ return "#Bundles/Bundle/" + bundleId + "/destinations"
+ + (bundleDestinationId == 0 ? "" : ("/" + bundleDestinationId));
}
public static String getBundleDeploymentLink(int bundleId, int bundleDeploymentId) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
index 393e4a6..94b216a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
@@ -32,9 +32,12 @@ import com.smartgwt.client.types.AnimationEffect;
import com.smartgwt.client.types.AutoFitWidthApproach;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.ListGridFieldType;
-import com.smartgwt.client.types.VerticalAlignment;
+import com.smartgwt.client.util.BooleanCallback;
+import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.LinkItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
@@ -76,6 +79,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.LocatableDynamicForm;
+import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton;
import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/**
@@ -134,7 +138,7 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
LocatableDynamicForm form = new LocatableDynamicForm(extendLocatorId("Summary"));
form.setWidth100();
form.setAutoHeight();
- form.setNumCols(4);
+ form.setNumCols(5);
form.setWrapItemTitles(false);
form.setExtraSpace(10);
form.setIsGroup(true);
@@ -147,6 +151,12 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
bundleName.setLinkTitle(bundle.getName());
bundleName.setTarget("_self");
+ CanvasItem actionItem = new CanvasItem("actions");
+ actionItem.setColSpan(1);
+ actionItem.setRowSpan(4);
+ actionItem.setShowTitle(false);
+ actionItem.setCanvas(getActionLayout(form.extendLocatorId("actions")));
+
LinkItem bundleVersionName = new LinkItem("bundleVersion");
bundleVersionName.setTitle(MSG.view_bundle_bundleVersion());
bundleVersionName.setValue(LinkManager.getBundleVersionLink(bundle.getId(), deployment.getBundleVersion()
@@ -172,7 +182,6 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
StaticTextItem description = new StaticTextItem("description", MSG.common_title_description());
description.setValue(deployment.getDescription());
- description.setTitleVAlign(VerticalAlignment.TOP);
StaticTextItem status = new StaticTextItem("status", MSG.common_title_status());
status.setValue(deployment.getStatus().name());
@@ -192,12 +201,51 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
});
}
- form.setFields(bundleName, deployed, bundleVersionName, deployedBy, //
- destinationGroup, path, description, status);
+ form.setFields(bundleName, deployed, actionItem, bundleVersionName, deployedBy, destinationGroup, path,
+ description, status);
return form;
}
+ private Canvas getActionLayout(String locatorId) {
+ LocatableVLayout actionLayout = new LocatableVLayout(locatorId, 10);
+ IButton deleteButton = new LocatableIButton(actionLayout.extendLocatorId("Delete"), MSG.common_button_delete());
+ deleteButton.setIcon("subsystems/bundle/BundleDeploymentAction_Delete_16.png");
+ deleteButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
+ @Override
+ public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
+ SC.ask(MSG.view_bundle_deploy_deleteConfirm(), new BooleanCallback() {
+ public void execute(Boolean aBoolean) {
+ if (aBoolean) {
+ bundleService.deleteBundleDeployment(deployment.getId(), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_bundle_deploy_deleteFailure(deployment.getName()), caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_bundle_deploy_deleteSuccessful(deployment.getName()),
+ Message.Severity.Info));
+ // Bundle deployment is deleted, go back to main bundle destinations view
+ CoreGUI.goToView(LinkManager.getBundleDestinationLink(bundle.getId(), deployment
+ .getDestination().getId()));
+ }
+ });
+ }
+ }
+ });
+ }
+ });
+ actionLayout.addMember(deleteButton);
+
+ if (!canManageBundles) {
+ deleteButton.setDisabled(true);
+ }
+
+ return actionLayout;
+ }
+
private TagEditorView createTagEditor() {
boolean readOnly = !this.canManageBundles;
TagEditorView tagEditor = new TagEditorView(extendLocatorId("tagEditor"), version.getTags(), readOnly,
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
index ec1ca5e..91eaa34 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
@@ -27,6 +27,8 @@ import java.util.HashSet;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.util.BooleanCallback;
+import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.events.ClickEvent;
@@ -192,9 +194,39 @@ public class BundleDestinationView extends LocatableVLayout implements Bookmarka
});
actionLayout.addMember(revertButton);
+ IButton deleteButton = new LocatableIButton(actionLayout.extendLocatorId("Delete"), MSG.common_button_delete());
+ deleteButton.setIcon("subsystems/bundle/BundleDestinationAction_Delete_16.png");
+ deleteButton.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ SC.ask(MSG.view_bundle_dest_deleteConfirm(), new BooleanCallback() {
+ public void execute(Boolean aBoolean) {
+ if (aBoolean) {
+ bundleService.deleteBundleDestination(destination.getId(), new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_bundle_dest_deleteFailure(destination.getName()), caught);
+ }
+
+ public void onSuccess(Void result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_bundle_dest_deleteSuccessful(destination.getName()),
+ Message.Severity.Info));
+ // Bundle destination is deleted, go back to main bundle view
+ CoreGUI.goToView(LinkManager.getBundleDestinationLink(bundle.getId(), 0));
+ }
+ });
+ }
+ }
+ });
+ }
+ });
+ actionLayout.addMember(deleteButton);
+
if (!canManageBundles) {
deployButton.setDisabled(true);
revertButton.setDisabled(true);
+ deleteButton.setDisabled(true);
}
return actionLayout;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java
index cf4ab17..44f950c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java
@@ -174,7 +174,7 @@ public class BundleVersionView extends LocatableVLayout implements BookmarkableV
new Message(MSG.view_bundle_version_deleteSuccessful(version.getVersion()),
Message.Severity.Info));
// Bundle version is deleted, go back to main bundle view
- CoreGUI.goToView(LinkManager.getBundleLink(version.getBundle().getId()));
+ CoreGUI.goToView(LinkManager.getBundleVersionLink(version.getBundle().getId(), 0));
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 4e12244..a34c71c 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -961,6 +961,9 @@ view_bundle_dest_loadFailureVersionInfo = Failed to load bundle destination depl
view_bundle_dest_backToBundle = Back to Bundle
view_bundle_dest_tagUpdateFailure = Failed to update bundle destination tags
view_bundle_dest_tagUpdateSuccessful = You have successfully updated the bundle destination tags
+view_bundle_dest_deleteConfirm = Are you sure you want to delete this bundle destination?
+view_bundle_dest_deleteFailure = Failed to delete the bundle destination [{0}]
+view_bundle_dest_deleteSuccessful = You successfully deleted the bundle destination [{0}]
view_bundle_resDeployDS_loadFailure = Failed to load bundle resource deployments
view_bundle_deploy_name = Deployment Name
view_bundle_deploy_time = Deployment Time
@@ -977,6 +980,9 @@ view_bundle_deploy_loadFailure = Failed to load bundle deployment
view_bundle_deploy_loadBundleFailure = Failed to find bundle
view_bundle_deploy_deployedBy = Deployed By
view_bundle_deploy_clickForError = Click the icon for the error message
+view_bundle_deploy_deleteConfirm = Are you sure you want to delete this bundle deployment?
+view_bundle_deploy_deleteFailure = Failed to delete the bundle deployment [{0}]
+view_bundle_deploy_deleteSuccessful = You successfully deleted the bundle deployment [{0}]
view_bundle_createWizard_title = Create Bundle
view_bundle_createWizard_windowTitle = Bundle Creation Wizard
view_bundle_createWizard_cancelSuccessful = Canceled the creation of bundle [{0}], version = [{1}]
13 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleTopView.java | 8 +++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java | 16 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java | 4 +-
3 files changed, 18 insertions(+), 10 deletions(-)
New commits:
commit a87495b17c10e016084ef82af52959f4a4077a91
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 16:52:09 2010 -0500
don't show the deployment tree nodes if the user doesn't have permissions to see them
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleTopView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleTopView.java
index fd0bbe7..b66a340 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleTopView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleTopView.java
@@ -71,6 +71,10 @@ public class BundleTopView extends LocatableHLayout implements BookmarkableView
public void onPermissionsLoaded(Set<Permission> permissions) {
// if we haven't done it yet, build the view components
if (bundleTreeView == null) {
+ boolean canManageInventory = permissions != null
+ && permissions.contains(Permission.MANAGE_INVENTORY);
+ boolean canManageBundles = permissions != null && permissions.contains(Permission.MANAGE_BUNDLE);
+
SectionStack sectionStack = new LocatableSectionStack(getLocatorId());
sectionStack.setShowResizeBar(true);
sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);
@@ -78,12 +82,12 @@ public class BundleTopView extends LocatableHLayout implements BookmarkableView
sectionStack.setHeight100();
SectionStackSection bundlesSection = new SectionStackSection(MSG.view_bundle_bundles());
- bundleTreeView = new BundleTreeView(extendLocatorId("BundleTree"));
+ bundleTreeView = new BundleTreeView(extendLocatorId("BundleTree"), canManageBundles);
bundlesSection.addItem(bundleTreeView);
sectionStack.addSection(bundlesSection);
// we only show repositories if the user has the global manage_inventory perms since that is required
- if (permissions != null && permissions.contains(Permission.MANAGE_INVENTORY)) {
+ if (canManageInventory) {
SectionStackSection repositoriesSection = new SectionStackSection(MSG
.common_title_repositories());
ContentRepositoryTreeView repoTree = new ContentRepositoryTreeView(extendLocatorId("RepoTree"));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
index dadace4..61b29ce 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
@@ -56,9 +56,11 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
public class BundleTreeDataSource extends RPCDataSource {
private BundleGWTServiceAsync bundleService = GWTServiceLookup.getBundleService();
+ private final boolean canManageBundles;
- public BundleTreeDataSource() {
+ public BundleTreeDataSource(boolean canManageBundles) {
super();
+ this.canManageBundles = canManageBundles;
List<DataSourceField> fields = addDataSourceFields();
addFields(fields);
}
@@ -207,12 +209,14 @@ public class BundleTreeDataSource extends RPCDataSource {
deploymentsNode.setName(MSG.view_bundle_destinations());
records.add(deploymentsNode);
} else if (item instanceof BundleDestination) {
- BundleDestination dest = (BundleDestination) item;
+ if (canManageBundles) {
+ BundleDestination dest = (BundleDestination) item;
- // each destination has 0, 1 or more deployments
- if (dest.getDeployments() != null) {
- for (BundleDeployment deploy : dest.getDeployments()) {
- records.add(copyValuesForKnownBundle(deploy, bundleId));
+ // each destination has 0, 1 or more deployments
+ if (dest.getDeployments() != null) {
+ for (BundleDeployment deploy : dest.getDeployments()) {
+ records.add(copyValuesForKnownBundle(deploy, bundleId));
+ }
}
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
index 272841f..d692d60 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
@@ -40,7 +40,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableTreeGrid;
*/
public class BundleTreeView extends LocatableTreeGrid {
- public BundleTreeView(String locatorId) {
+ public BundleTreeView(String locatorId, boolean canManageBundles) {
super(locatorId);
setWidth100();
setHeight100();
@@ -52,7 +52,7 @@ public class BundleTreeView extends LocatableTreeGrid {
setSortField("name");
setShowHeader(false);
- setDataSource(new BundleTreeDataSource());
+ setDataSource(new BundleTreeDataSource(canManageBundles));
addNodeClickHandler(new NodeClickHandler() {
public void onNodeClick(NodeClickEvent event) {
13 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java | 23 +++++-----
1 file changed, 13 insertions(+), 10 deletions(-)
New commits:
commit 0105d3cb908d44b4156c8ce0f3c2709ea57101a3
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 16:31:52 2010 -0500
reorder some fields - description makes sense at bottom and if its a long description it won't push other fields down lower
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
index 97b60af..393e4a6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
@@ -32,6 +32,7 @@ import com.smartgwt.client.types.AnimationEffect;
import com.smartgwt.client.types.AutoFitWidthApproach;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.form.fields.LinkItem;
@@ -160,8 +161,18 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
StaticTextItem deployedBy = new StaticTextItem("deployedBy", MSG.view_bundle_deploy_deployedBy());
deployedBy.setValue(deployment.getSubjectName());
+ LinkItem destinationGroup = new LinkItem("group");
+ destinationGroup.setTitle(MSG.common_title_resource_group());
+ destinationGroup.setValue(LinkManager.getResourceGroupLink(deployment.getDestination().getGroup().getId()));
+ destinationGroup.setLinkTitle(deployment.getDestination().getGroup().getName());
+ destinationGroup.setTarget("_self");
+
+ StaticTextItem path = new StaticTextItem("path", MSG.view_bundle_deployDir());
+ path.setValue(deployment.getDestination().getDeployDir());
+
StaticTextItem description = new StaticTextItem("description", MSG.common_title_description());
description.setValue(deployment.getDescription());
+ description.setTitleVAlign(VerticalAlignment.TOP);
StaticTextItem status = new StaticTextItem("status", MSG.common_title_status());
status.setValue(deployment.getStatus().name());
@@ -181,17 +192,9 @@ public class BundleDeploymentView extends LocatableVLayout implements Bookmarkab
});
}
- LinkItem destinationGroup = new LinkItem("group");
- destinationGroup.setTitle(MSG.common_title_resource_group());
- destinationGroup.setValue(LinkManager.getResourceGroupLink(deployment.getDestination().getGroup().getId()));
- destinationGroup.setLinkTitle(deployment.getDestination().getGroup().getName());
- destinationGroup.setTarget("_self");
-
- StaticTextItem path = new StaticTextItem("path", MSG.view_bundle_deployDir());
- path.setValue(deployment.getDestination().getDeployDir());
-
form.setFields(bundleName, deployed, bundleVersionName, deployedBy, //
- description, status, destinationGroup, path);
+ destinationGroup, path, description, status);
+
return form;
}
13 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java | 13 +++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java | 5 ---
2 files changed, 11 insertions(+), 7 deletions(-)
New commits:
commit 4d770cf184501a7fa6dbf00741729e0e31dff122
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 15:48:09 2010 -0500
get the bundle list to sort properly on name column.
can't currently sort on the composite fields "latest version" and "count"
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index c6a9cdc..643d13a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -27,6 +27,7 @@ import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.ListGridFieldType;
import com.smartgwt.client.widgets.events.DoubleClickEvent;
import com.smartgwt.client.widgets.events.DoubleClickHandler;
+import com.smartgwt.client.widgets.grid.CellFormatter;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
@@ -85,11 +86,15 @@ public class BundlesListView extends Table<RPCDataSource<BundleWithLatestVersion
idField.setType(ListGridFieldType.INTEGER);
idField.setWidth("50");
- ListGridField nameField = new ListGridField(BundlesWithLatestVersionDataSource.FIELD_NAMELINK, MSG
+ ListGridField nameField = new ListGridField(BundlesWithLatestVersionDataSource.FIELD_NAME, MSG
.common_title_name());
- nameField.setType(ListGridFieldType.LINK);
- nameField.setTarget("_self");
nameField.setWidth("33%");
+ nameField.setCellFormatter(new CellFormatter() {
+ public String format(Object o, ListGridRecord record, int i, int i1) {
+ return "<a href=\"" + record.getAttribute(BundlesWithLatestVersionDataSource.FIELD_NAMELINK) + "\">"
+ + String.valueOf(o) + "</a>";
+ }
+ });
ListGridField descField = new ListGridField(BundlesWithLatestVersionDataSource.FIELD_DESCRIPTION, MSG
.common_title_description());
@@ -99,12 +104,14 @@ public class BundlesListView extends Table<RPCDataSource<BundleWithLatestVersion
MSG.view_bundle_latestVersion());
latestVersionField.setWidth("20%");
latestVersionField.setAlign(Alignment.CENTER);
+ latestVersionField.setCanSort(false); // need to figure out how we can sort on this projection field of the composite
ListGridField versionsCountField = new ListGridField(BundlesWithLatestVersionDataSource.FIELD_VERSIONS_COUNT,
MSG.view_bundle_list_versionsCount());
versionsCountField.setType(ListGridFieldType.INTEGER);
versionsCountField.setWidth("*");
versionsCountField.setAlign(Alignment.CENTER);
+ versionsCountField.setCanSort(false); // need to figure out how we can sort on this projection field of the composite
setListGridFields(idField, nameField, descField, latestVersionField, versionsCountField);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java
index 0932620..16b48c7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesWithLatestVersionDataSource.java
@@ -46,7 +46,7 @@ public class BundlesWithLatestVersionDataSource extends RPCDataSource<BundleWith
public static final String FIELD_NAMELINK = "namelink";
public static final String FIELD_DESCRIPTION = "description";
public static final String FIELD_LATEST_VERSION = "latestVersion";
- public static final String FIELD_VERSIONS_COUNT = "versionsCount";
+ public static final String FIELD_VERSIONS_COUNT = "deploymentCount";
private BundleGWTServiceAsync bundleService = GWTServiceLookup.getBundleService();
@@ -101,10 +101,7 @@ public class BundlesWithLatestVersionDataSource extends RPCDataSource<BundleWith
record.setAttribute(FIELD_ID, from.getBundleId());
record.setAttribute(FIELD_NAME, from.getBundleName());
-
record.setAttribute(FIELD_NAMELINK, LinkManager.getBundleLink(from.getBundleId()));
- record.setLinkText(from.getBundleName());
-
record.setAttribute(FIELD_DESCRIPTION, from.getBundleDescription());
record.setAttribute(FIELD_LATEST_VERSION, from.getLatestVersion());
record.setAttribute(FIELD_VERSIONS_COUNT, Integer.valueOf(from.getVersionsCount().intValue())); // want int, not long
13 years, 4 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java | 47 ++++++----
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java | 8 +
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 6 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 12 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java | 14 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java | 8 +
7 files changed, 76 insertions(+), 21 deletions(-)
New commits:
commit 3ddf5894f46a62d894a099d20db329e599fac42d
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 15:07:06 2010 -0500
BZ 606530 to avoid db deadlock during bundle deletion, add new "deletebundles" SLSB API that the client can use
this enables the client to not have to do multiple async calls to the single "deletebundle" api.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
index e06b795..c6a9cdc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java
@@ -18,6 +18,7 @@
*/
package org.rhq.enterprise.gui.coregui.client.bundle.list;
+import java.util.ArrayList;
import java.util.Set;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -44,6 +45,7 @@ import org.rhq.enterprise.gui.coregui.client.components.table.Table;
import org.rhq.enterprise.gui.coregui.client.components.table.TableActionEnablement;
import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.ErrorHandler;
import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
@@ -133,25 +135,37 @@ public class BundlesListView extends Table<RPCDataSource<BundleWithLatestVersion
addTableAction(extendLocatorId("Delete"), MSG.common_button_delete(), MSG.common_msg_areYouSure(),
new AbstractTableAction((hasAuth) ? TableActionEnablement.ANY : TableActionEnablement.NEVER) {
public void executeAction(ListGridRecord[] selections, Object actionValue) {
+ if (selections == null || selections.length == 0) {
+ return;
+ }
+
BundlesWithLatestVersionDataSource ds = (BundlesWithLatestVersionDataSource) getDataSource();
+ final ArrayList<String> doomedNames = new ArrayList<String>(selections.length);
+ int[] doomedIds = new int[selections.length];
+ int i = 0;
for (ListGridRecord selection : selections) {
- BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
- final BundleWithLatestVersionComposite object = ds.copyValues(selection);
- bundleManager.deleteBundle(object.getBundleId(), new AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(
- MSG.view_bundle_list_deleteFailure(object.getBundleName()), caught);
- }
-
- public void onSuccess(Void result) {
- CoreGUI.getMessageCenter().notify(
- new Message(MSG.view_bundle_list_deleteSuccessful(object.getBundleName()),
- Severity.Info));
-
- CoreGUI.refresh();
- }
- });
+ BundleWithLatestVersionComposite object = ds.copyValues(selection);
+ doomedNames.add(object.getBundleName());
+ doomedIds[i++] = object.getBundleId();
}
+
+ BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
+ bundleManager.deleteBundles(doomedIds, new AsyncCallback<Void>() {
+ public void onFailure(Throwable caught) {
+ String names = doomedNames.toString();
+ String error = ErrorHandler.getAllMessages(caught);
+ Message m = new Message(MSG.view_bundle_list_deletesFailure(), names + "<br/>\n"
+ + error, Severity.Error);
+ CoreGUI.getMessageCenter().notify(m);
+ }
+
+ public void onSuccess(Void result) {
+ Message m = new Message(MSG.view_bundle_list_deletesSuccessful(), doomedNames
+ .toString(), Severity.Info);
+ CoreGUI.getMessageCenter().notify(m);
+ CoreGUI.refresh();
+ }
+ });
}
});
@@ -191,5 +205,4 @@ public class BundlesListView extends Table<RPCDataSource<BundleWithLatestVersion
}
}
-
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index ad56819..0f58c44 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -55,6 +55,8 @@ public interface BundleGWTService extends RemoteService {
BundleDestination createBundleDestination(int bundleId, String name, String description, String deployDir,
int groupId) throws Exception;
+ void deleteBundles(int[] bundleIds) throws Exception;
+
void deleteBundle(int bundleId) throws Exception;
void deleteBundleDeployment(int bundleDeploymentId) throws Exception;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index cfb8d18..103fcac 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -101,6 +101,14 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
}
+ public void deleteBundles(int[] bundleIds) throws Exception {
+ try {
+ bundleManager.deleteBundles(getSessionSubject(), bundleIds);
+ } catch (Exception e) {
+ throw new RuntimeException(ThrowableUtil.getAllMessages(e));
+ }
+ }
+
public void deleteBundle(int bundleId) throws Exception {
try {
bundleManager.deleteBundle(getSessionSubject(), bundleId);
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
index 3ed25bb..4e12244 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties
@@ -942,9 +942,11 @@ view_bundleVersion_loadFailure = Failed to load bundle version data
view_bundle_list_backToAll = Back to All Bundles
view_bundle_list_tagUpdateFailure = Failed to update bundle tags
view_bundle_list_tagUpdateSuccessful = You have successfully updated the bundle tags
-view_bundle_list_deleteConfirm = Are you sure you want to delete this bundle?
+view_bundle_list_deleteConfirm = Are you sure you want to delete the selected bundles?
+view_bundle_list_deletesFailure = Failed to delete the bundles
+view_bundle_list_deletesSuccessful = You successfully deleted the bundles
view_bundle_list_deleteFailure = Failed to delete the bundle [{0}]
-view_bundle_list_deleteSuccessful = You successfully deleted the bundle named [{0}]
+view_bundle_list_deleteSuccessful = You successfully deleted the bundle [{0}]
view_bundle_list_error1 = Failed to load bundle to deploy [{0}]
view_bundle_list_error2 = Failed to get a single bundle to deploy [{0}]
view_bundle_list_error3 = Failed to load bundle
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index b1f65cf..a57b618 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -1219,6 +1219,18 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return results;
}
+ // to avoid deadlocks, you cannot delete multiple bundles concurrently (see BZ 606530)
+ // instead, this simple method just loops over the given array and deletes them serially
+ // note they all get deleted in their own transaction; this method is never in a tx itself
+ @TransactionAttribute(TransactionAttributeType.NEVER)
+ public void deleteBundles(Subject subject, int[] bundleIds) throws Exception {
+ if (bundleIds != null) {
+ for (int bundleId : bundleIds) {
+ bundleManager.deleteBundle(subject, bundleId);
+ }
+ }
+ }
+
@SuppressWarnings("unchecked")
@RequiredPermission(Permission.MANAGE_BUNDLE)
public void deleteBundle(Subject subject, int bundleId) throws Exception {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 3ce410d..e8fdd8f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -210,6 +210,20 @@ public interface BundleManagerRemote {
@WebParam(name = "distributionFileUrl") String distributionFileUrl) throws Exception;
/**
+ * Remove everything associated with the Bundles with the exception of files laid down by related deployments.
+ * Deployed files are left as is on the deployment platforms but the bundle mechanism will no longer track
+ * the deployment of all bundles that have been deleted.
+ *
+ * @param subject
+ * @param bundleIds IDs of all bundles to be deleted
+ * @throws Exception if any part of the removal fails.
+ */
+ @WebMethod
+ void deleteBundles( //
+ @WebParam(name = "subject") Subject subject, //
+ @WebParam(name = "bundleIds") int[] bundleIds) throws Exception;
+
+ /**
* Remove everything associated with the Bundle with the exception of files laid down by related deployments.
* Deployed files are left as is on the deployment platforms but the bundle mechanism will no longer track
* the deployment.
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 6e4f1a6..484a751 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
@@ -105,6 +105,8 @@ import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowCo
import org.rhq.core.domain.operation.GroupOperationHistory;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.ResourceOperationHistory;
+import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
+import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.core.domain.resource.CreateResourceHistory;
import org.rhq.core.domain.resource.DeleteResourceHistory;
import org.rhq.core.domain.resource.Resource;
@@ -140,9 +142,7 @@ import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementProblemManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
-import org.rhq.core.domain.operation.bean.GroupOperationSchedule;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
-import org.rhq.core.domain.operation.bean.ResourceOperationSchedule;
import org.rhq.enterprise.server.resource.ResourceFactoryManagerLocal;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.resource.ResourceNotFoundException;
@@ -307,6 +307,10 @@ public class WebservicesManagerBean implements WebservicesRemote {
return bundleManager.createBundleVersionViaURL(subject, distributionFileUrl);
}
+ public void deleteBundles(Subject subject, int[] bundleIds) throws Exception {
+ bundleManager.deleteBundles(subject, bundleIds);
+ }
+
public void deleteBundle(Subject subject, int bundleId) throws Exception {
bundleManager.deleteBundle(subject, bundleId);
}
13 years, 4 months
[rhq] 2 commits - modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/ConfirmationStep.java | 53 ++++++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/RevertStep.java | 3
2 files changed, 47 insertions(+), 9 deletions(-)
New commits:
commit 5dc0d1c0aa10da93ea73bfda9bc9b642b5daf543
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 14:14:52 2010 -0500
BZ 612955 if we don't have the previous bundle version, get it async and set the field. this way the user knows the bundle version of the previous bundle
this also fixes the description field which erroneously was the name field (cut-n-paste typo)
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 ce59914..4053fae 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
@@ -20,6 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.bundle.revert;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
@@ -27,7 +28,9 @@ import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleVersion;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
+import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep;
@@ -104,8 +107,8 @@ public class ConfirmationStep extends AbstractWizardStep {
private void setLayout() {
- BundleDeployment live = this.wizard.getLiveDeployment();
- BundleDeployment prev = this.wizard.getPreviousDeployment();
+ final BundleDeployment live = this.wizard.getLiveDeployment();
+ final BundleDeployment prev = this.wizard.getPreviousDeployment();
Label liveHeader = new Label();
liveHeader.setContents("<b>" + MSG.view_bundle_revertWizard_confirmStep_liveDeployment() + ":<b>");
@@ -120,6 +123,7 @@ public class ConfirmationStep extends AbstractWizardStep {
liveNameItem.setTitleAlign(Alignment.LEFT);
liveNameItem.setAlign(Alignment.LEFT);
liveNameItem.setWrap(false);
+ liveNameItem.setWrapTitle(false);
liveNameItem.setValue(live.getName());
liveNameItem.setLeft(20);
@@ -127,12 +131,15 @@ public class ConfirmationStep extends AbstractWizardStep {
liveDescItem.setTitleAlign(Alignment.LEFT);
liveDescItem.setAlign(Alignment.LEFT);
liveDescItem.setWrap(false);
- liveDescItem.setValue((null != live.getName()) ? live.getName() : MSG.common_val_none());
+ liveDescItem.setWrapTitle(false);
+ liveDescItem.setTitleVAlign(VerticalAlignment.TOP);
+ liveDescItem.setValue((null != live.getDescription()) ? live.getDescription() : MSG.common_val_none());
StaticTextItem liveVersionItem = new StaticTextItem("liveVersion", MSG.view_bundle_bundleVersion());
liveVersionItem.setTitleAlign(Alignment.LEFT);
liveVersionItem.setAlign(Alignment.LEFT);
liveVersionItem.setWrap(false);
+ liveVersionItem.setWrapTitle(false);
liveVersionItem.setValue(live.getBundleVersion().getVersion());
liveForm.setItems(liveNameItem, liveDescItem, liveVersionItem);
@@ -144,22 +151,53 @@ public class ConfirmationStep extends AbstractWizardStep {
prevHeader.setWidth100();
layout.addMember(prevHeader);
- DynamicForm prevForm = new DynamicForm();
+ final DynamicForm prevForm = new DynamicForm();
prevForm.setNumCols(2);
StaticTextItem prevNameItem = new StaticTextItem("prevName", MSG.common_title_name());
prevNameItem.setTitleAlign(Alignment.LEFT);
prevNameItem.setAlign(Alignment.LEFT);
prevNameItem.setWrap(false);
+ prevNameItem.setWrapTitle(false);
prevNameItem.setValue(prev.getName());
StaticTextItem prevDescItem = new StaticTextItem("prevDesc", MSG.common_title_description());
prevDescItem.setTitleAlign(Alignment.LEFT);
prevDescItem.setAlign(Alignment.LEFT);
prevDescItem.setWrap(false);
- prevDescItem.setValue((null != prev.getName()) ? prev.getName() : MSG.common_val_none());
+ prevDescItem.setWrapTitle(false);
+ prevDescItem.setTitleVAlign(VerticalAlignment.TOP);
+ prevDescItem.setValue((null != prev.getDescription()) ? prev.getDescription() : MSG.common_val_none());
+
+ final StaticTextItem prevVersionItem = new StaticTextItem("prevVersion", MSG.view_bundle_bundleVersion());
+ prevVersionItem.setTitleAlign(Alignment.LEFT);
+ prevVersionItem.setAlign(Alignment.LEFT);
+ prevVersionItem.setWrap(false);
+ prevVersionItem.setWrapTitle(false);
+ if (prev.getBundleVersion().getVersion() == null) {
+ BundleVersionCriteria c = new BundleVersionCriteria();
+ c.addFilterId(prev.getBundleVersion().getId());
+ bundleServer.findBundleVersionsByCriteria(c, new AsyncCallback<PageList<BundleVersion>>() {
+
+ @Override
+ public void onSuccess(PageList<BundleVersion> result) {
+ if (result != null && result.size() == 1) {
+ prevVersionItem.setValue(result.get(0).getVersion());
+ prevForm.markForRedraw();
+ }
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ prevVersionItem.setValue("?");
+ prevForm.markForRedraw();
+ }
+ });
+ } else {
+ prevVersionItem.setValue(prev.getBundleVersion().getVersion());
+ }
- prevForm.setItems(prevNameItem, prevDescItem);
+ prevForm.setItems(prevNameItem, prevDescItem, prevVersionItem);
layout.addMember(prevForm);
Label confirmation = new Label();
commit 6bd6837302b3e8720bebcfa8c2ed60f8de1345a9
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Mon Dec 20 13:29:54 2010 -0500
use concise messages for message center. the exception's messages will be put into the details area in the popup by ErrorHandler
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 8a8baa6..ce59914 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
@@ -93,7 +93,8 @@ public class ConfirmationStep extends AbstractWizardStep {
String message = MSG.view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment() + ": "
+ caught.getMessage();
wizard.getView().showMessage(message);
- CoreGUI.getErrorHandler().handleError(message, caught);
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment(), caught);
}
});
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/RevertStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/RevertStep.java
index 7724572..bfef06c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/RevertStep.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/revert/RevertStep.java
@@ -88,8 +88,7 @@ public class RevertStep extends AbstractWizardStep {
deployingImage.setSrc("/images/status_error.gif");
deployingMessage.setText(MSG.view_bundle_revertWizard_revertStep_scheduledFailure());
CoreGUI.getErrorHandler().handleError(
- MSG.view_bundle_revertWizard_revertStep_scheduledFailure() + ": " + caught.getMessage(),
- caught);
+ MSG.view_bundle_revertWizard_revertStep_scheduledFailure(), caught);
}
});
}
13 years, 4 months
[rhq] modules/enterprise
by Joseph Marques
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
New commits:
commit 270a9782e2d2f71d6bbad09627e4d260bbe2d04b
Author: Joseph Marques <joseph(a)redhat.com>
Date: Mon Dec 20 13:58:09 2010 -0500
fix to filter by subjectId not the subject object
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index dd6d556..27d9dcd 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -215,7 +215,7 @@ public final class CriteriaQueryGenerator {
+ " %aliasWithFragment%.id IN ( SELECT %aliasWithFragment%.id " + NL //
+ " FROM %alias% innerAlias " + NL //
+ " JOIN %innerAlias%.clusterResourceGroup crg JOIN crg.roles r JOIN r.subjects s " + NL //
- + " WHERE crg.recursive = true AND s = %subjectId% )" + NL //
+ + " WHERE crg.recursive = true AND s.id = %subjectId% )" + NL //
+ " OR" + NL //
+ " %aliasWithFragment%.id IN ( SELECT %aliasWithFragment%.id" + NL //
+ " FROM %alias% innerAlias " + NL //
13 years, 4 months