You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ni...@apache.org on 2010/02/21 03:52:56 UTC

svn commit: r912292 - in /commons/proper/lang/branches/LANG_2_X: ./ src/main/java/org/apache/commons/lang/enum/ src/main/java/org/apache/commons/lang/enums/ src/test/java/org/apache/commons/lang/enums/

Author: niallp
Date: Sun Feb 21 02:52:56 2010
New Revision: 912292

URL: http://svn.apache.org/viewvc?rev=912292&view=rev
Log:
LANG-76 EnumUtils.getEnum() doesn't work in 1.5+ - force initialization of the Enum class using Class.forName() thanks to Marcus Schulte for the solution
(Note: for JDK 1.5+ the Ant build compiles EnumUtilsLang76Test with source/target 1.5 which causes this problem to occur)

Added:
    commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java   (with props)
Modified:
    commons/proper/lang/branches/LANG_2_X/build.xml
    commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java
    commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java
    commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsTest.java

Modified: commons/proper/lang/branches/LANG_2_X/build.xml
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/build.xml?rev=912292&r1=912291&r2=912292&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/build.xml (original)
+++ commons/proper/lang/branches/LANG_2_X/build.xml Sun Feb 21 02:52:56 2010
@@ -53,6 +53,7 @@
         <filter token="compile.source" value="${compile.source}"/>
         <filter token="compile.target" value="${compile.target}"/>
         <mkdir dir="${build.home}"/>
+        <available property="jdk.1.5.present" classname="java.lang.StringBuilder"/>
     </target>
 
     <!-- ========== Compile Targets ========================================= -->
@@ -66,9 +67,21 @@
         </copy>
     </target>
 
-    <target name="compile.tests" depends="compile" description="Compile unit test cases">
+    <!-- Compile EnumUtilsLang76Test using source/target 1.5 if JDK 1.5 present (see LANG-76) -->
+    <target name="test.compile.jdk15" depends="compile" description="Run test for LANG-76" if="jdk.1.5.present">
+        <echo message="Compiling EnumUtilsLang76Test using source/target 1.5"/>
+        <mkdir dir="${build.home}/tests"/>
+        <javac srcdir="${test.home}" destdir="${build.home}/tests"
+               target="1.5" source="1.5"
+               includes="org/apache/commons/lang/enums/EnumUtilsLang76Test.java">
+            <classpath refid="test.classpath"/>
+        </javac>
+    </target>
+
+    <target name="compile.tests" depends="compile,test.compile.jdk15" description="Compile unit test cases">
         <mkdir dir="${build.home}/tests"/>
         <javac srcdir="${test.home}" destdir="${build.home}/tests" debug="${compile.debug}" deprecation="off" target="${compile.target}" source="${compile.source}" optimize="${compile.optimize}">
+            <exclude name="org/apache/commons/lang/enums/EnumUtilsLang76Test.java" if="jdk.1.5.present"/>
             <classpath refid="test.classpath"/>
         </javac>
         <copy todir="${build.home}/tests" filtering="on">

Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java?rev=912292&r1=912291&r2=912292&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java (original)
+++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java Sun Feb 21 02:52:56 2010
@@ -484,6 +484,17 @@
             throw new IllegalArgumentException("The Class must be a subclass of Enum");
         }
         Entry entry = (Entry) cEnumClasses.get(enumClass);
+
+        if (entry == null) {
+            try {
+                // LANG-76 - try to force class initialization for JDK 1.5+
+                Class.forName(enumClass.getName(), true, enumClass.getClassLoader());
+                entry = (Entry) cEnumClasses.get(enumClass);
+            } catch (Throwable t) {
+                // Ignore
+            }
+        }
+
         return entry;
     }
     

Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java?rev=912292&r1=912291&r2=912292&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java (original)
+++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java Sun Feb 21 02:52:56 2010
@@ -530,6 +530,17 @@
             throw new IllegalArgumentException("The Class must be a subclass of Enum");
         }
         Entry entry = (Entry) cEnumClasses.get(enumClass);
+
+        if (entry == null) {
+            try {
+                // LANG-76 - try to force class initialization for JDK 1.5+
+                Class.forName(enumClass.getName(), true, enumClass.getClassLoader());
+                entry = (Entry) cEnumClasses.get(enumClass);
+            } catch (Throwable t) {
+                // Ignore
+            }
+        }
+
         return entry;
     }
     

Added: commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java?rev=912292&view=auto
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java (added)
+++ commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java Sun Feb 21 02:52:56 2010
@@ -0,0 +1,53 @@
+/*
+ * 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.commons.lang.enums;
+
+import junit.framework.TestCase;
+
+/**
+ * Test cases for the LANG-76 issue with {@link EnumUtils}.
+ *
+ * NOTE: this needs to be compiled with source/target versions set to 1.5
+ *       in order to replicate/test the issue properly
+ */
+public class EnumUtilsLang76Test extends TestCase {
+
+    public EnumUtilsLang76Test(String name) {
+        super(name);
+    }
+
+    /**
+     * Test LANG-76
+     */
+    public void test_EnumUtils_getEnum_LANG76() {
+        Object obj = EnumUtils.getEnum(TestEnum.class, "1");
+        assertNotNull("Enum is not intialized", obj);
+        assertEquals("EnumUtilsLang76Test.TestEnum[1]", obj.toString());
+    }
+
+    /** Test Enum for LANG-76 **/
+    public static final class TestEnum  extends Enum {
+        private static final long serialVersionUID = 1L;
+        public static final TestEnum ONE     = new TestEnum("1");
+        public static final TestEnum TWO     = new TestEnum("2");
+        public static final TestEnum THREE   = new TestEnum("3");
+
+        private TestEnum(String value) {
+            super(value);
+        }
+    }
+}

Propchange: commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsTest.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsTest.java?rev=912292&r1=912291&r2=912292&view=diff
==============================================================================
--- commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsTest.java (original)
+++ commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsTest.java Sun Feb 21 02:52:56 2010
@@ -156,22 +156,4 @@
             fail();
         } catch (IllegalArgumentException ex) {}
     }
-
-    /** Test for LANG-76 **/
-    public void testGetEnum_LANG76() {
-        Object obj = EnumUtils.getEnum(Lang76Enum.class, "1");
-        assertNotNull(obj);
-        assertEquals("EnumUtilsTest.Lang76Enum[1]", obj.toString());
-    }
-
-    /** Test Enum for LANG-76 **/
-    public static final class Lang76Enum  extends Enum {
-        public static final Lang76Enum ONE     = new Lang76Enum("1");
-        public static final Lang76Enum TWO     = new Lang76Enum("2");
-        public static final Lang76Enum THREE   = new Lang76Enum("3");
-
-        private Lang76Enum(String suit) {
-            super(suit);
-        }
-    }
 }



Re: svn commit: r912292 - in /commons/proper/lang/branches/LANG_2_X: ./ src/main/java/org/apache/commons/lang/enum/ src/main/java/org/apache/commons/lang/enums/ src/test/java/org/apache/commons/lang/enums/

Posted by Niall Pemberton <ni...@gmail.com>.
On Sun, Feb 21, 2010 at 8:03 PM, sebb <se...@gmail.com> wrote:
> On 21/02/2010, niallp@apache.org <ni...@apache.org> wrote:
>> Author: niallp
>>  Date: Sun Feb 21 02:52:56 2010
>>  New Revision: 912292
>>
>>  URL: http://svn.apache.org/viewvc?rev=912292&view=rev
>>  Log:
>>  LANG-76 EnumUtils.getEnum() doesn't work in 1.5+ - force initialization of the Enum class using Class.forName() thanks to Marcus Schulte for the solution
>>  (Note: for JDK 1.5+ the Ant build compiles EnumUtilsLang76Test with source/target 1.5 which causes this problem to occur)
>>
>>  Added:
>>     commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java   (with props)
>>  Modified:
>>     commons/proper/lang/branches/LANG_2_X/build.xml
>>     commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java
>>     commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java
>>     commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsTest.java
>>
> ...
>>  Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java
>>  URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java?rev=912292&r1=912291&r2=912292&view=diff
>>  ==============================================================================
>>  --- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java (original)
>>  +++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java Sun Feb 21 02:52:56 2010
>>  @@ -484,6 +484,17 @@
>>              throw new IllegalArgumentException("The Class must be a subclass of Enum");
>>          }
>>          Entry entry = (Entry) cEnumClasses.get(enumClass);
>>  +
>>  +        if (entry == null) {
>>  +            try {
>>  +                // LANG-76 - try to force class initialization for JDK 1.5+
>>  +                Class.forName(enumClass.getName(), true, enumClass.getClassLoader());
>>  +                entry = (Entry) cEnumClasses.get(enumClass);
>>  +            } catch (Throwable t) {
>>  +                // Ignore
>
> Not a good idea to ignore Throwable.

OK I've changed it to Exception:

http://svn.apache.org/viewvc?view=revision&revision=912394

Niall

>>  +            }
>>  +        }
>>  +
>>          return entry;
>>      }
>>
>>
>>  Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java
>>  URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java?rev=912292&r1=912291&r2=912292&view=diff
>>  ==============================================================================
>>  --- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java (original)
>>  +++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java Sun Feb 21 02:52:56 2010
>>  @@ -530,6 +530,17 @@
>>              throw new IllegalArgumentException("The Class must be a subclass of Enum");
>>          }
>>          Entry entry = (Entry) cEnumClasses.get(enumClass);
>>  +
>>  +        if (entry == null) {
>>  +            try {
>>  +                // LANG-76 - try to force class initialization for JDK 1.5+
>>  +                Class.forName(enumClass.getName(), true, enumClass.getClassLoader());
>>  +                entry = (Entry) cEnumClasses.get(enumClass);
>>  +            } catch (Throwable t) {
>>  +                // Ignore
>
> Ditto.
>
>>  +            }
>>  +        }
>>  +
>>          return entry;
>>      }
>>
>>
>
> ...
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r912292 - in /commons/proper/lang/branches/LANG_2_X: ./ src/main/java/org/apache/commons/lang/enum/ src/main/java/org/apache/commons/lang/enums/ src/test/java/org/apache/commons/lang/enums/

Posted by sebb <se...@gmail.com>.
On 21/02/2010, niallp@apache.org <ni...@apache.org> wrote:
> Author: niallp
>  Date: Sun Feb 21 02:52:56 2010
>  New Revision: 912292
>
>  URL: http://svn.apache.org/viewvc?rev=912292&view=rev
>  Log:
>  LANG-76 EnumUtils.getEnum() doesn't work in 1.5+ - force initialization of the Enum class using Class.forName() thanks to Marcus Schulte for the solution
>  (Note: for JDK 1.5+ the Ant build compiles EnumUtilsLang76Test with source/target 1.5 which causes this problem to occur)
>
>  Added:
>     commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsLang76Test.java   (with props)
>  Modified:
>     commons/proper/lang/branches/LANG_2_X/build.xml
>     commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java
>     commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java
>     commons/proper/lang/branches/LANG_2_X/src/test/java/org/apache/commons/lang/enums/EnumUtilsTest.java
>
...
>  Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java
>  URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java?rev=912292&r1=912291&r2=912292&view=diff
>  ==============================================================================
>  --- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java (original)
>  +++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enum/Enum.java Sun Feb 21 02:52:56 2010
>  @@ -484,6 +484,17 @@
>              throw new IllegalArgumentException("The Class must be a subclass of Enum");
>          }
>          Entry entry = (Entry) cEnumClasses.get(enumClass);
>  +
>  +        if (entry == null) {
>  +            try {
>  +                // LANG-76 - try to force class initialization for JDK 1.5+
>  +                Class.forName(enumClass.getName(), true, enumClass.getClassLoader());
>  +                entry = (Entry) cEnumClasses.get(enumClass);
>  +            } catch (Throwable t) {
>  +                // Ignore

Not a good idea to ignore Throwable.

>  +            }
>  +        }
>  +
>          return entry;
>      }
>
>
>  Modified: commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java
>  URL: http://svn.apache.org/viewvc/commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java?rev=912292&r1=912291&r2=912292&view=diff
>  ==============================================================================
>  --- commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java (original)
>  +++ commons/proper/lang/branches/LANG_2_X/src/main/java/org/apache/commons/lang/enums/Enum.java Sun Feb 21 02:52:56 2010
>  @@ -530,6 +530,17 @@
>              throw new IllegalArgumentException("The Class must be a subclass of Enum");
>          }
>          Entry entry = (Entry) cEnumClasses.get(enumClass);
>  +
>  +        if (entry == null) {
>  +            try {
>  +                // LANG-76 - try to force class initialization for JDK 1.5+
>  +                Class.forName(enumClass.getName(), true, enumClass.getClassLoader());
>  +                entry = (Entry) cEnumClasses.get(enumClass);
>  +            } catch (Throwable t) {
>  +                // Ignore

Ditto.

>  +            }
>  +        }
>  +
>          return entry;
>      }
>
>

...

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org