You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2017/12/06 12:12:04 UTC

svn commit: r1817292 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/inject/ main/java/org/apache/webbeans/portable/events/discovery/ main/java/org/apache/webbeans/util/ main/java/org/apache/webbeans/xml/ test/java/org/apache/...

Author: struberg
Date: Wed Dec  6 12:12:03 2017
New Revision: 1817292

URL: http://svn.apache.org/viewvc?rev=1817292&view=rev
Log:
OWB-1219 take Prioritized custom beans into consideration

even if a @Alternative @Priority bean exists.

Added:
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomPrioritizedBeanTest.java
      - copied, changed from r1817291, openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomBeanTest.java
Removed:
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomBeanTest.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/PriorityClasses.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/xml/DefaultBeanArchiveService.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java?rev=1817292&r1=1817291&r2=1817292&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AlternativesManager.java Wed Dec  6 12:12:03 2017
@@ -26,6 +26,7 @@ import java.util.Set;
 import javax.annotation.Priority;
 import javax.enterprise.inject.Alternative;
 import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.Prioritized;
 
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
@@ -123,6 +124,23 @@ public class AlternativesManager
     }
 
     /**
+     * This method is used to add Alternative Beans which implement the {@link Prioritized} interface
+     * This is performed after the Bean get's added.
+     */
+    public void addPrioritizedAlternativeBean(Bean<?> prioritizedBean)
+    {
+        if (prioritizedBean instanceof Prioritized)
+        {
+            priorityAlternatives.add(prioritizedBean.getBeanClass(), ((Prioritized) prioritizedBean).getPriority());
+        }
+        else
+        {
+            throw new WebBeansConfigurationException("Given Bean : " + prioritizedBean + " doesn't implement " +
+                        Prioritized.class.getName());
+        }
+    }
+
+    /**
      * Alternatives get ordered by their priority and as lowest priority all
      * the alternatives added via XML get added.
      * @return the list of sorted alternatives

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java?rev=1817292&r1=1817291&r2=1817292&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java Wed Dec  6 12:12:03 2017
@@ -195,6 +195,11 @@ public class AfterBeanDiscoveryImpl exte
         }
         else
         {
+            if (bean.isAlternative() && bean instanceof Prioritized)
+            {
+                webBeansContext.getAlternativesManager().addPrioritizedAlternativeBean(bean);
+            }
+
             beanManager.addBean(bean);
         }                
     }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/PriorityClasses.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/PriorityClasses.java?rev=1817292&r1=1817291&r2=1817292&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/PriorityClasses.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/PriorityClasses.java Wed Dec  6 12:12:03 2017
@@ -34,12 +34,25 @@ public class PriorityClasses
     private final List<PriorityClass> raw = new ArrayList<>();
     private List<Class<?>> sorted;
 
+    /**
+     * Used for Classes which are annotated with &#064;Priority
+     */
     public void add(Class<?> clazz, Priority priority)
     {
         raw.add(new PriorityClass(clazz, priority.value()));
         sorted = null;
     }
 
+    /**
+     * Used for Classes which are added by Beans which implement the
+     * {@link javax.enterprise.inject.spi.Prioritized} interface
+     */
+    public void add(Class<?> clazz, int priority)
+    {
+        raw.add(new PriorityClass(clazz, priority));
+        sorted = null;
+    }
+
     public List<Class<?>> getSorted()
     {
         if (sorted == null)

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/xml/DefaultBeanArchiveService.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/xml/DefaultBeanArchiveService.java?rev=1817292&r1=1817291&r2=1817292&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/xml/DefaultBeanArchiveService.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/xml/DefaultBeanArchiveService.java Wed Dec  6 12:12:03 2017
@@ -84,7 +84,7 @@ public class DefaultBeanArchiveService i
             {
                 // we have to 'normalise' both values and remove the beans.xml string to be compareable
                 String entryUrl = stripProtocol(entry.getKey());
-                if (entryUrl.length() > META_INF_BEANS_XML.length() &&
+                if (entryUrl.length(   ) > META_INF_BEANS_XML.length() &&
                     entryUrl.substring(entryUrl.length() - META_INF_BEANS_XML.length()).equalsIgnoreCase(META_INF_BEANS_XML))
                 {
                     entryUrl = entryUrl.substring(0, entryUrl.length() - META_INF_BEANS_XML.length());

Copied: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomPrioritizedBeanTest.java (from r1817291, openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomBeanTest.java)
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomPrioritizedBeanTest.java?p2=openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomPrioritizedBeanTest.java&p1=openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomBeanTest.java&r1=1817291&r2=1817292&rev=1817292&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomBeanTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/CustomPrioritizedBeanTest.java Wed Dec  6 12:12:03 2017
@@ -18,110 +18,94 @@
  */
 package org.apache.webbeans.test.portable;
 
+import javax.annotation.Priority;
+import javax.enterprise.context.RequestScoped;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Alternative;
+import javax.enterprise.inject.Default;
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
 import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.InjectionPoint;
-import javax.sql.DataSource;
-import java.io.PrintWriter;
+import javax.enterprise.inject.spi.Prioritized;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.SQLFeatureNotSupportedException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Set;
-import java.util.logging.Logger;
+
+import org.apache.webbeans.test.AbstractUnitTest;
+import org.junit.Assert;
+import org.junit.Test;
+
 
 /**
- * Test that custom Bean<T> impls work
+ * Test that custom Prioritized Beans work in conjunction with &#064;Priority.
+ * See OWB-1219.
  */
-public class CustomBeanTest
+public class CustomPrioritizedBeanTest extends AbstractUnitTest
 {
 
+    @Test
+    public void testCustomPrioritizedBeanInAbdTest()
+    {
+        addExtension(new CustomBeanAbdExtension());
+
+        startContainer(MySampleClass.class, MySampleAltrnativeClass.class);
+
+        MySampleInterface instance = getInstance(MySampleInterface.class);
+        Assert.assertEquals(MySampleAlternativeBean.class.getSimpleName(), instance.impl());
+    }
 
-    public static class CustomBeanExtension implements Extension
+    public static class CustomBeanAbdExtension implements Extension
     {
-        public void addBean(@Observes AfterBeanDiscovery abd, BeanManager beanManager)
+        public void addBean(@Observes AfterBeanDiscovery abd)
         {
-
+            abd.addBean(new MySampleAlternativeBean());
         }
     }
 
-    public static class MyBean implements Bean<DataSource>
+    public interface MySampleInterface
+    {
+        String impl();
+    }
+
+    @RequestScoped
+    public static class MySampleClass implements MySampleInterface
     {
         @Override
-        public DataSource create(CreationalContext<DataSource> context)
+        public String impl()
         {
-            return new DataSource()
-            {
-                @Override
-                public Connection getConnection() throws SQLException
-                {
-                    return null;
-                }
-
-                @Override
-                public Connection getConnection(String username, String password) throws SQLException
-                {
-                    return null;
-                }
-
-                @Override
-                public PrintWriter getLogWriter() throws SQLException
-                {
-                    return null;
-                }
-
-                @Override
-                public void setLogWriter(PrintWriter out) throws SQLException
-                {
-
-                }
-
-                @Override
-                public void setLoginTimeout(int seconds) throws SQLException
-                {
-
-                }
-
-                @Override
-                public int getLoginTimeout() throws SQLException
-                {
-                    return 0;
-                }
-
-                public Logger getParentLogger() throws SQLFeatureNotSupportedException
-                {
-                    return null;
-                }
-
-                @Override
-                public <T> T unwrap(Class<T> iface) throws SQLException
-                {
-                    return null;
-                }
+            return this.getClass().getSimpleName();
+        }
+    }
 
-                @Override
-                public boolean isWrapperFor(Class<?> iface) throws SQLException
-                {
-                    return false;
-                }
-            };
+    @Alternative
+    @Priority(1000)
+    @RequestScoped
+    public static class MySampleAltrnativeClass implements MySampleInterface
+    {
+        @Override
+        public String impl()
+        {
+            return this.getClass().getSimpleName();
         }
+    }
 
+    public static class MySampleAlternativeBean implements Bean<MySampleInterface>, Prioritized
+    {
         @Override
         public Set<InjectionPoint> getInjectionPoints()
         {
-            return null;
+            return Collections.emptySet();
         }
 
         @Override
         public Class<?> getBeanClass()
         {
-            return null;
+            return MySampleInterface.class;
         }
 
         @Override
@@ -131,21 +115,40 @@ public class CustomBeanTest
         }
 
         @Override
+        public MySampleInterface create(CreationalContext<MySampleInterface> context)
+        {
+            return new MySampleInterface()
+            {
+                @Override
+                public String impl()
+                {
+                    return MySampleAlternativeBean.class.getSimpleName();
+                }
+            };
+        }
+
+        @Override
+        public void destroy(MySampleInterface instance, CreationalContext<MySampleInterface> context)
+        {
+            // no-op
+        }
+
+        @Override
         public Set<Type> getTypes()
         {
-            return null;
+            return new HashSet<>(Arrays.asList(Object.class, MySampleInterface.class));
         }
 
         @Override
         public Set<Annotation> getQualifiers()
         {
-            return null;
+            return Collections.singleton(Default.Literal.INSTANCE);
         }
 
         @Override
         public Class<? extends Annotation> getScope()
         {
-            return null;
+            return RequestScoped.class;
         }
 
         @Override
@@ -157,19 +160,21 @@ public class CustomBeanTest
         @Override
         public Set<Class<? extends Annotation>> getStereotypes()
         {
-            return null;
+            return Collections.emptySet();
         }
 
         @Override
         public boolean isAlternative()
         {
-            return false;
+            return true;
         }
 
         @Override
-        public void destroy(DataSource instance, CreationalContext<DataSource> context)
+        public int getPriority()
         {
-
+            return 2000;
         }
     }
+
+
 }