[SYNCOPE-1066] Avoid invoking REST via HTTP to fetch the generated WADL; rather getting it via Spring bean
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/3da6a045 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/3da6a045 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/3da6a045 Branch: refs/heads/SYNCOPE-808 Commit: 3da6a0455d99e8c97e184072f54362d6801297fc Parents: 89530be Author: Francesco Chicchiriccò <[email protected]> Authored: Tue Apr 18 10:41:41 2017 +0200 Committer: Francesco Chicchiriccò <[email protected]> Committed: Tue Apr 18 10:41:41 2017 +0200 ---------------------------------------------------------------------- .../syncope/core/rest/cxf/WADLServlet.java | 13 ++-- .../syncope/core/rest/cxf/WadlGenerator.java | 74 +++++++++++++++++++- .../src/main/resources/log4j2.xml | 4 ++ 3 files changed, 83 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/3da6a045/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WADLServlet.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WADLServlet.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WADLServlet.java index 534ae9f..e421909 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WADLServlet.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WADLServlet.java @@ -18,10 +18,10 @@ */ package org.apache.syncope.core.rest.cxf; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.net.URL; import java.rmi.ServerException; import java.util.HashMap; import java.util.Map; @@ -39,7 +39,7 @@ import org.apache.cocoon.sax.component.XMLGenerator; import org.apache.cocoon.sax.component.XMLSerializer; import org.apache.cocoon.sax.component.XSLTTransformer; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; +import org.apache.syncope.core.spring.ApplicationContextProvider; public class WADLServlet extends HttpServlet { @@ -73,10 +73,11 @@ public class WADLServlet extends HttpServlet { Matcher schemaMatcher = SCHEMA_PATTERN.matcher(request.getServletPath()); + WadlGenerator wadlGenerator = ApplicationContextProvider.getApplicationContext().getBean(WadlGenerator.class); + String wadl = wadlGenerator.getWadl(); + Pipeline<SAXPipelineComponent> pipeline = new CachingPipeline<>(); - String wadlURL = StringUtils.substringBeforeLast(request.getRequestURL().toString(), "/") - + "/rest/?_wadl"; - pipeline.addComponent(new XMLGenerator(new URL(wadlURL))); + pipeline.addComponent(new XMLGenerator(wadl)); if ("/index.html".equals(request.getServletPath())) { XSLTTransformer xslt = new XSLTTransformer(getClass().getResource("/wadl2html/index.xsl")); @@ -102,7 +103,7 @@ public class WADLServlet extends HttpServlet { } else if ("/syncope.wadl".equals(request.getServletPath())) { response.setContentType(MediaType.APPLICATION_XML); - InputStream in = new URL(wadlURL).openStream(); + InputStream in = new ByteArrayInputStream(wadl.getBytes()); OutputStream out = response.getOutputStream(); try { IOUtils.copy(in, out); http://git-wip-us.apache.org/repos/asf/syncope/blob/3da6a045/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java index 444e58e..8595293 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java @@ -18,8 +18,21 @@ */ package org.apache.syncope.core.rest.cxf; +import java.lang.annotation.Annotation; import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import javax.ws.rs.Path; import javax.ws.rs.container.ContainerRequestContext; +import org.apache.commons.collections4.IterableUtils; +import org.apache.commons.collections4.Predicate; +import org.apache.cxf.BusFactory; +import org.apache.cxf.common.util.ClasspathScanner; +import org.apache.cxf.jaxrs.model.ClassResourceInfo; +import org.apache.cxf.jaxrs.utils.InjectionUtils; +import org.apache.cxf.jaxrs.utils.ResourceUtils; /** * Automatically loads available javadocs from class loader (when {@link java.net.URLClassLoader}). @@ -28,8 +41,9 @@ public class WadlGenerator extends org.apache.cxf.jaxrs.model.wadl.WadlGenerator private boolean inited = false; - @Override - public void filter(final ContainerRequestContext context) { + private String wadl = null; + + private void init() { synchronized (this) { if (!inited) { URL[] javaDocURLs = JavaDocUtils.getJavaDocURLs(); @@ -40,8 +54,64 @@ public class WadlGenerator extends org.apache.cxf.jaxrs.model.wadl.WadlGenerator inited = true; } } + } + @Override + public void filter(final ContainerRequestContext context) { + init(); super.filter(context); } + public String getWadl() { + synchronized (this) { + if (wadl == null) { + init(); + + List<Class<?>> resourceClasses = new ArrayList<>(); + try { + List<Class<? extends Annotation>> anns = new ArrayList<>(); + anns.add(Path.class); + Map<Class<? extends Annotation>, Collection<Class<?>>> discoveredClasses = + ClasspathScanner.findClasses(ClasspathScanner.parsePackages( + "org.apache.syncope.common.rest.api.service"), + anns); + if (discoveredClasses.containsKey(Path.class)) { + resourceClasses.addAll(discoveredClasses.get(Path.class)); + } + } catch (Exception e) { + // ignore + } + + List<ClassResourceInfo> classResourceInfos = new ArrayList<>(); + for (final Class<?> beanClass : resourceClasses) { + ClassResourceInfo cri = IterableUtils.find(classResourceInfos, new Predicate<ClassResourceInfo>() { + + @Override + public boolean evaluate(final ClassResourceInfo cri) { + return cri.isCreatedFromModel() && cri.isRoot() + && cri.getServiceClass().isAssignableFrom(beanClass); + } + }); + if (cri != null) { + if (!InjectionUtils.isConcreteClass(cri.getServiceClass())) { + cri = new ClassResourceInfo(cri); + classResourceInfos.add(cri); + } + cri.setResourceClass(beanClass); + continue; + } + + cri = ResourceUtils.createClassResourceInfo( + beanClass, beanClass, true, true, BusFactory.getDefaultBus()); + if (cri != null) { + classResourceInfos.add(cri); + } + } + + wadl = generateWADL("/", classResourceInfos, false, null, null).toString(); + } + } + + return wadl; + } } http://git-wip-us.apache.org/repos/asf/syncope/blob/3da6a045/fit/core-reference/src/main/resources/log4j2.xml ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/main/resources/log4j2.xml b/fit/core-reference/src/main/resources/log4j2.xml index bc4771c..19f5cc4 100644 --- a/fit/core-reference/src/main/resources/log4j2.xml +++ b/fit/core-reference/src/main/resources/log4j2.xml @@ -144,6 +144,10 @@ under the License. <appender-ref ref="mainFile"/> <appender-ref ref="main"/> </asyncLogger> + <asyncLogger name="org.apache.cocoon" additivity="false" level="ERROR"> + <appender-ref ref="mainFile"/> + <appender-ref ref="main"/> + </asyncLogger> <asyncLogger name="org.apache.camel" additivity="false" level="ERROR"> <appender-ref ref="mainFile"/> <appender-ref ref="main"/>
