Author: lukaszlenart Date: Tue Jan 22 14:28:15 2013 New Revision: 1436951 URL: http://svn.apache.org/viewvc?rev=1436951&view=rev Log: WW-3845 adds usage of putIfAbsent to improve atomicity
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/UIBean.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/UIBean.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/UIBean.java?rev=1436951&r1=1436950&r2=1436951&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/UIBean.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/UIBean.java Tue Jan 22 14:28:15 2013 @@ -49,6 +49,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** * UIBean is the standard superclass of all Struts UI components. @@ -502,7 +503,7 @@ public abstract class UIBean extends Com protected TemplateEngineManager templateEngineManager; // dynamic attributes support for tags used with FreeMarker templates - protected static Map<Class, Set<String>> standardAttributesMap = new ConcurrentHashMap<Class, Set<String>>(); + protected static ConcurrentMap<Class, Set<String>> standardAttributesMap = new ConcurrentHashMap<Class, Set<String>>(); @Inject(StrutsConstants.STRUTS_UI_TEMPLATEDIR) public void setDefaultTemplateDir(String dir) { @@ -1256,7 +1257,7 @@ public abstract class UIBean extends Com clz = clz.getSuperclass(); } } - standardAttributesMap.put(clz, standardAttributes); + standardAttributesMap.putIfAbsent(clz, standardAttributes); } return standardAttributes; } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java?rev=1436951&r1=1436950&r2=1436951&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java Tue Jan 22 14:28:15 2013 @@ -22,7 +22,12 @@ import com.opensymphony.xwork2.util.Comp import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; import com.opensymphony.xwork2.util.reflection.ReflectionException; -import ognl.*; +import ognl.Ognl; +import ognl.OgnlContext; +import ognl.OgnlException; +import ognl.OgnlRuntime; +import ognl.SimpleNode; +import ognl.TypeConverter; import java.beans.BeanInfo; import java.beans.IntrospectionException; @@ -33,6 +38,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** @@ -44,8 +50,8 @@ import java.util.concurrent.ConcurrentHa public class OgnlUtil { private static final Logger LOG = LoggerFactory.getLogger(OgnlUtil.class); - private ConcurrentHashMap<String, Object> expressions = new ConcurrentHashMap<String, Object>(); - private final ConcurrentHashMap<Class, BeanInfo> beanInfoCache = new ConcurrentHashMap<Class, BeanInfo>(); + private ConcurrentMap<String, Object> expressions = new ConcurrentHashMap<String, Object>(); + private final ConcurrentMap<Class, BeanInfo> beanInfoCache = new ConcurrentHashMap<Class, BeanInfo>(); private TypeConverter defaultConverter; static boolean devMode = false; @@ -240,7 +246,7 @@ public class OgnlUtil { Object o = expressions.get(expression); if (o == null) { o = Ognl.parseExpression(expression); - expressions.put(expression, o); + expressions.putIfAbsent(expression, o); } return o; } else @@ -416,7 +422,7 @@ public class OgnlUtil { beanInfo = beanInfoCache.get(clazz); if (beanInfo == null) { beanInfo = Introspector.getBeanInfo(clazz, Object.class); - beanInfoCache.put(clazz, beanInfo); + beanInfoCache.putIfAbsent(clazz, beanInfo); } return beanInfo; } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java?rev=1436951&r1=1436950&r2=1436951&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/LocalizedTextUtil.java Tue Jan 22 14:28:15 2013 @@ -251,7 +251,7 @@ public class LocalizedTextUtil { try { if (!bundlesMap.containsKey(key)) { bundle = ResourceBundle.getBundle(aBundleName, locale, Thread.currentThread().getContextClassLoader()); - bundlesMap.put(key, bundle); + bundlesMap.putIfAbsent(key, bundle); } bundle = bundlesMap.get(key); @@ -260,18 +260,18 @@ public class LocalizedTextUtil { try { if (!bundlesMap.containsKey(key)) { bundle = ResourceBundle.getBundle(aBundleName, locale, delegatedClassLoader); - bundlesMap.put(key, bundle); + bundlesMap.putIfAbsent(key, bundle); } bundle = bundlesMap.get(key); } catch (MissingResourceException e) { bundle = EMPTY_BUNDLE; - bundlesMap.put(key, bundle); + bundlesMap.putIfAbsent(key, bundle); } } else { bundle = EMPTY_BUNDLE; - bundlesMap.put(key, bundle); + bundlesMap.putIfAbsent(key, bundle); } } return (bundle == EMPTY_BUNDLE) ? null : bundle;