/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008-2010 Sun Microsystems, Inc. * Portions Copyright 2013-2015 ForgeRock AS. */ package org.opends.guitools.controlpanel.browser; import java.util.HashMap; import java.util.Set; import java.util.SortedSet; import javax.swing.ImageIcon; import org.opends.guitools.controlpanel.util.Utilities; import org.opends.quicksetup.ui.UIFactory; import org.opends.server.util.ServerConstants; import static org.opends.messages.AdminToolMessages.*; /** * This class is used as a cache containing the icons that are used by the * BrowserController to update the nodes. It keeps some icons associated with * some entry types, to suffixes, to the root node, etc. */ public class IconPool { /** * Mask for the leaf node. */ public static final int MODIFIER_LEAF = 0x01; /** * Mask for the referral node. */ public static final int MODIFIER_REFERRAL = 0x02; /** * Mask for the node that has an error. */ public static final int MODIFIER_ERROR = 0x04; private final HashMap<String, ImageIcon> iconTable = new HashMap<>(); private final HashMap<String, String> pathTable = new HashMap<>(); private final HashMap<String, String> descriptionTable = new HashMap<>(); private ImageIcon defaultLeafIcon; private ImageIcon suffixIcon; private ImageIcon defaultContainerIcon; private ImageIcon rootNodeIcon; private ImageIcon errorIcon; private ImageIcon errorMaskIcon; private ImageIcon referralMaskIcon; /** * The path that contains the icons. */ public static final String IMAGE_PATH = "org/opends/guitools/controlpanel/images"; private static final String[] ICON_PATH = { ServerConstants.OC_PERSON, "ds-user.png", ServerConstants.OC_ORGANIZATION, "ds-folder.png", ServerConstants.OC_ORGANIZATIONAL_UNIT_LC, "ds-ou.png", ServerConstants.OC_GROUP_OF_NAMES_LC, "ds-group.png", ServerConstants.OC_GROUP_OF_ENTRIES_LC, "ds-group.png", ServerConstants.OC_GROUP_OF_UNIQUE_NAMES_LC, "ds-group.png", ServerConstants.OC_GROUP_OF_URLS_LC, "ds-group.png", ServerConstants.OC_VIRTUAL_STATIC_GROUP, "ds-group.png", "passwordpolicy", "ds-ppol.png" }; private static final String[] DESCRIPTION = { ServerConstants.OC_PERSON, INFO_PERSON_ICON_DESCRIPTION.get().toString(), ServerConstants.OC_ORGANIZATION, INFO_ORGANIZATION_ICON_DESCRIPTION.get() .toString(), ServerConstants.OC_ORGANIZATIONAL_UNIT_LC, INFO_ORGANIZATIONAL_UNIT_ICON_DESCRIPTION.get().toString(), ServerConstants.OC_GROUP_OF_NAMES_LC, INFO_STATIC_GROUP_ICON_DESCRIPTION .get().toString(), ServerConstants.OC_GROUP_OF_ENTRIES_LC, INFO_STATIC_GROUP_ICON_DESCRIPTION .get().toString(), ServerConstants.OC_GROUP_OF_UNIQUE_NAMES_LC, INFO_STATIC_GROUP_ICON_DESCRIPTION.get().toString(), ServerConstants.OC_GROUP_OF_URLS_LC, INFO_DYNAMIC_GROUP_ICON_DESCRIPTION .get().toString(), ServerConstants.OC_VIRTUAL_STATIC_GROUP, INFO_VIRTUAL_STATIC_GROUP_ICON_DESCRIPTION.get().toString(), "passwordpolicy", INFO_PASSWORD_POLICY_ICON_DESCRIPTION.get().toString() }; private final String GENERIC_OBJECT_DESCRIPTION = "Generic entry"; /** The default constructor. */ public IconPool() { // Recopy ICON_PATH in pathTable for fast access for (int i = 0; i < ICON_PATH.length; i = i+2) { pathTable.put(ICON_PATH[i], ICON_PATH[i+1]); } for (int i = 0; i < DESCRIPTION.length; i = i+2) { descriptionTable.put(DESCRIPTION[i], DESCRIPTION[i+1]); } } /** * If objectClass is null, a default icon is used. * @param objectClasses the objectclass values of the entry for which we want * an icon. * @param modifiers the modifiers associated with the entry (if there was * an error, if it is a referral, etc.). * @return the icon corresponding to the provided object classes and * modifiers. */ public ImageIcon getIcon(SortedSet<String> objectClasses, int modifiers) { String key = makeKey(objectClasses, modifiers); ImageIcon result = iconTable.get(key); if (result == null) { result = makeIcon(objectClasses, modifiers); iconTable.put(key, result); } return result; } /** * Creates an icon for a given path. * @param path the path of the icon. * @param description the description of the icon * @return the associated ImageIcon. */ private ImageIcon createIcon(String path, String description) { ImageIcon icon = Utilities.createImageIcon(path); if (description != null) { icon.setDescription(description); icon.getAccessibleContext().setAccessibleDescription(description); } return icon; } /** * Returns the icon associated with a leaf node. * @return the icon associated with a leaf node. */ public ImageIcon getDefaultLeafIcon() { if (defaultLeafIcon == null) { defaultLeafIcon = createIcon(IMAGE_PATH + "/ds-generic.png", GENERIC_OBJECT_DESCRIPTION); } return defaultLeafIcon; } /** * Returns the icon associated with a container node. * @return the icon associated with a container node. */ public ImageIcon getDefaultContainerIcon() { if (defaultContainerIcon == null) { defaultContainerIcon = createIcon(IMAGE_PATH + "/ds-folder.png", "Folder entry"); } return defaultContainerIcon; } /** * Returns the icon associated with a suffix node. * @return the icon associated with a suffix node. */ public ImageIcon getSuffixIcon() { if (suffixIcon == null) { suffixIcon = createIcon(IMAGE_PATH + "/ds-suffix.png", "Suffix entry"); } return suffixIcon; } /** * Returns the icon associated with a root node. * @return the icon associated with a root node. */ public ImageIcon getIconForRootNode() { if (rootNodeIcon == null) { rootNodeIcon = createIcon(IMAGE_PATH + "/ds-directory.png", "Root entry"); } return rootNodeIcon; } /** * Returns the icon associated with a node for which an error occurred. * @return the icon associated with a node for which an error occurred. */ public ImageIcon getErrorIcon() { if (errorIcon == null) { errorIcon = UIFactory.getImageIcon(UIFactory.IconType.ERROR); } return errorIcon; } /** * Returns the icon associated with the error mask icon. * @return the icon associated with the error mask icon. */ public ImageIcon getErrorMaskIcon() { if (errorMaskIcon == null) { errorMaskIcon = UIFactory.getImageIcon(UIFactory.IconType.ERROR); } return errorMaskIcon; } /** * Returns the icon associated with the referral mask icon. * @return the icon associated with the referral mask icon. */ public ImageIcon getReferralMaskIcon() { if (referralMaskIcon == null) { referralMaskIcon = createIcon(IMAGE_PATH + "/ds-referral.png", "Referral mask"); } return referralMaskIcon; } /** * Returns an icon for a given objectclass applying some modifiers. * @param objectClasses the objectclasses of the entry * @param modifiers the modifiers of the icon (if the entry is inactivated, * if it is a referral...). * @return an icon for a given objectclass applying some modifiers. */ private ImageIcon makeIcon(Set<String> objectClasses, int modifiers) { ImageIcon result; // Find the icon associated to the object class if (objectClasses == null || objectClasses.isEmpty()) { result = getDefaultContainerIcon(); } else { String iconFile = null; for (String value : objectClasses) { iconFile = pathTable.get(value.toLowerCase()); if (iconFile != null) { break; } } if (iconFile == null) { if ((modifiers & MODIFIER_LEAF) != 0) { result = getDefaultLeafIcon(); } else { result = getDefaultContainerIcon(); } } else { String description = null; for (String value : objectClasses) { description = descriptionTable.get(value.toLowerCase()); if (description != null) { break; } } if (description == null) { description = GENERIC_OBJECT_DESCRIPTION; } result = createIcon(IMAGE_PATH + "/" + iconFile, description); } } // Alter this icon according the modifiers if ((modifiers & MODIFIER_REFERRAL) != 0) { result = getReferralMaskIcon(); } if ((modifiers & MODIFIER_ERROR) != 0) { result = getErrorMaskIcon(); } return result; } private String makeKey(SortedSet<String> ocValues, int modifiers) { // TODO: verify the performance of IconPool.makeKey() StringBuilder result = new StringBuilder(); if(ocValues != null) { result.append(Utilities.getStringFromCollection(ocValues, "")); } result.append(modifiers); return result.toString(); } }