Author: lukaszlenart
Date: Thu May 23 05:34:19 2013
New Revision: 1485576

URL: http://svn.apache.org/r1485576
Log:
WW-3689 Adds synchronized block with global lock to avoid NPE

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/Settings.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java?rev=1485576&r1=1485575&r2=1485576&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java
 Thu May 23 05:34:19 2013
@@ -21,22 +21,21 @@
 
 package org.apache.struts2.config;
 
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.StringTokenizer;
-
 import com.opensymphony.xwork2.config.Configuration;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.config.ConfigurationProvider;
 import com.opensymphony.xwork2.inject.ContainerBuilder;
 import com.opensymphony.xwork2.inject.Context;
 import com.opensymphony.xwork2.inject.Factory;
-import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.location.LocatableProperties;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.StrutsConstants;
 
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.StringTokenizer;
+
 public class LegacyPropertiesConfigurationProvider implements 
ConfigurationProvider {
 
     /**
@@ -69,10 +68,10 @@ public class LegacyPropertiesConfigurati
         loadSettings(props, settings);
         
         // Set default locale by lazily resolving the locale property as 
needed into a Locale object
-        builder.factory(Locale.class, new Factory() {
+        builder.factory(Locale.class,  new Factory<Locale>() {
             private Locale locale;
 
-            public synchronized Object create(Context context) throws 
Exception {
+            public synchronized Locale create(Context context) throws 
Exception {
                 if (locale == null) {
                     String loc = 
context.getContainer().getInstance(String.class, StrutsConstants.STRUTS_LOCALE);
                     if (loc != null) {

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/Settings.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/Settings.java?rev=1485576&r1=1485575&r2=1485576&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/Settings.java 
(original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/Settings.java 
Thu May 23 05:34:19 2013
@@ -21,16 +21,14 @@
 
 package org.apache.struts2.config;
 
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.StringTokenizer;
-
-import org.apache.struts2.StrutsConstants;
-
 import com.opensymphony.xwork2.ObjectFactory;
 import com.opensymphony.xwork2.util.location.Location;
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import org.apache.struts2.StrutsConstants;
+
+import java.util.Iterator;
+import java.util.Locale;
 
 
 /**
@@ -75,6 +73,11 @@ class Settings {
     static Settings defaultImpl;
 
     /**
+     * Guard used to protect the defaultImpl initialisation.
+     */
+    private static final Object DEFAULT_LOCK = new Object();
+
+    /**
      * An instance of the default locale as specified by the 
<code>struts.locale</code>  setting.
      *
      * @see #getLocale
@@ -267,23 +270,27 @@ class Settings {
      */
     private static Settings getDefaultInstance() {
         if (defaultImpl == null) {
-            // Create bootstrap implementation
-            defaultImpl = new DefaultSettings();
+            synchronized (DEFAULT_LOCK) {
+                if (defaultImpl == null) {
+                    // Create bootstrap implementation
+                    defaultImpl = new DefaultSettings();
 
-            // Create default implementation
-            try {
-                String className = get(StrutsConstants.STRUTS_CONFIGURATION);
-
-                if (!className.equals(defaultImpl.getClass().getName())) {
+                    // Create default implementation
                     try {
-                        // singleton instances shouldn't be built accessing 
request or session-specific context data
-                        defaultImpl = (Settings) 
ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className),
 null);
-                    } catch (Exception e) {
-                        LOG.error("Settings: Could not instantiate the 
struts.configuration object, substituting the default implementation.", e);
+                        String className = 
get(StrutsConstants.STRUTS_CONFIGURATION);
+
+                        if 
(!className.equals(defaultImpl.getClass().getName())) {
+                            try {
+                                // singleton instances shouldn't be built 
accessing request or session-specific context data
+                                defaultImpl = (Settings) 
ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className),
 null);
+                            } catch (Exception e) {
+                                LOG.error("Settings: Could not instantiate the 
struts.configuration object, substituting the default implementation.", e);
+                            }
+                        }
+                    } catch (IllegalArgumentException ex) {
+                        // ignore
                     }
                 }
-            } catch (IllegalArgumentException ex) {
-                // ignore
             }
         }
 
@@ -294,7 +301,10 @@ class Settings {
      * Resets the default and any plugin Setting instance to null.
      */
     public static void reset() {
-        defaultImpl = null;
+        synchronized (DEFAULT_LOCK) {
+            defaultImpl = null;
+        }
         settingsImpl = null;
     }
+
 }


Reply via email to