Author: jleroux Date: Thu Feb 25 14:50:39 2016 New Revision: 1732313 URL: http://svn.apache.org/viewvc?rev=1732313&view=rev Log: Fixes "Error with UtilMisc.availableLocales() shows with Java 8" - https://issues.apache.org/jira/browse/OFBIZ-6917
I simply used the version introduced by Adrian at r1647873 which replaces DCL code with lazy-initializer class. Modified: ofbiz/branches/release12.04/framework/base/src/org/ofbiz/base/util/UtilMisc.java Modified: ofbiz/branches/release12.04/framework/base/src/org/ofbiz/base/util/UtilMisc.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/base/src/org/ofbiz/base/util/UtilMisc.java?rev=1732313&r1=1732312&r2=1732313&view=diff ============================================================================== --- ofbiz/branches/release12.04/framework/base/src/org/ofbiz/base/util/UtilMisc.java (original) +++ ofbiz/branches/release12.04/framework/base/src/org/ofbiz/base/util/UtilMisc.java Thu Feb 25 14:50:39 2016 @@ -26,10 +26,10 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.Serializable; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -37,12 +37,12 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; +import org.ofbiz.base.util.collections.MapComparator; + import javolution.util.FastList; import javolution.util.FastMap; import javolution.util.FastSet; -import org.ofbiz.base.util.collections.MapComparator; - /** * UtilMisc - Misc Utility Functions */ @@ -749,46 +749,43 @@ public class UtilMisc { * @param localeObject An Object representing the locale */ public static Locale ensureLocale(Object localeObject) { - if (localeObject != null && localeObject instanceof String) { - localeObject = UtilMisc.parseLocale((String) localeObject); - } - if (localeObject != null && localeObject instanceof Locale) { + if (localeObject instanceof String) { + return parseLocale((String) localeObject); + } else if (localeObject instanceof Locale) { return (Locale) localeObject; } return Locale.getDefault(); } - public static List<Locale> availableLocaleList = null; - /** Returns a List of available locales sorted by display name */ - public static List<Locale> availableLocales() { - if (availableLocaleList == null) { - synchronized(UtilMisc.class) { - if (availableLocaleList == null) { - TreeMap<String, Locale> localeMap = new TreeMap<String, Locale>(); - String localesString = UtilProperties.getPropertyValue("general", "locales.available"); - if (UtilValidate.isNotEmpty(localesString)) { // check if available locales need to be limited according general.properties file - int end = -1; - int start = 0; - for (int i=0; start < localesString.length(); i++) { - end = localesString.indexOf(",", start); - if (end == -1) { - end = localesString.length(); - } - Locale curLocale = UtilMisc.ensureLocale(localesString.substring(start, end)); - localeMap.put(curLocale.getDisplayName(), curLocale); - start = end + 1; - } - } else { - Locale[] locales = Locale.getAvailableLocales(); - for (int i = 0; i < locales.length && locales[i] != null; i++) { - localeMap.put(locales[i].getDisplayName(), locales[i]); - } + // Private lazy-initializer class + private static class LocaleHolder { + private static final List<Locale> availableLocaleList = getAvailableLocaleList(); + + private static List<Locale> getAvailableLocaleList() { + TreeMap<String, Locale> localeMap = new TreeMap<String, Locale>(); + String localesString = UtilProperties.getPropertyValue("general", "locales.available"); + if (UtilValidate.isNotEmpty(localesString)) { + List<String> idList = StringUtil.split(localesString, ","); + for (String id : idList) { + Locale curLocale = parseLocale(id); + localeMap.put(curLocale.getDisplayName(), curLocale); + } + } else { + Locale[] locales = Locale.getAvailableLocales(); + for (int i = 0; i < locales.length && locales[i] != null; i++) { + String displayName = locales[i].getDisplayName(); + if (!displayName.isEmpty()) { + localeMap.put(displayName, locales[i]); } - availableLocaleList = new LinkedList<Locale>(localeMap.values()); } } + return Collections.unmodifiableList(new ArrayList<Locale>(localeMap.values())); } - return availableLocaleList; + } + + /** Returns a List of available locales sorted by display name */ + public static List<Locale> availableLocales() { + return LocaleHolder.availableLocaleList; } /** This is meant to be very quick to create and use for small sized maps, perfect for how we usually use UtilMisc.toMap */