You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2016/12/03 16:37:44 UTC
[18/50] tomee git commit: ensuring lifecycle tasks instances can be
retrieved by the application
ensuring lifecycle tasks instances can be retrieved by the application
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/d5e01c0e
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/d5e01c0e
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/d5e01c0e
Branch: refs/heads/tomee-1.7.x
Commit: d5e01c0ee492f2d5fda30171637e78e47a9753a7
Parents: 78b76fc
Author: rmannibucau <rm...@apache.org>
Authored: Tue Oct 4 11:29:57 2016 +0200
Committer: rmannibucau <rm...@apache.org>
Committed: Tue Oct 4 11:29:57 2016 +0200
----------------------------------------------------------------------
.../TomEEEmbeddedApplicationRunner.java | 48 ++++++++++++++++++--
.../embedded/SingleInstanceRunnerTest.java | 16 ++++++-
2 files changed, 59 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/d5e01c0e/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/TomEEEmbeddedApplicationRunner.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/TomEEEmbeddedApplicationRunner.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/TomEEEmbeddedApplicationRunner.java
index 12033d2..b328d4b 100644
--- a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/TomEEEmbeddedApplicationRunner.java
+++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/TomEEEmbeddedApplicationRunner.java
@@ -54,6 +54,7 @@ import java.util.Map;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
+import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static org.apache.openejb.loader.JarLocation.jarLocation;
@@ -151,11 +152,14 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
}
}
+ final Collection<org.apache.tomee.embedded.LifecycleTask> lifecycleTasks = new ArrayList<>();
final Collection<Closeable> postTasks = new ArrayList<>();
final LifecycleTasks tasks = appClass.getAnnotation(LifecycleTasks.class);
if (tasks != null) {
for (final Class<? extends org.apache.tomee.embedded.LifecycleTask> type : tasks.value()) {
- postTasks.add(type.newInstance().beforeContainerStartup());
+ final org.apache.tomee.embedded.LifecycleTask lifecycleTask = type.newInstance();
+ lifecycleTasks.add(lifecycleTask);
+ postTasks.add(lifecycleTask.beforeContainerStartup());
}
}
@@ -229,6 +233,7 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
final Container container = new Container(configuration);
SystemInstance.get().setComponent(TomEEEmbeddedArgs.class, new TomEEEmbeddedArgs(args, null));
+ SystemInstance.get().setComponent(LifecycleTaskAccessor.class, new LifecycleTaskAccessor(lifecycleTasks));
container.deploy(new Container.DeploymentRequest(
context,
// call ClasspathSearcher that lazily since container needs to be started to not preload logging
@@ -281,9 +286,7 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
}
try {
- if (container != null) {
- container.close();
- }
+ container.close();
} catch (final Exception e) {
e.printStackTrace();
}
@@ -406,6 +409,14 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
f.setAccessible(true);
}
f.set(target, app);
+ } else if (f.isAnnotationPresent(LifecycleTask.class)) {
+ if (!f.isAccessible()) {
+ f.setAccessible(true);
+ }
+ final LifecycleTaskAccessor accessor = SystemInstance.get().getComponent(LifecycleTaskAccessor.class);
+ final Class type = f.getType();
+ final Object taskByType = accessor.getTaskByType(type);
+ f.set(target, taskByType);
}
}
final Class<?> superclass = aClass.getSuperclass();
@@ -421,6 +432,11 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
}
@Retention(RUNTIME)
+ @Target(FIELD)
+ public @interface LifecycleTask {
+ }
+
+ @Retention(RUNTIME)
@Target(TYPE)
public @interface Configurers {
Class<? extends Configurer>[] value();
@@ -429,4 +445,28 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
public interface Configurer {
void configure(Configuration configuration);
}
+
+ public static class LifecycleTaskAccessor {
+ private final Collection<org.apache.tomee.embedded.LifecycleTask> tasks;
+
+ private LifecycleTaskAccessor(final Collection<org.apache.tomee.embedded.LifecycleTask> lifecycleTasks) {
+ this.tasks = lifecycleTasks;
+ }
+
+ public Collection<org.apache.tomee.embedded.LifecycleTask> getTasks() {
+ return tasks;
+ }
+
+ public <T> T getTaskByType(final Class<T> type) {
+ for (final org.apache.tomee.embedded.LifecycleTask task : tasks) {
+ if (type == task.getClass()) {
+ return (T) task;
+ }
+ }
+ if (Collection.class.isAssignableFrom(type)) {
+ return (T) tasks;
+ }
+ return null;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/d5e01c0e/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SingleInstanceRunnerTest.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SingleInstanceRunnerTest.java b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SingleInstanceRunnerTest.java
index cf2d039..3c5ae7d 100644
--- a/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SingleInstanceRunnerTest.java
+++ b/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SingleInstanceRunnerTest.java
@@ -30,6 +30,7 @@ import org.junit.runner.RunWith;
import java.io.Closeable;
import java.io.IOException;
import java.net.URL;
+import java.util.Collection;
import java.util.Properties;
import static org.junit.Assert.assertEquals;
@@ -39,7 +40,6 @@ import static org.junit.Assert.assertTrue;
// just a manual test to check it works, can't be executed with the rest of the suite,
// we could use a different surefire execution if we want to add it to the default run
-//@Ignore("can't run with by test containers")
@RunWith(TomEEEmbeddedSingleRunner.class)
public class SingleInstanceRunnerTest {
@Application // app can have several injections/helpers
@@ -58,6 +58,11 @@ public class SingleInstanceRunnerTest {
assertNotEquals(8080, app.port);
assertTrue(app.base.toExternalForm().endsWith("/app"));
assertEquals(app.port, port);
+ assertNotNull(app.task);
+ assertNotNull(app.tasks);
+ assertEquals(1, app.tasks.size());
+ assertEquals(app.task, app.tasks.iterator().next());
+ assertEquals(app.task, MyTask.instance);
}
@Application
@@ -72,6 +77,12 @@ public class SingleInstanceRunnerTest {
@RandomPort("http")
private URL base;
+ @TomEEEmbeddedApplicationRunner.LifecycleTask
+ private MyTask task;
+
+ @TomEEEmbeddedApplicationRunner.LifecycleTask
+ private Collection<LifecycleTask> tasks;
+
@org.apache.openejb.testing.Configuration
public Properties add() {
return new PropertiesBuilder().p("prog", "p").build();
@@ -79,8 +90,11 @@ public class SingleInstanceRunnerTest {
}
public static class MyTask implements LifecycleTask {
+ private static MyTask instance;
+
@Override
public Closeable beforeContainerStartup() {
+ instance = this;
System.out.println(">>> start");
System.setProperty("my.server.port", "128463");
return new Closeable() {