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:45 UTC

[19/50] tomee git commit: app class should be an observer by default and adding TomEEEmbeddedApplicationRunnerInjection to simplify custom injections

app class should be an observer by default and adding TomEEEmbeddedApplicationRunnerInjection to simplify custom injections


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/3bb08cbe
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/3bb08cbe
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/3bb08cbe

Branch: refs/heads/tomee-1.7.x
Commit: 3bb08cbe19cb9c1ae3419ac40e9467ed8fcb8eae
Parents: d5e01c0
Author: rmannibucau <rm...@apache.org>
Authored: Tue Oct 4 11:44:52 2016 +0200
Committer: rmannibucau <rm...@apache.org>
Committed: Tue Oct 4 11:44:52 2016 +0200

----------------------------------------------------------------------
 .../TomEEEmbeddedApplicationRunner.java         |  4 ++
 ...TomEEEmbeddedApplicationRunnerInjection.java | 54 ++++++++++++++++++++
 .../embedded/SingleInstanceRunnerTest.java      | 19 ++++++-
 3 files changed, 76 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/3bb08cbe/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 b328d4b..34826c3 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
@@ -26,6 +26,7 @@ import org.apache.openejb.testing.Jars;
 import org.apache.openejb.testing.RandomPort;
 import org.apache.openejb.testing.WebResource;
 import org.apache.tomee.embedded.component.TomEEEmbeddedArgs;
+import org.apache.tomee.embedded.event.TomEEEmbeddedApplicationRunnerInjection;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.inject.OWBInjector;
 import org.apache.xbean.finder.AnnotationFinder;
@@ -255,6 +256,7 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
             }
         }
 
+        SystemInstance.get().addObserver(app);
         composerInject(app);
 
         final AnnotationFinder appFinder = new AnnotationFinder(new ClassesArchive(appClass));
@@ -423,6 +425,8 @@ public class TomEEEmbeddedApplicationRunner implements AutoCloseable {
         if (superclass != Object.class) {
             composerInject(superclass);
         }
+
+        SystemInstance.get().fireEvent(new TomEEEmbeddedApplicationRunnerInjection(target));
     }
 
     @Retention(RUNTIME)

http://git-wip-us.apache.org/repos/asf/tomee/blob/3bb08cbe/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedApplicationRunnerInjection.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedApplicationRunnerInjection.java b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedApplicationRunnerInjection.java
new file mode 100644
index 0000000..8be133a
--- /dev/null
+++ b/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/event/TomEEEmbeddedApplicationRunnerInjection.java
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomee.embedded.event;
+
+import org.apache.openejb.observer.Event;
+
+import java.lang.reflect.Field;
+
+@Event
+public class TomEEEmbeddedApplicationRunnerInjection {
+    private final Object instance;
+
+    public TomEEEmbeddedApplicationRunnerInjection(final Object instance) {
+        this.instance = instance;
+    }
+
+    public Object getInstance() {
+        return instance;
+    }
+
+    public <T> TomEEEmbeddedApplicationRunnerInjection inject(final Class<T> type, final T value) {
+        Class<?> aClass = instance.getClass();
+        while (aClass != null) {
+            for (final Field f : aClass.getDeclaredFields()) {
+                if (f.getType().isAssignableFrom(type)) {
+                    if (!f.isAccessible()) {
+                        f.setAccessible(true);
+                    }
+                    try {
+                        f.set(instance, value);
+                    } catch (final IllegalAccessException e) {
+                        throw new IllegalStateException(e);
+                    }
+                }
+            }
+            aClass = aClass.getSuperclass();
+        }
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/tomee/blob/3bb08cbe/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 3c5ae7d..8bb73e7 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
@@ -18,11 +18,13 @@ package org.apache.tomee.embedded;
 
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.observer.Observes;
 import org.apache.openejb.testing.Application;
 import org.apache.openejb.testing.Classes;
 import org.apache.openejb.testing.ContainerProperties;
 import org.apache.openejb.testing.RandomPort;
 import org.apache.openejb.testng.PropertiesBuilder;
+import org.apache.tomee.embedded.event.TomEEEmbeddedApplicationRunnerInjection;
 import org.apache.tomee.embedded.junit.TomEEEmbeddedSingleRunner;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -63,12 +65,14 @@ public class SingleInstanceRunnerTest {
         assertEquals(1, app.tasks.size());
         assertEquals(app.task, app.tasks.iterator().next());
         assertEquals(app.task, MyTask.instance);
+        assertNotNull(app.custom);
     }
 
     @Application
     @Classes(context = "app")
     @ContainerProperties(@ContainerProperties.Property(name = "t", value = "set"))
-    @TomEEEmbeddedApplicationRunner.LifecycleTasks(MyTask.class) // can start a ftp/sftp/elasticsearch/mongo/... server before tomee
+    @TomEEEmbeddedApplicationRunner.LifecycleTasks(MyTask.class)
+    // can start a ftp/sftp/elasticsearch/mongo/... server before tomee
     @TomEEEmbeddedApplicationRunner.Configurers(SetMyProperty.class)
     public static class TheApp {
         @RandomPort("http")
@@ -87,6 +91,19 @@ public class SingleInstanceRunnerTest {
         public Properties add() {
             return new PropertiesBuilder().p("prog", "p").build();
         }
+
+        private Custom custom;
+
+        public void doInject(@Observes final TomEEEmbeddedApplicationRunnerInjection injector) {
+            injector.inject(Custom.class, new Custom())
+                    .inject(NotHere.class, new NotHere());
+        }
+    }
+
+    public static class NotHere {
+    }
+
+    public static class Custom {
     }
 
     public static class MyTask implements LifecycleTask {