package org.rhq.coregui.client;
import org.rhq.core.domain.alert.AlertPriority;
import org.rhq.core.domain.alert.notification.ResultState;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.drift.DriftCategory;
import org.rhq.core.domain.event.EventSeverity;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.ResourceAvailability;
import org.rhq.core.domain.operation.OperationRequestStatus;
import org.rhq.core.domain.resource.CreateResourceStatus;
import org.rhq.core.domain.resource.DeleteResourceStatus;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.GroupCategory;
import org.rhq.core.domain.resource.group.composite.ResourceGroupComposite.GroupAvailabilityType;
/**
* Provides an API to obtain links to images and icons, thus avoiding hardcoding image URLs throughout client code.
*
* For each icon, there is typically a small and large version (16x16 and 24x24). To obtain the smaller icon,
* you use the "getXXXIcon" methods and to obtain the larger icon you use the "getXXXLargeIcon" method.
*
* @author John Mazzitelli
*
*/
public class ImageManager {
public static final String IMAGES_DIR = "images/";
/**
* Returns the base icon name for the discovery queue's platform folder nodes.
* There are actually two icons, open and closed - the returned string is just
* the base icon name.
*/
public static String getDiscoveryQueuePlatformIconBase() {
return "global/DiscoveryQueue_Platform_16.png";
}
/**
* Returns a generic "help" icon. This will also have a peer "disabled" help icon.
*/
public static String getHelpIcon() {
return "global/help.png";
}
public static String getLoadingIcon() {
return "ajax-loader.gif";
}
public static String getStatusComplete() {
return "status_complete.gif";
}
public static String getStatusError() {
return "status_error.gif";
}
public static String getCloseIcon() {
return "[SKIN]/actions/close.png";
}
/**
* Returns a generic "upload" icon.
*/
public static String getUploadIcon() {
return "global/upload.png";
}
/**
* Returns a generic view icon.
*/
public static String getViewIcon() {
return "[SKIN]/actions/view.png";
}
/**
* Returns a generic edit icon.
*/
public static String getEditIcon() {
return "[SKIN]/actions/edit.png";
}
/**
* Returns a generic edit icon.
*/
public static String getEditDisabledIcon() {
return "[SKIN]/actions/edit_Disabled.png";
}
/**
* Returns a generic remove icon.
*/
public static String getRemoveIcon() {
return "[SKIN]/actions/remove.png";
}
/**
* Returns a generic add icon.
*/
public static String getAddIcon() {
return "[SKIN]/actions/add.png";
}
/**
* Returns a generic approve (aka "ok") icon.
*/
public static String getApproveIcon() {
return "[SKIN]/actions/approve.png";
}
/**
* Returns a generic cancel icon.
*/
public static String getCancelIcon() {
return "[SKIN]/actions/undo.png";
}
/**
* Returns a generic pinned icon.
*/
public static String getUnpinnedIcon() {
return "[SKIN]/headerIcons/pin_left.png";
}
/**
* Returns a generic pinned icon.
*/
public static String getPinnedIcon() {
return "subsystems/drift/Pinned_active.png";
}
/**
* Returns a generic pinned icon.
*/
public static String getPinnedInactiveIcon() {
return "subsystems/drift/Pinned_inactive.png";
}
public static String getDriftIcon() {
return "subsystems/drift/Drift_16.png";
}
/**
* Returns a drift icon given the category of the drift.
* Note that if the category is null, it will be assumed the drift icon
* should be one that indicates the file is "new" (presumably from
* a coverage change set report - that is, its the first time the file
* has been seen).
*
* @param category
* @return path to icon
*/
public static String getDriftCategoryIcon(DriftCategory category) {
if (category == null) {
return "subsystems/drift/Drift_new_16.png";
}
switch (category) {
case FILE_ADDED:
return "subsystems/drift/Drift_add_16.png";
case FILE_CHANGED:
return "subsystems/drift/Drift_change_16.png";
case FILE_REMOVED:
return "subsystems/drift/Drift_remove_16.png";
}
return null; // should never happen
}
/**
* Returns the operation status icon. If status is null, returns
* the plain, unbadged, operation icon.
*/
public static String getOperationResultsIcon(OperationRequestStatus status) {
String icon = "";
if (status != null) {
switch (status) {
case INPROGRESS:
icon = "_inprogress";
break;
case SUCCESS:
icon = "_ok";
break;
case FAILURE:
icon = "_failed";
break;
case CANCELED:
icon = "_cancel";
break;
}
}
return "subsystems/control/Operation" + icon + "_16.png";
}
/**
* All methods in this ImageManager class return image paths relative to the top
* {@link #IMAGES_DIR images directory}. If you need a full path to the image, including
* this top images directory name (for example, if you need to populate an explicit HTML
* img tag's src attribute) pass in an image path to this {@link #getFullImagePath(String)}
* method to obtain the full path. The caller can optionally prepend {@link #IMAGES_DIR}
* to any path returned by ImageManager, which is all this method really does.
*
* @param image a relative image path
* @return a full image path
*/
public static String getFullImagePath(String image) {
return IMAGES_DIR + image;
}
public static String getResourceIcon(Resource resource) {
return getResourceIcon(resource, "16");
}
public static String getResourceLargeIcon(Resource resource) {
return getResourceIcon(resource, "24");
}
private static String getResourceIcon(Resource resource, String size) {
ResourceType type = resource.getResourceType();
ResourceCategory category;
if (type != null) {
category = type.getCategory();
} else {
category = ResourceCategory.SERVICE;
}
ResourceAvailability resourceAvail = resource.getCurrentAvailability();
return getResourceIcon(category, resourceAvail.getAvailabilityType(), size);
}
public static String getClusteredResourceIcon(ResourceCategory category) {
String categoryName = null;
switch (category) {
case PLATFORM: {
categoryName = "Platform";
break;
}
case SERVER: {
categoryName = "Server";
break;
}
case SERVICE: {
categoryName = "Service";
break;
}
}
return "resources/" + categoryName + "_Group_16.png";
}
public static String getResourceTypeIcon(ResourceCategory category) {
return "types/" + category.getDisplayName() + "_type_24.png";
}
public static String getResourceIcon(ResourceCategory category) {
return getResourceIcon(category, AvailabilityType.UP);
}
public static String getResourceLargeIcon(ResourceCategory category) {
return getResourceLargeIcon(category, AvailabilityType.UP);
}
public static String getResourceIcon(ResourceCategory category, AvailabilityType avail) {
return getResourceIcon(category, avail, "16");
}
public static String getResourceLargeIcon(ResourceCategory category, AvailabilityType avail) {
return getResourceIcon(category, avail, "24");
}
private static String getResourceIcon(ResourceCategory category, AvailabilityType avail, String size) {
String categoryName = null;
String availName = null;
if (null == avail) {
avail = AvailabilityType.UNKNOWN;
}
switch (category) {
case PLATFORM: {
categoryName = "Platform";
// platform can only be up or down
availName = (AvailabilityType.UP == avail) ? "up" : "down";
break;
}
case SERVER: {
categoryName = "Server";
// no break
}
case SERVICE: {
if (null == categoryName) {
categoryName = "Service";
}
availName = avail.name().toLowerCase();
break;
}
}
return "types/" + categoryName + "_" + availName + "_" + size + ".png";
}
public static String getGroupIcon(GroupCategory groupType) {
String category = groupType == GroupCategory.COMPATIBLE ? "Cluster" : "Group";
return "types/" + category + "_up_16.png";
}
public static String getGroupLargeIcon(GroupCategory groupType) {
String category = groupType == GroupCategory.COMPATIBLE ? "Cluster" : "Group";
return "types/" + category + "_up_24.png";
}
/**
* Returns the group icon badged with availability icon. Group avail
* badging is determined in the following way, in order:
* allDown = red
* someDown = yellow
* someDisabled = orange
* otherwise = green
*
* @param groupType the type of group
* @return the group badge icon
*/
public static String getGroupIcon(GroupCategory groupType, GroupAvailabilityType groupAvailType) {
return getGroupIcon(groupType, groupAvailType, "16");
}
/**
* @see #getGroupIcon(GroupCategory, GroupAvailabilityType)
*/
public static String getGroupLargeIcon(GroupCategory groupType, GroupAvailabilityType groupAvailType) {
return getGroupIcon(groupType, groupAvailType, "24");
}
/**
* @see #getGroupIcon(GroupCategory, GroupAvailabilityType)
*/
private static String getGroupIcon(GroupCategory groupType, GroupAvailabilityType groupAvailType, String size) {
String category = groupType == GroupCategory.COMPATIBLE ? "Cluster" : "Group";
switch (groupAvailType) {
case EMPTY:
return "types/" + category + "_up_" + size + ".png";
case DOWN:
return "types/" + category + "_down_" + size + ".png";
case WARN:
return "types/" + category + "_warning_" + size + ".png";
case DISABLED:
return "types/" + category + "_disabled_" + size + ".png";
default:
return "types/" + category + "_up_" + size + ".png";
}
}
public static String getAvailabilityIconFromAvailType(AvailabilityType availType) {
return getAvailabilityIconFromAvailTypeAndSize(availType, false);
}
public static String getAvailabilityLargeIconFromAvailType(AvailabilityType availType) {
return getAvailabilityIconFromAvailTypeAndSize(availType, true);
}
private static String getAvailabilityIconFromAvailTypeAndSize(AvailabilityType availType, boolean isLarge) {
if (null == availType) {
availType = AvailabilityType.UNKNOWN;
}
String color = null;
switch (availType) {
case UP:
color = "green";
break;
case DOWN:
color = "red";
break;
case DISABLED:
color = "orange";
break;
case UNKNOWN:
color = "grey";
break;
}
return "subsystems/availability/availability_" + color + "_" + (isLarge ? "24" : "16") + ".png";
}
// TODO: Fix this overloading of avail icons, status should have their own icons
public static String getAvailabilityIcon(Boolean status) {
AvailabilityType availType = (null == status) ? AvailabilityType.UNKNOWN
: (Boolean.TRUE == status) ? AvailabilityType.UP : AvailabilityType.DOWN;
return getAvailabilityIconFromAvailTypeAndSize(availType, false);
}
// TODO: Fix this overloading of avail icons, status should have their own icons
public static String getAvailabilityLargeIcon(Boolean status) {
AvailabilityType availType = (null == status) ? AvailabilityType.UNKNOWN
: (Boolean.TRUE == status) ? AvailabilityType.UP : AvailabilityType.DOWN;
return getAvailabilityIconFromAvailTypeAndSize(availType, true);
}
/**
* Returns the large availability icon based on group availability. Determined in the following way, in order:
* empty = grey
* allDown = red
* someDown = yellow
* someDisabled = orange
* otherwise = green
*
* @return the large avail icon
*/
public static String getAvailabilityGroupLargeIcon(GroupAvailabilityType groupAvailType) {
switch (groupAvailType) {
case EMPTY:
return "subsystems/availability/availability_grey_24.png";
case DOWN:
return "subsystems/availability/availability_red_24.png";
case WARN:
return "subsystems/availability/availability_yellow_24.png";
case DISABLED:
return "subsystems/availability/availability_orange_24.png";
default:
return "subsystems/availability/availability_green_24.png";
}
}
public static String getAvailabilityYellowIcon() {
return "subsystems/availability/availability_yellow_16.png";
}
public static String getAvailBarImagePath(AvailabilityType availType) {
switch (availType) {
case UP:
return "availBar/up.png";
case DOWN:
return "availBar/down.png";
case DISABLED:
return "availBar/disabled.png";
case UNKNOWN:
default:
return "availBar/unknown.png";
}
}
public static String getAlertStatusCheckedIcon() {
return "global/Check_16.png";
}
public static String getAlertIcon(AlertPriority priority) {
return "subsystems/alert/Alert_" + priority.name() + "_16.png";
}
public static String getAlertIcon() {
return "subsystems/alert/Flag_blue_16.png";
}
public static String getMetricEditIcon() {
return "subsystems/monitor/Edit_Metric.png";
}
public static String getPluginConfigurationIcon(ConfigurationUpdateStatus updateStatus) {
if (updateStatus != null) {
switch (updateStatus) {
case SUCCESS: {
return "subsystems/inventory/Connection_ok_16.png";
}
case FAILURE: {
return "subsystems/inventory/Connection_failed_16.png";
}
case INPROGRESS: {
return "subsystems/inventory/Connection_inprogress_16.png";
}
case NOCHANGE:
return "subsystems/inventory/Connection_16.png";
}
}
return "subsystems/inventory/Connection_16.png";
}
public static String getResourceConfigurationIcon(ConfigurationUpdateStatus updateStatus) {
if (updateStatus != null) {
switch (updateStatus) {
case SUCCESS: {
return "subsystems/configure/Configure_ok_16.png";
}
case FAILURE: {
return "subsystems/configure/Configure_failed_16.png";
}
case INPROGRESS: {
return "subsystems/configure/Configure_inprogress_16.png";
}
case NOCHANGE:
return "subsystems/configure/Configure_16.png";
}
}
return "subsystems/configure/Configure_16.png";
}
public static String getLockedIcon() {
return "global/Locked_16.png";
}
public static String getEventSeverityIcon(EventSeverity severity) {
String icon = "";
if (severity != null) {
switch (severity) {
case DEBUG:
icon = "_debug";
break;
case INFO:
icon = "_info";
break;
case WARN:
icon = "_warning";
break;
case ERROR:
icon = "_error";
break;
case FATAL:
icon = "_fatal";
break;
}
}
return "subsystems/event/Events" + icon + "_16.png";
}
public static String getAlertNotificationResultIcon(ResultState status) {
if (status == null) {
status = ResultState.UNKNOWN;
}
switch (status) {
case SUCCESS:
return ImageManager.getAvailabilityIcon(true);
case FAILURE:
return ImageManager.getAvailabilityIcon(false);
case PARTIAL:
return ImageManager.getAvailabilityYellowIcon();
case DEFERRED:
return "[SKIN]/actions/forward.png"; // for lack of a better icon
case UNKNOWN:
default:
return ImageManager.getAvailabilityIcon(null);
}
}
/**
* This returns an icon of the badge (e.g. the red X or the blue I) without the
* event icon. This is used if you have a table of events and the user knows they are
* events so there is no need to show the event icon itself- showing a bigger badge
* to indicate severity is more useful.
*
* @param severity
* @return badge icon
*/
public static String getEventSeverityBadge(EventSeverity severity) {
return "subsystems/event/" + severity.name() + "_16.png";
}
public static String getEventIcon() {
return "subsystems/event/Events_16.png";
}
public static String getMonitorIcon() {
return "subsystems/monitor/Monitor_16.png";
}
public static String getMonitorFailedIcon() {
return "subsystems/monitor/Monitor_failed_16.png";
}
public static String getOperationIcon() {
return "subsystems/control/Operation_16.png";
}
public static String getActivityPackageIcon() {
return "subsystems/content/Package_16.png";
}
public static String getBundleIcon() {
return "subsystems/bundle/Bundle_16.png";
}
public static String getBundleGroupIcon() {
return "subsystems/bundle/BundleGroup_16.png";
}
public static String getConfigureIcon() {
return "subsystems/configure/Configure_16.png";
}
public static String getChildCreateIcon() {
return "subsystems/inventory/CreateChild_16.png";
}
public static String getBlankIcon() {
return IMAGES_DIR+"blank.png";
}
public static String getChildCreateIcon(CreateResourceStatus createStatus) {
if (createStatus == null) {
return getChildCreateIcon();
} else {
switch (createStatus) {
case SUCCESS: {
return "subsystems/inventory/CreateChild_success_16.png";
}
case IN_PROGRESS: {
return getChildCreateIcon();
}
default: {
// all others will use the failure icon
return "subsystems/inventory/CreateChild_failed_16.png";
}
}
}
}
public static String getChildDeleteIcon() {
return "subsystems/inventory/DeleteChild_16.png";
}
public static String getChildDeleteIcon(DeleteResourceStatus deleteStatus) {
if (deleteStatus == null) {
return getChildDeleteIcon();
} else {
switch (deleteStatus) {
case SUCCESS: {
return "subsystems/inventory/DeleteChild_success_16.png";
}
case IN_PROGRESS: {
return getChildDeleteIcon();
}
default: {
// all others will use the failure icon
return "subsystems/inventory/DeleteChild_failed_16.png";
}
}
}
}
}