HCL-TECH-SOFTWARE / domino-jnx

Modern Domino Java API based on JNA access to Domino's C API
https://opensource.hcltechsw.com/domino-jnx/
Apache License 2.0
12 stars 3 forks source link

A jakarta.mail library issue in a RunJavaAddin class #428

Open sbasegmez opened 3 months ago

sbasegmez commented 3 months ago

A class extending RunJavaAddin generates an exception about Jakarta.mail class.

       Optional<Item> item = doc.getFirstItem("Details");

        if(item.isPresent()) {
            switch (item.get().getType()) {
                case TYPE_COMPOSITE: // RichText
                    RichTextRecordList rtl = item.get().getValueRichText();
                    return rtl.extractText();
                case TYPE_MIME_PART: // MIME
                    MimeData mimeData = doc.get("Details", MimeData.class, null); <<<<<<<<
                    if (null != mimeData) {
                        return mimeData.getPlainText();
                    }
                    break;
                default:
                    return item.get().getAsText(' ');
            }
        }

The marked line throws the following stack trace:

RunJava JVM: Exception in thread "Thread-0"
RunJava JVM: java.util.ServiceConfigurationError: Jakarta.mail.Provider: Provider com.sun.mail.imap.IMAPProvider could not be instantiated
RunJava JVM:    at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:594)
RunJava JVM:    at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:821)
RunJava JVM:    at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:737)
RunJava JVM:    at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1422)
RunJava JVM:    at jakarta.mail.Session.loadProviders(Session.java:964)
RunJava JVM:    at jakarta.mail.Session.<init>(Session.java:254)
RunJava JVM:    at jakarta.mail.Session.getInstance(Session.java:281)
RunJava JVM:    at com.hcl.domino.jna.mime.JNAMimeReader.lambda$readMIME$0(JNAMimeReader.java:158)
RunJava JVM:    at java.base/java.security.AccessController.doPrivileged(AccessController.java:692)
RunJava JVM:    at com.hcl.domino.jna.mime.JNAMimeReader.readMIME(JNAMimeReader.java:143)
RunJava JVM:    at com.hcl.domino.jna.internal.converters.MimeDataDocumentValueConverter.getValue(MimeDataDocumentValueConverter.java:82)
RunJava JVM:    at com.hcl.domino.jna.internal.converters.MimeDataDocumentValueConverter.getValue(MimeDataDocumentValueConverter.java:60)
RunJava JVM:    at com.hcl.domino.jna.data.JNADocument$1.getViaValueConverter(JNADocument.java:228)
RunJava JVM:    at com.hcl.domino.commons.data.AbstractTypedAccess.get(AbstractTypedAccess.java:118)
RunJava JVM:    at com.hcl.domino.jna.data.JNADocument.get(JNADocument.java:3480)
RunJava JVM:    at com.developi.engage24.ProjectsGateway.extractDetails(ProjectsGateway.java:102)
RunJava JVM:    at com.developi.engage24.ProjectsGateway.extractText(ProjectsGateway.java:87)
RunJava JVM:    at com.developi.engage24.ProjectsGateway.lambda$extractTextSegment$1(ProjectsGateway.java:69)
RunJava JVM:    at java.base/java.util.Optional.map(Optional.java:260)
RunJava JVM:    at com.developi.engage24.ProjectsGateway.extractTextSegment(ProjectsGateway.java:68)
RunJava JVM:    at com.developi.engage24.ProjectsGateway.lambda$getProjects$0(ProjectsGateway.java:47)
RunJava JVM:    at com.hcl.domino.jna.data.DbQueryResultUtil.forEachDocument(DbQueryResultUtil.java:404)
RunJava JVM:    at com.hcl.domino.jna.data.JNADQLQueryResult.forEachDocument(JNADQLQueryResult.java:143)
RunJava JVM:    at com.developi.engage24.ProjectsGateway.getProjects(ProjectsGateway.java:47)
RunJava JVM:    at com.developi.engage24.QDrantUploader.run(QDrantUploader.java:89)
RunJava JVM:    at ProjectsUploader.runAddin(ProjectsUploader.java:35)
RunJava JVM:    at com.hcl.domino.server.RunJavaAddin.run(RunJavaAddin.java:73)
RunJava JVM: Caused by:
RunJava JVM: java.lang.SecurityException: Signers of 'com.sun.mail.imap.IMAPStore' do not match signers of other classes in package
RunJava JVM:    at java.base/java.lang.ClassLoader.checkPackageSigners(ClassLoader.java:581)
RunJava JVM:    at java.base/java.lang.ClassLoader.defineClassInternal(ClassLoader.java:459)
RunJava JVM:    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:433)
RunJava JVM:    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
RunJava JVM:    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:1174)
RunJava JVM:    at java.base/jdk.internal.loader.BuiltinClassLoader$6.run(BuiltinClassLoader.java:974)
RunJava JVM:    at java.base/jdk.internal.loader.BuiltinClassLoader$6.run(BuiltinClassLoader.java:969)
RunJava JVM:    at java.base/java.security.AccessController.doPrivileged(AccessController.java:692)
RunJava JVM:    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:982)
RunJava JVM:    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:867)
RunJava JVM:    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:825)
RunJava JVM:    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
RunJava JVM:    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1095)
RunJava JVM:    at com.sun.mail.imap.IMAPProvider.<init>(IMAPProvider.java:29)
RunJava JVM:    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
RunJava JVM:    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
RunJava JVM:    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
RunJava JVM:    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
RunJava JVM:    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
RunJava JVM:    at java.base/java.util.ServiceLoader$ProviderImpl$2.run(ServiceLoader.java:805)
RunJava JVM:    at java.base/java.security.AccessController.doPrivileged(AccessController.java:784)
RunJava JVM:    at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:810)
RunJava JVM:    ... 25 more

I don't think we can find a solution for this problem, as it is systematic for the domino environment. But a workaround would be great.

The server is Domino Server 14.0.1. Using JNX version 1.40

jesse-gallagher commented 3 months ago

Hmm, this may be very sticky indeed. Since RunJava stuff runs all in the same classpath pool, then the newer-era Jakarta Mail implementation will butt heads with the ancient one included in Domino.

The trouble is that Jakarta Mail is the closest to a standard that we can target for this sort of thing, but the presence of the old one in Domino makes it tough. It could be possible to provide an alternative fork of Jakarta Mail that doesn't reference the old class names for cases like this, but that'll take some investigation.

jesse-gallagher commented 3 months ago

Could you try using this dependency instead of com.sun.mail:jakarta-mail?

<dependency>
  <groupId>org.eclipse.angus</groupId>
  <artifactId>jakarta.mail</artifactId>
  <version>2.0.3</version>
</dependency>

You may also have to add an exclusion in your JNX dependency to exclude jakarta.mail:jakarta.mail-api, since Angus's jakarta.mail includes the API.

It requires Java 11, which is why JNX doesn't reference it yet, but it has the very-pleasant trait of them finally having renamed away from com.sun in the default mailcap file.

It's possible it will still run into trouble due to finding the mailcap file in the other JAR first, but it's worth a try. If this happens and you're not currently glomming everything together into one JAR, it could be worth trying that with maven-shade-plugin.

sbasegmez commented 2 months ago

I couldn't try this. I gave up this path since I noticed that this was poisoning my dependencies in the OSGi part. It makes sense to take the Rust-based add-in path instead.