You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2014/10/17 05:40:28 UTC
[8/8] git commit: CAMEL-7920 Make sure the JAXB fallback converter is
the last one loaded
CAMEL-7920 Make sure the JAXB fallback converter is the last one loaded
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f0ddb5ef
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f0ddb5ef
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f0ddb5ef
Branch: refs/heads/camel-2.13.x
Commit: f0ddb5ef76a37bd0b7715ed6ee28165d814f2d95
Parents: b41b8d0
Author: Willem Jiang <wi...@gmail.com>
Authored: Fri Oct 17 11:07:26 2014 +0800
Committer: Willem Jiang <wi...@gmail.com>
Committed: Fri Oct 17 11:39:26 2014 +0800
----------------------------------------------------------------------
.../converter/BaseTypeConverterRegistry.java | 1 +
.../org/apache/camel/impl/osgi/Activator.java | 18 ++++++++---
.../camel/core/osgi/OsgiTypeConverter.java | 33 ++++++++++++++------
3 files changed, 38 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/f0ddb5ef/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java b/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
index 5443e75..a71d46e 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
@@ -389,6 +389,7 @@ public abstract class BaseTypeConverterRegistry extends ServiceSupport implement
log.trace("Adding fallback type converter: {} which can promote: {}", typeConverter, canPromote);
// add in top of fallback as the toString() fallback will nearly always be able to convert
+ // the last one which is add to the FallbackTypeConverter will be called at the first place
fallbackConverters.add(0, new FallbackTypeConverter(typeConverter, canPromote));
if (typeConverter instanceof TypeConverterAware) {
TypeConverterAware typeConverterAware = (TypeConverterAware) typeConverter;
http://git-wip-us.apache.org/repos/asf/camel/blob/f0ddb5ef/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java b/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
index 9be601b..36d8249 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/osgi/Activator.java
@@ -61,8 +61,8 @@ import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
+import org.osgi.framework.Constants;
import org.osgi.framework.ServiceRegistration;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -176,7 +176,8 @@ public class Activator implements BundleActivator, BundleTrackerCustomizer {
URL url1 = bundle.getEntry(META_INF_TYPE_CONVERTER);
URL url2 = bundle.getEntry(META_INF_FALLBACK_TYPE_CONVERTER);
if (url1 != null || url2 != null) {
- resolvers.add(new BundleTypeConverterLoader(bundle));
+ LOG.debug("Found TypeConverter in bundle {}", bundle.getSymbolicName());
+ resolvers.add(new BundleTypeConverterLoader(bundle, url2 != null));
}
}
}
@@ -264,11 +265,13 @@ public class Activator implements BundleActivator, BundleTrackerCustomizer {
private final AnnotationTypeConverterLoader loader = new Loader();
private final Bundle bundle;
+ private final boolean hasFallbackTypeConverter;
- public BundleTypeConverterLoader(Bundle bundle) {
+ public BundleTypeConverterLoader(Bundle bundle, boolean hasFallbackTypeConverter) {
super(bundle, TypeConverter.class);
ObjectHelper.notNull(bundle, "bundle");
this.bundle = bundle;
+ this.hasFallbackTypeConverter = hasFallbackTypeConverter;
}
public synchronized void load(TypeConverterRegistry registry) throws TypeConverterLoaderException {
@@ -282,7 +285,13 @@ public class Activator implements BundleActivator, BundleTrackerCustomizer {
}
public void register() {
- doRegister(TypeConverterLoader.class);
+ if (hasFallbackTypeConverter) {
+ // The FallbackTypeConverter should have a higher ranking
+ doRegister(TypeConverterLoader.class, Constants.SERVICE_RANKING, new Integer(100));
+ } else {
+ // The default service ranking is Integer(0);
+ doRegister(TypeConverterLoader.class);
+ }
}
class Loader extends AnnotationTypeConverterLoader {
@@ -360,6 +369,7 @@ public class Activator implements BundleActivator, BundleTrackerCustomizer {
// register fallback converters
URL fallbackUrl = bundle.getEntry(META_INF_FALLBACK_TYPE_CONVERTER);
if (fallbackUrl != null) {
+ LOG.debug("Found {} to load the FallbackTypeConverter", META_INF_FALLBACK_TYPE_CONVERTER);
TypeConverter tc = createInstance("FallbackTypeConverter", fallbackUrl, registry.getInjector());
registry.addFallbackTypeConverter(tc, false);
}
http://git-wip-us.apache.org/repos/asf/camel/blob/f0ddb5ef/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
----------------------------------------------------------------------
diff --git a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
index e5452fe..1ac5fa7 100644
--- a/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
+++ b/components/camel-core-osgi/src/main/java/org/apache/camel/core/osgi/OsgiTypeConverter.java
@@ -16,6 +16,8 @@
*/
package org.apache.camel.core.osgi;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -60,12 +62,16 @@ public class OsgiTypeConverter extends ServiceSupport implements TypeConverter,
public Object addingService(ServiceReference<TypeConverterLoader> serviceReference) {
LOG.trace("AddingService: {}", serviceReference);
TypeConverterLoader loader = bundleContext.getService(serviceReference);
- if (loader != null) {
+ // just make sure we don't load the bundle converter this time
+ if (delegate != null) {
try {
- loader.load(getDelegate());
- } catch (Throwable t) {
- throw ObjectHelper.wrapRuntimeCamelException(t);
+ ServiceHelper.stopService(this.delegate);
+ } catch (Exception e) {
+ // ignore
+ LOG.debug("Error stopping service due: " + e.getMessage() + ". This exception will be ignored.", e);
}
+ // It can force camel to reload the type converter again
+ this.delegate = null;
}
return loader;
}
@@ -81,6 +87,7 @@ public class OsgiTypeConverter extends ServiceSupport implements TypeConverter,
// ignore
LOG.debug("Error stopping service due: " + e.getMessage() + ". This exception will be ignored.", e);
}
+ // It can force camel to reload the type converter again
this.delegate = null;
}
@@ -185,14 +192,20 @@ public class OsgiTypeConverter extends ServiceSupport implements TypeConverter,
throw new RuntimeCamelException("Error loading CoreTypeConverter due: " + e.getMessage(), e);
}
- // load the type converters the tracker has been tracking
- Object[] services = this.tracker.getServices();
- if (services != null) {
- for (Object o : services) {
+ // Load the type converters the tracker has been tracking
+ // Here we need to use the ServiceReference to check the ranking
+ ServiceReference<TypeConverterLoader>[] serviceReferences = this.tracker.getServiceReferences();
+ if (serviceReferences != null) {
+ ArrayList<ServiceReference<TypeConverterLoader>> servicesList =
+ new ArrayList<ServiceReference<TypeConverterLoader>>(Arrays.asList(serviceReferences));
+ // Just make sure we install the high ranking fallback converter at last
+ Collections.sort(servicesList);
+ for (ServiceReference<TypeConverterLoader> sr : servicesList) {
try {
- ((TypeConverterLoader) o).load(answer);
+ LOG.debug("loading the type converter from bundle{} ", sr.getBundle().getSymbolicName());
+ ((TypeConverterLoader)this.tracker.getService(sr)).load(answer);
} catch (Throwable t) {
- throw new RuntimeCamelException("Error loading type converters from service: " + o + " due: " + t.getMessage(), t);
+ throw new RuntimeCamelException("Error loading type converters from service: " + sr + " due: " + t.getMessage(), t);
}
}
}