From fca03ea334be5eb34e919a5cc7ca8bc25d79a564 Mon Sep 17 00:00:00 2001
From: Christof Rabensteiner <christof.rabensteiner@iaik.tugraz.at>
Date: Wed, 30 Oct 2019 15:54:56 +0100
Subject: Remove JAXB Class Not Found Fix

- Problem: Apparently I used the wrong executor when supplying the
  backend tasks via CompletableFuture.supplyAsync(). This method
  relies on ForkJoinPool.commonPool(), and threads in this pool are
  not configured correctly?
- Solution: Use spring-boots auto-configured TaskExecutor.
- More Information on this issue can be found here:
  https://issues.apache.org/jira/browse/CXF-8100#
---
 .../at/gv/egiz/moazs/client/ClientFactory.java     |  7 +-
 .../java/at/gv/egiz/moazs/scheme/Marshaller.java   | 11 +--
 .../java/at/gv/egiz/moazs/service/MzsService.java  |  6 +-
 .../gv/egiz/moazs/util/JAXBClassNotFoundFix.java   | 83 ----------------------
 4 files changed, 11 insertions(+), 96 deletions(-)
 delete mode 100644 src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java

diff --git a/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java b/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java
index 04eedab..a14e693 100644
--- a/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java
+++ b/src/main/java/at/gv/egiz/moazs/client/ClientFactory.java
@@ -23,7 +23,6 @@ package at.gv.egiz.moazs.client;
 
 import at.gv.egiz.moazs.preprocess.ConfigUtil;
 import at.gv.egiz.moazs.util.FileUtils;
-import at.gv.egiz.moazs.util.JAXBClassNotFoundFix;
 import at.gv.egiz.moazs.util.StoreSOAPBodyBinaryInRepositoryInterceptor;
 import at.gv.zustellung.app2mzs.xsd.ClientType;
 import at.gv.zustellung.app2mzs.xsd.KeyStoreType;
@@ -42,9 +41,9 @@ import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Component;
 
-import javax.annotation.Nullable;
 import javax.net.ssl.SSLContext;
 import javax.xml.ws.BindingProvider;
 import javax.xml.ws.soap.SOAPBinding;
@@ -86,7 +85,7 @@ public class ClientFactory {
      * @return the client
      */
     public <T> T create(ClientType params, Class<T> clazz) {
-        return JAXBClassNotFoundFix.runInTheadWithClassClassLoader(() -> create(params, clazz, true));
+        return create(params, clazz, true);
     }
 
     /**
@@ -96,7 +95,7 @@ public class ClientFactory {
      * @return the client
      */
     public <T> T createSoap11(ClientType params, Class<T> clazz) {
-        return JAXBClassNotFoundFix.runInTheadWithClassClassLoader(() -> create(params, clazz, false));
+        return create(params, clazz, false);
     }
 
 
diff --git a/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java b/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java
index 3c144d4..8722cf4 100644
--- a/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java
+++ b/src/main/java/at/gv/egiz/moazs/scheme/Marshaller.java
@@ -30,8 +30,6 @@ import java.io.InputStream;
 import java.io.StringWriter;
 import java.util.HashMap;
 
-import static at.gv.egiz.moazs.util.JAXBClassNotFoundFix.runInTheadWithClassClassLoader;
-
 /**
  * @author xerx593
  * Source: https://stackoverflow.com/questions/44676532/how-to-use-spring-to-marshal-and-unmarshal-xml
@@ -63,14 +61,11 @@ public class Marshaller {
         StringWriter sw = new StringWriter();
         Result result = new StreamResult(sw);
 
-        return runInTheadWithClassClassLoader(() -> {
-            jaxbMarshaller.marshal(obj, result);
-            return sw.toString();
-        });
+        jaxbMarshaller.marshal(obj, result);
+        return sw.toString();
     }
 
     public <T> T unmarshallXml(final InputStream xml) {
-        return runInTheadWithClassClassLoader(
-                () -> (T) jaxbMarshaller.unmarshal(new StreamSource(xml)));
+        return (T) jaxbMarshaller.unmarshal(new StreamSource(xml));
     }
 }
diff --git a/src/main/java/at/gv/egiz/moazs/service/MzsService.java b/src/main/java/at/gv/egiz/moazs/service/MzsService.java
index d9c81f3..55f0554 100644
--- a/src/main/java/at/gv/egiz/moazs/service/MzsService.java
+++ b/src/main/java/at/gv/egiz/moazs/service/MzsService.java
@@ -34,6 +34,7 @@ import org.apache.cxf.annotations.SchemaValidation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.task.TaskExecutor;
 import org.springframework.stereotype.Service;
 
 import javax.jws.WebParam;
@@ -71,6 +72,9 @@ public class MzsService implements App2MzsPortType {
     private final MsgResponseSinkHub hub;
     private final MzsDeliveryRequestValidator validator;
 
+    @Autowired
+    private TaskExecutor taskExecutor;
+
     @Autowired
     public MzsService(DeliveryRepository repository, Consumer<String> deliveryRequestBackend,
                       DeliveryRequestAugmenter augmenter, Msg2MzsConverter converter,
@@ -93,7 +97,7 @@ public class MzsService implements App2MzsPortType {
 
         validator.isRequestValid(completeRequest);
 
-        var requestProcessed = supplyAsync(() -> process(completeRequest));
+        var requestProcessed = supplyAsync(() -> process(completeRequest), taskExecutor);
 
         try {
             var serviceTimeout = completeRequest.getConfig().getServiceTimeout();
diff --git a/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java b/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java
deleted file mode 100644
index 22f8b1e..0000000
--- a/src/main/java/at/gv/egiz/moazs/util/JAXBClassNotFoundFix.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright 2019 Graz University of Technology
- * MOA ZS has been developed in a cooperation between EGIZ
- * and Graz University of Technology.
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "Licence");
- * You may not use this work except in compliance with the Licence.
- * You may obtain a copy of the Licence at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the Licence is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the Licence for the specific language governing permissions and
- * limitations under the Licence.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
- *******************************************************************************/
-package at.gv.egiz.moazs.util;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.function.Supplier;
-
-import static at.gv.egiz.moazs.MoaZSException.moaZSException;
-
-/**
- * @author Christof Rabensteiner
- *
- */
-@Component
-public class JAXBClassNotFoundFix {
-
-    private static final Logger log = LoggerFactory.getLogger(JAXBClassNotFoundFix.class);
-
-    private JAXBClassNotFoundFix() {}
-
-    /**
-     * Solves JAXB's "ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory" in Java >= 9
-     * by running func in a dedicated thread which has its context classloader replaced with a classloader that finds
-     * the ContextFactory.
-     *
-     * See https://sjhannah.com/blog/2018/11/21/jaxb-hell-on-jdk-9/
-     * Note: "runInTheadWithClassClassLoader" is not a typo.
-     * @param func function that is called in a dedicated thread.
-     * @param <A> return value of func.
-     * @return
-     */
-    public static <A> A runInTheadWithClassClassLoader(Supplier<A> func) {
-
-        final Object[] result = new Object[1];
-        final Exception[] error = new Exception[1];
-
-        Thread t = new Thread(() -> {
-            try {
-                result[0] = func.get();
-            } catch (Exception ex) {
-                error[0] = ex;
-            }
-        });
-
-        t.setContextClassLoader(JAXBClassNotFoundFix.class.getClassLoader());
-        t.start();
-
-        try {
-            t.join();
-        } catch (InterruptedException ex) {
-            log.error("Interrupted. ", ex);
-            Thread.currentThread().interrupt();
-        }
-
-        if (error[0] != null) {
-            throw moaZSException("Could not run function.", error[0]);
-        }
-
-        return (A)result[0];
-    }
-}
-- 
cgit v1.2.3