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 }