You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/04/18 08:43:13 UTC

[3/7] syncope git commit: [SYNCOPE-1066] Avoid invoking REST via HTTP to fetch the generated WADL; rather getting it via Spring bean

[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/2_0_X
Commit: 3da6a0455d99e8c97e184072f54362d6801297fc
Parents: 89530be
Author: Francesco Chicchiricc� <il...@apache.org>
Authored: Tue Apr 18 10:41:41 2017 +0200
Committer: Francesco Chicchiricc� <il...@apache.org>
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"/>