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

ilgrosso pushed a commit to branch 3_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git

commit b87accd313aa47aaec2f22166270c26aa46296cd
Author: Francesco Chicchiriccò <[email protected]>
AuthorDate: Mon Jun 12 15:02:24 2023 +0200

    Improving JavaDocUtils
---
 .../core/rest/cxf/IdRepoRESTCXFContext.java        | 28 ++++-----
 .../apache/syncope/core/rest/cxf/JavaDocUtils.java | 68 +++++++++++++++++-----
 .../core/flowable/FlowableWorkflowContext.java     |  1 +
 .../core/flowable/impl/FlowableDeployUtils.java    |  4 +-
 .../syncope/core/logic/FlowableLogicContext.java   | 34 ++++++-----
 5 files changed, 88 insertions(+), 47 deletions(-)

diff --git 
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
 
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
index 41d1007885..6f12ce33ed 100644
--- 
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
+++ 
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
@@ -22,7 +22,6 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
 import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider;
 import com.fasterxml.jackson.jaxrs.yaml.JacksonYAMLProvider;
 import io.swagger.v3.oas.models.security.SecurityScheme;
-import java.net.URL;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -251,21 +250,18 @@ public class IdRepoRESTCXFContext {
     @ConditionalOnMissingBean(name = { "openApiCustomizer", 
"syncopeOpenApiCustomizer" })
     @Bean
     public OpenApiCustomizer openApiCustomizer(final DomainHolder 
domainHolder, final Environment env) {
-        JavaDocProvider javaDocProvider = null;
-
-        URL[] javaDocURLs = JavaDocUtils.getJavaDocURLs();
-        if (javaDocURLs == null) {
-            String[] javaDocPaths = JavaDocUtils.getJavaDocPaths(env);
-            if (javaDocPaths != null) {
-                try {
-                    javaDocProvider = new JavaDocProvider(javaDocPaths);
-                } catch (Exception e) {
-                    LOG.error("Could not set javadoc paths from {}", 
List.of(javaDocPaths), e);
-                }
-            }
-        } else {
-            javaDocProvider = new JavaDocProvider(javaDocURLs);
-        }
+        JavaDocProvider javaDocProvider = JavaDocUtils.getJavaDocURLs().
+                map(JavaDocProvider::new).
+                orElseGet(() -> JavaDocUtils.getJavaDocPaths(env).
+                map(javaDocPaths -> {
+                    try {
+                        return new JavaDocProvider(javaDocPaths);
+                    } catch (Exception e) {
+                        LOG.error("Could not set javadoc paths from {}", 
List.of(javaDocPaths), e);
+                        return null;
+                    }
+                }).
+                orElse(null));
 
         SyncopeOpenApiCustomizer openApiCustomizer = new 
SyncopeOpenApiCustomizer(domainHolder);
         openApiCustomizer.setDynamicBasePath(false);
diff --git 
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/JavaDocUtils.java
 
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/JavaDocUtils.java
index 173317000c..05a3377820 100644
--- 
a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/JavaDocUtils.java
+++ 
b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/JavaDocUtils.java
@@ -18,45 +18,83 @@
  */
 package org.apache.syncope.core.rest.cxf;
 
+import java.io.File;
+import java.lang.management.ManagementFactory;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.core.env.Environment;
 import org.springframework.util.ClassUtils;
 
 public final class JavaDocUtils {
 
-    public static URL[] getJavaDocURLs() {
-        URL[] result = null;
+    private static final Logger LOG = 
LoggerFactory.getLogger(JavaDocUtils.class);
 
-        ClassLoader classLoader = ClassUtils.getDefaultClassLoader();
+    private static URL toURL(final String classPathEntry) {
+        try {
+            return new File(classPathEntry).toURI().toURL();
+        } catch (MalformedURLException e) {
+            throw new IllegalArgumentException("URL could not be created from 
'" + classPathEntry + "'", e);
+        }
+    }
+
+    /**
+     * Inspired by 
org.springframework.boot.devtools.restart.ChangeableUrls#urlsFromClassLoader
+     *
+     * @param classLoader class loader
+     * @return URLs from underlying class loader
+     */
+    private static URL[] urlsFromClassLoader(final ClassLoader classLoader) {
         if (classLoader instanceof URLClassLoader) {
-            List<URL> javaDocURLs = new ArrayList<>();
-            for (URL url : ((URLClassLoader) classLoader).getURLs()) {
-                String filename = 
StringUtils.substringAfterLast(url.toExternalForm(), "/");
-                if (filename.startsWith("syncope-") && 
filename.endsWith("-javadoc.jar")) {
-                    javaDocURLs.add(url);
-                }
-            }
-            if (!javaDocURLs.isEmpty()) {
-                result = javaDocURLs.toArray(URL[]::new);
+            return ((URLClassLoader) classLoader).getURLs();
+        }
+
+        return Stream.of(ManagementFactory.getRuntimeMXBean().getClassPath().
+                split(File.pathSeparator)).
+                map(JavaDocUtils::toURL).toArray(URL[]::new);
+    }
+
+    public static Optional<URL[]> getJavaDocURLs() {
+        URL[] urls = urlsFromClassLoader(ClassUtils.getDefaultClassLoader());
+        if (urls == null) {
+            LOG.debug("No classpath URLs found");
+            return Optional.empty();
+        }
+
+        List<URL> javaDocURLs = new ArrayList<>();
+        for (URL url : urls) {
+            LOG.debug("Processing {}", url.toExternalForm());
+
+            String filename = 
StringUtils.substringAfterLast(url.toExternalForm(), "/");
+            if (filename.startsWith("syncope-") && 
filename.endsWith("-javadoc.jar")) {
+                javaDocURLs.add(url);
             }
         }
 
-        return result;
+        LOG.debug("JavaDoc Urls found: {}", javaDocURLs);
+        return Optional.of(javaDocURLs.toArray(URL[]::new));
     }
 
-    public static String[] getJavaDocPaths(final Environment env) {
+    public static Optional<String[]> getJavaDocPaths(final Environment env) {
         String[] result = null;
 
         if (env.containsProperty("javadocPaths")) {
             result = 
Objects.requireNonNull(env.getProperty("javadocPaths")).split(",");
         }
 
-        return result;
+        LOG.debug("JavaDoc paths found: {}",
+                result == null ? List.of() : 
Arrays.stream(result).collect(Collectors.toList()));
+        return Optional.ofNullable(result);
     }
 
     private JavaDocUtils() {
diff --git 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java
 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java
index 9d0335fb53..44c094b180 100644
--- 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java
+++ 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java
@@ -141,6 +141,7 @@ public class FlowableWorkflowContext {
             final IdGenerator idGenerator,
             final SyncopeEntitiesVariableType syncopeEntitiesVariableType,
             final SyncopeFormHandlerHelper syncopeFormHandlerHelper) {
+
         SpringProcessEngineConfiguration conf = new 
SpringProcessEngineConfiguration();
         
conf.setDatabaseSchemaUpdate(AbstractEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
         conf.setJpaHandleTransaction(true);
diff --git 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableDeployUtils.java
 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableDeployUtils.java
index 827e596589..45abc4fb55 100644
--- 
a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableDeployUtils.java
+++ 
b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/impl/FlowableDeployUtils.java
@@ -62,8 +62,8 @@ public final class FlowableDeployUtils {
     public static void deployModel(final ProcessEngine engine, final 
ProcessDefinition procDef) {
         XMLStreamReader xtr = null;
         try (InputStream bpmnStream = engine.getRepositoryService().
-                getResourceAsStream(procDef.getDeploymentId(), 
procDef.getResourceName());  InputStreamReader isr =
-                new InputStreamReader(bpmnStream)) {
+                getResourceAsStream(procDef.getDeploymentId(), 
procDef.getResourceName());
+             InputStreamReader isr = new InputStreamReader(bpmnStream);) {
 
             xtr = XML_INPUT_FACTORY.createXMLStreamReader(isr);
             BpmnModel bpmnModel = new 
BpmnXMLConverter().convertToBpmnModel(xtr);
diff --git 
a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java
 
b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java
index 884e0d3f84..ef71a4f29e 100644
--- 
a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java
+++ 
b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java
@@ -38,9 +38,11 @@ public class FlowableLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public FlowableLoader flowableLoader(final DomainProcessEngine engine,
-                                         @Qualifier("userWorkflowDef")
-                                         final Resource userWorkflowDef) {
+    public FlowableLoader flowableLoader(
+            final DomainProcessEngine engine,
+            @Qualifier("userWorkflowDef")
+            final Resource userWorkflowDef) {
+
         return new FlowableLoader(userWorkflowDef, engine);
     }
 
@@ -52,12 +54,14 @@ public class FlowableLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public UserRequestLogic userRequestLogic(final UserRequestHandler 
userRequestHandler,
-                                             final UserDataBinder binder,
-                                             final BpmnProcessManager 
bpmnProcessManager,
-                                             final PropagationTaskExecutor 
taskExecutor,
-                                             final UserDAO userDAO,
-                                             final PropagationManager 
propagationManager) {
+    public UserRequestLogic userRequestLogic(
+            final UserRequestHandler userRequestHandler,
+            final UserDataBinder binder,
+            final BpmnProcessManager bpmnProcessManager,
+            final PropagationTaskExecutor taskExecutor,
+            final UserDAO userDAO,
+            final PropagationManager propagationManager) {
+
         return new UserRequestLogic(
                 bpmnProcessManager,
                 userRequestHandler,
@@ -69,11 +73,13 @@ public class FlowableLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public UserWorkflowTaskLogic userWorkflowTaskLogic(final 
WorkflowTaskManager wfTaskManager,
-                                                       final UserDataBinder 
binder,
-                                                       final UserDAO userDAO,
-                                                       final 
PropagationTaskExecutor taskExecutor,
-                                                       final 
PropagationManager propagationManager) {
+    public UserWorkflowTaskLogic userWorkflowTaskLogic(
+            final WorkflowTaskManager wfTaskManager,
+            final UserDataBinder binder,
+            final UserDAO userDAO,
+            final PropagationTaskExecutor taskExecutor,
+            final PropagationManager propagationManager) {
+
         return new UserWorkflowTaskLogic(wfTaskManager, propagationManager, 
taskExecutor, binder, userDAO);
     }
 }

Reply via email to