You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2010/02/14 23:34:47 UTC
svn commit: r910096 -
/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
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);
}
Re: svn commit: r910096 - /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
Posted by Adam Heath <do...@brainfood.com>.
Adrian Crum wrote:
> doogie@apache.org wrote:
>> 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
>
> Adam,
>
> Do you know of any advantages/disadvantages of using FastMap versus
> ConcurrentHashMap?
FastMap is more stable with regard to memory allocation. It might be
a tad slower because of this, but it's execution profile doesn't vary
as much.
Re: svn commit: r910096 - /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
Posted by Adrian Crum <ad...@hlmksw.com>.
doogie@apache.org wrote:
> 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
Adam,
Do you know of any advantages/disadvantages of using FastMap versus
ConcurrentHashMap?