Author: craigmcc
Date: Fri Sep 16 19:42:29 2005
New Revision: 289689
URL: http://svn.apache.org/viewcvs?rev=289689&view=rev
Log:
Add a utility class (and corresonding unit tests) that supports programmatic
access to a Map representation of a localized resource bundle, similar to the
kind of resource that <f:loadBundle> makes available inside a JSP page.
Added:
struts/shale/trunk/core-library/src/java/org/apache/shale/util/LoadBundle.java
struts/shale/trunk/core-library/src/test/org/apache/shale/util/
struts/shale/trunk/core-library/src/test/org/apache/shale/util/LoadBundleTestCase.java
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_en_US.properties
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_fr_FR.properties
Added:
struts/shale/trunk/core-library/src/java/org/apache/shale/util/LoadBundle.java
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/util/LoadBundle.java?rev=289689&view=auto
==============================================================================
---
struts/shale/trunk/core-library/src/java/org/apache/shale/util/LoadBundle.java
(added)
+++
struts/shale/trunk/core-library/src/java/org/apache/shale/util/LoadBundle.java
Fri Sep 16 19:42:29 2005
@@ -0,0 +1,252 @@
+/*
+ * Copyright 2004-2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shale.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Set;
+import javax.faces.context.FacesContext;
+
+/**
+ * <p>Utility class emulating the behavior of the standard JSF Core Library
+ * tag <code><f:loadBundle></code>. This class is designed to be used
+ * as a managed bean, and exposes a <code>map</code> property containing the
+ * messages in the resoruce bundle specified by the <code>basename</code>
+ * property, localized for the <code>Locale</code> specified on the current
+ * request.</p>
+ *
+ * <p>A typical use of this class would be to declare a managed bean like
this:</p>
+ * <code>
+ * <managed-bean>
+ * <managed-bean-name>messages</managed-bean-name>
+ * <managed-bean-class>
+ * org.apache.shale.util.LoadBundle
+ * </managed-bean-class>
+ * <managed-bean-scope>request</managed-bean-scope>
+ * <managed-property>
+ * <property-name>basename</property-name>
+ * <value>com.mycompany.mypackage.Bundle</value>
+ * </managed-property>
+ * </managed-bean>
+ * </code>
+ *
+ * <p>This will result in creation of a request scope object whose
<code>map</code>
+ * property will return a <code>Map</code> representing the localized messages
for
+ * the <code>com.mycompany.mypackage.Bundle</code> resource bundle. You can
look
+ * up localized messages in this <code>Map</code> by evaluating a value binding
+ * expression like <code>#{messages.map['message.key']}</code>, where
+ * <code>message.key</code> is the key for which to retrieve a localized
message.</p>
+ */
+public class LoadBundle {
+
+ // -------------------------------------------------------------
Constructors
+
+
+ /** Creates a new instance of LoadBundle */
+ public LoadBundle() {
+ this(null);
+ }
+
+
+ /** <p>Creates a new instance of LoadBundle for the specified bundle.</p>
+ *
+ * @param basename Base resource bundle name for this
<code>LoadBundle</code>
+ */
+ public LoadBundle(String basename) {
+ this.basename = basename;
+ }
+
+
+ // ---------------------------------------------------------------
Properties
+
+
+ /**
+ * <p>The base resource bundle name for this <code>LoadBundle</code>
instance.</p>
+ */
+ private String basename = null;
+
+
+ /**
+ * <p>Return the base resource bundle name for this <code>LoadBundle</code>
+ * instance.</p>
+ */
+ public String getBasename() {
+ return this.basename;
+ }
+
+
+ /**
+ * <p>Set the base resource bundle name for this <code>LoadBundle</code>
+ * instance.</p>
+ */
+ public void setBasename(String basename) {
+ this.basename = basename;
+ }
+
+
+ // ----------------------------------------------------------- Public
Methods
+
+
+ /**
+ * <p>Return a <code>Map</code> whose keys and values represent the content
+ * of the application resource bundle specified by the <code>basename</code>
+ * property, localized for the <code>Locale</code> stored in the
+ * <code>UIViewRoot</code> for the current request.</p>
+ */
+ public Map getMap() {
+
+ // Validate our current state
+ if (basename == null) {
+ throw new IllegalStateException("The 'basename' property cannot be
null"); // FIXME - i18n
+ }
+ FacesContext context = FacesContext.getCurrentInstance();
+ Locale locale = context.getViewRoot().getLocale();
+
+ // Look up the requested resource bundle
+ final ResourceBundle bundle =
+ ResourceBundle.getBundle(basename, locale,
+
Thread.currentThread().getContextClassLoader());
+ if (bundle == null) {
+ throw new IllegalArgumentException
+ ("No resource bundle found for base name '" + basename + "' and
locale '" + locale + "'"); // FIXME - i18n
+ }
+
+ // Construct and return an immutable Map representing these contents
+ Map map = new Map() {
+
+ public void clear() {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean containsKey(Object key) {
+ boolean result = false;
+ if (key != null) {
+ result = bundle.getObject(key.toString()) != null;
+ }
+ return result;
+ }
+
+ public boolean containsValue(Object value) {
+ Enumeration keys = bundle.getKeys();
+ while (keys.hasMoreElements()) {
+ Object val =
bundle.getObject(keys.nextElement().toString());
+ if ((val != null) && val.equals(value)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ public Set entrySet() {
+ Map map = new HashMap();
+ Enumeration keys = bundle.getKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement().toString();
+ Object value = bundle.getObject(key);
+ map.put(key, value);
+ }
+ return map.entrySet();
+ }
+
+ public boolean equals(Object o) {
+ if ((o == null) || !(o instanceof Map)) {
+ return false;
+ }
+ return entrySet().equals(((Map) o).entrySet());
+ }
+
+ public Object get(Object key) {
+ if (key == null) {
+ return null;
+ }
+ try {
+ return bundle.getObject(key.toString());
+ } catch (MissingResourceException e) {
+ return "???" + key.toString() + "???";
+ }
+ }
+
+ public int hashCode() {
+ return bundle.hashCode();
+ }
+
+ public boolean isEmpty() {
+ Enumeration keys = bundle.getKeys();
+ while (keys.hasMoreElements()) {
+ return false;
+ }
+ return true;
+ }
+
+ public Set keySet() {
+ Set set = new HashSet();
+ Enumeration keys = bundle.getKeys();
+ while (keys.hasMoreElements()) {
+ set.add(keys.nextElement());
+ }
+ return set;
+ }
+
+ public Object put(Object key, Object value) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void putAll(Map map) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object remove(Object key) {
+ throw new UnsupportedOperationException();
+ }
+
+ public int size() {
+ int size = 0;
+ Enumeration keys = bundle.getKeys();
+ while (keys.hasMoreElements()) {
+ Object key = keys.nextElement();
+ size++;
+ }
+ return size;
+ }
+
+ public Collection values() {
+ List list = new ArrayList();
+ Enumeration keys = bundle.getKeys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement().toString();
+ list.add(bundle.getObject(key));
+ }
+ return list;
+ }
+
+ };
+ return map;
+
+ }
+
+
+}
Added:
struts/shale/trunk/core-library/src/test/org/apache/shale/util/LoadBundleTestCase.java
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/test/org/apache/shale/util/LoadBundleTestCase.java?rev=289689&view=auto
==============================================================================
---
struts/shale/trunk/core-library/src/test/org/apache/shale/util/LoadBundleTestCase.java
(added)
+++
struts/shale/trunk/core-library/src/test/org/apache/shale/util/LoadBundleTestCase.java
Fri Sep 16 19:42:29 2005
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shale.util;
+
+import java.util.Locale;
+import java.util.Map;
+import javax.faces.context.FacesContext;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.shale.test.base.AbstractJsfTestCase;
+
+/**
+ *
+ * @author craigmcc
+ */
+public class LoadBundleTestCase extends AbstractJsfTestCase {
+
+
+ // ------------------------------------------------------------
Constructors
+
+
+ // Construct a new instance of this test case.
+ public LoadBundleTestCase(String name) {
+ super(name);
+ }
+
+
+ // ---------------------------------------------------- Overall Test
Methods
+
+
+ // Set up instance variables required by this test case.
+ public void setUp() {
+
+ super.setUp();
+
+ // Set up the instance we will be testing
+ lb = new LoadBundle("org.apache.shale.util.TestBundle");
+
+ }
+
+
+ // Return the tests included in this test case.
+ public static Test suite() {
+
+ return (new TestSuite(LoadBundleTestCase.class));
+
+ }
+
+
+ // Tear down instance variables required by this test case.
+ public void tearDown() {
+
+ lb = null;
+ super.tearDown();
+
+ }
+
+
+ // ------------------------------------------------------ Instance
Variables
+
+
+ // The instance to be tested
+ LoadBundle lb = null;
+
+
+ // ------------------------------------------------------------ Test
Methods
+
+
+ // Test access to the English values for this resource bundle
+ public void testEngish() {
+
+ FacesContext.getCurrentInstance().getViewRoot().setLocale(new
Locale("en", "US"));
+ Map map = lb.getMap();
+ assertNotNull(map);
+ assertEquals("English Key 1", map.get("key1"));
+ assertEquals("English Key 2", map.get("key2"));
+
+ }
+
+
+ // Test access to the French values for this resource bundle
+ public void testFrench() {
+
+ FacesContext.getCurrentInstance().getViewRoot().setLocale(new
Locale("fr", "FR"));
+ Map map = lb.getMap();
+ assertNotNull(map);
+ assertEquals("French Key 1", map.get("key1"));
+ assertEquals("French Key 2", map.get("key2"));
+
+ }
+
+
+ // Test a pristine instance
+ public void testPristine() {
+
+ assertEquals("org.apache.shale.util.TestBundle", lb.getBasename());
+
+ }
+
+
+}
Added:
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_en_US.properties
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_en_US.properties?rev=289689&view=auto
==============================================================================
---
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_en_US.properties
(added)
+++
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_en_US.properties
Fri Sep 16 19:42:29 2005
@@ -0,0 +1,4 @@
+# TestBundle (English)
+key1=English Key 1
+key2=English Key 2
+
Added:
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_fr_FR.properties
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_fr_FR.properties?rev=289689&view=auto
==============================================================================
---
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_fr_FR.properties
(added)
+++
struts/shale/trunk/core-library/src/test/org/apache/shale/util/TestBundle_fr_FR.properties
Fri Sep 16 19:42:29 2005
@@ -0,0 +1,3 @@
+# TestBundle (French)
+key1=French Key 1
+key2=French Key 2
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]