modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceComposite.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java | 156 +++++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TogglableTextItem.java | 61 +++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/ValueUpdatedHandler.java | 8 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java | 10 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGroupGWTService.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 19 - modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/OverviewView.java | 164 +++++++--- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSelectListener.java | 11 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 126 ++----- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java | 81 ++-- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/alert/ResourceAlertHistoryView.java | 6 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/GraphListView.java | 12 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java | 38 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java | 159 +++++++-- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java | 35 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGroupGWTServiceImpl.java | 12 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 64 +++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerLocal.java | 10 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java | 20 + modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java | 38 ++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java | 8 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerRemote.java | 20 + 25 files changed, 821 insertions(+), 264 deletions(-)
New commits: commit aad7ce9eabe9d79aeb035bd17f98f2ef8ffa7410 Author: Ian Springer ian.springer@redhat.com Date: Thu Aug 12 11:26:01 2010 -0400
fix logic that determines which resource tabs are enabled
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java index 68d92d5..1be470e 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java @@ -202,46 +202,34 @@ public class ResourceDetailView extends VLayout implements BookmarkableView, Res ResourcePermission permissions = this.resourceComposite.getResourcePermission(); ResourceFacets facets = this.resourceComposite.getResourceFacets();
- // TODO (ips): No perms should be needed to view Monitoring and Alerts tabs. + // Summary, Monitoring, Inventory, and Alerts tabs are always enabled.
- if (permissions.isMeasure()) { - topTabSet.enableTab(monitoringTab); - } else { - topTabSet.disableTab(monitoringTab); - } + monitoringTab.setSubTabEnabled("Call Time", facets.isCallTime());
- if (facets.isOperation() && permissions.isControl()) { + if (facets.isOperation()) { topTabSet.enableTab(operationsTab); } else { topTabSet.disableTab(operationsTab); }
- if (permissions.isAlert()) { - topTabSet.enableTab(alertsTab); - } else { - topTabSet.disableTab(alertsTab); - } - - if (!facets.isConfiguration() && permissions.isConfigureRead()) { + if (facets.isConfiguration() && permissions.isConfigureRead()) { topTabSet.enableTab(configurationTab); } else { topTabSet.disableTab(configurationTab); }
- if (facets.isEvent() && permissions.isMeasure()) { + if (facets.isEvent()) { topTabSet.enableTab(eventsTab); } else { topTabSet.disableTab(eventsTab); }
- if (facets.isContent() && permissions.isContent()) { + if (facets.isContent()) { topTabSet.enableTab(contentTab); } else { topTabSet.disableTab(contentTab); }
- // only enable "Call Time" sub-tab for those that implement it - monitoringTab.setSubTabEnabled("Call Time", facets.isCallTime());
if (topTabSet.getSelectedTab().getDisabled()) { topTabSet.selectTab(0);
commit d00cabef04eb1ae458a9dcf4b1f217e6d4c7b76e Author: Ian Springer ian.springer@redhat.com Date: Thu Aug 12 11:06:03 2010 -0400
add new EnhancedDynamicForm GWT component that supports fields that can be toggled back and forth between view and edit mode; add support for setting name, description, and location fields on both Resources and groups
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceComposite.java index 96745a8..8b6f809 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/composite/ResourceComposite.java @@ -119,6 +119,10 @@ public class ResourceComposite implements Serializable { return resourcePermission; }
+ public void setResourcePermission(ResourcePermission resourcePermission) { + this.resourcePermission = resourcePermission; + } + @XmlTransient public ResourceFacets getResourceFacets() { return resourceFacets; diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java index 3e8f61a..50ed0ae 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/FullHTMLPane.java @@ -26,10 +26,15 @@ import com.smartgwt.client.widgets.HTMLPane; */ public class FullHTMLPane extends HTMLPane {
- public FullHTMLPane(String url) { + public FullHTMLPane() { setWidth100(); setHeight100(); setContentsType(ContentsType.PAGE); + } + + public FullHTMLPane(String url) { + this(); setContentsURL(url); } + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java new file mode 100644 index 0000000..02185e7 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/EnhancedDynamicForm.java @@ -0,0 +1,156 @@ +/* + * RHQ Management Platform + * Copyright (C) 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.components.form; + +import com.google.gwt.core.client.JavaScriptObject; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.FormItemIfFunction; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.FormItemIcon; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.form.fields.events.BlurEvent; +import com.smartgwt.client.widgets.form.fields.events.BlurHandler; +import com.smartgwt.client.widgets.form.fields.events.IconClickEvent; +import com.smartgwt.client.widgets.form.fields.events.IconClickHandler; +import com.smartgwt.client.widgets.form.fields.events.KeyPressEvent; +import com.smartgwt.client.widgets.form.fields.events.KeyPressHandler; + +import java.util.ArrayList; +import java.util.List; + +/** + * TODO + * + * @author Ian Springer + */ +public class EnhancedDynamicForm extends DynamicForm { + public EnhancedDynamicForm(JavaScriptObject jsObj) { + super(jsObj); + } + + public EnhancedDynamicForm() { + super(); + } + + @Override + protected void onDraw() { + super.onDraw(); + setNumCols(4); + setColWidths("25%", "25%", "25%", "25%"); + setWrapItemTitles(false); + setWidth("90%"); + } + + @Override + public void setItems(FormItem... items) { + List<FormItem> itemsList = new ArrayList<FormItem>(); + List<String> togglableTextItemNames = new ArrayList<String>(); + for (FormItem item : items) { + if (item instanceof TogglableTextItem) { + final TogglableTextItem togglableTextItem = (TogglableTextItem) item; + togglableTextItemNames.add(togglableTextItem.getName()); + + final StaticTextItem staticTextItem = + new StaticTextItem(getStaticTextItemName(togglableTextItem.getName()), + togglableTextItem.getTitle()); + staticTextItem.setAttribute("editing", false); + + FormItemIcon editIcon = new FormItemIcon(); + editIcon.setName("Edit"); + editIcon.setSrc("[SKIN]/actions/edit.png"); + staticTextItem.setIcons(editIcon); + staticTextItem.setShowIcons(true); + + staticTextItem.addIconClickHandler(new IconClickHandler() { + public void onIconClick(IconClickEvent iconClickEvent) { + if ("Edit".equals(iconClickEvent.getIcon().getName())) { + staticTextItem.setAttribute("editing", true); + markForRedraw(); + } + } + }); + staticTextItem.setShowIfCondition(new FormItemIfFunction() { + public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) { + boolean editing = staticTextItem.getAttributeAsBoolean("editing"); + return !editing; + } + }); + staticTextItem.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() { + public void onClick(com.smartgwt.client.widgets.form.fields.events.ClickEvent clickEvent) { + staticTextItem.setAttribute("editing", true); + markForRedraw(); + } + }); + staticTextItem.setRedrawOnChange(true); + itemsList.add(staticTextItem); + + togglableTextItem.addKeyPressHandler(new KeyPressHandler() { + public void onKeyPress(KeyPressEvent keyPressEvent) { + if (keyPressEvent.getKeyName().equals("Enter")) { + updateValue(staticTextItem, togglableTextItem); + } + } + }); + togglableTextItem.addBlurHandler(new BlurHandler() { + public void onBlur(BlurEvent blurEvent) { + updateValue(staticTextItem, togglableTextItem); + } + }); + togglableTextItem.setShowIfCondition(new FormItemIfFunction() { + public boolean execute(FormItem formItem, Object o, DynamicForm dynamicForm) { + boolean editing = staticTextItem.getAttributeAsBoolean("editing"); + return editing; + } + }); + itemsList.add(togglableTextItem); + } else { + itemsList.add(item); + } + } + + super.setItems((FormItem[]) itemsList.toArray(new FormItem[itemsList.size()])); + + // SmartGWT annoyingly barfs if getValue() is called on a form item before it's been added to a form, so + // we wait until after we've added all of the items to the form to set the values of the static items we + // added, because only at that point can we grab the values of the corresponding togglable items. + for (String name : togglableTextItemNames) { + String value = getValueAsString(name); + setValue(getStaticTextItemName(name), value); + } + } + + private String getStaticTextItemName(String togglableTextItemName) { + return "static" + togglableTextItemName; + } + + private void updateValue(StaticTextItem staticTextItem, TogglableTextItem textItem) { + String value = (String) textItem.getValue(); + staticTextItem.setValue(value); + staticTextItem.setAttribute("editing", false); + for (ValueUpdatedHandler handler : textItem.getValueUpdatedHandlers()) { + handler.onValueUpdated(value); + } + markForRedraw(); + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TogglableTextItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TogglableTextItem.java new file mode 100644 index 0000000..399cb7e --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/TogglableTextItem.java @@ -0,0 +1,61 @@ +/* + * RHQ Management Platform + * Copyright (C) 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.components.form; + +import com.google.gwt.core.client.JavaScriptObject; +import com.smartgwt.client.widgets.form.fields.TextItem; + +import java.util.ArrayList; +import java.util.List; + +/** + * TODO + * + * @author Ian Springer + */ +public class TogglableTextItem extends TextItem { + List<ValueUpdatedHandler> valueUpdatedHandlers = new ArrayList<ValueUpdatedHandler>(); + + public TogglableTextItem() { + } + + public TogglableTextItem(JavaScriptObject jsObj) { + super(jsObj); + } + + public TogglableTextItem(String name) { + super(name); + } + + public TogglableTextItem(String name, String title) { + super(name, title); + } + + public void addValueUpdatedHandler(ValueUpdatedHandler handler) { + this.valueUpdatedHandlers.add(handler); + } + + public List<ValueUpdatedHandler> getValueUpdatedHandlers() { + return valueUpdatedHandlers; + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/ValueUpdatedHandler.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/ValueUpdatedHandler.java new file mode 100644 index 0000000..ac35115 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/form/ValueUpdatedHandler.java @@ -0,0 +1,8 @@ +package org.rhq.enterprise.gui.coregui.client.components.form; + +/** + * @author Ian Springer + */ +public interface ValueUpdatedHandler { + void onValueUpdated(String newValue); +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java index e7857cd..53741a9 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/ResourceGWTService.java @@ -29,6 +29,7 @@ import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.composite.RecentlyAddedResourceComposite; +import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList;
@@ -39,6 +40,8 @@ public interface ResourceGWTService extends RemoteService {
PageList<Resource> findResourcesByCriteria(ResourceCriteria criteria);
+ PageList<ResourceComposite> findResourceCompositesByCriteria(ResourceCriteria criteria); + List<Resource> getResourceLineage(int resourceId);
List<Resource> getResourceLineageAndSiblings(int resourceId); @@ -61,4 +64,11 @@ public interface ResourceGWTService extends RemoteService { void ignoreResources(Integer[] resourceIds);
void unignoreResources(Integer[] resourceIds); + + void updateResourceName(int resourceId, String name); + + void updateResourceDescription(int resourceId, String description); + + void updateResourceLocation(int resourceId, String location); + } \ No newline at end of file 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 5644554..9134199 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 @@ -45,4 +45,11 @@ public interface ResourceGroupGWTService extends RemoteService { ResourceGroup createResourceGroup(ResourceGroup group, int[] resourceIds);
void deleteResourceGroup(int groupId); + + void updateResourceGroupName(int groupId, String name); + + void updateResourceGroupDescription(int groupId, String description); + + void updateResourceGroupLocation(int groupId, String location); + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java index 7ce294f..51c225a 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java @@ -246,13 +246,17 @@ public class ResourceGroupDetailView extends VLayout implements BookmarkableView }
public void onTabSelected(TwoLevelTabSelectedEvent tabSelectedEvent) { - // Switch tabs directly, rather than letting the history framework do it, to avoid redrawing the outer views. - selectTab(tabSelectedEvent.getId(), tabSelectedEvent.getSubTabId()); - String tabPath = "/" + tabSelectedEvent.getId() + "/" + tabSelectedEvent.getSubTabId(); - String path = "ResourceGroup/" + this.groupComposite.getResourceGroup().getId() + tabPath; + if (this.groupComposite == null) { + History.fireCurrentHistoryState(); + } else { + // Switch tabs directly, rather than letting the history framework do it, to avoid redrawing the outer views. + selectTab(tabSelectedEvent.getId(), tabSelectedEvent.getSubTabId()); + String tabPath = "/" + tabSelectedEvent.getId() + "/" + tabSelectedEvent.getSubTabId(); + String path = "ResourceGroup/" + this.groupComposite.getResourceGroup().getId() + tabPath;
- // But still add an item to the history, specifying false to tell it not to fire an event. - History.newItem(path, false); + // But still add an item to the history, specifying false to tell it not to fire an event. + History.newItem(path, false); + } }
public void renderView(ViewPath viewPath) { @@ -282,4 +286,5 @@ public class ResourceGroupDetailView extends VLayout implements BookmarkableView tab.getLayout().selectTab(subtabName); } } -} \ No newline at end of file +} + diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/OverviewView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/OverviewView.java index 57ecbcd..e9078cd 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/OverviewView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/inventory/OverviewView.java @@ -18,11 +18,10 @@ */ package org.rhq.enterprise.gui.coregui.client.inventory.groups.detail.inventory;
+import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.widgets.HTMLFlow; -import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.FormItem; -import com.smartgwt.client.widgets.form.fields.SpacerItem; import com.smartgwt.client.widgets.form.fields.StaticTextItem; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.VLayout; @@ -30,16 +29,25 @@ import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.GroupDefinition; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm; +import org.rhq.enterprise.gui.coregui.client.components.form.TogglableTextItem; +import org.rhq.enterprise.gui.coregui.client.components.form.ValueUpdatedHandler; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGroupGWTServiceAsync; +import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import java.util.ArrayList; import java.util.Date; +import java.util.List;
/** - * The group Inventory>Overview tab. + * The group Inventory>Overview subtab. * * @author Ian Springer */ public class OverviewView extends VLayout { + private ResourceGroupGWTServiceAsync resourceGroupService = GWTServiceLookup.getResourceGroupService(); private ResourceGroupComposite groupComposite;
public OverviewView(ResourceGroupComposite groupComposite) { @@ -51,31 +59,55 @@ public class OverviewView extends VLayout { protected void onInit() { super.onInit();
- ResourceGroup group = this.groupComposite.getResourceGroup(); + final ResourceGroup group = this.groupComposite.getResourceGroup();
HLayout spacer = new HLayout(); spacer.setHeight(15); addMember(spacer);
- DynamicForm generalPropsForm = new DynamicForm(); - generalPropsForm.setNumCols(4); - generalPropsForm.setColWidths("25%", "25%", "25%", "25%"); - generalPropsForm.setWrapItemTitles(false); - setWidth("90%"); + final EnhancedDynamicForm generalPropsForm = new EnhancedDynamicForm();
- ArrayList<FormItem> formItems = new ArrayList<FormItem>(); - ArrayList<String> itemIds = new ArrayList<String>(); + List<FormItem> formItems = new ArrayList<FormItem>();
+ // TODO: Uncomment the below header if we decide to add other stuff to this page besides the general props. //HeaderItem headerItem = new HeaderItem("header", "General Properties"); //headerItem.setValue("General Properties"); - //formItems.add(headerItem); + //formItems.add(headerItem);
- StaticTextItem nameItem = new StaticTextItem("nameItem", "Name"); + boolean dynamic = (group.getGroupDefinition() != null); + + final FormItem nameItem = (dynamic) ? new StaticTextItem() : new TogglableTextItem(); + nameItem.setName("name"); + nameItem.setTitle("Name"); nameItem.setValue(group.getName()); + if (nameItem instanceof TogglableTextItem) { + final TogglableTextItem togglableNameItem = (TogglableTextItem) nameItem; + togglableNameItem.addValueUpdatedHandler(new ValueUpdatedHandler() { + public void onValueUpdated(final String newName) { + final String oldName = group.getName(); + OverviewView.this.resourceGroupService.updateResourceGroupName(group.getId(), + newName, new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to change name of Resource group with id " + + group.getId() + + " from "" + oldName + "" to "" + newName + "".", caught); + // We failed to update it on the Server, so change back the form item to the original value. + nameItem.setValue(oldName); + } + + public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify(new Message("Name of Resource group with id " + + group.getId() + " was changed from "" + + oldName + "" to "" + newName + "".", Message.Severity.Info)); + group.setName(newName); + } + }); + } + }); + } formItems.add(nameItem); - itemIds.add(nameItem.getName());
- StaticTextItem typeItem = new StaticTextItem("typeItem", "Member Type"); + StaticTextItem typeItem = new StaticTextItem("memberType", "Member Type"); ResourceType type = group.getResourceType(); if (type != null) { typeItem.setTooltip("Plugin: " + type.getPlugin() + "\n<br>" + "Type: " + type.getName()); @@ -84,56 +116,106 @@ public class OverviewView extends VLayout { typeItem.setValue("<i>Mixed</i>"); } formItems.add(typeItem); - itemIds.add(typeItem.getName());
- StaticTextItem countItem = new StaticTextItem("countItem", "Member Count"); + StaticTextItem countItem = new StaticTextItem("memberCount", "Member Count"); long memberCount = this.groupComposite.getImplicitUp() + this.groupComposite.getImplicitDown(); countItem.setValue(memberCount); formItems.add(countItem); - itemIds.add(countItem.getName());
- StaticTextItem descriptionItem = new StaticTextItem("descriptionItem", "Description"); - String description = group.getDescription(); - descriptionItem.setValue((description != null) ? description : "<i>none</i>"); + final FormItem descriptionItem = (dynamic) ? new StaticTextItem() : new TogglableTextItem(); + descriptionItem.setName("description"); + descriptionItem.setTitle("Description"); + descriptionItem.setValue(group.getDescription()); + if (descriptionItem instanceof TogglableTextItem) { + final TogglableTextItem togglableDescriptionItem = (TogglableTextItem) descriptionItem; + togglableDescriptionItem.addValueUpdatedHandler(new ValueUpdatedHandler() { + public void onValueUpdated(final String newDescription) { + final String oldDescription = group.getDescription(); + OverviewView.this.resourceGroupService.updateResourceGroupDescription(group.getId(), + newDescription, new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to change description of Resource group with id " + + group.getId() + + " from "" + oldDescription + "" to "" + newDescription + "".", caught); + // We failed to update it on the Server, so change back the form item to the original value. + descriptionItem.setValue(oldDescription); + } + + public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify(new Message("Description of Resource group with id " + + group.getId() + " was changed from "" + + oldDescription + "" to "" + newDescription + "".", Message.Severity.Info)); + group.setDescription(newDescription); + } + }); + } + }); + } formItems.add(descriptionItem); - itemIds.add(descriptionItem.getName());
- StaticTextItem dynamicItem = new StaticTextItem("dynamicItem", "Dynamic?"); - dynamicItem.setValue((group.getGroupDefinition() != null) ? "yes" : "no"); + final FormItem locationItem = (dynamic) ? new StaticTextItem() : new TogglableTextItem(); + locationItem.setName("location"); + locationItem.setTitle("Location"); + locationItem.setValue(group.getLocation()); + if (locationItem instanceof TogglableTextItem) { + final TogglableTextItem togglableLocationItem = (TogglableTextItem) locationItem; + togglableLocationItem.addValueUpdatedHandler(new ValueUpdatedHandler() { + public void onValueUpdated(final String newLocation) { + final String oldLocation = group.getLocation(); + OverviewView.this.resourceGroupService.updateResourceGroupLocation(group.getId(), + newLocation, new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to change location of Resource group with id " + + group.getId() + + " from "" + oldLocation + "" to "" + newLocation + "".", caught); + // We failed to update it on the Server, so change back the form item to the original value. + locationItem.setValue(oldLocation); + } + + public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify(new Message("Location of Resource group with id " + + group.getId() + " was changed from "" + + oldLocation + "" to "" + newLocation + "".", Message.Severity.Info)); + group.setLocation(newLocation); + } + }); + } + }); + } + formItems.add(locationItem); + + StaticTextItem dynamicItem = new StaticTextItem("dynamic", "Dynamic?"); + dynamicItem.setValue(dynamic ? "yes" : "no"); formItems.add(dynamicItem); - itemIds.add(dynamicItem.getName());
- StaticTextItem recursiveItem = new StaticTextItem("recursiveItem", "Recursive?"); + StaticTextItem recursiveItem = new StaticTextItem("recursive", "Recursive?"); recursiveItem.setValue((group.isRecursive()) ? "yes" : "no"); formItems.add(recursiveItem); - itemIds.add(recursiveItem.getName());
- StaticTextItem createdItem = new StaticTextItem("createdItem", "Created"); + StaticTextItem createdItem = new StaticTextItem("created", "Created"); createdItem.setValue(new Date(group.getCtime())); formItems.add(createdItem); - itemIds.add(createdItem.getName());
- StaticTextItem lastModifiedItem = new StaticTextItem("lastModifiedItem", "Last Modified"); + StaticTextItem lastModifiedItem = new StaticTextItem("lastModified", "Last Modified"); lastModifiedItem.setValue(new Date(group.getMtime())); formItems.add(lastModifiedItem); - itemIds.add(lastModifiedItem.getName());
- StaticTextItem lastModifiedByItem = new StaticTextItem("lastModifiedByItem", "Last Modified By"); + StaticTextItem lastModifiedByItem = new StaticTextItem("lastModifiedBy", "Last Modified By"); lastModifiedByItem.setValue(group.getModifiedBy()); formItems.add(lastModifiedByItem); - itemIds.add(lastModifiedByItem.getName()); - - StaticTextItem groupDefinitionItem = new StaticTextItem("groupDefinitionItem", "Group Definition"); - GroupDefinition groupDefinition = group.getGroupDefinition(); - // TODO (ips): Make this a link to the group def. - groupDefinitionItem.setValue((groupDefinition != null) ? groupDefinition.getName() : "<i>none</i>"); - formItems.add(groupDefinitionItem); - itemIds.add(groupDefinitionItem.getName()); + + if (dynamic) { + StaticTextItem groupDefinitionItem = new StaticTextItem("groupDefinition", "Group Definition"); + GroupDefinition groupDefinition = group.getGroupDefinition(); + // TODO (ips): Make this a link to the group def. + groupDefinitionItem.setValue(groupDefinition.getName()); + formItems.add(groupDefinitionItem); + }
generalPropsForm.setItems(formItems.toArray(new FormItem[formItems.size()])); addMember(generalPropsForm);
- if (groupDefinition != null) { + if (dynamic) { spacer = new HLayout(); spacer.setHeight(10); addMember(spacer); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java index 2e2617e..70c5445 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/InventoryView.java @@ -34,8 +34,8 @@ import com.smartgwt.client.widgets.tree.TreeGrid; import com.smartgwt.client.widgets.tree.TreeNode;
import org.rhq.core.domain.measurement.AvailabilityType; -import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; +import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.enterprise.gui.coregui.client.BookmarkableView; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.ViewId; @@ -50,7 +50,6 @@ public class InventoryView extends HLayout implements BookmarkableView {
public static final String VIEW_PATH = "Inventory";
- private ViewId currentSectionViewId; private ViewId currentPageViewId;
@@ -58,9 +57,9 @@ public class InventoryView extends HLayout implements BookmarkableView { private Canvas currentContent; private LinkedHashMap<String, TreeGrid> treeGrids = new LinkedHashMap<String, TreeGrid>();
- private SectionStack sectionStack;
+ @Override protected void onInit() { super.onInit(); @@ -110,9 +109,9 @@ public class InventoryView extends HLayout implements BookmarkableView { private ResourceSearchView buildResourceSearchView() { ResourceSearchView searchView = new ResourceSearchView(); searchView.addResourceSelectedListener(new ResourceSelectListener() { - public void onResourceSelected(Resource resource) { + public void onResourceSelected(ResourceComposite resourceComposite) { //CoreGUI.setContent(new ResourceView(resource)); - CoreGUI.goTo("Resource/" + resource.getId()); + CoreGUI.goTo("Resource/" + resourceComposite.getResource().getId()); } }); return searchView; diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSelectListener.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSelectListener.java index e64f27b..21806ab 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSelectListener.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSelectListener.java @@ -18,12 +18,19 @@ */ package org.rhq.enterprise.gui.coregui.client.inventory.resource;
-import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.composite.ResourceComposite;
/** * @author Greg Hinkle */ public interface ResourceSelectListener {
- void onResourceSelected(Resource resource); + /** + * An event handler that is called then the user selects a Resource. + * + * @param resourceComposite a Resource composite for the Resource that was just selected by the user; the Resource + * wrapped by the composite's ResourceType will be mostly fetched. + */ + void onResourceSelected(ResourceComposite resourceComposite); + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java index 92d74eb..68d92d5 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java @@ -18,19 +18,13 @@ */ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail;
-import java.util.EnumSet; -import java.util.Set; - import com.google.gwt.user.client.History; -import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.types.Side; import com.smartgwt.client.widgets.layout.VLayout;
-import org.rhq.core.domain.authz.Permission; -import org.rhq.core.domain.measurement.DataType; -import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.resource.Resource; -import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.resource.composite.ResourceComposite; +import org.rhq.core.domain.resource.composite.ResourceFacets; import org.rhq.core.domain.resource.composite.ResourcePermission; import org.rhq.enterprise.gui.coregui.client.BookmarkableView; import org.rhq.enterprise.gui.coregui.client.CoreGUI; @@ -40,7 +34,6 @@ import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTab; import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTabSelectedEvent; import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTabSelectedHandler; import org.rhq.enterprise.gui.coregui.client.components.tab.TwoLevelTabSet; -import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSearchView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ConfigurationHistoryView; @@ -48,10 +41,9 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configura import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.PluginConfigurationEditView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.GraphListView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.overview.ResourceOverviewView; -import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository;
/** - * Right panel of the resource view. + * Right panel of the Resource view. * * @author Greg Hinkle */ @@ -60,9 +52,7 @@ public class ResourceDetailView extends VLayout implements BookmarkableView, Res
private static final String DEFAULT_TAB_NAME = "Summary";
- private Resource resource; - private ResourcePermission permissions; - private ResourceType type; + private ResourceComposite resourceComposite;
private TwoLevelTab summaryTab; private TwoLevelTab monitoringTab; @@ -77,9 +67,6 @@ public class ResourceDetailView extends VLayout implements BookmarkableView, Res
private ResourceTitleBar titleBar;
- public void setResource(Resource resource) { - this.resource = resource; - }
@Override protected void onDraw() { @@ -134,13 +121,14 @@ public class ResourceDetailView extends VLayout implements BookmarkableView, Res // CoreGUI.addBreadCrumb(getPlace()); }
- public void onResourceSelected(Resource resource) { + public void onResourceSelected(ResourceComposite resourceComposite) {
- this.resource = resource; + this.resourceComposite = resourceComposite;
- titleBar.setResource(resource); + final Resource resource = this.resourceComposite.getResource(); + this.titleBar.setResource(resource);
- summaryTab.updateSubTab("Overview", new ResourceOverviewView(resource)); + summaryTab.updateSubTab("Overview", new ResourceOverviewView(this.resourceComposite)); summaryTab.updateSubTab("Timeline", new FullHTMLPane("/rhq/resource/summary/timeline-plain.xhtml?id=" + resource.getId()));
@@ -204,80 +192,56 @@ public class ResourceDetailView extends VLayout implements BookmarkableView, Res
// topTabSet.setSelectedTab(selectedTab);
- updateTabStatus(); + completeTabUpdate();
}
- private void updateTabStatus() { - // Go and get the type with all needed metadata - // and then get the permissions for this resource - - ResourceTypeRepository.Cache.getInstance().getResourceTypes( - resource.getResourceType().getId(), - EnumSet.of(ResourceTypeRepository.MetadataType.content, ResourceTypeRepository.MetadataType.operations, - ResourceTypeRepository.MetadataType.events, - ResourceTypeRepository.MetadataType.resourceConfigurationDefinition, - ResourceTypeRepository.MetadataType.measurements), new ResourceTypeRepository.TypeLoadedCallback() { - public void onTypesLoaded(ResourceType type) { - - ResourceDetailView.this.type = type; - - GWTServiceLookup.getAuthorizationService().getImplicitResourcePermissions( - ResourceDetailView.this.resource.getId(), new AsyncCallback<Set<Permission>>() { - public void onFailure(Throwable caught) { - CoreGUI.getErrorHandler().handleError("Failed to load resource permissions", caught); - } - - public void onSuccess(Set<Permission> result) { - ResourceDetailView.this.permissions = new ResourcePermission(result); - completeTabUpdate(); - } - }); - } - }); - }
private void completeTabUpdate() {
- if (!permissions.isMeasure()) { - topTabSet.disableTab(monitoringTab); - } else { + ResourcePermission permissions = this.resourceComposite.getResourcePermission(); + ResourceFacets facets = this.resourceComposite.getResourceFacets(); + + // TODO (ips): No perms should be needed to view Monitoring and Alerts tabs. + + if (permissions.isMeasure()) { topTabSet.enableTab(monitoringTab); + } else { + topTabSet.disableTab(monitoringTab); }
- if (type.getOperationDefinitions() == null || type.getOperationDefinitions().isEmpty() - || !permissions.isControl()) { - topTabSet.disableTab(operationsTab); - } else { + if (facets.isOperation() && permissions.isControl()) { topTabSet.enableTab(operationsTab); + } else { + topTabSet.disableTab(operationsTab); }
- if (!permissions.isAlert()) { - topTabSet.disableTab(alertsTab); - } else { + if (permissions.isAlert()) { topTabSet.enableTab(alertsTab); + } else { + topTabSet.disableTab(alertsTab); }
- if (type.getResourceConfigurationDefinition() == null || !permissions.isConfigureRead()) { - topTabSet.disableTab(configurationTab); - } else { + if (!facets.isConfiguration() && permissions.isConfigureRead()) { topTabSet.enableTab(configurationTab); + } else { + topTabSet.disableTab(configurationTab); }
- if (type.getEventDefinitions() == null || type.getEventDefinitions().isEmpty() || !permissions.isMeasure()) { + if (facets.isEvent() && permissions.isMeasure()) { topTabSet.enableTab(eventsTab); } else { - topTabSet.enableTab(eventsTab); + topTabSet.disableTab(eventsTab); }
- if (type.getPackageTypes() == null || type.getPackageTypes().isEmpty() || !permissions.isContent()) { - topTabSet.disableTab(contentTab); - } else { + if (facets.isContent() && permissions.isContent()) { topTabSet.enableTab(contentTab); + } else { + topTabSet.disableTab(contentTab); }
// only enable "Call Time" sub-tab for those that implement it - monitoringTab.setSubTabEnabled("Call Time", implementsCallTime(type)); + monitoringTab.setSubTabEnabled("Call Time", facets.isCallTime());
if (topTabSet.getSelectedTab().getDisabled()) { topTabSet.selectTab(0); @@ -286,25 +250,22 @@ public class ResourceDetailView extends VLayout implements BookmarkableView, Res topTabSet.markForRedraw(); }
- private boolean implementsCallTime(ResourceType type) { - for (MeasurementDefinition definition : type.getMetricDefinitions()) { - if (definition.getDataType() == DataType.CALLTIME) { - return true; - } - } - return false; - }
public void onTabSelected(TwoLevelTabSelectedEvent tabSelectedEvent) { - // Switch tabs directly, rather than letting the history framework do it, to avoid redrawing the outer views. - selectTab(tabSelectedEvent.getId(), tabSelectedEvent.getSubTabId()); - String tabPath = "/" + tabSelectedEvent.getId() + "/" + tabSelectedEvent.getSubTabId(); - String path = "Resource/" + this.resource.getId() + tabPath; + if (this.resourceComposite == null) { + History.fireCurrentHistoryState(); + } else { + // Switch tabs directly, rather than letting the history framework do it, to avoid redrawing the outer views. + selectTab(tabSelectedEvent.getId(), tabSelectedEvent.getSubTabId()); + String tabPath = "/" + tabSelectedEvent.getId() + "/" + tabSelectedEvent.getSubTabId(); + String path = "Resource/" + this.resourceComposite.getResource().getId() + tabPath;
- // But still add an item to the history, specifying false to tell it not to fire an event. - History.newItem(path, false); + // But still add an item to the history, specifying false to tell it not to fire an event. + History.newItem(path, false); + } }
+ public void renderView(ViewPath viewPath) { // e.g. #Resource/10010/Inventory/Overview String tabName = (!viewPath.isEnd()) ? viewPath.getCurrent().getPath() : null; // e.g. "Inventory" @@ -312,6 +273,7 @@ public class ResourceDetailView extends VLayout implements BookmarkableView, Res selectTab(tabName, subTabName); }
+ public void selectTab(String tabName, String subtabName) { if (tabName == null) { tabName = DEFAULT_TAB_NAME; diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java index f7b5c6e..39e748f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceView.java @@ -24,6 +24,8 @@ import com.smartgwt.client.widgets.layout.HLayout;
import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.gui.coregui.client.BookmarkableView; import org.rhq.enterprise.gui.coregui.client.CoreGUI; @@ -32,8 +34,11 @@ import org.rhq.enterprise.gui.coregui.client.ViewPath; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync; import org.rhq.enterprise.gui.coregui.client.inventory.resource.InventoryView; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository; import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+import java.util.EnumSet; + /** * @author Greg Hinkle */ @@ -41,7 +46,7 @@ public class ResourceView extends HLayout implements BookmarkableView {
private Canvas contentCanvas;
- private Resource currentResource; + private ResourceComposite currentResource; //private Resource resourcePlatform;
private ResourceTreeView treeView; @@ -61,60 +66,70 @@ public class ResourceView extends HLayout implements BookmarkableView { setWidth100(); setHeight100();
- treeView = new ResourceTreeView(); addMember(treeView);
contentCanvas = new Canvas(); addMember(contentCanvas);
- // created above // detailView = new ResourceDetailView();
treeView.addResourceSelectListener(detailView);
- setContent(detailView); - }
+ public void setSelectedResource(final int resourceId, final ViewPath view) { - Resource resource = this.treeView.getResource(resourceId); - if (resource != null) { - setSelectedResource(resource, view); - } else { - ResourceCriteria criteria = new ResourceCriteria(); - criteria.addFilterId(resourceId); - criteria.fetchTags(true); - //criteria.fetchParentResource(true); - resourceService.findResourcesByCriteria(criteria, new AsyncCallback<PageList<Resource>>() { - public void onFailure(Throwable caught) { - CoreGUI.getMessageCenter().notify(new Message("Resource with id [" + resourceId + - "] does not exist or is not accessible.", Message.Severity.Warning)); - - CoreGUI.goTo(InventoryView.VIEW_PATH); + ResourceCriteria criteria = new ResourceCriteria(); + criteria.addFilterId(resourceId); + criteria.fetchTags(true); + //criteria.fetchParentResource(true); + resourceService.findResourceCompositesByCriteria(criteria, new AsyncCallback<PageList<ResourceComposite>>() { + public void onFailure(Throwable caught) { + CoreGUI.getMessageCenter().notify(new Message("Resource with id [" + resourceId + + "] does not exist or is not accessible.", Message.Severity.Warning)); + + CoreGUI.goTo(InventoryView.VIEW_PATH); + } + + public void onSuccess(PageList<ResourceComposite> result) { + if (result.isEmpty()) { + //noinspection ThrowableInstanceNeverThrown + onFailure(new Exception("Resource with id [" + resourceId + "] does not exist.")); + } else { + final ResourceComposite resourceComposite = result.get(0); + loadResourceType(resourceComposite, view); } + } + }); + } +
- public void onSuccess(PageList<Resource> result) { - if (result.isEmpty()) { - //noinspection ThrowableInstanceNeverThrown - onFailure(new Exception("Resource with id [" + resourceId + "] does not exist.")); - } else { - Resource resource = result.get(0); - setSelectedResource(resource, view); - } + private void loadResourceType(final ResourceComposite resourceComposite, final ViewPath view) { + final Resource resource = resourceComposite.getResource(); + ResourceTypeRepository.Cache.getInstance().getResourceTypes( + resource.getResourceType().getId(), + EnumSet.of(ResourceTypeRepository.MetadataType.content, ResourceTypeRepository.MetadataType.operations, + ResourceTypeRepository.MetadataType.events, + ResourceTypeRepository.MetadataType.resourceConfigurationDefinition), + new ResourceTypeRepository.TypeLoadedCallback() { + public void onTypesLoaded(ResourceType type) { + resource.setResourceType(type); + completeSetSelectedResource(resourceComposite, view); } }); - } }
- private void setSelectedResource(Resource resource, ViewPath viewPath) { - this.currentResource = resource; - this.treeView.setSelectedResource(resource, viewPath.getCurrent()); - this.detailView.onResourceSelected(resource); + + private void completeSetSelectedResource(ResourceComposite resourceComposite, ViewPath viewPath) { + this.currentResource = resourceComposite; + this.treeView.setSelectedResource(resourceComposite.getResource(), viewPath.getCurrent()); + this.detailView.onResourceSelected(resourceComposite); }
+ public void setContent(Canvas newContent) { if (contentCanvas.getChildren().length > 0) contentCanvas.getChildren()[0].destroy(); @@ -132,7 +147,7 @@ public class ResourceView extends HLayout implements BookmarkableView {
Integer resourceId = Integer.parseInt(viewPath.getCurrent().getPath());
- if (currentResource == null || currentResource.getId() != resourceId) { + if (currentResource == null || currentResource.getResource().getId() != resourceId) { // The previous history item did not already point to this Resource. setSelectedResource(resourceId, viewPath); } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/alert/ResourceAlertHistoryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/alert/ResourceAlertHistoryView.java index cfa77c0..32c0f44 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/alert/ResourceAlertHistoryView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/alert/ResourceAlertHistoryView.java @@ -25,6 +25,8 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.alert; import com.smartgwt.client.data.Criteria; import org.rhq.core.domain.criteria.AlertCriteria; import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.composite.ResourceComposite; +import org.rhq.core.domain.resource.composite.ResourcePermission; import org.rhq.enterprise.gui.coregui.client.alert.AlertsView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
@@ -39,8 +41,8 @@ public class ResourceAlertHistoryView extends AlertsView super(createCriteria(resourceId), EXCLUDED_FIELD_NAMES); }
- public void onResourceSelected(Resource resource) { - refresh(createCriteria(resource.getId())); + public void onResourceSelected(ResourceComposite resourceComposite) { + refresh(createCriteria(resourceComposite.getResource().getId())); }
private static Criteria createCriteria(int resourceId) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/GraphListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/GraphListView.java index d77e08b..770c43b 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/GraphListView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/GraphListView.java @@ -24,6 +24,7 @@ import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.components.measurement.MeasurementRangeEditor; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; @@ -32,7 +33,6 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTyp
import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.types.Overflow; -import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.layout.VLayout; @@ -48,12 +48,9 @@ import java.util.List; */ public class GraphListView extends VLayout implements ResourceSelectListener {
- private Resource resource; private Label loadingLabel = new Label("Loading...");
- public GraphListView() { - }
public GraphListView(Resource resource) { this.resource = resource; @@ -83,7 +80,6 @@ public class GraphListView extends VLayout implements ResourceSelectListener {
private void buildGraphs() {
- ResourceTypeRepository.Cache.getInstance().getResourceTypes( resource.getResourceType().getId(), EnumSet.of(ResourceTypeRepository.MetadataType.measurements), new ResourceTypeRepository.TypeLoadedCallback() { @@ -139,18 +135,18 @@ public class GraphListView extends VLayout implements ResourceSelectListener { ); }
+ private void buildGraph(MeasurementDefinition def, List<MeasurementDataNumericHighLowComposite> data) { SmallGraphView graph = new SmallGraphView(resource.getId(), def, data); graph.setWidth("95%"); graph.setHeight(220);
addMember(graph); - }
- public void onResourceSelected(Resource resource) { - this.resource = resource;
+ public void onResourceSelected(ResourceComposite resourceComposite) { + this.resource = resourceComposite.getResource();
buildGraphs(); markForRedraw(); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java index bb01526..92cd3ff 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceOverviewView.java @@ -20,36 +20,42 @@ package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.overview
import com.smartgwt.client.widgets.layout.VLayout;
-import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.enterprise.gui.coregui.client.components.FullHTMLPane; -import org.rhq.enterprise.gui.coregui.client.components.SimpleCollapsiblePanel; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener;
/** * @author Greg Hinkle */ -public class ResourceOverviewView extends VLayout { +public class ResourceOverviewView extends VLayout implements ResourceSelectListener { + private ResourceSummaryView summaryView; + private FullHTMLPane summaryPane; + private ResourceComposite resourceComposite;
- private Resource resource; - - - public ResourceOverviewView(Resource resource) { - this.resource = resource; + public ResourceOverviewView(ResourceComposite resourceComposite) { + this.resourceComposite = resourceComposite; }
- @Override protected void onDraw() { super.onDraw();
- ResourceSummaryView summaryView = new ResourceSummaryView(); - summaryView.onResourceSelected(resource); - - addMember(summaryView); + this.summaryView = new ResourceSummaryView(); + addMember(this.summaryView);
+ this.summaryPane = new FullHTMLPane(); + addMember(this.summaryPane);
- FullHTMLPane summaryPane = new FullHTMLPane("/rhq/resource/summary/overview-plain.xhtml?id=" + resource.getId()); - addMember(summaryPane); - + if (this.resourceComposite != null) { + onResourceSelected(this.resourceComposite); + } + }
+ @Override + public void onResourceSelected(ResourceComposite resourceComposite) { + this.resourceComposite = resourceComposite; + this.summaryView.onResourceSelected(resourceComposite); + this.summaryPane.setContentsURL("/rhq/resource/summary/overview-plain.xhtml?id=" + + resourceComposite.getResource().getId()); } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java index 6f1228c..0015742 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/overview/ResourceSummaryView.java @@ -26,7 +26,6 @@ import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.util.SC; -import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.FormItem; import com.smartgwt.client.widgets.form.fields.HeaderItem; import com.smartgwt.client.widgets.form.fields.SpacerItem; @@ -38,59 +37,64 @@ import org.rhq.core.domain.measurement.MeasurementDataTrait; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm; +import org.rhq.enterprise.gui.coregui.client.components.form.TogglableTextItem; +import org.rhq.enterprise.gui.coregui.client.components.form.ValueUpdatedHandler; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTServiceAsync; import org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceSelectListener; import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository; +import org.rhq.enterprise.gui.coregui.client.util.message.Message;
/** * @author Greg Hinkle */ -public class ResourceSummaryView extends DynamicForm implements ResourceSelectListener { +public class ResourceSummaryView extends EnhancedDynamicForm implements ResourceSelectListener {
- private Resource resource; + private ResourceGWTServiceAsync resourceService = GWTServiceLookup.getResourceService(); + private ResourceComposite resourceComposite;
@Override protected void onDraw() { super.onDraw();
- setNumCols(4); - setWrapItemTitles(false); setLeft("10%"); setWidth("80%"); }
- public void onResourceSelected(Resource resource) { + public void onResourceSelected(ResourceComposite resourceComposite) {
- this.resource = resource; + this.resourceComposite = resourceComposite; + Resource resource = resourceComposite.getResource();
+ // Load metric defs. ResourceTypeRepository.Cache.getInstance().getResourceTypes(resource.getResourceType().getId(), EnumSet.of(ResourceTypeRepository.MetadataType.measurements), new ResourceTypeRepository.TypeLoadedCallback() { public void onTypesLoaded(ResourceType type) { try { buildForm(type); - loadValues(); + loadTraitValues(); } catch (Exception e) { SC.say("Form load failure"); e.printStackTrace(); } } }); - - - markForRedraw(); }
- private void loadValues() { + private void loadTraitValues() { + final Resource resource = resourceComposite.getResource(); GWTServiceLookup.getMeasurementDataService().findCurrentTraitsForResource( resource.getId(), DisplayType.SUMMARY, new AsyncCallback<List<MeasurementDataTrait>>() { public void onFailure(Throwable caught) { - SC.say("Failed to load traits"); - CoreGUI.getErrorHandler().handleError("Failed to load traits information for resource",caught); + CoreGUI.getErrorHandler().handleError("Failed to load traits for " + resource + ".", + caught); }
public void onSuccess(List<MeasurementDataTrait> result) { @@ -111,7 +115,7 @@ public class ResourceSummaryView extends DynamicForm implements ResourceSelectLi }
private void buildForm(ResourceType type) { - ArrayList<MeasurementDefinition> traits = new ArrayList<MeasurementDefinition>(); + List<MeasurementDefinition> traits = new ArrayList<MeasurementDefinition>();
for (MeasurementDefinition measurement : type.getMetricDefinitions()) { if (measurement.getDataType() == DataType.TRAIT && measurement.getDisplayType() == DisplayType.SUMMARY) { @@ -125,39 +129,122 @@ public class ResourceSummaryView extends DynamicForm implements ResourceSelectLi } });
- - ArrayList<FormItem> formItems = new ArrayList<FormItem>(); - ArrayList<String> itemIds = new ArrayList<String>(); + List<FormItem> formItems = new ArrayList<FormItem>();
HeaderItem headerItem = new HeaderItem("header", "Summary"); headerItem.setValue("Summary"); formItems.add(headerItem);
- StaticTextItem typeItem = new StaticTextItem("typeItem", "Type"); + StaticTextItem typeItem = new StaticTextItem("type", "Type"); typeItem.setTooltip("Plugin: " + type.getPlugin() + "\n<br>" + "Type: " + type.getName()); typeItem.setValue(type.getName() + " (" + type.getPlugin() + ")"); formItems.add(typeItem); - itemIds.add(typeItem.getName());
- StaticTextItem descriptionItem = new StaticTextItem("descriptionItem", "Description"); + final Resource resource = this.resourceComposite.getResource(); + boolean modifiable = this.resourceComposite.getResourcePermission().isInventory(); + + final FormItem nameItem = (modifiable) ? new TogglableTextItem() : new StaticTextItem(); + nameItem.setName("name"); + nameItem.setTitle("Name"); + nameItem.setValue(resource.getName()); + if (nameItem instanceof TogglableTextItem) { + TogglableTextItem togglableNameItem = (TogglableTextItem) nameItem; + togglableNameItem.addValueUpdatedHandler(new ValueUpdatedHandler() { + public void onValueUpdated(final String newName) { + final String oldName = resource.getName(); + ResourceSummaryView.this.resourceService.updateResourceName(resource.getId(), + newName, new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to change name of Resource with id " + + resource.getId() + + " from "" + oldName + "" to "" + newName + "".", caught); + // We failed to update it on the Server, so change back the form item to the original value. + nameItem.setValue(oldName); + } + + public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify(new Message("Name of Resource with id " + + resource.getId() + " was changed from "" + + oldName + "" to "" + newName + "".", Message.Severity.Info)); + resource.setName(newName); + } + }); + } + }); + } + formItems.add(nameItem); + + final FormItem descriptionItem = (modifiable) ? new TogglableTextItem() : new StaticTextItem(); + descriptionItem.setName("description"); + descriptionItem.setTitle("Description"); descriptionItem.setValue(resource.getDescription()); + if (descriptionItem instanceof TogglableTextItem) { + TogglableTextItem togglableDescriptionItem = (TogglableTextItem) descriptionItem; + togglableDescriptionItem.addValueUpdatedHandler(new ValueUpdatedHandler() { + public void onValueUpdated(final String newDescription) { + final String oldDescription = resource.getDescription(); + ResourceSummaryView.this.resourceService.updateResourceDescription(resource.getId(), + newDescription, new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to change description of Resource with id " + + resource.getId() + + " from "" + oldDescription + "" to "" + newDescription + "".", caught); + // We failed to update it on the Server, so change back the form item to the original value. + descriptionItem.setValue(oldDescription); + } + + public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify(new Message("Description of Resource with id " + + resource.getId() + " was changed from "" + + oldDescription + "" to "" + newDescription + "".", Message.Severity.Info)); + resource.setDescription(newDescription); + } + }); + } + }); + } formItems.add(descriptionItem); - itemIds.add(descriptionItem.getName());
- StaticTextItem versionItem = new StaticTextItem("versionItem", "Version"); - formItems.add(versionItem); - itemIds.add(versionItem.getName()); + final FormItem locationItem = (modifiable) ? new TogglableTextItem() : new StaticTextItem(); + locationItem.setName("location"); + locationItem.setTitle("Location"); + locationItem.setValue(resource.getLocation()); + if (locationItem instanceof TogglableTextItem) { + TogglableTextItem togglableNameItem = (TogglableTextItem) locationItem; + togglableNameItem.addValueUpdatedHandler(new ValueUpdatedHandler() { + public void onValueUpdated(final String newLocation) { + final String oldLocation = resource.getLocation(); + ResourceSummaryView.this.resourceService.updateResourceLocation(resource.getId(), + newLocation, new AsyncCallback<Void>() { + public void onFailure(Throwable caught) { + CoreGUI.getErrorHandler().handleError("Failed to change location of Resource with id " + + resource.getId() + + " from "" + oldLocation + "" to "" + newLocation + "".", caught); + // We failed to update it on the Server, so change back the form item to the original value. + locationItem.setValue(oldLocation); + }
+ public void onSuccess(Void result) { + CoreGUI.getMessageCenter().notify(new Message("Location of Resource with id " + + resource.getId() + " was changed from "" + + oldLocation + "" to "" + newLocation + "".", Message.Severity.Info)); + resource.setLocation(newLocation); + } + }); + } + }); + } + formItems.add(locationItem);
- StaticTextItem parentItem = new StaticTextItem("parentItem", "Parent"); - formItems.add(parentItem); - itemIds.add(parentItem.getName());
+ StaticTextItem versionItem = new StaticTextItem("version", "Version"); + formItems.add(versionItem);
- for (MeasurementDefinition trait : traits) { + StaticTextItem parentItem = new StaticTextItem("parent", "Parent"); + formItems.add(parentItem);
+ for (MeasurementDefinition trait : traits) { String id = trait.getDisplayName().replaceAll("\.", "_").replaceAll(" ", "__"); - itemIds.add(id);
StaticTextItem item = new StaticTextItem(id, trait.getDisplayName()); item.setTooltip(trait.getDescription()); @@ -176,14 +263,14 @@ public class ResourceSummaryView extends DynamicForm implements ResourceSelectLi formItems.add(new SpacerItem()); setItems(formItems.toArray(new FormItem[formItems.size()]));
- - setValue("typeItem", type.getName() + " (" + type.getPlugin() + ")"); - setValue("descriptionItem", resource.getDescription()); - setValue("versionItem", resource.getVersion()); - setValue("parentItem", resource.getParentResource() == null ? null : + setValue("type", type.getName() + " (" + type.getPlugin() + ")"); + setValue("name", resource.getName()); + setValue("description", resource.getDescription()); + setValue("location", resource.getLocation()); + setValue("version", resource.getVersion()); + setValue("parent", resource.getParentResource() == null ? null : ("<a href="#Resource/" + resource.getParentResource().getId() + "">" + resource.getParentResource().getName() + "</a>"));
- } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java index 7cd7fdd..56d91bd 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/ResourceGWTServiceImpl.java @@ -18,6 +18,7 @@ */ package org.rhq.enterprise.gui.coregui.server.gwt;
+import java.util.ArrayList; import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; @@ -35,6 +36,7 @@ import org.rhq.core.domain.criteria.ResourceCriteria; import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.composite.RecentlyAddedResourceComposite; +import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.gui.coregui.client.gwt.ResourceGWTService; @@ -109,15 +111,27 @@ public class ResourceGWTServiceImpl extends AbstractGWTServiceImpl implements Re public PageList<Resource> findResourcesByCriteria(ResourceCriteria criteria) { try { PageList<Resource> result = resourceManager.findResourcesByCriteria(getSessionSubject(), criteria); - for (Resource resource : result) { - resource.setAgent(null); - }
ObjectFilter.filterFieldsInCollection(result, importantFieldsSet);
- return SerialUtility.prepare(result, "ResourceService.findResourceByCriteria"); + return SerialUtility.prepare(result, "ResourceService.findResourcesByCriteria"); } catch (Exception e) { - e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public PageList<ResourceComposite> findResourceCompositesByCriteria(ResourceCriteria criteria) { + try { + PageList<ResourceComposite> result = resourceManager.findResourceCompositesByCriteria(getSessionSubject(), + criteria); + List<Resource> resources = new ArrayList<Resource>(result.size()); + + ObjectFilter.filterFieldsInCollection(resources, importantFieldsSet); + + return SerialUtility.prepare(result, "ResourceService.findResourceCompositesByCriteria"); + } catch (Exception e) { + e.printStackTrace(); throw new RuntimeException(e); } } @@ -199,4 +213,15 @@ public class ResourceGWTServiceImpl extends AbstractGWTServiceImpl implements Re discoveryBoss.unignoreResources(getSessionSubject(), resourceIds); }
+ public void updateResourceName(int resourceId, String name) { + resourceManager.updateResourceName(getSessionSubject(), resourceId, name); + } + + public void updateResourceDescription(int resourceId, String description) { + resourceManager.updateResourceDescription(getSessionSubject(), resourceId, description); + } + + public void updateResourceLocation(int resourceId, String location) { + resourceManager.updateResourceLocation(getSessionSubject(), resourceId, location); + } } \ No newline at end of file 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 67326c1..d4dd777 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 @@ -74,4 +74,16 @@ public class ResourceGroupGWTServiceImpl extends AbstractGWTServiceImpl implemen throw new RuntimeException(e.getMessage()); } } + + public void updateResourceGroupName(int groupId, String name) { + groupManager.updateResourceGroupName(getSessionSubject(), groupId, name); + } + + public void updateResourceGroupDescription(int groupId, String description) { + groupManager.updateResourceGroupDescription(getSessionSubject(), groupId, description); + } + + public void updateResourceGroupLocation(int groupId, String location) { + groupManager.updateResourceGroupLocation(getSessionSubject(), groupId, location); + } } \ No newline at end of file diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java index 3dfc87f..4804a73 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -27,6 +27,7 @@ import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.Set;
import javax.ejb.EJB; import javax.ejb.Stateless; @@ -93,6 +94,7 @@ import org.rhq.core.domain.resource.composite.ResourceHealthComposite; import org.rhq.core.domain.resource.composite.ResourceIdFlyWeight; import org.rhq.core.domain.resource.composite.ResourceInstallCount; import org.rhq.core.domain.resource.composite.ResourceNamesDisambiguationResult; +import org.rhq.core.domain.resource.composite.ResourcePermission; import org.rhq.core.domain.resource.composite.ResourceWithAvailability; import org.rhq.core.domain.resource.flyweight.FlyweightCache; import org.rhq.core.domain.resource.flyweight.ResourceFlyweight; @@ -864,7 +866,8 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage * * @param user * @param category Limit the search to a given {@link ResourceCategory} - * @param type Limit the search to to a given {@link ResourceType} + * @param typeName Limit the search to to {@link ResourceType}(s) with the given name + * @param pluginName Limit the search to the plugin with the given name * @param parentResource Limit the search to children of a given parent resource * @param searchString * @param pageControl @@ -2040,9 +2043,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage // lineage is a getXXX (not findXXX) because it logically returns a single object, but modeled as a list here public @XmlJavaTypeAdapter(value = ResourceListAdapter.class) List<Resource> findResourceLineage(Subject subject, int resourceId) { - List<Resource> result = null; - - result = getResourceLineage(resourceId); + List<Resource> result = getResourceLineage(resourceId);
for (Resource resource : result) { if (!authorizationManager.canViewResource(subject, resource.getId())) { @@ -2069,19 +2070,21 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage }
public PageList<ResourceComposite> findResourceCompositesByCriteria(Subject subject, ResourceCriteria criteria) { - PageList<Resource> intermediate = findResourcesByCriteria(subject, criteria); + PageList<Resource> resources = findResourcesByCriteria(subject, criteria);
List<ResourceComposite> results = new ArrayList<ResourceComposite>(); - for (Resource next : intermediate) { - AvailabilityType availType = next.getCurrentAvailability().getAvailabilityType(); - Resource parent = next.getParentResource(); - ResourceComposite composite = new ResourceComposite(next, parent, availType); - composite.setResourceFacets(typeManager.getResourceFacets(next.getResourceType().getId())); - // TODO: jmarques: need to set resource permissions here, or alter criteria projection to include it + for (Resource resource : resources) { + AvailabilityType availType = resource.getCurrentAvailability().getAvailabilityType(); + Resource parent = resource.getParentResource(); + ResourceComposite composite = new ResourceComposite(resource, parent, availType); + composite.setResourceFacets(typeManager.getResourceFacets(resource.getResourceType().getId())); + Set<Permission> permissions = authorizationManager.getImplicitResourcePermissions(subject, resource.getId()); + composite.setResourcePermission(new ResourcePermission(permissions)); + // TODO: jmarques: Alter criteria projection to include permissions. results.add(composite); }
- return new PageList<ResourceComposite>(results, (int) intermediate.getTotalSize(), intermediate + return new PageList<ResourceComposite>(results, resources.getTotalSize(), resources .getPageControl()); }
@@ -2152,4 +2155,39 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage DisambiguationUpdateStrategy updateStrategy) { return Disambiguator.disambiguate(results, updateStrategy, extractor, entityManager); } + + public void updateResourceName(Subject subject, int resourceId, String name) { + if (name == null) { + throw new IllegalArgumentException("Resource name cannot be null."); + } + Resource resource = getResourceToBeModified(subject, resourceId); + resource.setName(name); + resource.setMtime(System.currentTimeMillis()); + } + + public void updateResourceDescription(Subject subject, int resourceId, String description) { + Resource resource = getResourceToBeModified(subject, resourceId); + resource.setDescription(description); + resource.setMtime(System.currentTimeMillis()); + } + + public void updateResourceLocation(Subject subject, int resourceId, String location) { + Resource resource = getResourceToBeModified(subject, resourceId); + resource.setLocation(location); + resource.setMtime(System.currentTimeMillis()); + } + + private Resource getResourceToBeModified(Subject subject, int resourceId) { + Resource resource = entityManager.find(Resource.class, resourceId); + + if (resource == null) { + throw new ResourceNotFoundException(resourceId); + } + + if (!authorizationManager.hasResourcePermission(subject, Permission.MODIFY_RESOURCE, resourceId)) { + throw new PermissionException("User [" + subject + "] does not have permission to modify Resource with id [" + + resourceId + "]."); + } + return resource; + } } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerLocal.java index 327c439..3dd1fcb 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerLocal.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -429,7 +429,7 @@ public interface ResourceManagerLocal { * order (for example, if a given resource is actually a child of one of the other given resources, this method * ensures the uninventory occurs properly). * - * @param user the user performing the uninventory action + * @param subject the user performing the uninventory action * @param resourceIds the ID of the resource to be deleted * * @return the list of all resources that were deleted - in effect, this will contain <code>resourceIds</code> and @@ -455,4 +455,10 @@ public interface ResourceManagerLocal { */ <T> ResourceNamesDisambiguationResult<T> disambiguate(List<T> results, IntExtractor<? super T> resourceIdExtractor, DisambiguationUpdateStrategy updateStrategy); + + void updateResourceName(Subject subject, int resourceId, String name); + + void updateResourceDescription(Subject subject, int resourceId, String description); + + void updateResourceLocation(Subject subject, int resourceId, String location); } \ No newline at end of file diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java index d633909..2eb9d62 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerRemote.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -43,7 +43,6 @@ import org.rhq.enterprise.server.system.ServerVersion; * @author Jay Shaughnessy * @author Simeon Pinder */ - @SOAPBinding(style = SOAPBinding.Style.DOCUMENT) @WebService(targetNamespace = ServerVersion.namespace) @Remote @@ -139,4 +138,21 @@ public interface ResourceManagerRemote { @WebParam(name = "subject") Subject subject, // @WebParam(name = "resourceId") int resourceId);
+ @WebMethod + void updateResourceName( // + @WebParam(name = "subject") Subject subject, // + @WebParam(name = "resourceId") int resourceId, // + @WebParam(name = "name") String name); + + @WebMethod + void updateResourceDescription( // + @WebParam(name = "subject") Subject subject, // + @WebParam(name = "resourceId") int resourceId, // + @WebParam(name = "description") String description); + + @WebMethod + void updateResourceLocation( // + @WebParam(name = "subject") Subject subject, // + @WebParam(name = "resourceId") int resourceId, // + @WebParam(name = "location") String location); } \ No newline at end of file diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java index b2ed76e..987015b 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerBean.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -90,6 +90,7 @@ import org.rhq.enterprise.server.jaxb.adapter.ResourceGroupAdapter; import org.rhq.enterprise.server.operation.GroupOperationSchedule; import org.rhq.enterprise.server.operation.OperationManagerLocal; import org.rhq.enterprise.server.resource.ResourceManagerLocal; +import org.rhq.enterprise.server.resource.ResourceNotFoundException; import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal; import org.rhq.enterprise.server.util.CriteriaQueryGenerator; import org.rhq.enterprise.server.util.CriteriaQueryRunner; @@ -1424,4 +1425,39 @@ public class ResourceGroupManagerBean implements ResourceGroupManagerLocal, Reso } }
+ public void updateResourceGroupName(Subject subject, int groupId, String name) { + if (name == null) { + throw new IllegalArgumentException("Group name cannot be null."); + } + ResourceGroup group = getResourceGroupToBeModified(subject, groupId); + group.setName(name); + group.setMtime(System.currentTimeMillis()); + } + + public void updateResourceGroupDescription(Subject subject, int groupId, String description) { + ResourceGroup group = getResourceGroupToBeModified(subject, groupId); + group.setDescription(description); + group.setMtime(System.currentTimeMillis()); + } + + public void updateResourceGroupLocation(Subject subject, int groupId, String location) { + ResourceGroup group = getResourceGroupToBeModified(subject, groupId); + group.setDescription(location); + group.setMtime(System.currentTimeMillis()); + } + + private ResourceGroup getResourceGroupToBeModified(Subject subject, int groupId) { + ResourceGroup group = entityManager.find(ResourceGroup.class, groupId); + + if (group == null) { + throw new ResourceGroupNotFoundException(groupId); + } + + if (!authorizationManager.hasGroupPermission(subject, Permission.MODIFY_RESOURCE, groupId)) { + throw new PermissionException("User [" + subject + "] does not have permission to modify Resource group with id [" + + groupId + "]."); + } + return group; + } + } \ No newline at end of file diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java index 5975099..8ed40b6 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerLocal.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -138,4 +138,10 @@ public interface ResourceGroupManagerLocal { ResourceGroup updateResourceGroup(Subject subject, ResourceGroup group);
PageList<ResourceGroup> findResourceGroupsByCriteria(Subject subject, ResourceGroupCriteria criteria); + + void updateResourceGroupName(Subject subject, int groupId, String name); + + void updateResourceGroupDescription(Subject subject, int groupId, String description); + + void updateResourceGroupLocation(Subject subject, int groupId, String location); } \ No newline at end of file diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerRemote.java index f285fb5..8907ea9 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerRemote.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/group/ResourceGroupManagerRemote.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -96,4 +96,22 @@ public interface ResourceGroupManagerRemote { PageList<ResourceGroup> findResourceGroupsByCriteria( // @WebParam(name = "subject") Subject subject, // @WebParam(name = "criteria") ResourceGroupCriteria criteria); + + @WebMethod + void updateResourceGroupName( // + @WebParam(name = "subject") Subject subject, // + @WebParam(name = "groupId") int groupId, // + @WebParam(name = "name") String name); + + @WebMethod + void updateResourceGroupDescription( // + @WebParam(name = "subject") Subject subject, // + @WebParam(name = "groupId") int groupId, // + @WebParam(name = "description") String description); + + @WebMethod + void updateResourceGroupLocation( // + @WebParam(name = "subject") Subject subject, // + @WebParam(name = "groupId") int groupId, // + @WebParam(name = "location") String location); }
rhq-commits@lists.fedorahosted.org