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