package org.rhq.coregui.client.inventory.resource.detail.summary; import java.util.HashMap; import java.util.Set; import com.google.gwt.user.client.rpc.AsyncCallback; import com.smartgwt.client.util.BooleanCallback; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.common.EntityContext; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.criteria.DashboardCriteria; import org.rhq.core.domain.dashboard.Dashboard; import org.rhq.core.domain.dashboard.DashboardCategory; import org.rhq.core.domain.dashboard.DashboardPortlet; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.composite.ResourceComposite; import org.rhq.core.domain.util.PageList; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.InitializableView; import org.rhq.coregui.client.PermissionsLoadedListener; import org.rhq.coregui.client.PermissionsLoader; import org.rhq.coregui.client.UserSessionManager; import org.rhq.coregui.client.dashboard.DashboardContainer; import org.rhq.coregui.client.dashboard.DashboardView; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceAlertsPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceConfigurationUpdatesPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceEventsPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceMetricsPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceOperationsPortlet; import org.rhq.coregui.client.gwt.DashboardGWTServiceAsync; import org.rhq.coregui.client.gwt.GWTServiceLookup; import org.rhq.coregui.client.util.enhanced.EnhancedIButton; import org.rhq.coregui.client.util.enhanced.EnhancedToolStrip; import org.rhq.coregui.client.util.enhanced.EnhancedVLayout; /** * The content pane for the resource Summary>Activity subtab. * * @author Jay Shaughnessy */ public class ActivityView extends EnhancedVLayout implements DashboardContainer, InitializableView { private static final String DASHBOARD_NAME_PREFIX = "ResourceDashboard_"; private ResourceComposite resourceComposite; private DashboardGWTServiceAsync dashboardService = GWTServiceLookup.getDashboardService(); private DashboardView dashboardView; private EnhancedToolStrip footer; private IButton editButton; private IButton resetButton; // Capture the user's global permissions for use by any dashboard or portlet that may need it for rendering. private Set<Permission> globalPermissions; private boolean editMode = false; private boolean isInitialized = false; public ActivityView(ResourceComposite resourceComposite) { super(); this.resourceComposite = resourceComposite; } @Override protected void onInit() { if (!isInitialized()) { super.onInit(); // first async call to get global permissions new PermissionsLoader().loadExplicitGlobalPermissions(new PermissionsLoadedListener() { public void onPermissionsLoaded(Set<Permission> permissions) { globalPermissions = permissions; // now make async call to look for customized dash for this user and entity DashboardCriteria criteria = new DashboardCriteria(); criteria.addFilterCategory(DashboardCategory.RESOURCE); criteria.addFilterResourceId(resourceComposite.getResource().getId()); dashboardService.findDashboardsByCriteria(criteria, new AsyncCallback<PageList<Dashboard>>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError(MSG.view_dashboardsManager_error1(), caught); } public void onSuccess(final PageList<Dashboard> result) { Dashboard dashboard = result.isEmpty() ? getDefaultDashboard() : result.get(0); setDashboard(dashboard); isInitialized = true; // draw() may be done since onInit finishes asynchronously, if so redraw if (isDrawn()) { markForRedraw(); } } }); } }); } } private void setDashboard(Dashboard dashboard) { Canvas[] members = getMembers(); removeMembers(members); //pass in the resource information dashboardView = new DashboardView(this, dashboard, EntityContext.forResource(resourceComposite.getResource() .getId()), resourceComposite); addMember(dashboardView); footer = new EnhancedToolStrip(); footer.setStyleName("footer"); footer.setWidth100(); footer.setMembersMargin(15); editButton = new EnhancedIButton(editMode ? MSG.common_title_view_mode() : MSG.common_title_edit_mode()); editButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent clickEvent) { editMode = !editMode; editButton.setTitle(editMode ? MSG.common_title_view_mode() : MSG.common_title_edit_mode()); dashboardView.setEditMode(editMode); } }); resetButton = new EnhancedIButton(MSG.common_button_reset()); resetButton.addClickHandler(new ClickHandler() { public void onClick(ClickEvent clickEvent) { String message = MSG.view_summaryDashboard_resetConfirm(); SC.ask(message, new BooleanCallback() { public void execute(Boolean confirmed) { if (confirmed) { dashboardView.delete(); setDashboard(getDefaultDashboard()); markForRedraw(); } } }); } }); footer.addMember(editButton); footer.addMember(resetButton); addMember(footer); } protected Dashboard getDefaultDashboard() { Subject sessionSubject = UserSessionManager.getSessionSubject(); Resource resource = resourceComposite.getResource(); Dashboard dashboard = new Dashboard(); dashboard.setName(DASHBOARD_NAME_PREFIX + sessionSubject.getId() + "_" + resource.getId()); dashboard.setCategory(DashboardCategory.RESOURCE); dashboard.setResource(resource); dashboard.setColumns(2); // TODO, add real portlets // set leftmost column and let the rest be equally divided dashboard.setColumnWidths("40%"); dashboard.getConfiguration().put(new PropertySimple(Dashboard.CFG_BACKGROUND, "transparent")); //figure out which portlets to display and how HashMap<String, String> resKeyNameMap = DashboardView.processPortletNameMapForResource(resourceComposite); int colLeft = 0; int colRight = 1; int rowLeft = 0; int rowRight = 0; //Left Column if (resKeyNameMap.containsKey(ResourceMetricsPortlet.KEY)) {//measurments top left if available DashboardPortlet measurements = new DashboardPortlet(ResourceMetricsPortlet.NAME, ResourceMetricsPortlet.KEY, 220); dashboard.addPortlet(measurements, colLeft, rowLeft++); resKeyNameMap.remove(ResourceMetricsPortlet.KEY); } // right Column(approx 60%. As larger more room to display table and N rows.) if (resKeyNameMap.containsKey(ResourceAlertsPortlet.KEY)) {//alerts top right if available DashboardPortlet alerts = new DashboardPortlet(ResourceAlertsPortlet.NAME, ResourceAlertsPortlet.KEY, 210); dashboard.addPortlet(alerts, colRight, rowRight++); resKeyNameMap.remove(ResourceAlertsPortlet.KEY); } if (resKeyNameMap.containsKey(ResourceEventsPortlet.KEY)) {//events if available DashboardPortlet events = new DashboardPortlet(ResourceEventsPortlet.NAME, ResourceEventsPortlet.KEY, 210); dashboard.addPortlet(events, colRight, rowRight++); resKeyNameMap.remove(ResourceEventsPortlet.KEY); } if (resKeyNameMap.containsKey(ResourceOperationsPortlet.KEY)) {//operations if available DashboardPortlet ops = new DashboardPortlet(ResourceOperationsPortlet.NAME, ResourceOperationsPortlet.KEY, 210); dashboard.addPortlet(ops, colRight, rowRight++); resKeyNameMap.remove(ResourceOperationsPortlet.KEY); } if (resKeyNameMap.containsKey(ResourceConfigurationUpdatesPortlet.KEY)) {//configuration if available DashboardPortlet ops = new DashboardPortlet(ResourceConfigurationUpdatesPortlet.NAME, ResourceConfigurationUpdatesPortlet.KEY, 210); dashboard.addPortlet(ops, colRight, rowRight++); resKeyNameMap.remove(ResourceConfigurationUpdatesPortlet.KEY); } //Fill out left column(typically smaller portlets) then alternate cols with remaining boolean displayLeft = false; for (String key : resKeyNameMap.keySet()) { DashboardPortlet portlet = new DashboardPortlet(resKeyNameMap.get(key), key, 105); if (rowLeft < 4) { dashboard.addPortlet(portlet, colLeft, rowLeft++); } else {//alternate if (!displayLeft) { dashboard.addPortlet(portlet, colRight, rowRight++); } else { dashboard.addPortlet(portlet, colLeft, rowLeft++); } //toggle displayLeft = !displayLeft; } } return dashboard; } @Override public boolean isInitialized() { return isInitialized; } public Set<Permission> getGlobalPermissions() { return globalPermissions; } /** * name update not supported because the name is derived from the entity id. * @return */ public boolean supportsDashboardNameEdit() { return false; } public void updateDashboardNames() { return; } @Override public boolean isValidDashboardName(String name) { return ((name != null) && (dashboardView != null) && name.equals(dashboardView.getDashboard().getName())); } @Override public void refresh() { if (isInitialized()) { dashboardView.rebuild(); } } }