001 package users; 002 003 import java.util.Locale; 004 import java.util.ResourceBundle; 005 006 /** 007 * Convenience class implementing basic capability behavior. 008 * 009 * <p>For convenience you can derive all your capability classes from 010 * <code>AbstractCapability</code>, which will manage names and display names.</p> 011 * 012 * @author Steffen Zschaler 013 * @version 2.0 05/05/1999 014 * @since v2.0 015 */ 016 public abstract class AbstractCapability implements Capability { 017 018 /** 019 * The name of the capability. 020 * 021 * <p><strong>IMMUTABLE</strong></p> 022 * 023 * @serial 024 */ 025 private final String m_sName; 026 027 /** 028 * Create a new capability with a given name. 029 * 030 * @param sName the name of the capability. 031 */ 032 public AbstractCapability(String sName) { 033 super(); 034 035 m_sName = sName; 036 } 037 038 // Capability interface methods 039 040 /** 041 * Get the capability's name. 042 * 043 * @override Never 044 * 045 * @return the capability's name. 046 */ 047 public String getName() { 048 return m_sName; 049 } 050 051 /** 052 * Get the display name of this capability using the default locale. 053 * 054 * <p>This is identical to</p> 055 * 056 * <pre> 057 * getDisplayName (Locale.getDefault()); 058 * </pre> 059 * 060 * @override Never 061 * 062 * @return the display name of this capability according to the default locale. 063 */ 064 public String getDisplayName() { 065 return getDisplayName(Locale.getDefault()); 066 } 067 068 /** 069 * Get the display name of this capability according to a locale. You can set the base name of the resource 070 * bundle to be used by calling {@link #setDisplayNameResourceBundleName}. 071 * 072 * @override Never 073 * 074 * @param l the locale according to which to get the display name 075 * 076 * @return the display name according to the locale. 077 */ 078 public String getDisplayName(Locale l) { 079 return getCapabilityDisplayName(getName(), l); 080 } 081 082 /** 083 * Return the grant state of this capability. This method is <i>abstract</i> 084 * and you'll have to redefine it in subclasses. 085 * 086 * @override Always 087 * 088 * @return true if this capability grants rights. 089 */ 090 public abstract boolean isGranted(); 091 092 /** 093 * Get the capability that is the inverse to this one. This method is abstract and 094 * you'll have to redefine it in subclasses. 095 * 096 * @override Always 097 * 098 * @return the capability that is the inverse to this one. 099 */ 100 public abstract Capability getToggled(); 101 102 // general object methods 103 104 /** 105 * Return a string representation of this capability. 106 * 107 * <p>The format of the returned string is:</p> 108 * 109 * <p><i>display name</i> <<i>name</i>>: <i>grant state</i></p> 110 * 111 * @override Sometimes 112 * 113 * @return a string representation of this capability. 114 */ 115 public String toString() { 116 return getDisplayName() + " <" + getName() + ">: " + isGranted(); 117 } 118 119 /** 120 * The resource bundle that contains the display names for the capabilities. CACHE. 121 */ 122 private static ResourceBundle s_rbDisplayNames = null; 123 /** 124 * The least recently used locale for looking up display names. 125 */ 126 private static Locale s_lLRU = null; 127 128 /** 129 * The base name for the resource bundles containing the capabilities' display names. 130 */ 131 private static String s_sBaseName = null; 132 133 /** 134 * Get a capabilities display name depending on a locale. This will lookup the capability's display name 135 * in the resource bundle specified through {@link #setDisplayNameResourceBundleName} and the locale. 136 * The key will be: 137 * <pre>capabilities.display_names.<i>sName</i></pre> 138 * 139 * @param sName the programmatical name of the capability 140 * @param l the locale that determines which resource bundle to use. 141 * 142 * @see java.util.ResourceBundle 143 */ 144 private static final String getCapabilityDisplayName(String sName, Locale l) { 145 if (s_sBaseName != null) { 146 if (l != s_lLRU) { 147 s_lLRU = l; 148 149 s_rbDisplayNames = ResourceBundle.getBundle(s_sBaseName, l); 150 } 151 152 return s_rbDisplayNames.getString("capabilities.display_names." + sName); 153 } 154 155 return sName; 156 } 157 158 /** 159 * Set the base name for the resouce bundle that contains the capabilities' display names. The resource 160 * must contain a String for each Capability. The key for the String must be: 161 * 162 * <code>capabilities.display_names.<i>capability_name</i></code> 163 */ 164 public static final void setDisplayNameResourceBundleName(String sBaseName) { 165 s_sBaseName = sBaseName; 166 s_lLRU = null; 167 } 168 }