Author: struberg
Date: Fri Jun  6 20:28:54 2014
New Revision: 1600999

URL: http://svn.apache.org/r1600999
Log:
OWB-968 fix infinite loop in Generics handling of Enums

happens because is illegally defined as 
 Enum<E extends Enum<E>>
which actually contradicts the Java lang spec...

Added:
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnum.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnumProducer.java
Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/GenericsTest.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java?rev=1600999&r1=1600998&r2=1600999&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
 Fri Jun  6 20:28:54 2014
@@ -61,6 +61,8 @@ public final class ClassUtil
         PRIMITIVE_TO_WRAPPERS_MAP.put(Void.TYPE,Void.class);
     }
 
+    public static final Type[] NO_TYPES = new Type[0];
+
     /*
      * Private constructor
      */
@@ -726,7 +728,7 @@ public final class ClassUtil
         }
         else
         {
-            return new Type[0];
+            return NO_TYPES;
         }
     }
 

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java?rev=1600999&r1=1600998&r2=1600999&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
 Fri Jun  6 20:28:54 2014
@@ -462,7 +462,20 @@ public final class GenericsUtil
         else if (type instanceof ParameterizedType)
         {
             ParameterizedType parameterizedType = (ParameterizedType)type;
-            Type[] resolvedTypeArguments = 
resolveTypes(parameterizedType.getActualTypeArguments(), actualType);
+
+            Type[] resolvedTypeArguments;
+            if (Enum.class.equals(parameterizedType.getRawType()))
+            {
+                // Enums derive from themselves, which would create an 
infinite loop
+                // we directly escape the loop if we detect this.
+                resolvedTypeArguments = new Type[]{new OwbWildcardTypeImpl(new 
Type[]{Enum.class}, ClassUtil.NO_TYPES)};
+            }
+            else
+            {
+                resolvedTypeArguments = 
resolveTypes(parameterizedType.getActualTypeArguments(), actualType);
+
+            }
+
             return new 
OwbParametrizedTypeImpl(parameterizedType.getOwnerType(), 
parameterizedType.getRawType(), resolvedTypeArguments);
         }
         else if (type instanceof TypeVariable)

Added: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnum.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnum.java?rev=1600999&view=auto
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnum.java
 (added)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnum.java
 Fri Jun  6 20:28:54 2014
@@ -0,0 +1,27 @@
+/*
+ * 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.webbeans.test.injection.generics;
+
+/**
+ * Scanning enums did blow up our GenericsUtil with an infinite loop...
+ */
+public enum BazEnum
+{
+    YES, NO;
+}

Added: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnumProducer.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnumProducer.java?rev=1600999&view=auto
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnumProducer.java
 (added)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/BazEnumProducer.java
 Fri Jun  6 20:28:54 2014
@@ -0,0 +1,33 @@
+/*
+ * 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.webbeans.test.injection.generics;
+
+import javax.enterprise.inject.Produces;
+
+/**
+ * Scanning enums did blow up our GenericsUtil with an infinite loop...
+ */
+public class BazEnumProducer
+{
+    @Produces
+    public BazEnum createBazEnum()
+    {
+        return BazEnum.YES;
+    }
+}

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/GenericsTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/GenericsTest.java?rev=1600999&r1=1600998&r2=1600999&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/GenericsTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/injection/generics/GenericsTest.java
 Fri Jun  6 20:28:54 2014
@@ -30,8 +30,8 @@ import javax.enterprise.inject.spi.Injec
 import javax.enterprise.inject.spi.ObserverMethod;
 import javax.enterprise.util.TypeLiteral;
 
+import junit.framework.Assert;
 import org.apache.webbeans.test.AbstractUnitTest;
-import org.junit.Ignore;
 import org.junit.Test;
 
 
@@ -112,4 +112,19 @@ public class GenericsTest extends Abstra
         assertNotNull(foo.getABazEvent());
         assertEquals((String) foo.getAObserverInjectionPoint(), "a produced 
String");
     }
+
+    @Test
+    public void testEnum() throws Exception
+    {
+        startContainer(BazEnum.class);
+    }
+
+    @Test
+    public void testEnumProducer() throws Exception
+    {
+        startContainer(BazEnumProducer.class);
+        BazEnum bazEnum = getInstance(BazEnum.class);
+        Assert.assertNotNull(bazEnum);
+        Assert.assertEquals(BazEnum.YES, bazEnum);
+    }
 }


Reply via email to