Author: doogie
Date: Sun Feb 14 22:41:19 2010
New Revision: 910110
URL: http://svn.apache.org/viewvc?rev=910110&view=rev
Log:
Implement a creation framework; this allows creaters to provide
optimized versions of converters.
Added:
ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/ConverterCreater.java
Modified:
ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
Added:
ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/ConverterCreater.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/ConverterCreater.java?rev=910110&view=auto
==============================================================================
---
ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/ConverterCreater.java
(added)
+++
ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/ConverterCreater.java
Sun Feb 14 22:41:19 2010
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+package org.ofbiz.base.conversion;
+
+/** ConverterCreater interface. Classes implement this interface to create a
+ * converter that can convert one Java object type to another.
+ */
+public interface ConverterCreater {
+ /** Creates a Converter that can convert the <code>sourceClass</code> to
+ * the <code>targetClass</code>. Returns <code>null</code> if this creater
+ * doesn't support the class pair.
+ *
+ * @param sourceClass The source <code>Class</code> to convert
+ * @param targetClass The target <code>Class</code> to convert to
+ * @return a converter that can convert <code>Object</code>s
+ */
+ public <S, T> Converter<S, T> createConverter(Class<S> sourceClass,
Class<T> targetClass);
+}
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=910110&r1=910109&r2=910110&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:41:19 2010
@@ -38,6 +38,7 @@
protected static final String module = Converters.class.getName();
protected static final String DELIMITER = "->";
protected static final FastMap<String, Converter<?, ?>> converterMap =
FastMap.newInstance();
+ protected static final FastSet<ConverterCreater> creaters =
FastSet.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
@@ -48,6 +49,7 @@
static {
converterMap.setShared(true);
+ registerCreater(new PassThruConverterCreater());
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Iterator<ConverterLoader> converterLoaders =
ServiceRegistry.lookupProviders(ConverterLoader.class, loader);
while (converterLoaders.hasNext()) {
@@ -97,11 +99,12 @@
continue OUTER;
}
}
- // Null converter must be checked last
- if (nullConverter.canConvert(sourceClass, targetClass)) {
- Converter passThruConverter = new
PassThruConverter<S>(sourceClass);
- converterMap.putIfAbsent(key, passThruConverter);
- continue;
+ for (ConverterCreater value : creaters) {
+ result = createConverter(value, sourceClass, targetClass);
+ if (result != null) {
+ converterMap.putIfAbsent(key, result);
+ continue OUTER;
+ }
}
if (noConversions.add(key)) {
Debug.logWarning("*** No converter found, converting from " +
@@ -113,6 +116,10 @@
} while (true);
}
+ private static <S, SS extends S, T, TT extends T> Converter<SS, TT>
createConverter(ConverterCreater creater, Class<SS> sourceClass, Class<TT>
targetClass) {
+ return creater.createConverter(sourceClass, targetClass);
+ }
+
/** Load all classes that implement <code>Converter</code> and are
* contained in <code>containerClass</code>.
*
@@ -143,6 +150,18 @@
}
}
+ /** Registers a <code>ConverterCreater</code> instance to be used by the
+ * {...@link org.ofbiz.base.conversion.Converters#getConverter(Class,
Class)}
+ * method, when a converter can't be found.
+ *
+ * @param <S> The source object type
+ * @param <T> The target object type
+ * @param creater The <code>ConverterCreater</code> instance to register
+ */
+ public static <S, T> void registerCreater(ConverterCreater creater) {
+ creaters.add(creater);
+ }
+
/** Registers a <code>Converter</code> instance to be used by the
* {...@link org.ofbiz.base.conversion.Converters#getConverter(Class,
Class)}
* method.
@@ -209,6 +228,19 @@
}
}
+ protected static class PassThruConverterCreater implements
ConverterCreater{
+ protected PassThruConverterCreater() {
+ }
+
+ public <S, T> Converter<S, T> createConverter(Class<S> sourceClass,
Class<T> targetClass) {
+ if (sourceClass == targetClass) {
+ return UtilGenerics.cast(new
PassThruConverter<T>(targetClass));
+ } else {
+ return null;
+ }
+ }
+ }
+
/** Pass thru converter used when the source and target java object
* types are the same. The <code>convert</code> method returns the
* source object.