[prev in list] [next in list] [prev in thread] [next in thread] 

List:       rhq-commits
Subject:    [rhq] Branch 'gwt' - 10 commits - modules/core modules/enterprise
From:       ghinkle () fedoraproject ! org (Greg Hinkle)
Date:       2010-04-30 21:24:28
Message-ID: 20100430212428.181AE1201A4 () lists ! fedorahosted ! org
[Download RAW message or body]

 modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleType.java         \
|    2   modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementData.java \
|    7   modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric.java \
|    8   modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDefinition.java \
|    5   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java \
|   23 -  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java \
|  135 ++++++  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewPath.java \
|    8   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java \
|    4   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java \
|   59 ++  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java \
|   45 ++  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/BundleTopView.java \
|   63 ++-  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java \
|  206 ++++++----  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundlesListView.java \
|   26 -  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java \
|  188 +++++++++  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java \
|   91 ++++  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java \
|  199 +++++++++  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java \
|   84 ++++  modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java \
|    5   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java \
|    9   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletFactory.java \
|    9   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/GraphPortlet.java \
|    5   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/store/StoredPortlet.java \
|    5   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java \
|    6   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java \
|    2   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java \
|    4   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java \
|    2   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java \
|   11   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java \
|   16   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java \
|   15   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java \
|    8   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java \
|    4   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java \
|    4   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java \
|    7   modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java \
|   16   modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_16.png \
|binary  modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_24.png \
|binary  modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_16.png \
|binary  modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_24.png \
|binary  modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_16.png \
|binary  modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_24.png \
|binary  modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java \
|   74 ++-  modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java \
|    7   modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerRemote.java \
|    5   modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/webservices/WebservicesManagerBean.java \
|    4   44 files changed, 1220 insertions(+), 151 deletions(-)

New commits:
commit 13f0733ccb8ca2b2bead6d9057ebbffe17cd4eff
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Fri Apr 30 17:20:32 2010 -0400

    icons for the bundle area

diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_16.png \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_16.png
 new file mode 100644
index 0000000..78a92d9
Binary files /dev/null and \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_16.png \
                differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_24.png \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_24.png
 new file mode 100644
index 0000000..b2ef100
Binary files /dev/null and \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleDeployment_24.png \
                differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_16.png \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_16.png
 new file mode 100644
index 0000000..6b34692
Binary files /dev/null and \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_16.png \
                differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_24.png \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_24.png
 new file mode 100644
index 0000000..442f70b
Binary files /dev/null and \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/BundleVersion_24.png \
                differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_16.png \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_16.png
 new file mode 100644
index 0000000..78f3f34
Binary files /dev/null and \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_16.png \
                differ
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_24.png \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_24.png
 new file mode 100644
index 0000000..6605abb
Binary files /dev/null and \
b/modules/enterprise/gui/coregui/src/main/webapp/images/subsystems/bundle/Bundle_24.png \
differ


commit cc3a928d78a8dccfdec4df1a653ac7f0af1e0305
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Fri Apr 30 17:18:25 2010 -0400

    First version of the bundle tree
    updated bundle and bundle version screens

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewPath.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewPath.java
 index c3d82b8..8ad5d1f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewPath.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/ViewPath.java
 @@ -72,4 +72,12 @@ public class ViewPath {
     public boolean isNext(ViewId providedViewId) {
         return ((index + 1) < viewPath.size() && providedViewId != null && \
getNext().equals(providedViewId));  }
+
+    public boolean isNextEnd() {
+        return viewPath.size() <= index+1;
+    }
+
+    public int viewsLeft() {
+        return viewPath.size() - index - 1;
+    }
 }
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 4741f56..e2907b5 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
 @@ -19,16 +19,30 @@
 package org.rhq.enterprise.gui.coregui.client.bundle;
 
 import com.smartgwt.client.types.VisibilityMode;
+import com.smartgwt.client.widgets.Canvas;
 import com.smartgwt.client.widgets.layout.HLayout;
 import com.smartgwt.client.widgets.layout.SectionStack;
 import com.smartgwt.client.widgets.layout.SectionStackSection;
+import com.smartgwt.client.widgets.tree.TreeNode;
 
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.ViewId;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.bundle.list.BundleView;
 import org.rhq.enterprise.gui.coregui.client.bundle.list.BundlesListView;
+import org.rhq.enterprise.gui.coregui.client.bundle.tree.BundleTreeView;
 
 /**
  * @author Greg Hinkle
  */
-public class BundleTopView extends HLayout {
+public class BundleTopView extends HLayout implements BookmarkableView {
+    private BundleTreeView bundleTreeView;
+
+    private Canvas contentCanvas;
+
+    private ViewId currentNextPath;
+    private BundleView bundleView;
 
     public BundleTopView() {
         setWidth100();
@@ -45,12 +59,51 @@ public class BundleTopView extends HLayout {
         sectionStack.setWidth(250);
         sectionStack.setHeight100();
 
-        sectionStack.addSection(new SectionStackSection("Bundles"));
-        sectionStack.addSection(new SectionStackSection("Repositories"));
-        sectionStack.addSection(new SectionStackSection("Providers"));
+        SectionStackSection bundlesSection = new SectionStackSection("Bundles");
+        bundleTreeView = new BundleTreeView();
+        bundlesSection.addItem(bundleTreeView);
+        sectionStack.addSection(bundlesSection);
+
+        SectionStackSection repositoriesSection = new \
SectionStackSection("Repositories"); +        \
sectionStack.addSection(repositoriesSection); +
+        SectionStackSection providersSection = new SectionStackSection("Providers");
+        sectionStack.addSection(providersSection);
 
         addMember(sectionStack);
 
-        addMember(new BundlesListView());
+        contentCanvas = new Canvas();
+        contentCanvas.setWidth100();
+        contentCanvas.setHeight100();
+        addMember(contentCanvas);
+
+    }
+
+    public void setContent(Canvas newContent) {
+        if (contentCanvas.getChildren().length > 0)
+            contentCanvas.getChildren()[0].destroy();
+        contentCanvas.addChild(newContent);
+        contentCanvas.markForRedraw();
+    }
+
+
+    public void renderView(ViewPath viewPath) {
+
+        bundleTreeView.selectPath(viewPath);
+
+
+        if (viewPath.isEnd()) {
+            currentNextPath = null;
+            setContent(new BundlesListView());
+        } else if (viewPath.getCurrent().getPath().equals("Bundle")) {
+            if (!viewPath.getNext().equals(currentNextPath)) {
+                currentNextPath = viewPath.getNext();
+                bundleView = new BundleView();
+                setContent(bundleView);
+                bundleView.renderView(viewPath.next());
+            } else {
+                bundleView.renderView(viewPath.next());
+            }
+        }
     }
 }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
 index be0e415..cd23e12 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
 @@ -18,36 +18,52 @@
  */
 package org.rhq.enterprise.gui.coregui.client.bundle.list;
 
-import com.smartgwt.client.data.Record;
-import com.smartgwt.client.types.Alignment;
+import java.util.HashSet;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.smartgwt.client.types.Overflow;
 import com.smartgwt.client.types.SelectionAppearance;
 import com.smartgwt.client.types.SelectionStyle;
 import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Label;
 import com.smartgwt.client.widgets.form.DynamicForm;
 import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+import com.smartgwt.client.widgets.grid.CellFormatter;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.layout.HLayout;
 import com.smartgwt.client.widgets.layout.VLayout;
 import com.smartgwt.client.widgets.tab.Tab;
 import com.smartgwt.client.widgets.tab.TabSet;
 
-import org.rhq.core.domain.bundle.composite.BundleWithLatestVersionComposite;
+import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.criteria.BundleCriteria;
+import org.rhq.core.domain.tagging.Tag;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.Breadcrumb;
 import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ViewId;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.bundle.version.BundleVersionView;
 import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
 import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+import org.rhq.enterprise.gui.coregui.client.components.tagging.TagEditorView;
+import org.rhq.enterprise.gui.coregui.client.components.tagging.TagsChangedCallback;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
 
-public class BundleView extends VLayout {
+public class BundleView extends VLayout implements BookmarkableView {
 
     private int bundleBeingViewed = 0;
-    private Label message = new Label("Select a bundle...");
-    private VLayout canvas;
     private HeaderLabel headerLabel;
-    private StaticTextItem descriptionItem;
-    private StaticTextItem latestVersionItem;
+    DynamicForm form;
     private Table bundleVersionsTable;
 
+    private Bundle bundle;
+
     public BundleView() {
         super();
+        setWidth100();
+        setHeight100();
         setPadding(10);
         setOverflow(Overflow.AUTO);
     }
@@ -55,15 +71,14 @@ public class BundleView extends VLayout {
     @Override
     protected void onInit() {
         super.onInit();
-        addMember(message);
-        addMember(buildCanvas());
-        canvas.hide();
+
     }
 
-    private Canvas buildCanvas() {
-        canvas = new VLayout();
+    public void viewBundle(Bundle bundle, ViewId nextViewId) {
+        this.bundle = bundle;
+
+        headerLabel = new HeaderLabel("<img src=\"" + \
Canvas.getImgURL("subsystems/bundle/Bundle_24.png") + "\"/> " + bundle.getName());  
-        headerLabel = new HeaderLabel("<bundle name>");
 
         TabSet tabs = new TabSet();
         Tab summaryTab = createSummaryTab();
@@ -75,9 +90,18 @@ public class BundleView extends VLayout {
         Tab deploymentsTab = createDeploymentsTab();
         tabs.addTab(deploymentsTab);
 
-        canvas.addMember(headerLabel);
-        canvas.addMember(tabs);
-        return canvas;
+        addMember(headerLabel);
+        addMember(tabs);
+
+        if (nextViewId != null) {
+            if (nextViewId.getPath().equals("versions")) {
+                tabs.selectTab(versionsTab);
+            } else if (nextViewId.getPath().equals("deployments")) {
+                tabs.selectTab(deploymentsTab);
+            }
+        }
+
+        markForRedraw();
     }
 
     private Tab createDeploymentsTab() {
@@ -96,6 +120,12 @@ public class BundleView extends VLayout {
 
         bundleVersionsTable.getListGrid().getField("id").setWidth("60");
         bundleVersionsTable.getListGrid().getField("name").setWidth("25%");
+        bundleVersionsTable.getListGrid().getField("name").setCellFormatter(new \
CellFormatter() { +            public String format(Object o, ListGridRecord \
listGridRecord, int i, int i1) { +                return "<a href=\"#Bundles/Bundle/" \
+ bundle.getId() + "/versions/" + listGridRecord.getAttribute("id") + "\">" + o + \
"</a>"; +            }
+        });
+
         bundleVersionsTable.getListGrid().getField("version").setWidth("10%");
         bundleVersionsTable.getListGrid().getField("fileCount").setWidth("10%");
         bundleVersionsTable.getListGrid().getField("description").setWidth("*");
@@ -104,73 +134,117 @@ public class BundleView extends VLayout {
         bundleVersionsTable.getListGrid().setSelectionAppearance(SelectionAppearance.ROW_STYLE);
  
         versionsTab.setPane(bundleVersionsTable);
+
+        // versions tab
+        BundleVersionDataSource bvDataSource;
+        bvDataSource = (BundleVersionDataSource) \
bundleVersionsTable.getDataSource(); +        \
bvDataSource.setBundleId(bundleBeingViewed); +        bvDataSource.fetchData();
+        bundleVersionsTable.getListGrid().invalidateCache(); // TODO: is there a \
better way to refresh? +
         return versionsTab;
     }
 
     private Tab createSummaryTab() {
         Tab summaryTab = new Tab("Summary");
 
-        DynamicForm form = new DynamicForm();
+        form = new DynamicForm();
+        form.setWidth("50%");
+        form.setWrapItemTitles(false);
         form.setPadding(10);
 
-        descriptionItem = new StaticTextItem("description", "Description");
-        descriptionItem.setTitleAlign(Alignment.LEFT);
-        descriptionItem.setAlign(Alignment.LEFT);
+        StaticTextItem descriptionItem = new StaticTextItem("description", \
"Description");  descriptionItem.setWrap(false);
-        descriptionItem.setValue("");
 
-        latestVersionItem = new StaticTextItem("latestVersion", "Latest Version");
-        latestVersionItem.setTitleAlign(Alignment.LEFT);
-        latestVersionItem.setAlign(Alignment.LEFT);
+        StaticTextItem versionCountItem = new StaticTextItem("versionCount", \
"Version Count"); +
+
+        StaticTextItem latestVersionItem = new StaticTextItem("latestVersion", \
"Latest Version");  latestVersionItem.setWrap(false);
-        latestVersionItem.setValue("");
 
-        form.setFields(descriptionItem, latestVersionItem);
-        summaryTab.setPane(form);
+
+        StaticTextItem liveDeployments = new StaticTextItem("liveDeployments", "Live \
Deployments"); +
+
+        form.setFields(descriptionItem, versionCountItem, latestVersionItem, \
liveDeployments); +
+
+        form.setValue("description", bundle.getDescription());
+        form.setValue("versionCount", bundle.getBundleVersions() != null ? \
bundle.getBundleVersions().size() : 0); +
+
+        HLayout layout = new HLayout();
+        layout.setWidth100();
+
+        layout.addMember(form);
+
+        TagEditorView tagEditor = new TagEditorView(bundle.getTags(), false, new \
TagsChangedCallback() { +            public void tagsChanged(HashSet<Tag> tags) {
+                GWTServiceLookup.getTagService().updateBundleTags(bundleBeingViewed, \
tags, new AsyncCallback<Void>() { +                    public void \
onFailure(Throwable caught) { +                        \
CoreGUI.getErrorHandler().handleError("Failed to update bundle's tags", caught); +    \
} +
+                    public void onSuccess(Void result) {
+                        CoreGUI.getMessageCenter().notify(new Message("Bundle tags \
updated", Message.Severity.Info)); +                    }
+                });
+            }
+        });
+        layout.addMember(tagEditor);
+
+
+        summaryTab.setPane(layout);
+
 
         return summaryTab;
     }
 
-    public void viewRecord(Record record) {
-        if (record == null) {
-            viewNone();
-        } else {
-            final BundleWithLatestVersionComposite object;
-            object = (BundleWithLatestVersionComposite) \
                record.getAttributeAsObject("object");
-
-            if (object == null) {
-                viewNone();
-            } else {
-                if (bundleBeingViewed != object.getBundleId()) {
-                    bundleBeingViewed = object.getBundleId();
-
-                    // summary tab
-                    headerLabel.setContents(object.getBundleName());
-                    latestVersionItem.setValue(object.getLatestVersion());
-                    descriptionItem.setValue(object.getBundleDescription());
-
-                    // versions tab
-                    BundleVersionDataSource bvDataSource;
-                    bvDataSource = (BundleVersionDataSource) \
                bundleVersionsTable.getDataSource();
-                    bvDataSource.setBundleId(bundleBeingViewed);
-                    bvDataSource.fetchData();
-                    bundleVersionsTable.getListGrid().invalidateCache(); // TODO: is \
                there a better way to refresh?
-                }
 
-                try {
-                    message.hide();
-                    canvas.show();
-                    markForRedraw();
-                } catch (Throwable t) {
-                    CoreGUI.getErrorHandler().handleError("Cannot view bundle \
record", t); +
+    public void renderView(final ViewPath viewPath) {
+        int bundleId = Integer.parseInt(viewPath.getCurrent().getPath());
+
+        final ViewId viewId = viewPath.getCurrent();
+
+        viewPath.next();
+        if (viewPath.isEnd() || viewPath.isNextEnd()) {
+
+            if (bundleBeingViewed != bundleId) {
+                bundleBeingViewed = bundleId;
+
+                BundleCriteria criteria = new BundleCriteria();
+                criteria.addFilterId(bundleId);
+                criteria.fetchBundleVersions(true);
+                criteria.fetchTags(true);
+
+                GWTServiceLookup.getBundleService().findBundlesByCriteria(criteria,
+                        new AsyncCallback<PageList<Bundle>>() {
+                            public void onFailure(Throwable caught) {
+                                CoreGUI.getErrorHandler().handleError("Failed to \
load bundle", caught); +                            }
+
+                            public void onSuccess(PageList<Bundle> result) {
+                                Bundle bundle = result.get(0);
+                                viewBundle(bundle, viewPath.getCurrent());
+                                viewId.getBreadcrumbs().add(new \
Breadcrumb(String.valueOf(bundle.getId()), bundle.getName())); +                      \
CoreGUI.refreshBreadCrumbTrail(); +                            }
+                        });
+            }
+        } else {
+            if (viewPath.getCurrent().getPath().equals("versions")) {
+                if (viewPath.isEnd()) {
+
+                    // versions list screen
+                } else {
+                    // one version
+                    removeMembers(getMembers());
+                    BundleVersionView view = new BundleVersionView();
+                    addMember(view);
+                    view.renderView(viewPath.next());
                 }
             }
         }
     }
-
-    public void viewNone() {
-        message.show();
-        canvas.hide();
-        markForRedraw();
-    }
 }
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 21b04bf..2d49a44 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
 @@ -22,6 +22,7 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.smartgwt.client.types.Overflow;
 import com.smartgwt.client.types.SelectionAppearance;
 import com.smartgwt.client.types.SelectionStyle;
+import com.smartgwt.client.widgets.grid.CellFormatter;
 import com.smartgwt.client.widgets.grid.ListGridRecord;
 import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
 import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
@@ -49,19 +50,29 @@ import \
                org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity;
  */
 public class BundlesListView extends VLayout {
 
+    public BundlesListView() {
+        setWidth100();
+        setHeight100();
+    }
+
     @Override
     protected void onDraw() {
         super.onDraw();
 
         final Table table = new Table("Bundles");
-        table.setHeight("50%");
-        table.setShowResizeBar(true);
-        table.setResizeBarTarget("next");
 
         table.setDataSource(new BundlesWithLatestVersionDataSource());
 
         table.getListGrid().getField("id").setWidth("60");
         table.getListGrid().getField("name").setWidth("25%");
+        table.getListGrid().getField("name").setCellFormatter(new CellFormatter() {
+            public String format(Object o, ListGridRecord listGridRecord, int i, int \
i1) { +                return "<a href=\"#Bundles/Bundle/" + \
listGridRecord.getAttribute("id") + "\">" + o + "</a>"; +            }
+        });
+
+
+
         table.getListGrid().getField("description").setWidth("25%");
         table.getListGrid().getField("latestVersion").setWidth("25%");
         table.getListGrid().getField("versionsCount").setWidth("*");
@@ -154,14 +165,5 @@ public class BundlesListView extends VLayout {
 
         addMember(table);
 
-        final BundleView bundleView = new BundleView();
-        bundleView.setOverflow(Overflow.AUTO);
-        addMember(bundleView);
-
-        table.getListGrid().addRecordClickHandler(new RecordClickHandler() {
-            public void onRecordClick(RecordClickEvent event) {
-                bundleView.viewRecord(event.getRecord());
-            }
-        });
     }
 }
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
 new file mode 100644
index 0000000..e20dc58
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
 @@ -0,0 +1,188 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.tree;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.DataSourceField;
+import com.smartgwt.client.data.fields.DataSourceImageField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.tree.TreeNode;
+
+import org.rhq.core.domain.bundle.Bundle;
+import org.rhq.core.domain.bundle.BundleDeployment;
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.criteria.BundleCriteria;
+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.gwt.BundleGWTServiceAsync;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author Greg Hinkle
+ */
+public class BundleTreeDataSource extends RPCDataSource {
+
+    private BundleGWTServiceAsync bundleService = \
GWTServiceLookup.getBundleService(); +
+
+
+    public BundleTreeDataSource() {
+        DataSourceField idDataField = new DataSourceTextField("id", "ID");
+        idDataField.setPrimaryKey(true);
+
+        DataSourceTextField nameDataField = new DataSourceTextField("name", "Name");
+        nameDataField.setCanEdit(false);
+
+        DataSourceTextField descriptionDataField = new \
DataSourceTextField("description", "Description"); +        \
descriptionDataField.setCanEdit(false); +
+        DataSourceTextField parentIdField = new DataSourceTextField("parentId", \
"Parent ID"); +        parentIdField.setForeignKey("id");
+
+
+        setFields(idDataField, nameDataField, parentIdField);
+    }
+
+    @Override
+    protected void executeFetch(final DSRequest request, final DSResponse response) \
{ +
+        String p = request.getCriteria().getAttribute("parentId");
+        // load the bundles
+
+        if (p == null) {
+
+            BundleCriteria criteria = new BundleCriteria();
+            criteria.setPageControl(getPageControl(request));
+
+            bundleService.findBundlesByCriteria(criteria, new \
AsyncCallback<PageList<Bundle>>() { +                public void onFailure(Throwable \
caught) { +                    CoreGUI.getErrorHandler().handleError("Failed to load \
bundle data", caught); +                    \
response.setStatus(DSResponse.STATUS_FAILURE); +                    \
processResponse(request.getRequestId(), response); +                }
+
+                public void onSuccess(PageList<Bundle> result) {
+                    response.setData(buildRecords(result));
+                    response.setTotalRows(result.getTotalSize());
+                    processResponse(request.getRequestId(), response);
+                }
+            });
+        } else {
+            if (p.endsWith(":versions")) {
+                int bundleId = Integer.parseInt(p.substring(0, p.indexOf(":")));
+                BundleVersionCriteria criteria = new BundleVersionCriteria();
+                criteria.addFilterBundleId(bundleId);
+                bundleService.findBundleVersionsByCriteria(criteria, new \
AsyncCallback<PageList<BundleVersion>>() { +                    public void \
onFailure(Throwable caught) { +                        \
CoreGUI.getErrorHandler().handleError("Failed to load bundle data", caught); +        \
response.setStatus(DSResponse.STATUS_FAILURE); +                        \
processResponse(request.getRequestId(), response); +                    }
+
+                    public void onSuccess(PageList<BundleVersion> result) {
+                        response.setData(buildRecords(result));
+                        response.setTotalRows(result.getTotalSize());
+                        processResponse(request.getRequestId(), response);
+                    }
+                });
+            }
+        }
+
+
+    }
+
+    @Override
+    public Object copyValues(ListGridRecord from) {
+        return null;  // TODO: Implement this method.
+    }
+
+    @Override
+    public ListGridRecord[] buildRecords(Collection list) {
+        if (list == null) {
+            return null;
+        }
+
+        ArrayList<ListGridRecord> records = new ArrayList<ListGridRecord>();
+
+        int i = 0;
+        for (Object item : list) {
+            records.add(copyValues(item));
+            if (item instanceof Bundle) {
+                Bundle bundle = (Bundle) item;
+
+                TreeNode versionNode = new TreeNode("Versions");
+                versionNode.setID(bundle.getId() + ":versions");
+                versionNode.setParentID(String.valueOf(bundle.getId()));
+                versionNode.setName("Versions");
+                versionNode.setAttribute("name", "Versions");
+                records.add(versionNode);
+
+                TreeNode deploymentsNode = new TreeNode("Deployments");
+                deploymentsNode.setID(bundle.getId() + ":deployments");
+                deploymentsNode.setParentID(String.valueOf(bundle.getId()));
+                deploymentsNode.setName("Deployments");
+                records.add(deploymentsNode);
+
+            }
+
+        }
+        return records.toArray(new ListGridRecord[records.size()]);
+    }
+
+
+    @Override
+    public ListGridRecord copyValues(Object from) {
+        TreeNode node = new TreeNode();
+        if (from instanceof Bundle) {
+            Bundle bundle = (Bundle) from;
+            node.setID(String.valueOf(bundle.getId()));
+            node.setName(bundle.getName());
+            node.setIcon("subsystems/bundle/Bundle_16.png");
+
+        } else if (from instanceof BundleVersion) {
+            BundleVersion version = (BundleVersion) from;
+            node.setName(version.getName() + " (" + version.getVersion() + ")");
+            node.setID(version.getBundle().getId() + ":versions:" + \
version.getId()); +            node.setParentID(version.getBundle().getId() + \
":versions"); +            node.setIsFolder(false);
+            node.setIcon("subsystems/bundle/BundleVersion_16.png");
+
+        } else if (from instanceof BundleDeployment) {
+            BundleDeployment deployment = (BundleDeployment) from;
+            node.setName(deployment.getName() + " (" + \
deployment.getBundleVersion().getVersion() + ")"); +            \
node.setParentID(deployment.getBundleVersion().getBundle().getId() + ":deployments:" \
+ deployment.getId()); +            \
node.setParentID(deployment.getBundleVersion().getBundle().getId() + ":deployments"); \
+            node.setIsFolder(false); +            \
node.setIcon("subsystems/bundle/BundleDeployment_16.png"); +        }
+        return node;
+    }
+}
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
 new file mode 100644
index 0000000..effd488
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeView.java
 @@ -0,0 +1,91 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.tree;
+
+import com.google.gwt.user.client.History;
+import com.smartgwt.client.types.SelectionStyle;
+import com.smartgwt.client.widgets.grid.events.SelectionChangedHandler;
+import com.smartgwt.client.widgets.grid.events.SelectionEvent;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.tree.TreeGrid;
+import com.smartgwt.client.widgets.tree.TreeNode;
+import com.smartgwt.client.widgets.tree.events.NodeClickEvent;
+import com.smartgwt.client.widgets.tree.events.NodeClickHandler;
+
+import org.rhq.enterprise.gui.coregui.client.ViewId;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+
+/**
+ * @author Greg Hinkle
+ */
+public class BundleTreeView extends TreeGrid {
+
+    public BundleTreeView() {
+
+        setWidth100();
+        setHeight100();
+
+        setWidth100();
+        setHeight100();
+        setShowRoot(true);
+        setAutoFetchData(true);
+        setAnimateFolders(false);
+        setSelectionType(SelectionStyle.SINGLE);
+        setShowRollOver(false);
+        setSortField("name");
+        setShowHeader(false);
+
+        setDataSource(new BundleTreeDataSource());
+
+        addNodeClickHandler(new NodeClickHandler() {
+            public void onNodeClick(NodeClickEvent event) {
+                String path = event.getNode().getAttribute("id").replaceAll(":", \
"/"); +                History.newItem("Bundles/Bundle/" + path);
+            }
+        });
+    }
+
+    public void selectPath(ViewPath viewPath) {
+
+        if (viewPath.viewsLeft() > 0) {
+            String key = "";
+            for (ViewId view : viewPath.getViewPath().subList(2, \
viewPath.getViewPath().size())) { +                if (key.length() > 0)
+                    key += ":";
+
+                key += view.getPath();
+            }
+
+            TreeNode node = getTree().findById(key);
+            if (node != null) {
+                deselectAllRecords();
+                selectRecord(node);
+            }
+        } else {
+            deselectAllRecords();
+            selectRecord(0);
+        }
+
+
+    }
+}
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
 new file mode 100644
index 0000000..6a9aa6a
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java
 @@ -0,0 +1,199 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.version;
+
+import java.util.HashSet;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.TitleOrientation;
+import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
+import com.smartgwt.client.widgets.form.fields.StaticTextItem;
+import com.smartgwt.client.widgets.form.fields.TextAreaItem;
+import com.smartgwt.client.widgets.layout.VLayout;
+import com.smartgwt.client.widgets.tab.Tab;
+import com.smartgwt.client.widgets.tab.TabSet;
+
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.core.domain.criteria.BundleVersionCriteria;
+import org.rhq.core.domain.tagging.Tag;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ViewId;
+import org.rhq.enterprise.gui.coregui.client.ViewPath;
+import org.rhq.enterprise.gui.coregui.client.bundle.version.file.FileListView;
+import org.rhq.enterprise.gui.coregui.client.components.HeaderLabel;
+import org.rhq.enterprise.gui.coregui.client.components.tagging.TagEditorView;
+import org.rhq.enterprise.gui.coregui.client.components.tagging.TagsChangedCallback;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+
+/**
+ * @author Greg Hinkle
+ */
+public class BundleVersionView extends VLayout implements BookmarkableView {
+
+    private BundleVersion version;
+
+    public BundleVersionView() {
+        setWidth100();
+        setHeight100();
+    }
+
+    public void viewBundleVersion(BundleVersion version, ViewId nextViewId) {
+        this.version = version;
+
+
+        TabSet tabs = new TabSet();
+        tabs.addTab(createSummaryTab());
+
+        tabs.addTab(createLiveDeploymentsTab());
+
+        tabs.addTab(createFilesTab());
+
+        tabs.addTab(createUpdateHistoryTab());
+
+
+        addMember(new HeaderLabel("<img src=\"" + \
Canvas.getImgURL("subsystems/bundle/BundleVersion_24.png") + "\"/> " + \
version.getName())); +        addMember(tabs);
+
+        if (nextViewId != null) {
+            if (nextViewId.getPath().equals("deployments")) {
+                tabs.selectTab(1);
+            } else if (nextViewId.getPath().equals("files")) {
+                tabs.selectTab(2);
+            } else if (nextViewId.getPath().equals("history")) {
+                tabs.selectTab(3);
+            }
+        }
+
+        markForRedraw();
+    }
+
+
+    private Tab createSummaryTab() {
+        Tab tab = new Tab("Summary");
+
+        DynamicForm form = new DynamicForm();
+        form.setWidth100();
+        form.setNumCols(4);
+
+        StaticTextItem versionItem = new StaticTextItem("version","Version");
+        versionItem.setValue(version.getVersion());
+
+        CanvasItem tagItem = new CanvasItem("tag");
+        tagItem.setShowTitle(false);
+        TagEditorView tagEditor = new TagEditorView(version.getTags(), false, new \
TagsChangedCallback() { +            public void tagsChanged(HashSet<Tag> tags) {
+                GWTServiceLookup.getTagService().updateBundleVersionTags(version.getId(), \
tags, new AsyncCallback<Void>() { +                    public void \
onFailure(Throwable caught) { +                        \
CoreGUI.getErrorHandler().handleError("Failed to update bundle version's tags", \
caught); +                    }
+
+                    public void onSuccess(Void result) {
+                        CoreGUI.getMessageCenter().notify(new Message("Bundle \
Version tags updated", Message.Severity.Info)); +                    }
+                });
+            }
+        });
+        tagItem.setCanvas(tagEditor);
+        tagItem.setRowSpan(4);
+
+        StaticTextItem descriptionItem = new \
StaticTextItem("description","Description"); +        \
descriptionItem.setValue(version.getDescription()); +
+        StaticTextItem liveDeploymentsItem = new \
StaticTextItem("deployments","Deployments"); +        \
liveDeploymentsItem.setValue(version.getBundleDeployments().size()); +
+        StaticTextItem filesItems = new StaticTextItem("files","Files");
+        filesItems.setValue(version.getBundleFiles().size());
+
+
+
+
+        TextAreaItem recipeItem = new TextAreaItem("recipe","Recipe");
+        recipeItem.setTitleOrientation(TitleOrientation.TOP);
+        recipeItem.setColSpan(4);
+        recipeItem.setWidth("100%");
+        recipeItem.setValue(version.getRecipe());
+
+
+        form.setFields(versionItem,tagItem, descriptionItem, liveDeploymentsItem, \
filesItems, recipeItem); +
+        tab.setPane(form);
+
+        return tab;
+    }
+
+    private Tab createLiveDeploymentsTab() {
+        Tab tab = new Tab("Live Deployments");
+
+        return tab;
+    }
+
+    private Tab createFilesTab() {
+        Tab tab = new Tab("Files");
+
+        FileListView filesView = new FileListView(version.getBundleFiles());
+
+        tab.setPane(filesView);
+
+        return tab;
+    }
+
+    private Tab createUpdateHistoryTab() {
+        Tab tab = new Tab("Update History");
+
+        return tab;
+    }
+
+
+
+
+    public void renderView(final ViewPath viewPath) {
+        int bundleVersionId = Integer.parseInt(viewPath.getCurrent().getPath());
+
+
+        BundleVersionCriteria criteria = new BundleVersionCriteria();
+        criteria.addFilterId(bundleVersionId);
+        criteria.fetchBundle(true);
+        criteria.fetchBundleFiles(true);
+        criteria.fetchBundleDeployments(true);
+        criteria.fetchConfigurationDefinition(true);
+
+        GWTServiceLookup.getBundleService().findBundleVersionsByCriteria(criteria,
+                new AsyncCallback<PageList<BundleVersion>>() {
+                    public void onFailure(Throwable caught) {
+                        CoreGUI.getErrorHandler().handleError("Failed to load budle \
version", caught); +                    }
+
+                    public void onSuccess(PageList<BundleVersion> result) {
+                        viewBundleVersion(result.get(0), viewPath.getCurrent());
+                    }
+                });
+
+
+    }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java
 new file mode 100644
index 0000000..0d5f02e
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/file/FileListView.java
 @@ -0,0 +1,84 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.version.file;
+
+import java.util.List;
+
+import com.smartgwt.client.widgets.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleVersion;
+import org.rhq.enterprise.gui.coregui.client.components.table.Table;
+
+/**
+ * @author Greg Hinkle
+ */
+public class FileListView extends VLayout {
+
+    private List<BundleFile> files;
+
+    public FileListView(List<BundleFile> files) {
+        this.files = files;
+    }
+
+    @Override
+    protected void onDraw() {
+        super.onDraw();
+
+        Table table = new Table("Bundle Files");
+
+        ListGrid listGrid = table.getListGrid();
+
+        ListGridField id = new ListGridField("id", "Id");
+        id.setWidth("20%");
+
+        ListGridField name = new ListGridField("name", "Name");
+        name.setWidth("80%");
+
+        listGrid.setFields(id,name);
+
+        listGrid.setData(buildRecords(files));
+
+        addMember(listGrid);
+
+    }
+
+
+
+    private ListGridRecord[] buildRecords(List<BundleFile> files) {
+        ListGridRecord[] records = new ListGridRecord[files.size()];
+
+        int i = 0;
+        for (BundleFile file : files) {
+            ListGridRecord record = new ListGridRecord();
+            record.setAttribute("id",file.getId());
+            record.setAttribute("name", file.getPackageVersion().getFileName());
+            records[i++] = record;
+        }
+        return records;
+    }
+
+}


commit 8b73d728df3c1d81b467daa0714f2ae72882c38a
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Fri Apr 30 16:51:21 2010 -0400

    added missing method for webservices

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 6e952ef..c3fb229 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
 @@ -1080,6 +1080,10 @@ public class WebservicesManagerBean implements \
WebservicesRemote {  roleManager.removeSubjectsFromRole(subject, roleId, subjectIds);
     }
 
+    public void setAssignedResourceGroups(Subject subject, int roleId, int[] \
groupIds) { +        roleManager.setAssignedResourceGroups(subject, roleId, \
groupIds); +    }
+
     //ROLEMANAGER: END ----------------------------------
 
     //SUBJECT MANAGER: BEGIN ---------------------------------------


commit c8239a68740a082cd77c6d53e9eb360306b7f38a
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Thu Apr 29 16:47:57 2010 -0400

    Start to login screen, test dashboard tweaks

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
 index 995d19b..60b4b4b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java
 @@ -64,7 +64,10 @@ public class CoreGUI implements EntryPoint, \
ValueChangeHandler<String> {  
     private static ViewPath currentViewPath;
 
+    private static CoreGUI coreGUI;
+
     public void onModuleLoad() {
+        coreGUI = this;
 
         if (!GWT.isScript()) {
             KeyIdentifier debugKey = new KeyIdentifier();
@@ -83,6 +86,9 @@ public class CoreGUI implements EntryPoint, \
ValueChangeHandler<String> {  }
         });
 
+        messageCenter = new MessageCenter();
+
+
         RequestBuilder b = new RequestBuilder(RequestBuilder.GET,
                 "/j_security_check.do?j_username=rhqadmin&j_password=rhqadmin");
         try {
@@ -100,7 +106,6 @@ public class CoreGUI implements EntryPoint, \
                ValueChangeHandler<String> {
             e.printStackTrace(); //To change body of catch statement use File | \
Settings | File Templates.  }
 
-        messageCenter = new MessageCenter();
 
         SubjectGWTServiceAsync subjectService = \
SubjectGWTServiceAsync.Util.getInstance();  
@@ -115,18 +120,6 @@ public class CoreGUI implements EntryPoint, \
                ValueChangeHandler<String> {
                 System.out.println("Logged in: " + result.getSessionId());
                 setSessionSubject(result);
                 userPreferences = new UserPreferences(result);
-
-                buildCoreUI();
-
-                /* We can cache all metadata right here
-                ResourceTypeRepository.Cache.getInstance().getResourceTypes(
-                        (Integer[]) null, \
EnumSet.allOf(ResourceTypeRepository.MetadataType.class), new \
                ResourceTypeRepository.TypesLoadedCallback() {
-                    public void onTypesLoaded(HashMap<Integer, ResourceType> types) \
                {
-                        System.out.println("Preloaded [" + types.size() + "] \
                resource types");
-                        buildCoreUI();
-                    }
-                });
-                */
             }
         });
     }
@@ -195,6 +188,8 @@ public class CoreGUI implements EntryPoint, \
ValueChangeHandler<String> {  canvas = new DashboardsView();
         } else if (breadcrumbName.equals("Bundles")) {
             canvas = new BundleTopView();
+        } else if (breadcrumbName.equals("LogOut")) {
+            canvas = new LoginView();
         } else {
             canvas = null;
         }
@@ -229,6 +224,8 @@ public class CoreGUI implements EntryPoint, \
                ValueChangeHandler<String> {
         //        Subject s = new Subject(subject.getName(),subject.getFactive(), \
subject.getFsystem());  //        s.setSessionId(subject.getSessionId());
         CoreGUI.sessionSubject = subject;
+        CoreGUI.userPreferences = new UserPreferences(subject);
+        coreGUI.buildCoreUI();
     }
 
     public static void setContent(Canvas newContent) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
 new file mode 100644
index 0000000..8f5e35a
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LoginView.java
 @@ -0,0 +1,135 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client;
+
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestCallback;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.Window;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.PasswordItem;
+import com.smartgwt.client.widgets.form.fields.SubmitItem;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.enterprise.gui.coregui.client.gwt.SubjectGWTServiceAsync;
+
+/**
+ * @author Greg Hinkle
+ */
+public class LoginView extends VLayout {
+
+
+    public LoginView() {
+        setWidth100();
+        setHeight100();
+    }
+
+    @Override
+    protected void onDraw() {
+        super.onDraw();
+
+
+        final DynamicForm form = new DynamicForm();
+
+        TextItem user = new TextItem("user","User");
+        PasswordItem password = new PasswordItem("password","Password");
+
+        final SubmitItem login = new SubmitItem("login","Login");
+        login.setAlign(Alignment.CENTER);
+        login.setColSpan(2);
+
+        form.setFields(user,password,login);
+
+        Window graphPopup = new Window();
+        graphPopup.setTitle("RHQ Login");
+        graphPopup.setWidth(400);
+        graphPopup.setHeight(400);
+        graphPopup.setIsModal(true);
+        graphPopup.setShowModalMask(true);
+        graphPopup.setCanDragResize(true);
+        graphPopup.centerInPage();
+        graphPopup.addItem(form);
+        graphPopup.show();
+
+        login.addClickHandler(new ClickHandler() {
+            public void onClick(ClickEvent clickEvent) {
+                login(form.getValueAsString("user"), \
form.getValueAsString("password")); +            }
+        });
+
+    }
+
+    private void login(String user, String password) {
+        RequestBuilder b = new RequestBuilder(RequestBuilder.GET,
+        "/j_security_check.do?j_username=" + user + "&j_password=" + password );
+        try {
+            b.setCallback(new RequestCallback() {
+                public void onResponseReceived(Request request, Response response) {
+                    System.out.println("Portal-War logged in");
+                }
+
+                public void onError(Request request, Throwable exception) {
+                    System.out.println("Portal-War login failed");
+                }
+            });
+            b.send();
+        } catch (RequestException e) {
+            e.printStackTrace(); //To change body of catch statement use File | \
Settings | File Templates. +        }
+
+
+        SubjectGWTServiceAsync subjectService = \
SubjectGWTServiceAsync.Util.getInstance(); +
+        subjectService.login(user, password, new AsyncCallback<Subject>() {
+            public void onFailure(Throwable caught) {
+                System.out.println("Failed to login - cause: " + caught);
+                Label loginFailed = new Label("Failed to login - cause: " + caught);
+                loginFailed.draw();
+            }
+
+            public void onSuccess(Subject result) {
+                System.out.println("Logged in: " + result.getSessionId());
+                CoreGUI.setSessionSubject(result);
+
+                /* We can cache all metadata right here
+                ResourceTypeRepository.Cache.getInstance().getResourceTypes(
+                        (Integer[]) null, \
EnumSet.allOf(ResourceTypeRepository.MetadataType.class), new \
ResourceTypeRepository.TypesLoadedCallback() { +                    public void \
onTypesLoaded(HashMap<Integer, ResourceType> types) { +                        \
System.out.println("Preloaded [" + types.size() + "] resource types"); +              \
buildCoreUI(); +                    }
+                });
+                */
+            }
+        });
+    }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
 index 5c31020..20ebafc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/AdministrationView.java
 @@ -174,8 +174,6 @@ public class AdministrationView extends HLayout implements \
BookmarkableView {  final TreeNode manageDownloads = new TreeNode("Downloads");
         final TreeNode manageLicense = new TreeNode("License");
         final TreeNode managePlugins = new TreeNode("Plugins");
-        FullHTMLPane pane = new FullHTMLPane("/rhq/admin/plugin/plugin-list.xhtml");
-
 
         tree.setRoot(new TreeNode("System Configuration",
                 manageSettings, manageTemplates, manageDownloads, manageLicense, \
managePlugins)); @@ -252,6 +250,8 @@ public class AdministrationView extends HLayout \
implements BookmarkableView {  url = "/rhq/admin/downloads-body.xhtml";
             } else if ("License".equals(page)) {
                 url = "/admin/license/LicenseAdmin.do?mode=view";
+            } else if ("Plugins".equals(page)) {
+                url = "/rhq/admin/plugin/plugin-list.xhtml";
             }
             url = addQueryStringParam(url, "nomenu=true");
             content = new FullHTMLPane(url);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
 index 73bf032..8b7288f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
 @@ -23,12 +23,10 @@
 package org.rhq.enterprise.gui.coregui.client.admin.roles;
 
 import java.util.Collection;
-import java.util.List;
 
 import com.smartgwt.client.widgets.grid.ListGridRecord;
 
 import org.rhq.core.domain.resource.group.ResourceGroup;
-import org.rhq.core.domain.util.PageList;
 import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
  import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceGroupSelector;
  
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
 index db4fbf8..f3dee98 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/SmallGraphView.java
 @@ -116,6 +116,22 @@ public class SmallGraphView extends VLayout {
         return "PlotHoverListener";
     }
 
+    public int getResourceId() {
+        return resourceId;
+    }
+
+    public void setResourceId(int resourceId) {
+        this.resourceId = resourceId;
+    }
+
+    public int getDefinitionId() {
+        return definitionId;
+    }
+
+    public void setDefinitionId(int definitionId) {
+        this.definitionId = definitionId;
+    }
+
     @Override
     protected void onDraw() {
         super.onDraw();


commit 2aabed546fc64f64356ca49231846aa30d8864ae
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Thu Apr 29 16:47:16 2010 -0400

    Group member mgmt gwt exposed

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java
 index d0cc937..1915ec6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java
 @@ -39,4 +39,6 @@ public interface ResourceGroupGWTService extends RemoteService {
     PageList<ResourceGroup> findResourceGroupsByCriteria(ResourceGroupCriteria \
criteria);  
     PageList<GroupDefinition> \
findGroupDefinitionsByCriteria(ResourceGroupDefinitionCriteria criteria); +
+    void ensureMembershipMatches(int groupId, int[] resourceIds);
 }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java
 index 867de6e..e154f45 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java
 @@ -18,8 +18,6 @@
  */
 package org.rhq.enterprise.gui.coregui.server.gwt;
 
-import com.google.gwt.user.server.rpc.RemoteServiceServlet;
-
 import org.rhq.core.domain.criteria.ResourceGroupCriteria;
 import org.rhq.core.domain.criteria.ResourceGroupDefinitionCriteria;
 import org.rhq.core.domain.resource.group.GroupDefinition;
@@ -27,7 +25,6 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
 import org.rhq.core.domain.util.PageList;
 import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTService;
 import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
-import org.rhq.enterprise.server.resource.group.ResourceGroupManagerBean;
 import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal;
 import org.rhq.enterprise.server.resource.group.definition.GroupDefinitionManagerLocal;
  import org.rhq.enterprise.server.util.LookupUtil;
@@ -54,4 +51,8 @@ public class ResourceGroupGWTServiceImpl extends \
AbstractGWTServiceImpl implemen  \
"ResourceGroupService.findGroupDefinitionsByCriteria");  }
 
+    public void ensureMembershipMatches(int groupId, int[] resourceIds) {
+        groupManager.ensureMembershipMatches(getSessionSubject(), groupId, \
resourceIds); +    }
+
 }
\ No newline at end of file


commit 4a405ebb6341bb94e7820c84ff798d58f03cde59
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Thu Apr 29 16:46:52 2010 -0400

    type in the breadcrumbs

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 898b56a..92b63ce 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
 @@ -80,7 +80,7 @@ public class ResourceTreeView extends VLayout {
         super();
         this.selectedResource = selectedResource;
 
-        setWidth("30%");
+        setWidth("250");
         setHeight100();
 
         setShowResizeBar(true);
@@ -317,7 +317,8 @@ public class ResourceTreeView extends VLayout {
             for (int i = parents.length - 1; i >= 0; i--) {
                 TreeNode n = parents[i];
                 if (n instanceof ResourceTreeDatasource.ResourceTreeNode) {
-                    viewId.getBreadcrumbs().add(new Breadcrumb(n.getAttribute("id"), \
n.getName(), true)); +                    viewId.getBreadcrumbs().add(new \
Breadcrumb(n.getAttribute("id"), +                            n.getName() + " (" + \
((ResourceTreeDatasource.ResourceTreeNode)n).getResourceType().getName() + ")", \
true));  }
             }
             viewId.getBreadcrumbs().add(new Breadcrumb(node.getAttribute("id"), \
node.getName(), true)); @@ -372,7 +373,8 @@ public class ResourceTreeView extends \
                VLayout {
                                             for (int i = parents.length - 1; i >= 0; \
i--) {  TreeNode n = parents[i];
                                                 if (n instanceof \
                ResourceTreeDatasource.ResourceTreeNode) {
-                                                    viewId.getBreadcrumbs().add(new \
Breadcrumb(n.getAttribute("id"), n.getName(), true)); +                               \
viewId.getBreadcrumbs().add(new Breadcrumb(n.getAttribute("id"), +                    \
n.getName() + " (" + \
((ResourceTreeDatasource.ResourceTreeNode)n).getResourceType().getName() + ")", \
true));  }
                                             }
                                             viewId.getBreadcrumbs().add(new \
Breadcrumb(selectedNode.getAttribute("id"), selectedNode.getName(), true)); @@ -433,7 \
                +435,8 @@ public class ResourceTreeView extends VLayout {
                                             for (int i = parents.length - 1; i >= 0; \
i--) {  TreeNode n = parents[i];
                                                 if (n instanceof \
                ResourceTreeDatasource.ResourceTreeNode) {
-                                                    viewId.getBreadcrumbs().add(new \
Breadcrumb(n.getAttribute("id"), n.getName(), true)); +                               \
viewId.getBreadcrumbs().add(new Breadcrumb(n.getAttribute("id"), +                    \
n.getName() + " (" + \
((ResourceTreeDatasource.ResourceTreeNode)n).getResourceType().getName() + ")", \
true));  }
                                             }
                                             viewId.getBreadcrumbs().add(new \
Breadcrumb(selectedNode.getAttribute("id"), selectedNode.getName(), true));


commit 55b8817da82e76b677a4609c9e34b51f11ffa07f
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Thu Apr 29 15:50:03 2010 -0400

    Dashboard prototype tweaks

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
 index 9f3a1c5..34e0028 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardView.java
 @@ -187,7 +187,7 @@ public class DashboardView extends VLayout {
         for (ArrayList<StoredPortlet> column : storedDashboard.getPortlets()) {
 
             for (StoredPortlet storedPortlet : column) {
-                Canvas portalCanvas = \
PortletFactory.buildPortlet(storedPortlet.getPortletKey()); +                Canvas \
portalCanvas = PortletFactory.buildPortlet(storedPortlet);  
                 final Portlet portlet = new Portlet(editMode);
                 portlet.addItem(portalCanvas);
@@ -212,7 +212,8 @@ public class DashboardView extends VLayout {
     private void addPortlet(String portletName) {
         final Portlet newPortlet = new Portlet(true);
 
-        Canvas canvas = PortletFactory.buildPortlet(portletName);
+        StoredPortlet storedPortlet = new StoredPortlet(portletName, portletName, \
250); +        Canvas canvas = PortletFactory.buildPortlet(storedPortlet);
 
         newPortlet.setTitle(portletName);
 
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
 index 944a612..ac4e968 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java
 @@ -98,8 +98,17 @@ public class DashboardsView extends VLayout {
         col1.add(summary);
 
         StoredPortlet graph = new StoredPortlet("ghinkle (MAC OS X) CPU", \
GraphPortlet.KEY, 250); +        graph.setProperty("resourceId","10001");
+        graph.setProperty("definitionId","10139");
         col1.add(graph);
 
+        StoredPortlet graphTwo = new StoredPortlet("JBoss AS Txn / Min", \
GraphPortlet.KEY, 250); +        graphTwo.setProperty("resourceId","10003");
+        graphTwo.setProperty("definitionId","10971");
+        col1.add(graphTwo);
+
+
+
         // Experimental
 //        StoredPortlet platformSummary = new StoredPortlet("Platform Summary", \
PlatformPortletView.KEY, 300);  //        col2.add(platformSummary);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletFactory.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletFactory.java
 index e46aaa6..df9037f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletFactory.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/PortletFactory.java
 @@ -33,6 +33,7 @@ import \
org.rhq.enterprise.gui.coregui.client.dashboard.portlets.recent.alerts.Re  import \
org.rhq.enterprise.gui.coregui.client.dashboard.portlets.recent.imported.RecentlyAddedView;
  import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.platform.PlatformPortletView;
  import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.summary.InventorySummaryView;
 +import org.rhq.enterprise.gui.coregui.client.dashboard.store.StoredPortlet;
 
 /**
  * @author Greg Hinkle
@@ -58,13 +59,15 @@ public class PortletFactory {
 
     }
 
-    public static Canvas buildPortlet(String portletKey) {
+    public static Canvas buildPortlet(StoredPortlet storedPortlet) {
 
 
-        PortletViewFactory viewFactory = registeredPortlets.get(portletKey);
+        PortletViewFactory viewFactory = \
registeredPortlets.get(storedPortlet.getPortletKey());  
         Canvas canvas = null;
-        canvas = (Canvas) viewFactory.getInstance();
+        PortletView view = viewFactory.getInstance();
+        view.configure(storedPortlet);
+        canvas = (Canvas) view;
 
         return canvas;
 
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/GraphPortlet.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/GraphPortlet.java
 index ccba4e8..425cd42 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/GraphPortlet.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/inventory/resource/graph/GraphPortlet.java
 @@ -34,11 +34,12 @@ public class GraphPortlet extends SmallGraphView implements \
PortletView {  public static final String KEY = "Resource Graph";
 
     public GraphPortlet() {
-        super(10001, 10100);
+
     }
 
     public void configure(StoredPortlet storedPortlet) {
-        // TODO: Implement this method.
+        setResourceId(Integer.parseInt(storedPortlet.getProperties().get("resourceId")));
 +        setDefinitionId(Integer.parseInt(storedPortlet.getProperties().get("definitionId")));
  }
 
     public Canvas getHelpCanvas() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/store/StoredPortlet.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/store/StoredPortlet.java
 index 2ac35c4..e684f42 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/store/StoredPortlet.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/store/StoredPortlet.java
 @@ -101,4 +101,9 @@ public class StoredPortlet {
     public void setHeight(int height) {
         this.height = height;
     }
+
+    public void setProperty(String name, String value) {
+        properties.put(name, value);
+    }
+
 }


commit e198490d4aac0eb3dc5b852287af099b9373442d
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Thu Apr 29 15:49:24 2010 -0400

    Add resource icon to the favorites popup

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
 index 72eb936..6ae4186 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/footer/FavoritesButton.java
 @@ -90,6 +90,12 @@ public class FavoritesButton extends IMenuButton {
                                 // TODO: Ideally, we should use \
ResourceManagerLocal.disambiguate() here to obtain  //       disambiguated Resource \
names.  item.setTitle(resource.getName());
+
+                                String category = \
resource.getResourceType().getCategory().getDisplayName(); +
+                                String avail = (resource.getCurrentAvailability() != \
null && resource.getCurrentAvailability().getAvailabilityType() != null) +            \
? (resource.getCurrentAvailability().getAvailabilityType().name().toLowerCase()) : \
"down"; +                                item.setIcon("types/" + category + "_" + \
avail + "_16.png");  }
                             favoritesMenu.setItems(items);
                             favoritesMenu.showContextMenu();


commit 5aa82f1e3cc3423e1048cd418d8fbbc4ce149e5d
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Thu Apr 29 15:46:36 2010 -0400

    Support the selector having initially selected records (to update a current \
selection of groups to deploy to or for role assignments)

diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
 index 8d4025e..523c822 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
 @@ -22,8 +22,15 @@ import org.rhq.core.domain.authz.Permission;
 import org.rhq.core.domain.authz.Role;
 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.components.HeaderLabel;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceGroupSelector;
  
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
 import com.smartgwt.client.data.Record;
 import com.smartgwt.client.types.DSOperationType;
 import com.smartgwt.client.types.Overflow;
@@ -32,6 +39,7 @@ import com.smartgwt.client.widgets.Label;
 import com.smartgwt.client.widgets.form.DynamicForm;
 import com.smartgwt.client.widgets.form.events.SubmitValuesEvent;
 import com.smartgwt.client.widgets.form.events.SubmitValuesHandler;
+import com.smartgwt.client.widgets.form.fields.CanvasItem;
 import com.smartgwt.client.widgets.form.fields.ResetItem;
 import com.smartgwt.client.widgets.form.fields.SubmitItem;
 import com.smartgwt.client.widgets.form.fields.TextItem;
@@ -40,6 +48,8 @@ import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
 import com.smartgwt.client.widgets.grid.ListGridRecord;
 import com.smartgwt.client.widgets.layout.VLayout;
 
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.Set;
 
 /**
@@ -57,7 +67,8 @@ public class RoleEditView extends VLayout {
     private HeaderLabel editLabel;
     private DynamicForm form;
     private PermissionEditorView permissionEditorItem;
-    private RoleGroupsEditorItem assignedGroupEditorItem;
+    private CanvasItem selectorItem;
+    private ResourceGroupSelector groupSelector;
 
     public RoleEditView() {
         super();
@@ -97,10 +108,10 @@ public class RoleEditView extends VLayout {
         permissionEditorItem.setShowTitle(false);
         permissionEditorItem.setColSpan(2);
 
+        selectorItem = new CanvasItem("groupSelectionCanvas");
 
-        assignedGroupEditorItem = new RoleGroupsEditorItem("assignedGroups", \
                "Assigned Groups");
-        assignedGroupEditorItem.setShowTitle(false);
-        assignedGroupEditorItem.setColSpan(2);
+        selectorItem.setShowTitle(false);
+        selectorItem.setColSpan(2);
 
         SubmitItem saveButton = new SubmitItem("save", "Save");
 
@@ -123,7 +134,7 @@ public class RoleEditView extends VLayout {
                 idItem,
                 nameItem,
                 permissionEditorItem,
-                assignedGroupEditorItem,
+                selectorItem,
                 saveButton, new ResetItem("reset", "Reset"));
 
         editCanvas.addMember(form);
@@ -140,7 +151,10 @@ public class RoleEditView extends VLayout {
             form.editRecord(record);
             permissionEditorItem.setParentForm(form);
             permissionEditorItem.setPermissions((Set<Permission>) \
                record.getAttributeAsObject("permissions"));
-            assignedGroupEditorItem.setGroups((PageList<ResourceGroup>) \
record.getAttributeAsObject("assignedGroups")); +
+            groupSelector = new \
RoleResourceGroupSelector((Collection<ResourceGroup>) \
record.getAttributeAsObject("resourceGroups")); +            \
selectorItem.setCanvas(groupSelector); +
         } catch (Throwable t) {
             t.printStackTrace();
         }
@@ -164,8 +178,39 @@ public class RoleEditView extends VLayout {
 
 
     public void save() {
+
         System.out.println("Saving role");
-        form.saveData();
+        form.saveData(new DSCallback() {
+            public void execute(DSResponse dsResponse, Object o, DSRequest \
dsRequest) { +                HashSet<Integer> selection = \
groupSelector.getSelection(); +                int[] groupIds = new \
int[selection.size()]; +                int i = 0;
+                for (Integer id : selection) {
+                    groupIds[i++] = id;
+                }
+
+                int roleId;
+                if (roleBeingEdited != null) {
+                    roleId = roleBeingEdited.getId();
+                } else {
+                    // new role
+                    roleId = Integer.parseInt(new \
ListGridRecord(dsRequest.getData()).getAttribute("id")); +                }
+
+
+                GWTServiceLookup.getRoleService().setAssignedResourceGroups(
+                        roleId, groupIds,
+                        new AsyncCallback<Void>() {
+                            public void onFailure(Throwable caught) {
+                                CoreGUI.getErrorHandler().handleError("Failed to \
update role's assigned groups",caught); +                            }
+
+                            public void onSuccess(Void result) {
+                                // TODO: Implement this method.
+                            }
+                        });
+            }
+        });
     }
 
 
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
 new file mode 100644
index 0000000..73bf032
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleResourceGroupSelector.java
 @@ -0,0 +1,47 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2010 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.admin.roles;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.resource.group.ResourceGroup;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
 +import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceGroupSelector;
 +
+/**
+ * @author Greg Hinkle
+ */
+public class RoleResourceGroupSelector extends ResourceGroupSelector {
+
+    public RoleResourceGroupSelector(Collection<ResourceGroup> groups) {
+        super();
+        if (groups != null) {
+            ListGridRecord[] data = (new \
ResourceGroupsDataSource()).buildRecords(groups); +            setAssigned(data);
+        }
+    }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java
 index 230dbdc..768b8f4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/RoleGWTService.java
 @@ -37,4 +37,8 @@ public interface RoleGWTService extends RemoteService {
     Role updateRole(Role role);
 
     void removeRoles(Integer[] roleIds);
+
+    void setAssignedResourceGroups(int roleId, int[] resourceGroupIds);
+
+    void setAssignedSubjects(int roleId, int[] subjectIds);
 }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
 index 7499f0b..5738bd4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java
 @@ -55,7 +55,7 @@ public class ResourceGroupsDataSource extends \
RPCDataSource<ResourceGroup> {  }
 
     public ResourceGroupsDataSource() {
-        super("ResourceGroups");
+//        super("ResourceGroups");
 
         DataSourceField idDataField = new DataSourceIntegerField("id", "ID", 20);
         idDataField.setPrimaryKey(true);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java
 index 06c322c..b1fbcb2 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/AbstractSelector.java
 @@ -53,10 +53,12 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
 /**
  * @author Greg Hinkle
  */
-public abstract class AbstractSelector extends HLayout {
+public abstract class AbstractSelector<T> extends HLayout {
 
     protected HashSet<Integer> selection = new HashSet<Integer>();
 
+    protected ListGridRecord[] initialSelection;
+
     protected ListGrid availableGrid;
     protected ListGrid assignedGrid;
 
@@ -72,13 +74,17 @@ public abstract class AbstractSelector extends HLayout {
         setHeight(380);
     }
 
+    public void setAssigned(ListGridRecord[] assignedRecords) {
+        initialSelection = assignedRecords;
+    }
+
     public HashSet<Integer> getSelection() {
         return selection;
     }
 
     protected abstract DynamicForm getAvailableFilterForm();
 
-    protected abstract RPCDataSource<?> getDataSource();
+    protected abstract RPCDataSource<T> getDataSource();
 
     protected abstract Criteria getLatestCriteria(DynamicForm availableFilterForm);
 
@@ -219,6 +225,11 @@ public abstract class AbstractSelector extends HLayout {
                 select(recordDropEvent.getDropRecords());
             }
         });
+
+        if (initialSelection != null) {
+            assignedGrid.setData(initialSelection);
+            select(initialSelection);
+        }
     }
 
     protected void updateButtons() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
 index 06f6e4b..e4d9a5b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceGroupSelector.java
 @@ -18,6 +18,8 @@
  */
 package org.rhq.enterprise.gui.coregui.client.inventory.resource.selection;
 
+import java.util.Collection;
+
 import com.smartgwt.client.data.Criteria;
 import com.smartgwt.client.widgets.form.DynamicForm;
 import com.smartgwt.client.widgets.form.fields.SelectItem;
@@ -32,7 +34,7 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
 /**
  * @author Greg Hinkle
  */
-public class ResourceGroupSelector extends AbstractSelector {
+public class ResourceGroupSelector extends AbstractSelector<ResourceGroup> {
 
     public ResourceGroupSelector() {
         super();
@@ -51,7 +53,7 @@ public class ResourceGroupSelector extends AbstractSelector {
         return availableFilterForm;
     }
 
-    protected RPCDataSource<?> getDataSource() {
+    protected RPCDataSource<ResourceGroup> getDataSource() {
         return new SelectedResourceGroupsDataSource();
     }
 
@@ -68,7 +70,7 @@ public class ResourceGroupSelector extends AbstractSelector {
     private class SelectedResourceGroupsDataSource extends ResourceGroupsDataSource \
{  
         @Override
-        public ListGridRecord[] buildRecords(PageList<ResourceGroup> resourceGroups) \
{ +        public ListGridRecord[] buildRecords(Collection<ResourceGroup> \
                resourceGroups) {
             ListGridRecord[] records = super.buildRecords(resourceGroups);
             for (ListGridRecord record : records) {
                 if (selection.contains(record.getAttributeAsInt("id"))) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
 index ea092d5..2ed234f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/selection/ResourceSelector.java
 @@ -18,6 +18,8 @@
  */
 package org.rhq.enterprise.gui.coregui.client.inventory.resource.selection;
 
+import java.util.Collection;
+
 import com.smartgwt.client.data.Criteria;
 import com.smartgwt.client.widgets.form.DynamicForm;
 import com.smartgwt.client.widgets.form.fields.IPickTreeItem;
@@ -75,7 +77,7 @@ public class ResourceSelector extends AbstractSelector {
     private class SelectedResourceDataSource extends ResourceDatasource {
 
         @Override
-        public ListGridRecord[] buildRecords(PageList<Resource> resources) {
+        public ListGridRecord[] buildRecords(Collection<Resource> resources) {
             ListGridRecord[] records = super.buildRecords(resources);
             for (ListGridRecord record : records) {
                 if (selection.contains(record.getAttributeAsInt("id"))) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
 index 0774160..a288517 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java
 @@ -18,6 +18,8 @@
  */
 package org.rhq.enterprise.gui.coregui.client.util;
 
+import java.util.Collection;
+
 import org.rhq.core.domain.util.PageControl;
 import org.rhq.core.domain.util.PageList;
 import org.rhq.core.domain.util.PageOrdering;
@@ -111,7 +113,7 @@ public abstract class RPCDataSource<T> extends DataSource {
     }
 
 
-    public ListGridRecord[] buildRecords(PageList<T> list) {
+    public ListGridRecord[] buildRecords(Collection<T> list) {
         if (list == null) {
             return null;
         }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java \
b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java
 index 373322f..1414025 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java
                
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/RoleGWTServiceImpl.java
 @@ -18,23 +18,14 @@
  */
 package org.rhq.enterprise.gui.coregui.server.gwt;
 
-import org.rhq.core.domain.auth.Subject;
 import org.rhq.core.domain.authz.Role;
 import org.rhq.core.domain.criteria.RoleCriteria;
-import org.rhq.core.domain.criteria.SubjectCriteria;
 import org.rhq.core.domain.util.PageList;
 import org.rhq.enterprise.gui.coregui.client.gwt.RoleGWTService;
-import org.rhq.enterprise.gui.coregui.client.gwt.SubjectGWTService;
 import org.rhq.enterprise.gui.coregui.server.util.SerialUtility;
-import org.rhq.enterprise.server.auth.SubjectManagerLocal;
 import org.rhq.enterprise.server.authz.RoleManagerLocal;
-import org.rhq.enterprise.server.exception.LoginException;
 import org.rhq.enterprise.server.util.LookupUtil;
 
-import com.google.gwt.user.server.rpc.RemoteServiceServlet;
-
-import javax.jws.WebParam;
-
 /**
  * @author Greg Hinkle
  */
@@ -62,4 +53,11 @@ public class RoleGWTServiceImpl extends AbstractGWTServiceImpl \
implements RoleGW  roleManager.deleteRoles(getSessionSubject(), roleIds);
     }
 
+    public void setAssignedResourceGroups(int roleId, int[] resourceGroupIds) {
+        roleManager.setAssignedResourceGroups(getSessionSubject(), roleId, \
resourceGroupIds); +    }
+
+    public void setAssignedSubjects(int roleId, int[] subjectIds) {
+        roleManager.setAssignedSubjects(getSessionSubject(), roleId, subjectIds);
+    }
 }
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java \
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
 index 00d4c31..0bbfff8 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
                
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerBean.java
 @@ -27,6 +27,7 @@ import java.util.Set;
 import javax.ejb.EJB;
 import javax.ejb.Stateless;
 import javax.interceptor.ExcludeDefaultInterceptors;
+import javax.jws.WebParam;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
@@ -42,6 +43,7 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
 import org.rhq.core.domain.util.PageControl;
 import org.rhq.core.domain.util.PageList;
 import org.rhq.core.server.PersistenceUtility;
+import org.rhq.core.util.collection.ArrayUtils;
 import org.rhq.enterprise.server.RHQConstants;
 import org.rhq.enterprise.server.auth.SubjectManagerLocal;
 import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
@@ -179,7 +181,7 @@ public class RoleManagerBean implements RoleManagerLocal, \
RoleManagerRemote {  
             if (subjectToModify.getFsystem() || \
                (authorizationManager.isSystemSuperuser(subjectToModify))) {
                 throw new PermissionException("You cannot assign roles to user [" + \
                subjectToModify.getName()
-                    + "] - roles are fixed for this user");
+                        + "] - roles are fixed for this user");
             }
 
             subjectToModify.getRoles().size();
@@ -188,7 +190,7 @@ public class RoleManagerBean implements RoleManagerLocal, \
RoleManagerRemote {  Role role = entityManager.find(Role.class, roleId);
                 if (role == null) {
                     throw new IllegalArgumentException("Tried to add role[" + roleId \
                + "] to subject[" + subjectId
-                        + "], but role was not found");
+                            + "], but role was not found");
                 }
                 role.addSubject(subjectToModify);
                 if (isLdap) {
@@ -213,12 +215,12 @@ public class RoleManagerBean implements RoleManagerLocal, \
                RoleManagerRemote {
                 Subject newSubject = entityManager.find(Subject.class, subjectId);
                 if (newSubject == null) {
                     throw new IllegalArgumentException("Tried to add subject[" + \
                subjectId + "] to role[" + roleId
-                        + "], but subject was not found");
+                            + "], but subject was not found");
                 }
 
                 if (newSubject.getFsystem() || \
                (authorizationManager.isSystemSuperuser(newSubject))) {
                     throw new PermissionException("You cannot alter the roles for \
                user [" + newSubject.getName()
-                        + "] - roles are fixed for this user");
+                            + "] - roles are fixed for this user");
                 }
 
                 role.addSubject(newSubject);
@@ -239,7 +241,7 @@ public class RoleManagerBean implements RoleManagerLocal, \
RoleManagerRemote {  
             if (subjectToModify.getFsystem() || \
                (authorizationManager.isSystemSuperuser(subjectToModify))) {
                 throw new PermissionException("You cannot remove roles from user [" \
                + subjectToModify.getName()
-                    + "] - roles are fixed for this user");
+                        + "] - roles are fixed for this user");
             }
 
             for (Integer roleId : roleIds) {
@@ -353,7 +355,7 @@ public class RoleManagerBean implements RoleManagerLocal, \
RoleManagerRemote {  @RequiredPermission(Permission.MANAGE_SECURITY)
     @SuppressWarnings("unchecked")
     public PageList<Role> findAvailableRolesForSubject(Subject subject, Integer \
                subjectId, Integer[] pendingRoleIds,
-        PageControl pc) {
+                                                       PageControl pc) {
         pc.initDefaultOrderingField("r.name");
 
         String queryName;
@@ -408,7 +410,7 @@ public class RoleManagerBean implements RoleManagerLocal, \
                RoleManagerRemote {
                 ResourceGroup group = entityManager.find(ResourceGroup.class, \
groupId);  if (role == null) {
                     throw new IllegalArgumentException("Tried to add resourceGroup[" \
                + groupId + "] to role[" + roleId
-                        + "], but resourceGroup was not found");
+                            + "], but resourceGroup was not found");
                 }
                 role.addResourceGroup(group);
             }
@@ -433,13 +435,37 @@ public class RoleManagerBean implements RoleManagerLocal, \
                RoleManagerRemote {
                 ResourceGroup doomedGroup = entityManager.find(ResourceGroup.class, \
groupId);  if (doomedGroup == null) {
                     throw new IllegalArgumentException("Tried to remove \
                doomedGroup[" + groupId + "] from role["
-                        + roleId + "], but subject was not found");
+                            + roleId + "], but subject was not found");
                 }
                 role.removeResourceGroup(doomedGroup);
             }
         }
     }
 
+    @RequiredPermission(Permission.MANAGE_SECURITY)
+    public void setAssignedResourceGroups(Subject subject, int roleId, int[] \
groupIds) { +
+        Role role = getRole(subject, roleId);
+        List<Integer> currentMembers = new ArrayList<Integer>();
+        for (ResourceGroup group : role.getResourceGroups()) {
+            currentMembers.add(group.getId());
+        }
+
+
+        List<Integer> newMembers = ArrayUtils.wrapInList(groupIds); // members \
needing addition +        newMembers.removeAll(currentMembers);
+        if (newMembers.size() > 0) {
+            addResourceGroupsToRole(subject, roleId, groupIds);
+        }
+
+        List<Integer> extraMembers = new ArrayList<Integer>(currentMembers); // \
members needing removal +        \
extraMembers.removeAll(ArrayUtils.wrapInList(groupIds)); +        if \
(extraMembers.size() > 0) { +            removeResourceGroupsFromRole(subject, \
roleId, groupIds); +        }
+    }
+
+
     private void processDependentPermissions(Role role) {
         /*
          * if you can control user/roles, then you can give yourself permissions, \
too;  so we might as well @@ -468,7 +494,7 @@ public class RoleManagerBean implements \
                RoleManagerLocal, RoleManagerRemote {
                 Subject doomedSubject = entityManager.find(Subject.class, \
subjectId);  if (doomedSubject == null) {
                     throw new IllegalArgumentException("Tried to remove subject[" + \
                subjectId + "] from role[" + roleId
-                        + "], but subject was not found");
+                            + "], but subject was not found");
                 }
                 role.removeSubject(doomedSubject);
             }
@@ -476,6 +502,28 @@ public class RoleManagerBean implements RoleManagerLocal, \
RoleManagerRemote {  }
 
     @RequiredPermission(Permission.MANAGE_SECURITY)
+    public void setAssignedSubjects(Subject subject, int roleId, int[] subjectIds) {
+        Role role = getRole(subject, roleId);
+        List<Integer> currentMembers = new ArrayList<Integer>();
+        for (ResourceGroup group : role.getResourceGroups()) {
+            currentMembers.add(group.getId());
+        }
+
+
+        List<Integer> newMembers = ArrayUtils.wrapInList(subjectIds); // members \
needing addition +        newMembers.removeAll(currentMembers);
+        if (newMembers.size() > 0) {
+            addSubjectsToRole(subject, roleId, subjectIds);        }
+
+        List<Integer> extraMembers = new ArrayList<Integer>(currentMembers); // \
members needing removal +        \
extraMembers.removeAll(ArrayUtils.wrapInList(subjectIds)); +        if \
(extraMembers.size() > 0) { +            removeSubjectsFromRole(subject, roleId, \
subjectIds); +        }
+    }
+
+
+    @RequiredPermission(Permission.MANAGE_SECURITY)
     public void removeRolesFromResourceGroup(Subject subject, int groupId, int[] \
roleIds) {  if ((roleIds != null) && (roleIds.length > 0)) {
             ResourceGroup group = entityManager.find(ResourceGroup.class, groupId);
@@ -488,7 +536,7 @@ public class RoleManagerBean implements RoleManagerLocal, \
RoleManagerRemote {  Role doomedRole = entityManager.find(Role.class, roleId);
                 if (doomedRole == null) {
                     throw new IllegalArgumentException("Tried to remove role[" + \
                roleId + "] from resourceGroup["
-                        + groupId + "], but role was not found");
+                            + groupId + "], but role was not found");
                 }
                 group.removeRole(doomedRole);
             }
@@ -514,7 +562,7 @@ public class RoleManagerBean implements RoleManagerLocal, \
RoleManagerRemote {  Role role = entityManager.find(Role.class, roleId);
                 if (role == null) {
                     throw new IllegalArgumentException("Tried to add role[" + roleId \
                + "] to resourceGroup[" + groupId
-                        + "], but role was not found");
+                            + "], but role was not found");
                 }
                 group.addRole(role);
             }
@@ -527,9 +575,9 @@ public class RoleManagerBean implements RoleManagerLocal, \
                RoleManagerRemote {
     public PageList<Role> findRolesByCriteria(Subject subject, RoleCriteria \
criteria) {  
         if (criteria.isSecurityManagerRequired()
-            && !authorizationManager.hasGlobalPermission(subject, \
Permission.MANAGE_SECURITY)) { +                && \
!authorizationManager.hasGlobalPermission(subject, Permission.MANAGE_SECURITY)) {  \
                throw new PermissionException("Subject [" + subject.getName()
-                + "] requires SecurityManager permission for requested query \
criteria."); +                    + "] requires SecurityManager permission for \
requested query criteria.");  }
 
         CriteriaQueryGenerator generator = new CriteriaQueryGenerator(criteria);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java \
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
 index 58f962a..3b6e6e2 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
                
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerLocal.java
 @@ -21,6 +21,7 @@ package org.rhq.enterprise.server.authz;
 import java.util.Set;
 
 import javax.ejb.Local;
+import javax.jws.WebParam;
 
 import org.rhq.core.domain.auth.Subject;
 import org.rhq.core.domain.authz.Permission;
@@ -187,6 +188,8 @@ public interface RoleManagerLocal {
 
     void removeSubjectsFromRole(Subject subject, int roleId, int[] subjectIds);
 
+    void setAssignedSubjects(Subject sessionSubject, int roleId, int[] subjectIds);
+
     /**
      * Adds the given resource groups to the given role.
      *
@@ -198,6 +201,10 @@ public interface RoleManagerLocal {
 
     void addRolesToResourceGroup(Subject subject, int groupId, int[] roleIds);
 
+    void setAssignedResourceGroups(Subject subject, int roleId, int[] groupIds);
+
+
+
     /**
      * Removes the given resource groups from the given role.
      *
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerRemote.java \
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerRemote.java
 index 55da160..e0008cc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerRemote.java
                
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/RoleManagerRemote.java
 @@ -184,6 +184,11 @@ public interface RoleManagerRemote {
         @WebParam(name = "groupId") int groupId, //
         @WebParam(name = "roleIds") int[] roleIds);
 
+    void setAssignedResourceGroups(
+        @WebParam(name = "subject") Subject subject, //
+        @WebParam(name = "roleId") int roleId, //
+        @WebParam(name = "groupIds") int[] groupIds);
+
     /**
      * Removes the given resource groups from the given role.
      *


commit ddc67fa913b8f7cf21aa5a6f45d2b2fc518e852a
Author: Greg Hinkle <ghinkle at redhat.com>
Date:   Thu Apr 29 14:37:40 2010 -0400

    Some jaxb binding fixes for webservices

diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleType.java \
b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleType.java index \
                72605e0..8e766ae 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleType.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/bundle/BundleType.java
@@ -38,6 +38,7 @@ import javax.persistence.SequenceGenerator;
 import javax.persistence.Table;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlTransient;
 
 import org.rhq.core.domain.resource.ResourceType;
 
@@ -70,6 +71,7 @@ public class BundleType implements Serializable {
 
     @JoinColumn(name = "RESOURCE_TYPE_ID", referencedColumnName = "ID", nullable = \
false)  @OneToOne(fetch = FetchType.LAZY, optional = false)
+    @XmlTransient
     private ResourceType resourceType;
 
     public BundleType() {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementData.java \
b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementData.java
 index 6d0be7f..7fefa3e 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementData.java
                
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementData.java
 @@ -32,12 +32,17 @@ import javax.persistence.InheritanceType;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
 
-/**
+ /**
  * Represents data that was collected either due to a schedule or an on-demand, live \
                collection.
  */
 @Entity
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+ at XmlAccessorType(XmlAccessType.FIELD)
+ at XmlRootElement
 public abstract class MeasurementData implements Serializable {
 
     @EmbeddedId
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric.java \
b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric.java
 index d2f81dc..4e82c43 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric.java
                
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDataNumeric.java
 @@ -24,11 +24,17 @@ package org.rhq.core.domain.measurement;
 
 import java.io.Serializable;
 
-/**
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+ /**
  * Subclass for numerical measurement data
  *
  * @author Heiko W. Rupp
  */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlRootElement
 public class MeasurementDataNumeric extends MeasurementData implements Serializable \
{  private static final long serialVersionUID = 1L;
 
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDefinition.java \
b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDefinition.java
 index 48a682d..2d20882 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDefinition.java
                
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementDefinition.java
 @@ -43,6 +43,9 @@ import javax.persistence.OneToMany;
 import javax.persistence.SequenceGenerator;
 import javax.persistence.Table;
 import javax.persistence.Version;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -73,6 +76,8 @@ import org.rhq.core.domain.resource.ResourceType;
         + "   SET md.defaultOn = false") })
 @SequenceGenerator(name = "id", sequenceName = "RHQ_MEASUREMENT_DEF_ID_SEQ")
 @Table(name = "RHQ_MEASUREMENT_DEF")
+ at XmlAccessorType(XmlAccessType.FIELD)
+ at XmlRootElement
 public class MeasurementDefinition implements Serializable {
 
     public static final String QUERY_NATIVE_UPDATE_DEFAULT_ON_BY_IDS = "" //


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic