/* * RHQ Management Platform * Copyright (C) 2005-2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.dashboard; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.Label; import org.rhq.core.domain.common.EntityContext; import org.rhq.core.domain.dashboard.DashboardPortlet; import org.rhq.coregui.client.CoreGUI; import org.rhq.coregui.client.ImageManager; import org.rhq.coregui.client.dashboard.portlets.groups.FavoriteGroupsPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupAlertsPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupBundleDeploymentsPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupConfigurationUpdatesPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupEventsPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupMetricsPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupOobsPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupOperationsPortlet; import org.rhq.coregui.client.dashboard.portlets.groups.GroupPkgHistoryPortlet; import org.rhq.coregui.client.dashboard.portlets.inventory.groups.graph.ResourceGroupD3GraphPortlet; import org.rhq.coregui.client.dashboard.portlets.inventory.queue.AutodiscoveryPortlet; import org.rhq.coregui.client.dashboard.portlets.inventory.resource.FavoriteResourcesPortlet; import org.rhq.coregui.client.dashboard.portlets.inventory.resource.graph.ResourceD3GraphPortlet; import org.rhq.coregui.client.dashboard.portlets.platform.PlatformSummaryPortlet; import org.rhq.coregui.client.dashboard.portlets.recent.alerts.RecentAlertsPortlet; import org.rhq.coregui.client.dashboard.portlets.recent.events.RecentEventsPortlet; import org.rhq.coregui.client.dashboard.portlets.recent.imported.RecentlyAddedResourcesPortlet; import org.rhq.coregui.client.dashboard.portlets.recent.operations.OperationHistoryPortlet; import org.rhq.coregui.client.dashboard.portlets.recent.operations.OperationSchedulePortlet; import org.rhq.coregui.client.dashboard.portlets.recent.problems.ProblemResourcesPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceAlertsPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceBundleDeploymentsPortlet; 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.ResourceOobsPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceOperationsPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourcePkgHistoryPortlet; import org.rhq.coregui.client.dashboard.portlets.resource.ResourceTimelinePortlet; import org.rhq.coregui.client.dashboard.portlets.summary.InventorySummaryPortlet; import org.rhq.coregui.client.dashboard.portlets.summary.TagCloudPortlet; import org.rhq.coregui.client.dashboard.portlets.util.MashupPortlet; import org.rhq.coregui.client.dashboard.portlets.util.MessagePortlet; import org.rhq.coregui.client.util.message.Message; import org.rhq.coregui.client.util.message.Message.Severity; import org.rhq.coregui.client.util.preferences.UserPreferenceNames.UiSubsystem; /** * @author Simeon Pinder * @author Jay Shaughnessy */ public class PortletFactory { private static final HashMap<String, PortletViewFactory> globalPortletFactoryMap; // although portlet names are I18N, they are assumed to be unique. This maps portlet names to portlet keys, // and the keyset is sorted for convenient display. private static final TreeMap<String, String> globalPortletNameMap; // although portlet names are I18N, they are assumed to be unique. This maps portlet keys to portlet names, // and is suitable for a sorted Menu value map. private static final LinkedHashMap<String, String> globalPortletMenuMap; //Group portlet registrations, diff from default portlets as only applicable for specific group private static final HashMap<String, PortletViewFactory> groupPortletFactoryMap; private static final TreeMap<String, String> groupPortletNameMap; private static final LinkedHashMap<String, String> groupPortletMenuMap; //Resource portlet registrations, diff from default portlets as only applicable for specific resource private static final HashMap<String, PortletViewFactory> resourcePortletFactoryMap; private static final TreeMap<String, String> resourcePortletNameMap; private static final LinkedHashMap<String, String> resourcePortletMenuMap; private static HashMap<String, String> portletIconMap; static { // GLOBAL Portlets // Map portlet keys to portlet factories globalPortletFactoryMap = new HashMap<String, PortletViewFactory>(); globalPortletFactoryMap.put(InventorySummaryPortlet.KEY, InventorySummaryPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(RecentlyAddedResourcesPortlet.KEY, RecentlyAddedResourcesPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(PlatformSummaryPortlet.KEY, PlatformSummaryPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(AutodiscoveryPortlet.KEY, AutodiscoveryPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(RecentAlertsPortlet.KEY, RecentAlertsPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(RecentEventsPortlet.KEY, RecentEventsPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(ResourceD3GraphPortlet.KEY, ResourceD3GraphPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(ResourceGroupD3GraphPortlet.KEY, ResourceGroupD3GraphPortlet.Factory.INSTANCE); //conditionally add tags. Defaults to true, not available in JON builds. if (CoreGUI.isTagsEnabledForUI()) { globalPortletFactoryMap.put(TagCloudPortlet.KEY, TagCloudPortlet.Factory.INSTANCE); } globalPortletFactoryMap.put(FavoriteResourcesPortlet.KEY, FavoriteResourcesPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(FavoriteGroupsPortlet.KEY, FavoriteGroupsPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(MashupPortlet.KEY, MashupPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(MessagePortlet.KEY, MessagePortlet.Factory.INSTANCE); globalPortletFactoryMap.put(ProblemResourcesPortlet.KEY, ProblemResourcesPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(OperationHistoryPortlet.KEY, OperationHistoryPortlet.Factory.INSTANCE); globalPortletFactoryMap.put(OperationSchedulePortlet.KEY, OperationSchedulePortlet.Factory.INSTANCE); globalPortletFactoryMap.put(ResourceTimelinePortlet.KEY, ResourceTimelinePortlet.Factory.INSTANCE); // sorted map of portlet names to portlet keys globalPortletNameMap = new TreeMap<String, String>(); globalPortletNameMap.put(InventorySummaryPortlet.NAME, InventorySummaryPortlet.KEY); globalPortletNameMap.put(RecentlyAddedResourcesPortlet.NAME, RecentlyAddedResourcesPortlet.KEY); globalPortletNameMap.put(PlatformSummaryPortlet.NAME, PlatformSummaryPortlet.KEY); globalPortletNameMap.put(AutodiscoveryPortlet.NAME, AutodiscoveryPortlet.KEY); globalPortletNameMap.put(RecentAlertsPortlet.NAME, RecentAlertsPortlet.KEY); globalPortletNameMap.put(RecentEventsPortlet.NAME, RecentEventsPortlet.KEY); globalPortletNameMap.put(ResourceD3GraphPortlet.NAME, ResourceD3GraphPortlet.KEY); globalPortletNameMap.put(ResourceGroupD3GraphPortlet.NAME, ResourceGroupD3GraphPortlet.KEY); //conditionally add tags. Defaults to true, not available in JON builds. if (CoreGUI.isTagsEnabledForUI()) { globalPortletNameMap.put(TagCloudPortlet.NAME, TagCloudPortlet.KEY); } globalPortletNameMap.put(FavoriteResourcesPortlet.NAME, FavoriteResourcesPortlet.KEY); globalPortletNameMap.put(FavoriteGroupsPortlet.NAME, FavoriteGroupsPortlet.KEY); globalPortletNameMap.put(MashupPortlet.NAME, MashupPortlet.KEY); globalPortletNameMap.put(MessagePortlet.NAME, MessagePortlet.KEY); globalPortletNameMap.put(ProblemResourcesPortlet.NAME, ProblemResourcesPortlet.KEY); globalPortletNameMap.put(OperationHistoryPortlet.NAME, OperationHistoryPortlet.KEY); globalPortletNameMap.put(OperationSchedulePortlet.NAME, OperationSchedulePortlet.KEY); globalPortletNameMap.put(ResourceTimelinePortlet.NAME, ResourceTimelinePortlet.KEY); globalPortletMenuMap = new LinkedHashMap<String, String>(globalPortletNameMap.size()); for (String portletName : globalPortletNameMap.keySet()) { globalPortletMenuMap.put(globalPortletNameMap.get(portletName), portletName); } // GROUP Portlets // Map portlet keys to portlet factories groupPortletFactoryMap = new HashMap<String, PortletViewFactory>(); groupPortletFactoryMap.put(GroupAlertsPortlet.KEY, GroupAlertsPortlet.Factory.INSTANCE); groupPortletFactoryMap.put(GroupMetricsPortlet.KEY, GroupMetricsPortlet.Factory.INSTANCE); groupPortletFactoryMap.put(GroupOobsPortlet.KEY, GroupOobsPortlet.Factory.INSTANCE); groupPortletFactoryMap.put(GroupEventsPortlet.KEY, GroupEventsPortlet.Factory.INSTANCE); groupPortletFactoryMap.put(GroupOperationsPortlet.KEY, GroupOperationsPortlet.Factory.INSTANCE); groupPortletFactoryMap.put(GroupPkgHistoryPortlet.KEY, GroupPkgHistoryPortlet.Factory.INSTANCE); groupPortletFactoryMap.put(GroupBundleDeploymentsPortlet.KEY, GroupBundleDeploymentsPortlet.Factory.INSTANCE); groupPortletFactoryMap.put(GroupConfigurationUpdatesPortlet.KEY, GroupConfigurationUpdatesPortlet.Factory.INSTANCE); // sorted map of portlet names to portlet keys groupPortletNameMap = new TreeMap<String, String>(); groupPortletNameMap.put(GroupAlertsPortlet.NAME, GroupAlertsPortlet.KEY); groupPortletNameMap.put(GroupMetricsPortlet.NAME, GroupMetricsPortlet.KEY); groupPortletNameMap.put(GroupOobsPortlet.NAME, GroupOobsPortlet.KEY); groupPortletNameMap.put(GroupEventsPortlet.NAME, GroupEventsPortlet.KEY); groupPortletNameMap.put(GroupOperationsPortlet.NAME, GroupOperationsPortlet.KEY); groupPortletNameMap.put(GroupPkgHistoryPortlet.NAME, GroupPkgHistoryPortlet.KEY); groupPortletNameMap.put(GroupBundleDeploymentsPortlet.NAME, GroupBundleDeploymentsPortlet.KEY); groupPortletNameMap.put(GroupConfigurationUpdatesPortlet.NAME, GroupConfigurationUpdatesPortlet.KEY); groupPortletMenuMap = new LinkedHashMap<String, String>(groupPortletNameMap.size()); for (String portletName : groupPortletNameMap.keySet()) { groupPortletMenuMap.put(groupPortletNameMap.get(portletName), portletName); } // Resource Portlets // Map portlet keys to portlet factories resourcePortletFactoryMap = new HashMap<String, PortletViewFactory>(); resourcePortletFactoryMap.put(ResourceMetricsPortlet.KEY, ResourceMetricsPortlet.Factory.INSTANCE); resourcePortletFactoryMap.put(ResourceEventsPortlet.KEY, ResourceEventsPortlet.Factory.INSTANCE); resourcePortletFactoryMap.put(ResourceOobsPortlet.KEY, ResourceOobsPortlet.Factory.INSTANCE); resourcePortletFactoryMap.put(ResourceAlertsPortlet.KEY, ResourceAlertsPortlet.Factory.INSTANCE); resourcePortletFactoryMap.put(ResourceOperationsPortlet.KEY, ResourceOperationsPortlet.Factory.INSTANCE); resourcePortletFactoryMap.put(ResourcePkgHistoryPortlet.KEY, ResourcePkgHistoryPortlet.Factory.INSTANCE); resourcePortletFactoryMap.put(ResourceBundleDeploymentsPortlet.KEY, ResourceBundleDeploymentsPortlet.Factory.INSTANCE); resourcePortletFactoryMap.put(ResourceConfigurationUpdatesPortlet.KEY, ResourceConfigurationUpdatesPortlet.Factory.INSTANCE); // sorted map of portlet names to portlet keys resourcePortletNameMap = new TreeMap<String, String>(); resourcePortletNameMap.put(ResourceMetricsPortlet.NAME, ResourceMetricsPortlet.KEY); resourcePortletNameMap.put(ResourceEventsPortlet.NAME, ResourceEventsPortlet.KEY); resourcePortletNameMap.put(ResourceOobsPortlet.NAME, ResourceOobsPortlet.KEY); resourcePortletNameMap.put(ResourceOperationsPortlet.NAME, ResourceOperationsPortlet.KEY); resourcePortletNameMap.put(ResourcePkgHistoryPortlet.NAME, ResourcePkgHistoryPortlet.KEY); resourcePortletNameMap.put(ResourceAlertsPortlet.NAME, ResourceAlertsPortlet.KEY); resourcePortletNameMap.put(ResourceBundleDeploymentsPortlet.NAME, ResourceBundleDeploymentsPortlet.KEY); resourcePortletNameMap.put(ResourceConfigurationUpdatesPortlet.NAME, ResourceConfigurationUpdatesPortlet.KEY); resourcePortletMenuMap = new LinkedHashMap<String, String>(resourcePortletNameMap.size()); for (String portletName : resourcePortletNameMap.keySet()) { resourcePortletMenuMap.put(resourcePortletNameMap.get(portletName), portletName); } //############## Portlet icon mappings ############################################ //register portlet names portletIconMap = new HashMap<String, String>(globalPortletFactoryMap.size()); portletIconMap.put(GroupAlertsPortlet.KEY, ImageManager.getAlertIcon()); portletIconMap.put(ResourceAlertsPortlet.KEY, ImageManager.getAlertIcon()); portletIconMap.put(GroupMetricsPortlet.KEY, ImageManager.getMonitorIcon()); portletIconMap.put(ResourceMetricsPortlet.KEY, ImageManager.getMonitorIcon()); portletIconMap.put(GroupOobsPortlet.KEY, ImageManager.getMonitorFailedIcon()); portletIconMap.put(ResourceOobsPortlet.KEY, ImageManager.getMonitorFailedIcon()); portletIconMap.put(GroupEventsPortlet.KEY, ImageManager.getEventIcon()); portletIconMap.put(ResourceEventsPortlet.KEY, ImageManager.getEventIcon()); portletIconMap.put(GroupOperationsPortlet.KEY, ImageManager.getOperationIcon()); portletIconMap.put(ResourceOperationsPortlet.KEY, ImageManager.getOperationIcon()); portletIconMap.put(GroupPkgHistoryPortlet.KEY, ImageManager.getActivityPackageIcon()); portletIconMap.put(ResourcePkgHistoryPortlet.KEY, ImageManager.getActivityPackageIcon()); portletIconMap.put(GroupBundleDeploymentsPortlet.KEY, ImageManager.getBundleIcon()); portletIconMap.put(ResourceBundleDeploymentsPortlet.KEY, ImageManager.getBundleIcon()); portletIconMap.put(GroupConfigurationUpdatesPortlet.KEY, ImageManager.getConfigureIcon()); portletIconMap.put(ResourceConfigurationUpdatesPortlet.KEY, ImageManager.getConfigureIcon()); } private PortletFactory() { // static utility class } public static Portlet buildPortlet(PortletWindow portletWindow, DashboardPortlet storedPortlet, EntityContext context) { PortletViewFactory viewFactory = globalPortletFactoryMap.get(storedPortlet.getPortletKey()); if (viewFactory == null) {//check group view factory viewFactory = groupPortletFactoryMap.get(storedPortlet.getPortletKey()); if (viewFactory == null) {//check resource view factory viewFactory = resourcePortletFactoryMap.get(storedPortlet.getPortletKey()); if (viewFactory == null) { Message msg = new Message("Bad portlet: " + storedPortlet, Severity.Warning); CoreGUI.getMessageCenter().notify(msg); class InvalidPortlet extends Label implements Portlet { InvalidPortlet() { super(CoreGUI.getMessages().view_portlet_factory_invalidPortlet()); } @Override public Canvas getHelpCanvas() { return new Label(getContents()); } @Override public void configure(PortletWindow portletWindow, DashboardPortlet storedPortlet) { } } ; return new InvalidPortlet(); } } } Portlet view = viewFactory.getInstance(context); view.configure(portletWindow, storedPortlet); //add code to initiate refresh cycle for portlets if (view instanceof AutoRefreshPortlet) { ((AutoRefreshPortlet) view).startRefreshCycle(); } return view; } public static boolean canBeAdded(String portletKey, Map<UiSubsystem, Boolean> showSubsystems) { if (!showSubsystems.get(UiSubsystem.ALERTS)) { if (ResourceAlertsPortlet.KEY.equals(portletKey) || GroupAlertsPortlet.KEY.equals(portletKey) || RecentAlertsPortlet.KEY.equals(portletKey)) { return false; } } if (!showSubsystems.get(UiSubsystem.CONFIG)) { if (ResourceConfigurationUpdatesPortlet.KEY.equals(portletKey) || GroupConfigurationUpdatesPortlet.KEY.equals(portletKey)) { return false; } } if (!showSubsystems.get(UiSubsystem.CONTENT)) { if (ResourcePkgHistoryPortlet.KEY.equals(portletKey) || GroupPkgHistoryPortlet.KEY.equals(portletKey) || ResourceBundleDeploymentsPortlet.KEY.equals(portletKey) || GroupBundleDeploymentsPortlet.KEY.equals(portletKey)) { return false; } } if (!showSubsystems.get(UiSubsystem.EVENTS)) { if (ResourceEventsPortlet.KEY.equals(portletKey) || GroupEventsPortlet.KEY.equals(portletKey) || RecentEventsPortlet.KEY.equals(portletKey)) { return false; } } if (!showSubsystems.get(UiSubsystem.OPERATIONS)) { if (ResourceOperationsPortlet.KEY.equals(portletKey) || GroupOperationsPortlet.KEY.equals(portletKey) || OperationHistoryPortlet.KEY.equals(portletKey) || OperationSchedulePortlet.KEY.equals(portletKey)) { return false; } } return true; } /** * @return Unprotected, make a copy if you need to alter the map entries. */ public static LinkedHashMap<String, String> getGlobalPortletMenuMap() { return globalPortletMenuMap; } /** * @return Unprotected, make a copy if you need to alter the map entries. */ public static LinkedHashMap<String, String> getGroupPortletMenuMap() { return groupPortletMenuMap; } /** * @return Unprotected, make a copy if you need to alter the map entries. */ public static LinkedHashMap<String, String> getResourcePortletMenuMap() { return resourcePortletMenuMap; } public static String getRegisteredPortletIcon(String key) { return portletIconMap.get(key); } }