From 0560be45bc06e77ba92b14294fe8003bef597d1e Mon Sep 17 00:00:00 2001 From: joachimvda Date: Wed, 12 Nov 2014 22:16:11 +0100 Subject: [PATCH] #48 jRebel support --- checkstyle.xml | 6 ++ core/pom.xml | 6 ++ .../main/java/org/jtransfo/JTransfoImpl.java | 25 +++++ .../org/jtransfo/JTransfoJrebelPlugin.java | 91 +++++++++++++++++++ pom.xml | 6 ++ 5 files changed, 134 insertions(+) create mode 100644 core/src/main/java/org/jtransfo/JTransfoJrebelPlugin.java 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 + +