You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2008/11/02 01:05:57 UTC
svn commit: r709803 -
/myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/UIComponent.java
Author: lu4242
Date: Sat Nov 1 17:05:56 2008
New Revision: 709803
URL: http://svn.apache.org/viewvc?rev=709803&view=rev
Log:
MYFACES-1988 Implement JSF 2.0 logic at TODO #47
Modified:
myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/UIComponent.java
Modified: myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/UIComponent.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/UIComponent.java?rev=709803&r1=709802&r2=709803&view=diff
==============================================================================
--- myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/UIComponent.java (original)
+++ myfaces/core/branches/2_0_0/api/src/main/java/javax/faces/component/UIComponent.java Sat Nov 1 17:05:56 2008
@@ -30,6 +30,7 @@
import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;
+import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.Set;
@@ -71,6 +72,16 @@
private Map<Class<? extends SystemEvent>, List<SystemEventListener>> _systemEventListenerClassMap;
protected Map<String, ValueExpression> bindings;
+
+ /**
+ * Used to cache the map created using getResourceBundleMap() method,
+ * since this method could be called several times when rendering the
+ * composite component. This attribute may not be serialized,
+ * so transient is used (There are some very few special cases when
+ * UIComponent instances are serializable like t:schedule, so it
+ * is better if transient is used).
+ */
+ private transient Map<String,String> _resourceBundleMap = null;
public UIComponent()
{
@@ -288,38 +299,62 @@
public Map<String, String> getResourceBundleMap()
{
- Map<String, String> resourceMap;
-
- FacesContext context = getFacesContext();
- Locale locale = context.getViewRoot().getLocale();
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
-
- try
- {
- // looks for a ResourceBundle with a base name equal to the fully qualified class
- // name of the current UIComponent this and Locale equal to the Locale of the current UIViewRoot.
- resourceMap = new BundleMap(ResourceBundle.getBundle(getClass().getName(), locale, loader));
- }
- catch (MissingResourceException e)
- {
- /*
- * If no such bundle is found, and the component is a composite component, let resourceName be the
- * resourceName of the Resource for this composite component, replacing the file extension with
- * ".properties". Let libraryName be the libraryName of the the Resource for this composite component. Call
- * ResourceHandler.createResource(java.lang.String,java.lang.String), passing the derived resourceName and
- * libraryName. Note that this will automatically allow for the localization of the ResourceBundle due to
- * the localization facility implemented in createResource, which is specified in section 2.6.1.3 of the
- * spec prose document. If the resultant Resource exists and can be found, the InputStream for the resource
- * is used to create a ResourceBundle. If either of the two previous steps for obtaining the ResourceBundle
- * for this component is successful, the ResourceBundle is wrapped in a Map<String, String> and returned.
- */
-
- // TODO: JSF 2.0 #44
- // Otherwise Collections.EMPTY_MAP is returned.
- resourceMap = Collections.emptyMap();
+ if (_resourceBundleMap == null)
+ {
+ FacesContext context = getFacesContext();
+ Locale locale = context.getViewRoot().getLocale();
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
+ try
+ {
+ // looks for a ResourceBundle with a base name equal to the fully qualified class
+ // name of the current UIComponent this and Locale equal to the Locale of the current UIViewRoot.
+ _resourceBundleMap = new BundleMap(ResourceBundle.getBundle(getClass().getName(), locale, loader));
+ }
+ catch (MissingResourceException e)
+ {
+ //If no such bundle is found, and the component is a composite component
+ if (this._isCompositeComponent())
+ {
+ //No need to check componentResource (the resource used to build the composite
+ //component instance) to null since it is already done on this._isCompositeComponent()
+ Resource componentResource = (Resource) getAttributes().get(Resource.COMPONENT_RESOURCE_KEY);
+ // Let resourceName be the resourceName of the Resource for this composite component,
+ // replacing the file extension with ".properties"
+ int extensionIndex = componentResource.getResourceName().lastIndexOf('.');
+ String resourceName = (extensionIndex < 0 ? componentResource.getResourceName()
+ : componentResource.getResourceName().substring(0,extensionIndex) )+ ".properties" ;
+
+ // Let libraryName be the libraryName of the the Resource for this composite component.
+ // Call ResourceHandler.createResource(java.lang.String,java.lang.String), passing the derived resourceName and
+ // libraryName.
+ Resource bundleResource = context.getApplication().getResourceHandler().createResource(resourceName,
+ componentResource.getLibraryName());
+
+ if (bundleResource != null)
+ {
+ // If the resultant Resource exists and can be found, the InputStream for the resource
+ // is used to create a ResourceBundle. If either of the two previous steps for obtaining the ResourceBundle
+ // for this component is successful, the ResourceBundle is wrapped in a Map<String, String> and returned.
+ try
+ {
+ _resourceBundleMap = new BundleMap(new PropertyResourceBundle(bundleResource.getInputStream()));
+ }
+ catch (IOException e1)
+ {
+ //Nothing happens, then resourceBundleMap is set as empty map
+ }
+ }
+ }
+ // Otherwise Collections.EMPTY_MAP is returned.
+ if (_resourceBundleMap == null)
+ {
+ _resourceBundleMap = Collections.emptyMap();
+ }
+ }
}
- return resourceMap;
+ return _resourceBundleMap;
}
public abstract List<UIComponent> getChildren();