diff --git a/checkstyle.xml b/checkstyle.xml
index ea0a2fd..4277b53 100644
--- a/checkstyle.xml
+++ b/checkstyle.xml
@@ -69,6 +69,12 @@
+
+
+
+
+
+
diff --git a/core/pom.xml b/core/pom.xml
index c14596d..57ce581 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -19,6 +19,12 @@
JTransfo core
+
+ org.zeroturnaround
+ jr-sdk
+ provided
+
+
junit
junit
diff --git a/core/src/main/java/org/jtransfo/JTransfoImpl.java b/core/src/main/java/org/jtransfo/JTransfoImpl.java
index 1215830..0bf47b0 100644
--- a/core/src/main/java/org/jtransfo/JTransfoImpl.java
+++ b/core/src/main/java/org/jtransfo/JTransfoImpl.java
@@ -14,6 +14,7 @@
import org.jtransfo.internal.NewInstanceObjectFinder;
import org.jtransfo.internal.ToHelper;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -47,6 +48,23 @@ public JTransfoImpl() {
updateTypeConverters();
updateConvertInterceptors();
+
+ // CHECKSTYLE EMPTY_BLOCK: OFF
+ try {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ Class> plugin = cl.loadClass("org.jtransfo.JTransfoJrebelPlugin");
+ Method setInstance = plugin.getMethod("setInstance", JTransfoImpl.class);
+ Method preInit = plugin.getMethod("preinit");
+ if (null != setInstance && null != preInit) {
+ Object instance = plugin.newInstance();
+ setInstance.invoke(instance, this);
+ preInit.invoke(instance);
+ }
+ System.out.println("jRebel reload support for jTransfo loaded.");
+ } catch (Throwable ex) {
+ // JRebel not found - will not reload directory service automatically.
+ }
+ // CHECKSTYLE EMPTY_BLOCK: ON
}
/**
@@ -272,6 +290,13 @@ public Class> getToSubType(Class> toType, Object domainObject) {
return toHelper.getToSubType(toType, domainObject);
}
+ /**
+ * Clear cache with converters. Needed when classes are reloaded by something like jRebel or spring reloaded.
+ */
+ public void clearCaches() {
+ converters.clear();
+ }
+
private List getToToConverters(Class toClass) {
return getToConverter(toClass).getToTo();
}
diff --git a/core/src/main/java/org/jtransfo/JTransfoJrebelPlugin.java b/core/src/main/java/org/jtransfo/JTransfoJrebelPlugin.java
new file mode 100644
index 0000000..187c875
--- /dev/null
+++ b/core/src/main/java/org/jtransfo/JTransfoJrebelPlugin.java
@@ -0,0 +1,91 @@
+/*
+ * This file is part of jTransfo, a library for converting to and from transfer objects.
+ * Copyright (c) PROGS bvba, Belgium
+ *
+ * The program is available in open source according to the Apache License, Version 2.0.
+ * For full licensing details, see LICENSE.txt in the project root.
+ */
+
+package org.jtransfo;
+
+import org.zeroturnaround.javarebel.ClassEventListener;
+import org.zeroturnaround.javarebel.ClassResourceSource;
+import org.zeroturnaround.javarebel.LoggerFactory;
+import org.zeroturnaround.javarebel.Plugin;
+import org.zeroturnaround.javarebel.ReloaderFactory;
+
+/**
+ * Jrebel plugin, assure jTransfo does not keep working with 'old' class definitions.
+ */
+public class JTransfoJrebelPlugin implements Plugin {
+
+ private JTransfoImpl jTransfo;
+
+ /**
+ * Set instance for which this plugin (instance) applies.
+ *
+ * @param instance jTransfo registry instance
+ */
+ public void setInstance(JTransfoImpl instance) {
+ jTransfo = instance;
+ }
+
+ @Override
+ public void preinit() {
+ registerListener();
+ }
+
+ private void registerListener() {
+ // Set up the reload listener
+ ReloaderFactory.getInstance().addClassReloadListener(
+ new ClassEventListener() {
+ public void onClassEvent(int eventType, Class klass) {
+ try {
+ if (klass.isAnnotationPresent(DomainClass.class) ||
+ klass.isAnnotationPresent(DomainClassDelegate.class)) {
+ jTransfo.clearCaches();
+ }
+ } catch (Exception e) {
+ LoggerFactory.getInstance().error(e);
+ System.out.println(e);
+ }
+ }
+
+ public int priority() {
+ return 0;
+ }
+ }
+ );
+ }
+
+ @Override
+ public boolean checkDependencies(ClassLoader classLoader, ClassResourceSource classResourceSource) {
+ return classResourceSource.getClassResource("org.jtransfo.JTransfoImpl") != null;
+ }
+
+ @Override
+ public String getId() {
+ return "JTransfoJrebelPlugin";
+ }
+
+ @Override
+ public String getName() {
+ return "JRebel Plugin for jTransfo";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Assure jTransfo notices changes in mapped classes - clear cache.";
+ }
+
+ @Override
+ public String getAuthor() {
+ return null;
+ }
+
+ @Override
+ public String getWebsite() {
+ return null;
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 5e88086..9a55f90 100644
--- a/pom.xml
+++ b/pom.xml
@@ -207,6 +207,12 @@
1.6.4
+
+ org.zeroturnaround
+ jr-sdk
+ 3.0-M1
+
+