You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by bo...@apache.org on 2008/06/30 20:38:25 UTC
svn commit: r672861 -
/myfaces/tobago/branches/tobago-1.0.x/core/src/main/java/org/apache/myfaces/tobago/context/ResourceManagerImpl.java
Author: bommel
Date: Mon Jun 30 11:38:24 2008
New Revision: 672861
URL: http://svn.apache.org/viewvc?rev=672861&view=rev
Log:
(TOBAGO-685) Caches in ResourceManagerImpl should be Thread save
Modified:
myfaces/tobago/branches/tobago-1.0.x/core/src/main/java/org/apache/myfaces/tobago/context/ResourceManagerImpl.java
Modified: myfaces/tobago/branches/tobago-1.0.x/core/src/main/java/org/apache/myfaces/tobago/context/ResourceManagerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/tobago/branches/tobago-1.0.x/core/src/main/java/org/apache/myfaces/tobago/context/ResourceManagerImpl.java?rev=672861&r1=672860&r2=672861&view=diff
==============================================================================
--- myfaces/tobago/branches/tobago-1.0.x/core/src/main/java/org/apache/myfaces/tobago/context/ResourceManagerImpl.java (original)
+++ myfaces/tobago/branches/tobago-1.0.x/core/src/main/java/org/apache/myfaces/tobago/context/ResourceManagerImpl.java Mon Jun 30 11:38:24 2008
@@ -21,6 +21,7 @@
import org.apache.commons.logging.LogFactory;
import static org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_OUT;
import org.apache.myfaces.tobago.config.TobagoConfig;
+import org.apache.myfaces.tobago.renderkit.RendererBase;
import javax.faces.component.UIViewRoot;
import javax.faces.render.Renderer;
@@ -29,8 +30,8 @@
import java.util.List;
import java.util.Locale;
import java.util.StringTokenizer;
-
-// FIXME: is this class thread-safe?
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
public class ResourceManagerImpl implements ResourceManager {
@@ -38,14 +39,17 @@
private static final String PROPERTY = "property";
private static final String JSP = "jsp";
private static final String TAG = "tag";
+ private static final Renderer NULL_CACHE_RENDERER = new RendererBase();
private final HashMap<String, String> resourceList;
- private final HashMap<RendererCacheKey, Renderer> rendererCache = new HashMap<RendererCacheKey, Renderer>();
- private final HashMap<ImageCacheKey, String> imageCache = new HashMap<ImageCacheKey, String>();
- private final HashMap<JspCacheKey, String> jspCache = new HashMap<JspCacheKey, String>();
- private final HashMap<MiscCacheKey, String[]> miscCache = new HashMap<MiscCacheKey, String[]>();
- private final HashMap<PropertyCacheKey, String> propertyCache = new HashMap<PropertyCacheKey, String>();
+ private final Map<RendererCacheKey, Renderer> rendererCache =
+ new ConcurrentHashMap<RendererCacheKey, Renderer>(100, 0.75f, 1);
+ private final Map<ImageCacheKey, String> imageCache = new ConcurrentHashMap<ImageCacheKey, String>(100, 0.75f, 1);
+ private final Map<JspCacheKey, String> jspCache = new ConcurrentHashMap<JspCacheKey, String>(100, 0.75f, 1);
+ private final Map<MiscCacheKey, String[]> miscCache = new ConcurrentHashMap<MiscCacheKey, String[]>(100, 0.75f, 1);
+ private final Map<PropertyCacheKey, CachedString> propertyCache =
+ new ConcurrentHashMap<PropertyCacheKey, CachedString>(100, 0.75f, 1);
private TobagoConfig tobagoConfig;
@@ -88,27 +92,29 @@
result = imageCache.get(imageKey);
if (result == null) {
- // TODO: cache null values
try {
List paths = getPaths(key.getClientPropertyId(), key.getLocale(), "", null, name.substring(0, dot),
name.substring(dot), false, true, true, null, true, ignoreMissing);
if (paths != null) {
result = (String) paths.get(0);
+ } else {
+ result = "";
+ }
+ synchronized (imageCache) {
+ imageCache.put(imageKey, result);
}
- // TODO: cache null values
- imageCache.put(imageKey, result);
} catch (Exception e) {
LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
}
}
}
- if (result == null) {
+ if (result == null || result.length() == 0) {
if (LOG.isDebugEnabled()) {
LOG.debug("Can't find image for \"" + name + "\"");
}
+ return null;
}
-
return result;
}
@@ -132,15 +138,19 @@
JspCacheKey jspKey = new JspCacheKey(key, name);
result = jspCache.get(jspKey);
- if (result != null) {
- return result;
+ if (result == null) {
+ try {
+ result = (String) getPaths(key.getClientPropertyId(), key.getLocale(), "",
+ JSP, name, "", false, true, true, null, true, false).get(0);
+ synchronized(jspCache) {
+ jspCache.put(jspKey, result);
+ }
+ } catch (Exception e) {
+ LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
+ }
}
- try {
- result = (String) getPaths(key.getClientPropertyId(), key.getLocale(), "",
- JSP, name, "", false, true, true, null, true, false).get(0);
- jspCache.put(jspKey, result);
- } catch (Exception e) {
- LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
+ if (result != null && result.length() == 0) {
+ return null;
}
}
return result;
@@ -148,25 +158,26 @@
public String getProperty(
UIViewRoot viewRoot, String bundle, String propertyKey) {
- String result = null;
if (bundle != null && propertyKey != null) {
CacheKey key = getCacheKey(viewRoot);
PropertyCacheKey propertyCacheKey = new PropertyCacheKey(key, bundle, propertyKey);
- result = propertyCache.get(propertyCacheKey);
- if (result != null) {
- return result;
- }
- List properties = getPaths(key.getClientPropertyId(), key.getLocale(), "", PROPERTY, bundle,
- "", false, true, false, propertyKey, true, false);
- if (properties != null) {
- result = (String) properties.get(0);
- } else {
- result = null;
+ CachedString result = propertyCache.get(propertyCacheKey);
+ if (result == null) {
+ List properties = getPaths(key.getClientPropertyId(), key.getLocale(), "", PROPERTY, bundle,
+ "", false, true, false, propertyKey, true, false);
+ if (properties != null) {
+ result = new CachedString((String) properties.get(0));
+ } else {
+ result = new CachedString(null);
+ }
+ synchronized (propertyCache) {
+ propertyCache.put(propertyCacheKey, result);
+ }
}
- propertyCache.put(propertyCacheKey, result);
+ return result.getValue();
}
- return result;
+ return null;
}
private List getPaths(String clientProperties, Locale locale, String prefix,
@@ -333,24 +344,29 @@
RendererCacheKey rendererKey = new RendererCacheKey(key, name);
renderer = rendererCache.get(rendererKey);
- if (renderer != null) {
- return renderer;
- }
- try {
- name = getRendererClassName(name);
- List<Class> classes = getPaths(key.getClientPropertyId(), key.getLocale(), "", TAG, name, "",
- false, true, true, null, false, false);
- if (classes != null && !classes.isEmpty()) {
- Class clazz = classes.get(0);
- renderer = (Renderer) clazz.newInstance();
- rendererCache.put(rendererKey, renderer);
- } else {
- LOG.error("Don't find any RendererClass for " + name + ". Please check you configuration.");
+ if (renderer == null) {
+ try {
+ name = getRendererClassName(name);
+ List<Class> classes = getPaths(key.getClientPropertyId(), key.getLocale(), "", TAG, name, "",
+ false, true, true, null, false, false);
+ if (classes != null && !classes.isEmpty()) {
+ Class clazz = classes.get(0);
+ renderer = (Renderer) clazz.newInstance();
+ } else {
+ renderer = NULL_CACHE_RENDERER;
+ LOG.error("Don't find any RendererClass for " + name + ". Please check you configuration.");
+ }
+ synchronized (rendererCache) {
+ rendererCache.put(rendererKey, renderer);
+ }
+ } catch (InstantiationException e) {
+ LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
+ } catch (IllegalAccessException e) {
+ LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
+ }
+ if (renderer == NULL_CACHE_RENDERER) {
+ return null;
}
- } catch (InstantiationException e) {
- LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
- } catch (IllegalAccessException e) {
- LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
}
}
return renderer;
@@ -394,16 +410,17 @@
CacheKey key = getCacheKey(viewRoot);
MiscCacheKey miscKey = new MiscCacheKey(key, name);
result = miscCache.get(miscKey);
- if (result != null) {
- return result;
- }
- try {
- List matches = getPaths(key.getClientPropertyId(), key.getLocale(), "", type,
- name.substring(0, dot), name.substring(dot), true, false, true, null, true, false);
- result = (String[]) matches.toArray(new String[matches.size()]);
- miscCache.put(miscKey, result);
- } catch (Exception e) {
- LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
+ if (result == null) {
+ try {
+ List matches = getPaths(key.getClientPropertyId(), key.getLocale(), "", type,
+ name.substring(0, dot), name.substring(dot), true, false, true, null, true, false);
+ result = (String[]) matches.toArray(new String[matches.size()]);
+ synchronized (miscCache) {
+ miscCache.put(miscKey, result);
+ }
+ } catch (Exception e) {
+ LOG.error("name = '" + name + "' clientProperties = '" + key.getClientPropertyId() + "'", e);
+ }
}
}
return result;
@@ -411,25 +428,26 @@
public String getThemeProperty(UIViewRoot viewRoot,
String bundle, String propertyKey) {
- String result = null;
if (bundle != null && propertyKey != null) {
CacheKey key = getCacheKey(viewRoot);
PropertyCacheKey propertyCacheKey = new PropertyCacheKey(key, bundle, propertyKey);
- result = propertyCache.get(propertyCacheKey);
- if (result != null) {
- return result;
- }
- List properties = getPaths(key.getClientPropertyId(), key.getLocale(), "", PROPERTY,
- bundle, "", false, true, false, propertyKey, true, true);
- if (properties != null) {
- result = (String) properties.get(0);
- } else {
- result = null;
+ CachedString result = propertyCache.get(propertyCacheKey);
+ if (result == null) {
+ List properties = getPaths(key.getClientPropertyId(), key.getLocale(), "", PROPERTY,
+ bundle, "", false, true, false, propertyKey, true, true);
+ if (properties != null) {
+ result = new CachedString((String) properties.get(0));
+ } else {
+ result = new CachedString(null);
+ }
+ synchronized (propertyCache) {
+ propertyCache.put(propertyCacheKey, result);
+ }
}
- propertyCache.put(propertyCacheKey, result);
+ return result.getValue();
}
- return result;
+ return null;
}
public static CacheKey getRendererCacheKey(String clientPropertyId, Locale locale) {
@@ -673,5 +691,38 @@
return hashCode;
}
}
+
+ public static final class CachedString {
+ private String value;
+
+ public CachedString(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ CachedString that = (CachedString) o;
+
+ if (value != null ? !value.equals(that.value) : that.value != null) {
+ return false;
+ }
+
+ return true;
+ }
+
+ public int hashCode() {
+ return (value != null ? value.hashCode() : 0);
+ }
+ }
}