Repository: tomee Updated Branches: refs/heads/develop d64754772 -> 1ee61d2cf
support @PreDestroy as well in Application classes Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/1ee61d2c Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/1ee61d2c Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/1ee61d2c Branch: refs/heads/develop Commit: 1ee61d2cf7d7461867765bd7a813aaf4f1f319a0 Parents: d647547 Author: Romain Manni-Bucau <[email protected]> Authored: Sun Jan 18 17:47:09 2015 +0100 Committer: Romain Manni-Bucau <[email protected]> Committed: Sun Jan 18 17:47:09 2015 +0100 ---------------------------------------------------------------------- .../openejb/testing/ApplicationComposers.java | 39 ++++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/1ee61d2c/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java index f130cf2..fd7a21e 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java @@ -92,6 +92,7 @@ import org.apache.xbean.finder.archive.JarArchive; import org.xml.sax.InputSource; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.RequestScoped; import javax.enterprise.context.SessionScoped; @@ -154,6 +155,7 @@ public final class ApplicationComposers { private MockHttpSession session; private MockServletContext servletContext; private final Collection<String> globalJndiEntries = new ArrayList<>(); + private final Collection<Runnable> beforeDestroyAfterRunnables = new ArrayList<>(); private final Collection<Runnable> afterRunnables = new ArrayList<>(); public ApplicationComposers(final Object... modules) { @@ -1078,6 +1080,7 @@ public final class ApplicationComposers { public void after() throws Exception { try { + runAll(beforeDestroyAfterRunnables); if (assembler != null) { final ContextsService contextsService = appContext.getWebBeansContext().getContextsService(); contextsService.endContext(SessionScoped.class, session); @@ -1122,10 +1125,19 @@ public final class ApplicationComposers { OpenEJB.destroy(); } finally { - for (final Runnable r : afterRunnables) { + runAll(afterRunnables); + } + } + + private void runAll(final Collection<Runnable> runnables) { + for (final Runnable r : runnables) { + try { r.run(); + } catch (final Exception e) { + // no-op } } + runnables.clear(); } private <M extends NamedModule> M setId(final M module, final Method method) { @@ -1282,6 +1294,23 @@ public final class ApplicationComposers { composer.before(instance); final CountDownLatch latch = new CountDownLatch(1); + final Object appInstance = instance; + composer.beforeDestroyAfterRunnables.add(new Runnable() { + @Override + public void run() { + for (final Map.Entry<Object, ClassFinder> m : composer.testClassFinders.entrySet()) { + for (final Method mtd : m.getValue().findAnnotatedMethods(PreDestroy.class)) { + if (mtd.getParameterTypes().length == 0) { + try { + mtd.invoke(mtd.getDeclaringClass() == type ? appInstance : m.getKey()); + } catch (final IllegalAccessException | InvocationTargetException e) { + // no-op + } + } + } + } + } + }); composer.afterRunnables.add(new Runnable() { @Override public void run() { @@ -1299,9 +1328,11 @@ public final class ApplicationComposers { } }); - for (final Method m : type.getMethods()) { - if (m.getAnnotation(PostConstruct.class) != null && m.getParameterTypes().length == 0) { - m.invoke(instance); + for (final Map.Entry<Object, ClassFinder> m : composer.testClassFinders.entrySet()) { + for (final Method mtd : m.getValue().findAnnotatedMethods(PostConstruct.class)) { + if (mtd.getParameterTypes().length == 0) { + mtd.invoke(mtd.getDeclaringClass() == type ? instance : m.getKey()); + } } }
