You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by gp...@apache.org on 2012/03/19 10:36:28 UTC

git commit: DELTASPIKE-121 BeanProvider#injectFields

Updated Branches:
  refs/heads/master 56af95587 -> 04017e4c6


DELTASPIKE-121 BeanProvider#injectFields

and minor cleanup


Project: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/commit/04017e4c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/tree/04017e4c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/diff/04017e4c

Branch: refs/heads/master
Commit: 04017e4c6fa6cae90eccc14632f469a2ad0337c8
Parents: 56af955
Author: gpetracek <gp...@apache.org>
Authored: Mon Mar 19 10:31:14 2012 +0100
Committer: gpetracek <gp...@apache.org>
Committed: Mon Mar 19 10:31:14 2012 +0100

----------------------------------------------------------------------
 .../deltaspike/core/api/provider/BeanProvider.java |   38 +++++++++++++-
 .../test/core/api/provider/BeanProviderTest.java   |   27 ++++++++++
 .../test/core/api/provider/ManualBean.java         |   34 +++++++++++++
 .../test/core/api/provider/TestBean.java           |    2 +-
 4 files changed, 97 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/04017e4c/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java
index 6af4afa..2b9224d 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/provider/BeanProvider.java
@@ -23,8 +23,10 @@ import org.apache.deltaspike.core.api.literal.AnyLiteral;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Typed;
+import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.InjectionTarget;
 import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -70,7 +72,7 @@ public final class BeanProvider
      * @param qualifiers additional qualifiers which further distinct the resolved bean
      * @param <T> target type
      * @return the resolved Contextual Reference
-     * @throws {@code IllegalStateException} if the bean could not be found.
+     * @throws IllegalStateException if the bean could not be found.
      * @see #getContextualReference(Class, boolean, Annotation...)
      */
     public static <T> T getContextualReference(Class<T> type, Annotation... qualifiers)
@@ -118,7 +120,7 @@ public final class BeanProvider
      *
      * @param name     the EL name of the bean
      * @return the resolved Contextual Reference
-     * @throws {@code IllegalStateException} if the bean could not be found.
+     * @throws IllegalStateException if the bean could not be found.
      * @see #getContextualReference(String, boolean)
      */
     public static Object getContextualReference(String name)
@@ -238,12 +240,41 @@ public final class BeanProvider
 
         for (Bean<?> bean : beans)
         {
+            //noinspection unchecked
             result.add(getContextualReference(type, beanManager,
-                    new HashSet<Bean<?>>((Collection) Arrays.asList(new Object[]{bean}))));
+                new HashSet<Bean<?>>((Collection) Arrays.asList(bean))));
         }
         return result;
     }
 
+    /**
+     * Allows to perform dependency injection for instances which aren't managed by CDI
+     * <p/>
+     * Attention:<br/>
+     * The resulting instance isn't managed by CDI, only fields annotated with @Inject get initialized.
+     *
+     * @param instance current instance
+     * @param <T> current type
+     * @return instance with injected fields (if possible - or null if the given instance is null)
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T injectFields(T instance)
+    {
+        if (instance == null)
+        {
+            return null;
+        }
+
+        BeanManager beanManager = getBeanManager();
+
+        CreationalContext creationalContext = beanManager.createCreationalContext(null);
+
+        AnnotatedType annotatedType = beanManager.createAnnotatedType(instance.getClass());
+        InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotatedType);
+        injectionTarget.inject(instance, creationalContext);
+        return instance;
+    }
+
     private static Set<Bean<?>> filterDefaultScopedBeans(Set<Bean<?>> beans)
     {
         Set<Bean<?>> result = new HashSet<Bean<?>>(beans.size());
@@ -285,6 +316,7 @@ public final class BeanProvider
 
     /**
      * Internal method to resolve the BeanManager via the {@link BeanManagerProvider}
+     * @return current bean-manager
      */
     private static BeanManager getBeanManager()
     {

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/04017e4c/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
index 33506c8..8884e31 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/BeanProviderTest.java
@@ -173,4 +173,31 @@ public class BeanProviderTest
 
         Assert.assertEquals(1, result.size());
     }
+
+    /*
+     * create a manual instance, inject dependencies, set values of the dependencies and check the referenced cdi bean
+     */
+    @Test
+    public void injectBeansInNonManagedInstance() throws Exception
+    {
+        ManualBean manualBean = new ManualBean();
+
+        Assert.assertNull(manualBean.getTestBean());
+
+        BeanProvider.injectFields(manualBean);
+
+        Assert.assertNotNull(manualBean.getTestBean());
+
+        Assert.assertEquals(4711, manualBean.getTestBean().getI());
+
+        int newValue = 14;
+
+        manualBean.getTestBean().setI(newValue);
+
+        Assert.assertEquals(newValue, manualBean.getTestBean().getI());
+
+        TestBean testBean = BeanProvider.getContextualReference(TestBean.class);
+
+        Assert.assertEquals(newValue, testBean.getI());
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/04017e4c/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/ManualBean.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/ManualBean.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/ManualBean.java
new file mode 100644
index 0000000..09cd94b
--- /dev/null
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/ManualBean.java
@@ -0,0 +1,34 @@
+/*
+* 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
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* 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.deltaspike.test.core.api.provider;
+
+import javax.enterprise.inject.Typed;
+import javax.inject.Inject;
+
+@Typed()
+class ManualBean
+{
+    @Inject
+    private TestBean testBean;
+
+    TestBean getTestBean()
+    {
+        return testBean;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/04017e4c/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/TestBean.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/TestBean.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/TestBean.java
index e4e73e4..dcf56a7 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/TestBean.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/provider/TestBean.java
@@ -25,7 +25,7 @@ import javax.inject.Named;
 @ApplicationScoped
 public class TestBean
 {
-    int i=4711;
+    private int i = 4711;
 
     public int getI()
     {