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); } }
