|
Author: doogie
Date: Sun Feb 14 22:34:46 2010 New Revision: 910096 URL: http://svn.apache.org/viewvc?rev=910096&view=rev Log: Implement unsynchronized(non-blocking) access to converterMap and noConversion. Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java?rev=910096&r1=910095&r2=910096&view=diff ============================================================================== --- ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java (original) +++ ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java Sun Feb 14 22:34:46 2010 @@ -37,8 +37,8 @@ public class Converters { protected static final String module = Converters.class.getName(); protected static final String DELIMITER = "->"; - protected static final Map<String, Converter<?, ?>> converterMap = FastMap.newInstance(); - protected static final Set<String> noConversions = FastSet.newInstance(); + protected static final FastMap<String, Converter<?, ?>> converterMap = FastMap.newInstance(); + protected static final FastSet<String> noConversions = FastSet.newInstance(); /** Null converter used when the source and target java object * types are the same. The <code>convert</code> method returns the * source object. @@ -47,6 +47,7 @@ public static final Converter<Object, Object> nullConverter = new NullConverter(); static { + converterMap.setShared(true); ClassLoader loader = Thread.currentThread().getContextClassLoader(); Iterator<ConverterLoader> converterLoaders = ServiceRegistry.lookupProviders(ConverterLoader.class, loader); while (converterLoaders.hasNext()) { @@ -81,36 +82,40 @@ if (Debug.verboseOn()) { Debug.logVerbose("Getting converter: " + key, module); } - Converter<?, ?> result = converterMap.get(key); - if (result == null) { - if (!noConversions.contains(key)) { - synchronized (converterMap) { - for (Converter<?, ?> value : converterMap.values()) { - if (value.canConvert(sourceClass, targetClass)) { - converterMap.put(key, value); - return UtilGenerics.cast(value); - } - } - result = checkExtendsImplements(sourceClass, targetClass); - if (result != null) { - return UtilGenerics.cast(result); - } - // Null converter must be checked last - if (nullConverter.canConvert(sourceClass, targetClass)) { - Converter passThruConverter = new PassThruConverter<S>(sourceClass); - converterMap.put(key, passThruConverter); - return UtilGenerics.cast(passThruConverter); - } - noConversions.add(key); - Debug.logWarning("*** No converter found, converting from " + - sourceClass.getName() + " to " + targetClass.getName() + - ". Please report this message to the developer community so " + - "a suitable converter can be created. ***", module); +OUTER: + do { + Converter<?, ?> result = converterMap.get(key); + if (result != null) { + return UtilGenerics.cast(result); + } + if (noConversions.contains(key)) { + throw new ClassNotFoundException("No converter found for " + key); + } + for (Converter<?, ?> value : converterMap.values()) { + if (value.canConvert(sourceClass, targetClass)) { + converterMap.putIfAbsent(key, value); + continue OUTER; } } + result = checkExtendsImplements(sourceClass, targetClass); + if (result != null) { + converterMap.putIfAbsent(key, result); + continue; + } + // Null converter must be checked last + if (nullConverter.canConvert(sourceClass, targetClass)) { + Converter passThruConverter = new PassThruConverter<S>(sourceClass); + converterMap.putIfAbsent(key, passThruConverter); + continue; + } + if (noConversions.add(key)) { + Debug.logWarning("*** No converter found, converting from " + + sourceClass.getName() + " to " + targetClass.getName() + + ". Please report this message to the developer community so " + + "a suitable converter can be created. ***", module); + } throw new ClassNotFoundException("No converter found for " + key); - } - return UtilGenerics.cast(result); + } while (true); } private static <S, T> Converter<S, T> checkExtendsImplements(Class<S> sourceClass, Class<T> targetClass) throws ClassNotFoundException { @@ -187,10 +192,7 @@ sb.append("<null>"); } String key = sb.toString(); - if (converterMap.get(key) == null) { - synchronized (converterMap) { - converterMap.put(key, converter); - } + if (converterMap.putIfAbsent(key, converter) == null) { if (Debug.verboseOn()) { Debug.logVerbose("Registered converter " + converter.getClass().getName(), module); } |
| Free forum by Nabble | Edit this page |
