This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 28b3368aae75866178ef935acb54de5087a90c69 Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Mon Nov 21 15:20:17 2022 +0100 Fixing openapi.json content from javadocs at first access --- .../core/rest/cxf/IdRepoRESTCXFContext.java | 40 +++++++++++++-- .../core/rest/cxf/SyncopeOpenApiCustomizer.java | 57 +++------------------- .../core/persistence/jpa/dao/JPAJobStatusDAO.java | 1 - .../provisioning/java/job/JobStatusUpdater.java | 6 +++ 4 files changed, 48 insertions(+), 56 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 ab01ca51ad..51755161c8 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,6 +22,7 @@ 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; @@ -35,6 +36,8 @@ import org.apache.cxf.jaxrs.ext.search.SearchContext; import org.apache.cxf.jaxrs.ext.search.SearchContextImpl; import org.apache.cxf.jaxrs.ext.search.SearchContextProvider; import org.apache.cxf.jaxrs.ext.search.SearchUtils; +import org.apache.cxf.jaxrs.model.doc.JavaDocProvider; +import org.apache.cxf.jaxrs.openapi.OpenApiCustomizer; import org.apache.cxf.jaxrs.openapi.OpenApiFeature; import org.apache.cxf.jaxrs.spring.JAXRSServerFactoryBeanDefinitionParser.SpringJAXRSServerFactoryBean; import org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor; @@ -130,6 +133,8 @@ import org.apache.syncope.core.rest.cxf.service.SyncopeServiceImpl; import org.apache.syncope.core.rest.cxf.service.TaskServiceImpl; import org.apache.syncope.core.rest.cxf.service.UserSelfServiceImpl; import org.apache.syncope.core.rest.cxf.service.UserServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -146,6 +151,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration(proxyBeanMethods = false) public class IdRepoRESTCXFContext { + private static final Logger LOG = LoggerFactory.getLogger(IdRepoRESTCXFContext.class); + @Bean public ThreadPoolTaskExecutor batchExecutor(final RESTProperties props) { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); @@ -243,11 +250,38 @@ public class IdRepoRESTCXFContext { return new AddETagFilter(); } + @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); + } + + SyncopeOpenApiCustomizer openApiCustomizer = new SyncopeOpenApiCustomizer(domainHolder); + openApiCustomizer.setDynamicBasePath(false); + openApiCustomizer.setReplaceTags(false); + openApiCustomizer.setJavadocProvider(javaDocProvider); + return openApiCustomizer; + } + @ConditionalOnMissingBean @Bean - public OpenApiFeature openapiFeature(final ApplicationContext ctx) { + public OpenApiFeature openapiFeature(final OpenApiCustomizer openApiCustomizer, final ApplicationContext ctx) { String version = ctx.getEnvironment().getProperty("version"); OpenApiFeature openapiFeature = new OpenApiFeature(); + openapiFeature.setUseContextBasedConfig(true); openapiFeature.setTitle("Apache Syncope"); openapiFeature.setVersion(version); openapiFeature.setDescription("Apache Syncope " + version); @@ -256,10 +290,6 @@ public class IdRepoRESTCXFContext { openapiFeature.setContactUrl("https://syncope.apache.org"); openapiFeature.setScan(false); openapiFeature.setResourcePackages(Set.of("org.apache.syncope.common.rest.api.service")); - - SyncopeOpenApiCustomizer openApiCustomizer = new SyncopeOpenApiCustomizer(ctx.getEnvironment()); - openApiCustomizer.setDynamicBasePath(false); - openApiCustomizer.setReplaceTags(false); openapiFeature.setCustomizer(openApiCustomizer); Map<String, SecurityScheme> securityDefinitions = new HashMap<>(); diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java index b47f7a1f6d..0d515e39af 100644 --- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java +++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SyncopeOpenApiCustomizer.java @@ -33,8 +33,6 @@ import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponses; import io.swagger.v3.oas.models.servers.Server; -import java.net.URL; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -45,7 +43,6 @@ import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.apache.cxf.jaxrs.ext.MessageContext; import org.apache.cxf.jaxrs.model.OperationResourceInfo; -import org.apache.cxf.jaxrs.model.doc.JavaDocProvider; import org.apache.cxf.jaxrs.openapi.OpenApiCustomizer; import org.apache.cxf.jaxrs.utils.JAXRSUtils; import org.apache.syncope.common.lib.SyncopeConstants; @@ -53,60 +50,20 @@ import org.apache.syncope.common.lib.to.ErrorTO; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.rest.api.RESTHeaders; import org.apache.syncope.core.persistence.api.DomainHolder; -import org.apache.syncope.core.spring.ApplicationContextProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; public class SyncopeOpenApiCustomizer extends OpenApiCustomizer { - private static final Logger LOG = LoggerFactory.getLogger(SyncopeOpenApiCustomizer.class); + private final DomainHolder domainHolder; - private final Environment env; - - private List<String> domains; - - private boolean inited = false; - - public SyncopeOpenApiCustomizer(final Environment env) { - this.env = env; - } - - private void init() { - synchronized (this) { - if (!inited) { - 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); - } - super.setJavadocProvider(javaDocProvider); - - domains = new ArrayList<>(ApplicationContextProvider.getApplicationContext(). - getBean(DomainHolder.class).getDomains().keySet()); - - inited = true; - } - } + public SyncopeOpenApiCustomizer(final DomainHolder domainHolder) { + this.domainHolder = domainHolder; } @Override public OpenAPIConfiguration customize(final OpenAPIConfiguration configuration) { - init(); super.customize(configuration); - MessageContext ctx = JAXRSUtils.createContextValue( - JAXRSUtils.getCurrentMessage(), null, MessageContext.class); + MessageContext ctx = JAXRSUtils.createContextValue(JAXRSUtils.getCurrentMessage(), null, MessageContext.class); String url = StringUtils.substringBeforeLast(ctx.getUriInfo().getRequestUri().getRawPath(), "/"); configuration.getOpenAPI().setServers(List.of(new Server().url(url))); @@ -116,8 +73,8 @@ public class SyncopeOpenApiCustomizer extends OpenApiCustomizer { @Override protected void addParameters(final List<Parameter> parameters) { - Optional<Parameter> domainHeaderParameter = parameters.stream().filter(parameter - -> parameter instanceof HeaderParameter && RESTHeaders.DOMAIN.equals(parameter.getName())).findFirst(); + Optional<Parameter> domainHeaderParameter = parameters.stream(). + filter(p -> p instanceof HeaderParameter && RESTHeaders.DOMAIN.equals(p.getName())).findFirst(); if (domainHeaderParameter.isEmpty()) { HeaderParameter parameter = new HeaderParameter(); parameter.setName(RESTHeaders.DOMAIN); @@ -130,7 +87,7 @@ public class SyncopeOpenApiCustomizer extends OpenApiCustomizer { Schema<String> schema = new Schema<>(); schema.setDescription("Domains are built to facilitate multitenancy."); schema.setExternalDocs(extDoc); - schema.setEnum(domains); + schema.setEnum(domainHolder.getDomains().keySet().stream().sorted().collect(Collectors.toList())); schema.setDefault(SyncopeConstants.MASTER_DOMAIN); parameter.setSchema(schema); diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java index 560efd1d13..79a3818aaa 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAJobStatusDAO.java @@ -44,6 +44,5 @@ public class JPAJobStatusDAO extends AbstractDAO<JobStatus> implements JobStatus if (jobStatus != null) { entityManager().remove(jobStatus); } - } } diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java index 04bba663ac..ed39b658cc 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobStatusUpdater.java @@ -22,11 +22,15 @@ import org.apache.syncope.core.persistence.api.dao.JobStatusDAO; import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.JobStatus; import org.apache.syncope.core.provisioning.api.event.JobStatusEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; public class JobStatusUpdater { + protected static final Logger LOG = LoggerFactory.getLogger(JobStatusUpdater.class); + protected final JobStatusDAO jobStatusDAO; protected final EntityFactory entityFactory; @@ -50,8 +54,10 @@ public class JobStatusUpdater { @EventListener public void update(final JobStatusEvent event) { if (event.getJobStatus() == null) { + LOG.debug("Deleting status for job '{}'", event.getJobRefDesc()); jobStatusDAO.delete(event.getJobRefDesc()); } else { + LOG.debug("Updating job '{}' with status '{}'", event.getJobRefDesc(), event.getJobStatus()); JobStatus jobStatus = entityFactory.newEntity(JobStatus.class); jobStatus.setKey(event.getJobRefDesc()); jobStatus.setStatus(event.getJobStatus());