You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2013/10/22 15:42:52 UTC

svn commit: r1534634 - in /struts/struts2/trunk: archetypes/struts2-archetype-starter/src/main/resources/archetype-resources/src/main/resources/ core/src/main/java/org/apache/struts2/config/ core/src/main/java/org/apache/struts2/dispatcher/ core/src/te...

Author: lukaszlenart
Date: Tue Oct 22 13:42:51 2013
New Revision: 1534634

URL: http://svn.apache.org/r1534634
Log:
WW-4152 Solves problem with NPE as a side effect of concurrency issue, removes old code, use simpler dependency graph

Added:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesConfigurationProvider.java
      - copied, changed from r1534132, struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java
      - copied, changed from r1534132, struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/LegacyPropertiesConfigurationProviderTest.java
Removed:
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/LegacyPropertiesConfigurationProviderTest.java
Modified:
    struts/struts2/trunk/archetypes/struts2-archetype-starter/src/main/resources/archetype-resources/src/main/resources/struts.properties
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultPropertiesProvider.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultSettings.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DelegatingSettings.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesSettings.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/Settings.java
    struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/SettingsTest.java
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/TestSettings.java
    struts/struts2/trunk/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java
    struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocatableProperties.java
    struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocationImpl.java

Modified: struts/struts2/trunk/archetypes/struts2-archetype-starter/src/main/resources/archetype-resources/src/main/resources/struts.properties
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/archetypes/struts2-archetype-starter/src/main/resources/archetype-resources/src/main/resources/struts.properties?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/archetypes/struts2-archetype-starter/src/main/resources/archetype-resources/src/main/resources/struts.properties (original)
+++ struts/struts2/trunk/archetypes/struts2-archetype-starter/src/main/resources/archetype-resources/src/main/resources/struts.properties Tue Oct 22 13:42:51 2013
@@ -4,11 +4,6 @@
 ###(can be overridden by a struts.properties file in the root of the classpath)
 ###
 
-### Specifies the Configuration used to configure Struts 2.0
-### one could extend org.apache.struts2.config.Configuration
-### to build one's customize way of getting the configurations parameters into Struts 2.0
-# struts.configuration=org.apache.struts2.config.DefaultConfiguration
-
 ### This can be used to set your default locale and encoding scheme
 # struts.locale=en_US
 struts.i18n.encoding=UTF-8

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultPropertiesProvider.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultPropertiesProvider.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultPropertiesProvider.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultPropertiesProvider.java Tue Oct 22 13:42:51 2013
@@ -29,7 +29,7 @@ import com.opensymphony.xwork2.util.loca
 /**
  * Loads the default properties, separate from the usual struts.properties loading
  */
-public class DefaultPropertiesProvider extends LegacyPropertiesConfigurationProvider {
+public class DefaultPropertiesProvider extends PropertiesConfigurationProvider {
 
     public void destroy() {
     }
@@ -37,17 +37,13 @@ public class DefaultPropertiesProvider e
     public void init(Configuration configuration) throws ConfigurationException {
     }
 
-    public void register(ContainerBuilder builder, LocatableProperties props)
-            throws ConfigurationException {
-        
-        Settings defaultSettings = null;
+    public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException {
         try {
-            defaultSettings = new PropertiesSettings("org/apache/struts2/default");
+            PropertiesSettings defaultSettings = new PropertiesSettings("org/apache/struts2/default");
+            loadSettings(props, defaultSettings);
         } catch (Exception e) {
             throw new ConfigurationException("Could not find or error in org/apache/struts2/default.properties", e);
         }
-        
-        loadSettings(props, defaultSettings);
     }
 
 }

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultSettings.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultSettings.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultSettings.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DefaultSettings.java Tue Oct 22 13:42:51 2013
@@ -21,15 +21,16 @@
 
 package org.apache.struts2.config;
 
+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 org.apache.struts2.security.DefaultSecurityGate;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.StringTokenizer;
 
-import org.apache.struts2.StrutsConstants;
-
-import com.opensymphony.xwork2.util.logging.Logger;
-import com.opensymphony.xwork2.util.logging.LoggerFactory;
-
 
 
 /**
@@ -38,17 +39,14 @@ import com.opensymphony.xwork2.util.logg
  * This class creates and delegates to other settings by using an internal
  * {@link DelegatingSettings} object.
  */
-public class DefaultSettings extends Settings {
+public class DefaultSettings implements Settings {
 
-    /**
-     * The logging instance for this class.
-     */
-    protected Logger log = LoggerFactory.getLogger(this.getClass());
+    private static final Logger LOG = LoggerFactory.getLogger(DefaultSecurityGate.class);
 
     /**
      * The Settings object that handles API calls.
      */
-    Settings delegate;
+    private Settings delegate;
 
     /**
      * Constructs an instance by loading the standard property files, 
@@ -67,53 +65,39 @@ public class DefaultSettings extends Set
         try {
             list.add(new PropertiesSettings("struts"));
         } catch (Exception e) {
-            log.warn("DefaultSettings: Could not find or error in struts.properties", e);
+            LOG.warn("DefaultSettings: Could not find or error in struts.properties", e);
         }
 
-        Settings[] settings = new Settings[list.size()];
-        delegate = new DelegatingSettings(list.toArray(settings));
+        delegate = new DelegatingSettings(list);
 
         // struts.custom.properties
-        try {
-            StringTokenizer customProperties = new StringTokenizer(delegate.getImpl(StrutsConstants.STRUTS_CUSTOM_PROPERTIES), ",");
+        String files = delegate.get(StrutsConstants.STRUTS_CUSTOM_PROPERTIES);
+        if (files != null) {
+            StringTokenizer customProperties = new StringTokenizer(files, ",");
 
             while (customProperties.hasMoreTokens()) {
                 String name = customProperties.nextToken();
-
                 try {
                     list.add(new PropertiesSettings(name));
                 } catch (Exception e) {
-                    log.error("DefaultSettings: Could not find " + name + ".properties. Skipping.");
+                    LOG.error("DefaultSettings: Could not find " + name + ".properties. Skipping.");
                 }
             }
 
-            settings = new Settings[list.size()];
-            delegate = new DelegatingSettings(list.toArray(settings));
-        } catch (IllegalArgumentException e) {
-            // Assume it's OK, since IllegalArgumentException is thrown  
-            // when Settings is unable to find a certain setting,
-            // like the struts.custom.properties, which is commented out
+            delegate = new DelegatingSettings(list);
         }
-
     }
 
-    // See superclass for Javadoc
-    public void setImpl(String name, String value) throws IllegalArgumentException, UnsupportedOperationException {
-        delegate.setImpl(name, value);
+    public Location getLocation(String name) {
+        return delegate.getLocation(name);
     }
 
-    // See superclass for Javadoc
-    public String getImpl(String aName) throws IllegalArgumentException {
-        return delegate.getImpl(aName);
+    public String get(String aName) throws IllegalArgumentException {
+        return delegate.get(aName);
     }
 
-    // See superclass for Javadoc
-    public boolean isSetImpl(String aName) {
-        return delegate.isSetImpl(aName);
+    public Iterator list() {
+        return delegate.list();
     }
 
-    // See superclass for Javadoc
-    public Iterator listImpl() {
-        return delegate.listImpl();
-    }
 }

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DelegatingSettings.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DelegatingSettings.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DelegatingSettings.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/DelegatingSettings.java Tue Oct 22 13:42:51 2013
@@ -21,8 +21,11 @@
 
 package org.apache.struts2.config;
 
+import com.opensymphony.xwork2.util.location.Location;
+
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 
 
@@ -36,72 +39,34 @@ import java.util.Set;
  * withholding any exception until all delegates have been called.
  *
  */
-class DelegatingSettings extends Settings {
+class DelegatingSettings implements Settings {
 
     /**
      * The Settings objects.
      */
-    Settings[] delegates;
+    List<Settings> delegates;
 
     /**
      * Creates a new DelegatingSettings object utilizing the list of {@link Settings} objects.
      *
      * @param delegates The Settings objects to use as delegates
      */
-    public DelegatingSettings(Settings[] delegates) {
+    public DelegatingSettings(List<Settings> delegates) {
         this.delegates = delegates;
     }
 
-    // See superclass for Javadoc
-    public void setImpl(String name, String value) throws IllegalArgumentException, UnsupportedOperationException {
-        IllegalArgumentException e = null;
-
+    public String get(String name) throws IllegalArgumentException {
         for (Settings delegate : delegates) {
-            try {
-                delegate.getImpl(name); // Throws exception if not found
-                delegate.setImpl(name, value); // Found it
-                return; // Done
-            } catch (IllegalArgumentException ex) {
-                e = ex;
-
-                // Try next delegate
+            String value = delegate.get(name);
+            if (value != null) {
+                return value;
             }
         }
-
-        throw e;
+        return null;
     }
 
-    // See superclass for Javadoc
-    public String getImpl(String name) throws IllegalArgumentException {
-
-        IllegalArgumentException e = null;
 
-        for (Settings delegate : delegates) {
-            try {
-                return delegate.getImpl(name);  // Throws exception if not found
-            } catch (IllegalArgumentException ex) {
-                e = ex;
-
-                // Try next delegate
-            }
-        }
-
-        throw e;
-    }
-
-    // See superclass for Javadoc
-    public boolean isSetImpl(String aName) {
-        for (Settings delegate : delegates) {
-            if (delegate.isSetImpl(aName)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    // See superclass for Javadoc
-    public Iterator listImpl() {
+    public Iterator list() {
         boolean workedAtAll = false;
 
         Set<Object> settingList = new HashSet<Object>();
@@ -109,7 +74,7 @@ class DelegatingSettings extends Setting
 
         for (Settings delegate : delegates) {
             try {
-                Iterator list = delegate.listImpl();
+                Iterator list = delegate.list();
 
                 while (list.hasNext()) {
                     settingList.add(list.next());
@@ -129,4 +94,14 @@ class DelegatingSettings extends Setting
             return settingList.iterator();
         }
     }
+
+    public Location getLocation(String name) {
+        for (Settings delegate : delegates) {
+            Location loc = delegate.getLocation(name);
+            if (loc != null) {
+                return loc;
+            }
+        }
+        return Location.UNKNOWN;
+    }
 }

Copied: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesConfigurationProvider.java (from r1534132, 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/PropertiesConfigurationProvider.java?p2=struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesConfigurationProvider.java&p1=struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/LegacyPropertiesConfigurationProvider.java&r1=1534132&r2=1534634&rev=1534634&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/PropertiesConfigurationProvider.java Tue Oct 22 13:42:51 2013
@@ -25,78 +25,28 @@ import com.opensymphony.xwork2.config.Co
 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.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 {
-
-    /**
-     * The Logging instance for this class.
-     */
-    private static final Logger LOG = LoggerFactory.getLogger(LegacyPropertiesConfigurationProvider.class);
+public class PropertiesConfigurationProvider implements ConfigurationProvider {
 
     public void destroy() {
-        Settings.reset();
     }
 
-    public void init(Configuration configuration)
-        throws ConfigurationException {
-        Settings.reset();
+    public void init(Configuration configuration) throws ConfigurationException {
     }
-    
-    public void loadPackages()
-            throws ConfigurationException {
+
+    public void loadPackages() throws ConfigurationException {
     }
 
     public boolean needsReload() {
         return false;
     }
 
-    public void register(ContainerBuilder builder, LocatableProperties props)
-            throws ConfigurationException {
-        
-        final Settings settings = Settings.getInstance();
-        
+    public void register(ContainerBuilder builder, LocatableProperties props) throws ConfigurationException {
+        final DefaultSettings settings = new DefaultSettings();
         loadSettings(props, settings);
-        
-        // Set default locale by lazily resolving the locale property as needed into a Locale object
-        builder.factory(Locale.class,  new Factory<Locale>() {
-            private Locale locale;
-
-            public synchronized Locale create(Context context) throws Exception {
-                if (locale == null) {
-                    String loc = context.getContainer().getInstance(String.class, StrutsConstants.STRUTS_LOCALE);
-                    if (loc != null) {
-                        StringTokenizer localeTokens = new StringTokenizer(loc, "_");
-                        String lang = null;
-                        String country = null;
-
-                        if (localeTokens.hasMoreTokens()) {
-                            lang = localeTokens.nextToken();
-                        }
-
-                        if (localeTokens.hasMoreTokens()) {
-                            country = localeTokens.nextToken();
-                        }
-                        locale = new Locale(lang, country);
-                    } else {
-                        if (LOG.isInfoEnabled()) {
-                            LOG.info("No locale define, substituting the default VM locale");
-                        }
-                        locale = Locale.getDefault();
-                    }
-                }
-                return locale;
-            }
-        });
     }
 
     /**
@@ -104,10 +54,9 @@ public class LegacyPropertiesConfigurati
      * @param settings
      */
     protected void loadSettings(LocatableProperties props, final Settings settings) {
-        // We are calling the impl methods to get around the single instance of Settings that is expected
-        for (Iterator i = settings.listImpl(); i.hasNext(); ) {
+        for (Iterator i = settings.list(); i.hasNext(); ) {
             String name = (String) i.next();
-            props.setProperty(name, settings.getImpl(name), settings.getLocationImpl(name));
+            props.setProperty(name, settings.get(name), settings.getLocation(name));
         }
     }
 }

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesSettings.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesSettings.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesSettings.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/PropertiesSettings.java Tue Oct 22 13:42:51 2013
@@ -38,11 +38,11 @@ import java.util.Iterator;
 /**
  * A class to handle settings via a properties file.
  */
-class PropertiesSettings extends Settings {
+class PropertiesSettings implements Settings {
 
-    LocatableProperties settings;
-    static Logger LOG = LoggerFactory.getLogger(PropertiesSettings.class);
+    private static final Logger LOG = LoggerFactory.getLogger(PropertiesSettings.class);
 
+    private LocatableProperties settings;
 
     /**
      * Creates a new properties config given the name of a properties file. The name is expected to NOT have
@@ -87,27 +87,12 @@ class PropertiesSettings extends Setting
 
 
     /**
-     * Sets a property in the properties file.
-     *
-     * @see #set(String, String)
-     */
-    public void setImpl(String aName, String aValue) {
-        settings.setProperty(aName, aValue);
-    }
-
-    /**
      * Gets a property from the properties file.
      *
      * @see #get(String)
      */
-    public String getImpl(String aName) throws IllegalArgumentException {
-        String setting = settings.getProperty(aName);
-
-        if (setting == null) {
-            throw new IllegalArgumentException("No such setting:" + aName);
-        }
-
-        return setting;
+    public String get(String aName) throws IllegalArgumentException {
+        return settings.getProperty(aName);
     }
     
     /**
@@ -115,29 +100,8 @@ class PropertiesSettings extends Setting
      *
      * @see #getLocation(String)
      */
-    public Location getLocationImpl(String aName) throws IllegalArgumentException {
-        Location loc = settings.getPropertyLocation(aName);
-
-        if (loc == null) {
-            if (!settings.containsKey(aName)) {
-                throw new IllegalArgumentException("No such setting:" + aName);
-            } 
-        }
-
-        return loc;
-    }
-
-    /**
-     * Tests to see if a property exists in the properties file.
-     *
-     * @see #isSet(String)
-     */
-    public boolean isSetImpl(String aName) {
-        if (settings.get(aName) != null) {
-            return true;
-        } else {
-            return false;
-        }
+    public Location getLocation(String aName) throws IllegalArgumentException {
+        return settings.getPropertyLocation(aName);
     }
 
     /**
@@ -145,7 +109,8 @@ class PropertiesSettings extends Setting
      *
      * @see #list()
      */
-    public Iterator listImpl() {
+    public Iterator list() {
         return settings.keySet().iterator();
     }
+
 }

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=1534634&r1=1534633&r2=1534634&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 Tue Oct 22 13:42:51 2013
@@ -21,290 +21,36 @@
 
 package org.apache.struts2.config;
 
-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;
-
 
 /**
  * Settings retrieves and exposes default values used by the framework.
- * An application can override a factory default and provide its own value for a setting.
- * <p>
- * Implementation of the class is pluggable (the default implementation is {@link DefaultSettings}).
- * Pluggability gives applications to ability to customize how settings are retrieved.
- * As an example, an application may wish to check some custom property store
- * before delegating to the usual configuration and property files.
- * <p>
- * Key methods:
- * <ul>
- * <li>{@link #getLocale()}</li>
- * <li>{@link #get(String)}</li>
- * <li>{@link #set(String, String)}</li>
- * <li>{@link #list()}</li>
- * </ul>
- * <p>
- * Key methods for subclasses (plugins):
- * <ul>
- * <li>{@link #getImpl(String)}</li>
- * <li>{@link #setImpl(String, String)}</li>
- * <li>{@link #listImpl()}</li>
- * <li>{@link #isSetImpl(String)}</li>
- * </ul>
- * @deprecated Since Struts 2.1.2
  */
-class Settings {
-
-
-    /**
-     * A pluggable implementation of Settings,
-     * provided through the {@link #setInstance} method.
-     */
-    static Settings settingsImpl;
-
-    /**
-     * An instance of {@link DefaultSettings}
-     * to use when another implementation is not provided (plugged in).
-     */
-    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
-     */
-    static Locale locale;
-
-    /**
-     * The Logging instance for this class.
-     */
-    private static final Logger LOG = LoggerFactory.getLogger(Settings.class);
-
-    /**
-     * Registers a custom Settings implementation (plugin),
-     * and resets the cached locale.
-     * <p>
-     * This method can only be called once.
-     *
-     * @param config a Settings implementation
-     * @throws IllegalStateException if an error occurs when setting the settings implementation.
-     */
-    public static void setInstance(Settings config) throws IllegalStateException {
-        settingsImpl = config;
-        locale = null;
-    }
-
-    /**
-     * Provides the Settings object.
-     * <p>
-     * This method will substitute the default instance if another instance is not registered.
-     *
-     * @return the Settings object.
-     */
-    public static Settings getInstance() {
-        return (settingsImpl == null) ? getDefaultInstance() : settingsImpl;
-    }
-
-    /**
-     * Provides the Struts default locale.
-     * <p>
-     * This method utilizes the <code>struts.locale</code> setting, which should be given
-     * as the Java {@link java.util.Locale#toString() toString()} representation of a Locale object
-     * ("en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "fr_MAC", and so forth).
-     * <p>
-     * If a <code>struts.locale</code> setting is not registered,
-     * then the default virtual machine locale is substituted and cached.
-     *
-     * @return the Struts default locale if specified or the VM default locale.
-     * @see java.util.Locale#getDefault()
-     */
-    public static Locale getLocale() {
-        // Locale processing has been moved to the LegacyPropertiesConfigurationProvider
-
-        return locale;
-    }
-
-    /**
-     * Determines whether or not a setting has a registered value.
-     * <p>
-     * This method is useful for testing for the existance of setting without
-     * throwing an IllegalArgumentException.
-     *
-     * @param name the name of a setting to test.
-     * @return <code>true</code> if the setting exists and has a value, <code>false</code> otherwise.
-     */
-    public static boolean isSet(String name) {
-        return getInstance().isSetImpl(name);
-    }
+interface Settings {
 
     /**
-     * Provides a setting value as a String.
-     * <p>
-     * The method will throw an <code>IllegalArgumentException</code> if an error occurs
-     * while retrieveing the property or if the property doesn't exist.
+     * Retrieve value for provided name
      *
-     * @param name the name of the setting to retrieve.
-     * @return the setting value as a String.
-     * @throws IllegalArgumentException if an error occurs retrieving the property or the property does not exist.
+     * @param name The name of the setting value to retrieve
+     * @return The setting value as a String or null
      */
-    public static String get(String name) throws IllegalArgumentException {
-        return getInstance().getImpl(name);
-    }
+    String get(String name);
 
     /**
-     * Provides the Location of a setting.
-     * <p>
-     * The Location is utilized as part of precise error reporting.
-     * <p>
-      * This method will throw an <code>IllegalArgumentException</code> if an error occurs
-     * while retrieving the value or if the setting doesn't exist.
-     *
-     * @param name the name of the property to get.
-     * @return the Location of a property.
-     * @throws IllegalArgumentException if an error occurs retrieving the property or the property does not exist.
-     */
-    public static Location getLocation(String name) throws IllegalArgumentException {
-        return getInstance().getLocationImpl(name);
-    }
-
-    /**
-     * Provides an Iterator of all properties names.
-     *
-     * @return an Iterator of all properties names.
-     */
-    public static Iterator list() {
-        return getInstance().listImpl();
-    }
-
-    /**
-     * Implements the {@link #isSet(String)} method.
-     *
-     * @param name Identifier for the setting value to change
-     * @return True if the setting exists and has a value, false otherwise.
-     * @see #isSet(String)
-     */
-    public boolean isSetImpl(String name) {
-        // this is dumb.. maybe it should just throw an unsupported op like the rest of the *Impl
-        // methods in this class.
-        return false;
-    }
-
-    /**
-     * Registers a value for a setting.
-     * <p>
-     * This method raises an exception if an error occurs when setting the value or if the
-     * settings implementation does not support setting values.
-     *
-     * @param name  the name of the setting.
-     * @param value the value to register for the setting.
-     * @throws IllegalArgumentException      if an error occurs when setting the value.
-     * @throws UnsupportedOperationException if the config implementation does not support setting values.
-     */
-    public static void set(String name, String value) throws IllegalArgumentException, UnsupportedOperationException {
-        getInstance().setImpl(name, value);
-    }
-
-    /**
-     * Implements the {@link #set(String, String)} method.
-     *
-     * @param name Identifer for the setting to change.
-     * @param value The new value for the setting.
-     * @throws IllegalArgumentException      if an error occurs when setting the value.
-     * @throws UnsupportedOperationException if the config implementation does not support setting values.
-     * @see #set(String, String)
-     */
-    public void setImpl(String name, String value) throws IllegalArgumentException, UnsupportedOperationException {
-        throw new UnsupportedOperationException("Settings: This implementation does not support setting a value.");
-    }
-
-    /**
-     * Implements the {@link #get(String)} method.
-     *
-     * @param name The name of the setting value to retreive
-     * @return The setting value as a String
-     * @throws IllegalArgumentException if an error occurs when retrieving the value
-     * @see #get(String)
-     */
-    public String getImpl(String name) throws IllegalArgumentException {
-        return null;
-    }
-
-    /**
-     * Implements the {@link #getLocation(String)} method.
+     * Returns {@link com.opensymphony.xwork2.util.location.Location} of given setting
      *
      * @param name Name of the setting to locate
-     * @return The location  of the setting
-     * @throws IllegalArgumentException if an error occurs when retrieving the value
-     * @see #getLocation(String)
+     * @return The location  of the setting or null
      */
-    public Location getLocationImpl(String name) throws IllegalArgumentException {
-        return null;
-    }
+    Location getLocation(String name);
 
     /**
-     * Implements the {@link #list()} method.
+     * Returns {@link java.util.Iterator} with all values
      *
-     * @see #list()
      * @return A list of the settings as an iterator
      */
-    public Iterator listImpl() {
-        throw new UnsupportedOperationException("Settings: This implementation does not support listing the registered settings");
-    }
-
-    /**
-     * Creates a default Settings object.
-     * <p>
-     * A default implementation may be specified by the <code>struts.configuration</code> setting;
-     * otherwise, this method instantiates {@link DefaultSettings} as the default implementation.
-     *
-     * @return A default Settings object.
-     */
-    private static Settings getDefaultInstance() {
-        if (defaultImpl == null) {
-            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())) {
-                            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
-                    }
-                }
-            }
-        }
-
-        return defaultImpl;
-    }
-
-    /**
-     * Resets the default and any plugin Setting instance to null.
-     */
-    public static void reset() {
-        synchronized (DEFAULT_LOCK) {
-            defaultImpl = null;
-        }
-        settingsImpl = null;
-    }
+    Iterator list();
 
 }

Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java (original)
+++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java Tue Oct 22 13:42:51 2013
@@ -60,7 +60,7 @@ import org.apache.struts2.StrutsExceptio
 import org.apache.struts2.StrutsStatics;
 import org.apache.struts2.config.BeanSelectionProvider;
 import org.apache.struts2.config.DefaultPropertiesProvider;
-import org.apache.struts2.config.LegacyPropertiesConfigurationProvider;
+import org.apache.struts2.config.PropertiesConfigurationProvider;
 import org.apache.struts2.config.StrutsXmlConfigurationProvider;
 import org.apache.struts2.dispatcher.mapper.ActionMapping;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
@@ -374,7 +374,7 @@ public class Dispatcher {
     }
     
     private void init_LegacyStrutsProperties() {
-        configurationManager.addContainerProvider(new LegacyPropertiesConfigurationProvider());
+        configurationManager.addContainerProvider(new PropertiesConfigurationProvider());
     }
 
     private void init_TraditionalXmlConfigurations() {

Copied: struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java (from r1534132, struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/LegacyPropertiesConfigurationProviderTest.java)
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java?p2=struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java&p1=struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/LegacyPropertiesConfigurationProviderTest.java&r1=1534132&r2=1534634&rev=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/LegacyPropertiesConfigurationProviderTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/PropertiesConfigurationProviderTest.java Tue Oct 22 13:42:51 2013
@@ -21,24 +21,21 @@
 
 package org.apache.struts2.config;
 
-import java.util.Iterator;
-import java.util.Locale;
-
-import org.apache.struts2.StrutsConstants;
-import org.apache.struts2.StrutsTestCase;
-
+import com.opensymphony.xwork2.inject.Container;
+import com.opensymphony.xwork2.inject.ContainerBuilder;
 import com.opensymphony.xwork2.util.LocalizedTextUtil;
 import com.opensymphony.xwork2.util.location.LocatableProperties;
-import com.opensymphony.xwork2.inject.ContainerBuilder;
-import com.opensymphony.xwork2.inject.Container;
 import junit.framework.TestCase;
+import org.apache.struts2.StrutsConstants;
+
+import java.util.Locale;
 
 
 /**
  * Unit test for {@link SettingsTest}.
  *
  */
-public class LegacyPropertiesConfigurationProviderTest extends TestCase {
+public class PropertiesConfigurationProviderTest extends TestCase {
 
     public void testRegister_DifferentLocale() {
 
@@ -46,12 +43,13 @@ public class LegacyPropertiesConfigurati
         builder.constant("foo", "bar");
         builder.constant("struts.locale", "DE_de");
 
-        LegacyPropertiesConfigurationProvider prov = new LegacyPropertiesConfigurationProvider();
+        PropertiesConfigurationProvider prov = new PropertiesConfigurationProvider();
         prov.register(builder, new LocatableProperties());
 
         Container container = builder.create(true);
 
-        Locale locale = container.getInstance(Locale.class);
+        String localeStr = container.getInstance(String.class, StrutsConstants.STRUTS_LOCALE);
+        Locale locale = LocalizedTextUtil.localeFromString(localeStr, Locale.FRANCE);
 
         assertNotNull(locale);
         assertEquals("DE", locale.getCountry());
@@ -64,16 +62,30 @@ public class LegacyPropertiesConfigurati
         ContainerBuilder builder = new ContainerBuilder();
         builder.constant("foo", "bar");
 
-        LegacyPropertiesConfigurationProvider prov = new LegacyPropertiesConfigurationProvider();
+        PropertiesConfigurationProvider prov = new PropertiesConfigurationProvider();
         prov.register(builder, new LocatableProperties());
 
         Container container = builder.create(true);
 
-        Locale locale = container.getInstance(Locale.class);
+        String localeStr = container.getInstance(String.class, StrutsConstants.STRUTS_LOCALE);
+        Locale locale = LocalizedTextUtil.localeFromString(localeStr, Locale.getDefault());
 
         assertNotNull(locale);
         Locale vmLocale = Locale.getDefault();
         assertEquals(locale, vmLocale);
     }
 
+    public void testDefaultSettings() throws Exception {
+        // given
+        PropertiesConfigurationProvider prov = new PropertiesConfigurationProvider();
+        LocatableProperties props = new LocatableProperties();
+        prov.register(new ContainerBuilder(), props);
+
+        // when
+        Object encoding = props.get(StrutsConstants.STRUTS_I18N_ENCODING);
+
+        // then
+        assertEquals("ISO-8859-1", encoding);
+    }
+
 }

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/SettingsTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/SettingsTest.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/SettingsTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/SettingsTest.java Tue Oct 22 13:42:51 2013
@@ -21,13 +21,12 @@
 
 package org.apache.struts2.config;
 
-import java.util.Iterator;
-import java.util.Locale;
-
+import com.opensymphony.xwork2.util.LocalizedTextUtil;
 import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.StrutsTestCase;
 
-import com.opensymphony.xwork2.util.LocalizedTextUtil;
+import java.util.Iterator;
+import java.util.Locale;
 
 
 /**
@@ -37,34 +36,38 @@ import com.opensymphony.xwork2.util.Loca
 public class SettingsTest extends StrutsTestCase {
 
     public void testSettings() {
-        assertEquals("12345", Settings.get(StrutsConstants.STRUTS_MULTIPART_MAXSIZE));
-        assertEquals("\temp", Settings.get(StrutsConstants.STRUTS_MULTIPART_SAVEDIR));
+        Settings settings = new DefaultSettings();
 
-        assertEquals("test,org/apache/struts2/othertest", Settings.get( StrutsConstants.STRUTS_CUSTOM_PROPERTIES));
-        assertEquals("testvalue", Settings.get("testkey"));
-        assertEquals("othertestvalue", Settings.get("othertestkey"));
+        assertEquals("12345", settings.get(StrutsConstants.STRUTS_MULTIPART_MAXSIZE));
+        assertEquals("\temp", settings.get(StrutsConstants.STRUTS_MULTIPART_SAVEDIR));
 
-        int count = getKeyCount();
+        assertEquals("test,org/apache/struts2/othertest", settings.get( StrutsConstants.STRUTS_CUSTOM_PROPERTIES));
+        assertEquals("testvalue", settings.get("testkey"));
+        assertEquals("othertestvalue", settings.get("othertestkey"));
+
+        int count = getKeyCount(settings);
         assertEquals(12, count);
     }
 
     public void testDefaultResourceBundlesLoaded() {
-        assertEquals("testmessages,testmessages2", Settings.get(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES));
+        Settings settings = new DefaultSettings();
+
+        assertEquals("testmessages,testmessages2", settings.get(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES));
         assertEquals("This is a test message", LocalizedTextUtil.findDefaultText("default.testmessage", Locale.getDefault()));
         assertEquals("This is another test message", LocalizedTextUtil.findDefaultText("default.testmessage2", Locale.getDefault()));
     }
 
     public void testSetSettings() {
-        Settings.setInstance(new TestSettings());
+        Settings settings = new TestSettings();
 
         String keyName = "a.long.property.key.name";
-        assertEquals(keyName, Settings.get(keyName));
-        assertEquals(2, getKeyCount());
+        assertEquals(keyName, settings.get(keyName));
+        assertEquals(2, getKeyCount(settings));
     }
 
-    private int getKeyCount() {
+    private int getKeyCount(Settings settings) {
         int count = 0;
-        Iterator keyNames = Settings.list();
+        Iterator keyNames = settings.list();
 
         while (keyNames.hasNext()) {
             keyNames.next();

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/TestSettings.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/TestSettings.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/TestSettings.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/config/TestSettings.java Tue Oct 22 13:42:51 2013
@@ -21,6 +21,8 @@
 
 package org.apache.struts2.config;
 
+import com.opensymphony.xwork2.util.location.Location;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -30,25 +32,29 @@ import java.util.List;
  * TestSettings
  *
  */
-public class TestSettings extends Settings {
+public class TestSettings implements Settings {
 
     /**
      * Get a named setting.
      *
      * @throws IllegalArgumentException if there is no settings parameter with the given name.
      */
-    public String getImpl(String aName) throws IllegalArgumentException {
+    public String get(String aName) throws IllegalArgumentException {
         return aName;
     }
 
     /**
      * List setting names
      */
-    public Iterator listImpl() {
+    public Iterator list() {
         List testList = new ArrayList();
         testList.add("123");
         testList.add("testValue");
 
         return testList.iterator();
     }
+
+    public Location getLocation(String name) {
+        return null;
+    }
 }

Modified: struts/struts2/trunk/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java (original)
+++ struts/struts2/trunk/plugins/sitegraph/src/main/java/org/apache/struts2/sitegraph/StrutsConfigRetriever.java Tue Oct 22 13:42:51 2013
@@ -29,7 +29,7 @@ import com.opensymphony.xwork2.util.logg
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 import org.apache.struts2.config.BeanSelectionProvider;
 import org.apache.struts2.config.DefaultPropertiesProvider;
-import org.apache.struts2.config.LegacyPropertiesConfigurationProvider;
+import org.apache.struts2.config.PropertiesConfigurationProvider;
 import org.apache.struts2.config.StrutsXmlConfigurationProvider;
 import org.apache.struts2.sitegraph.entities.FreeMarkerView;
 import org.apache.struts2.sitegraph.entities.JspView;
@@ -75,7 +75,7 @@ public class StrutsConfigRetriever {
             cm.addContainerProvider(new DefaultPropertiesProvider());
             cm.addContainerProvider(new StrutsXmlConfigurationProvider("struts-default.xml", false, null));
             cm.addContainerProvider(configProvider);
-            cm.addContainerProvider(new LegacyPropertiesConfigurationProvider());
+            cm.addContainerProvider(new PropertiesConfigurationProvider());
             cm.addContainerProvider(new BeanSelectionProvider());
             isXWorkStarted = true;
         } catch (IOException e) {

Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocatableProperties.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocatableProperties.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocatableProperties.java (original)
+++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocatableProperties.java Tue Oct 22 13:42:51 2013
@@ -19,18 +19,18 @@ import java.util.Properties;
 public class LocatableProperties extends Properties implements Locatable {
 
     Location location;
-    Map<String,Location> propLocations;
-    
+    Map<String, Location> propLocations;
+
     public LocatableProperties() {
-        this(null);
+        this(Location.UNKNOWN);
     }
-    
+
     public LocatableProperties(Location loc) {
         super();
         this.location = loc;
-        this.propLocations = new HashMap<String,Location>();
+        this.propLocations = new HashMap<String, Location>();
     }
-    
+
     @Override
     public void load(InputStream in) throws IOException {
         Reader reader = new InputStreamReader(in);
@@ -40,12 +40,12 @@ public class LocatableProperties extends
             String val = pr.getPropertyValue();
             int line = pr.getLineNumber();
             String desc = convertCommentsToString(pr.getCommentLines());
-            
+
             Location loc = new LocationImpl(desc, location.getURI(), line, 0);
             setProperty(name, val, loc);
         }
     }
-    
+
     String convertCommentsToString(List<String> lines) {
         StringBuilder sb = new StringBuilder();
         if (lines != null && lines.size() > 0) {
@@ -55,7 +55,7 @@ public class LocatableProperties extends
         }
         return sb.toString();
     }
-    
+
     public Object setProperty(String key, String value, Object locationObj) {
         Object obj = super.setProperty(key, value);
         if (location != null) {
@@ -64,11 +64,16 @@ public class LocatableProperties extends
         }
         return obj;
     }
-    
+
     public Location getPropertyLocation(String key) {
-        return propLocations.get(key);
+        Location loc = propLocations.get(key);
+        if (loc != null) {
+            return loc;
+        } else {
+            return Location.UNKNOWN;
+        }
     }
-    
+
     public Location getLocation() {
         return location;
     }

Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocationImpl.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocationImpl.java?rev=1534634&r1=1534633&r2=1534634&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocationImpl.java (original)
+++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/location/LocationImpl.java Tue Oct 22 13:42:51 2013
@@ -27,6 +27,7 @@ import java.util.List;
  * A simple immutable and serializable implementation of {@link Location}.
  */
 public class LocationImpl implements Location, Serializable {
+
     private final String uri;
     private final int line;
     private final int column;