This is an automated email from the ASF dual-hosted git repository.

mattjuntunen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-configuration.git

commit 079cf7176989fb91d622a6a06f1fb7023cb79a25
Author: Bruno P. Kinoshita <ki...@users.noreply.github.com>
AuthorDate: Tue May 10 17:41:35 2022 +1200

    [CONFIGURATION-813] Support javamail 2.0 and javax to jakarta migration
---
 src/changes/changes.xml                               |  6 ++++++
 .../commons/configuration2/DataConfiguration.java     |  1 +
 .../configuration2/convert/PropertyConverter.java     | 19 +++++++++++++++++--
 .../commons/configuration2/TestDataConfiguration.java |  9 ++++++---
 4 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 0f7ce718..b97ba57d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -68,6 +68,9 @@
        <action type="fix" dev="ggregory" due-to="Gary Gregory">
          Implement proper concurrency in ConstantLookup.
        </action>
+       <action issue="CONFIGURATION-813" type="fix" dev="kinow" 
due-to="Dependabot">
+         Support new namespace jakarta.mail.* used by javamail 2.0+ (first 
release October 2020) #107.
+       </action>
        <!-- ADD -->
        <action type="add" dev="ggregory" due-to="SethiPandi">
          Implement Iterable in ImmutableNode #74.
@@ -200,6 +203,9 @@
        <action type="update" dev="ggregory" due-to="Dependabot">
          Bump slf4j.version from 1.7.33 to 1.7.36 #166.
        </action>
+       <action type="update" dev="kinow" due-to="Dependabot">
+          Bump mailapi from 1.6.6 to 2.0.1 #107.
+       </action>
     </release>
     <release version="2.7" date="2020-03-07"
              description="Minor release with new features and updated 
dependencies.">
diff --git 
a/src/main/java/org/apache/commons/configuration2/DataConfiguration.java 
b/src/main/java/org/apache/commons/configuration2/DataConfiguration.java
index 488648cc..0b532dad 100644
--- a/src/main/java/org/apache/commons/configuration2/DataConfiguration.java
+++ b/src/main/java/org/apache/commons/configuration2/DataConfiguration.java
@@ -46,6 +46,7 @@ import org.apache.commons.lang3.StringUtils;
  * <li>{@link java.awt.Color}</li>
  * <li>{@link java.net.InetAddress}</li>
  * <li>{@code javax.mail.internet.InternetAddress} (requires Javamail in the 
classpath)</li>
+ * <li>{@code jakarta.mail.internet.InternetAddress} (requires Javamail 2.+ in 
the classpath)</li>
  * <li>{@link java.lang.Enum} (Java 5 enumeration types)</li>
  * </ul>
  *
diff --git 
a/src/main/java/org/apache/commons/configuration2/convert/PropertyConverter.java
 
b/src/main/java/org/apache/commons/configuration2/convert/PropertyConverter.java
index b1a55b2e..2c2b451e 100644
--- 
a/src/main/java/org/apache/commons/configuration2/convert/PropertyConverter.java
+++ 
b/src/main/java/org/apache/commons/configuration2/convert/PropertyConverter.java
@@ -70,6 +70,9 @@ public final class PropertyConverter {
     /** The fully qualified name of {@code 
javax.mail.internet.InternetAddress} */
     private static final String INTERNET_ADDRESS_CLASSNAME = 
"javax.mail.internet.InternetAddress";
 
+    /** The fully qualified name of {@code 
jakarta.mail.internet.InternetAddress} */
+    private static final String INTERNET_ADDRESS_CLASSNAME_JAKARTA = 
"jakarta.mail.internet.InternetAddress";
+
     /**
      * Private constructor prevents instances from being created.
      */
@@ -150,6 +153,8 @@ public final class PropertyConverter {
             return toColor(value);
         } else if (cls.getName().equals(INTERNET_ADDRESS_CLASSNAME)) {
             return toInternetAddress(value);
+        } else if (cls.getName().equals(INTERNET_ADDRESS_CLASSNAME_JAKARTA)) {
+            return toInternetAddress(value);
         } else if (InetAddress.class.isAssignableFrom(cls)) {
             return toInetAddress(value);
         } else if (Duration.class.equals(cls)) {
@@ -607,12 +612,22 @@ public final class PropertyConverter {
         if (value.getClass().getName().equals(INTERNET_ADDRESS_CLASSNAME)) {
             return value;
         }
+        if 
(value.getClass().getName().equals(INTERNET_ADDRESS_CLASSNAME_JAKARTA)) {
+            return value;
+        }
         if (!(value instanceof String)) {
             throw new ConversionException("The value " + value + " can't be 
converted to a InternetAddress");
         }
         try {
-            final Constructor<?> ctor = 
Class.forName(INTERNET_ADDRESS_CLASSNAME).getConstructor(String.class);
-            return ctor.newInstance(value);
+            try {
+                // javamail-2.0+, with jakarta.mail.* namespace.
+                final Constructor<?> ctor = 
Class.forName(INTERNET_ADDRESS_CLASSNAME_JAKARTA).getConstructor(String.class);
+                return ctor.newInstance(value);
+            } catch (ClassNotFoundException e) {
+                // maybe javamail-1.*? With javax.mail.* namespace.
+                final Constructor<?> ctor = 
Class.forName(INTERNET_ADDRESS_CLASSNAME).getConstructor(String.class);
+                return ctor.newInstance(value);
+            }
         } catch (final Exception e) {
             throw new ConversionException("The value " + value + " can't be 
converted to a InternetAddress", e);
         }
diff --git 
a/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java 
b/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java
index 532473f7..af393b0a 100644
--- a/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java
+++ b/src/test/java/org/apache/commons/configuration2/TestDataConfiguration.java
@@ -73,10 +73,13 @@ public class TestDataConfiguration {
 
     /**
      * Create an instance of InternetAddress. This trick is necessary to 
compile and run the test with Java 1.3 and the
-     * javamail-1.4 which is not compatible with Java 1.3
+     * javamail-1.4 which is not compatible with Java 1.3.
+     *
+     * <p>javamail-2.0 had a namespace change, moving javax.mail.* to 
jakarta.mail.*. This test verifies if we have
+     * javax.mail.* in the classpath before trying the Jakarta classes.</p>
      */
     private Object createInternetAddress(final String email) throws Exception {
-        final Class<?> cls = 
Class.forName("javax.mail.internet.InternetAddress");
+        final Class<?> cls = 
Class.forName("jakarta.mail.internet.InternetAddress");
         return cls.getConstructor(String.class).newInstance(email);
     }
 
@@ -839,7 +842,7 @@ public class TestDataConfiguration {
         }
 
         try {
-            conf.get(Class.forName("javax.mail.internet.InternetAddress"), 
"key1");
+            conf.get(Class.forName("jakarta.mail.internet.InternetAddress"), 
"key1");
             fail("getInternetAddress didn't throw a ConversionException");
         } catch (final ConversionException e) {
             // expected

Reply via email to