You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/12/12 19:22:35 UTC

svn commit: r1550468 - in /cxf/trunk: core/src/main/java/org/apache/cxf/common/util/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/schemas/ systests/jaxrs/src/test/resources/jaxrs/WEB-INF/

Author: sergeyb
Date: Thu Dec 12 18:22:34 2013
New Revision: 1550468

URL: http://svn.apache.org/r1550468
Log:
[CXF-5324] Optimizing schema lookups in case of many schema resources

Modified:
    cxf/trunk/core/src/main/java/org/apache/cxf/common/util/ClasspathScanner.java
    cxf/trunk/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/schemas/SchemaHandler.java
    cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml

Modified: cxf/trunk/core/src/main/java/org/apache/cxf/common/util/ClasspathScanner.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/common/util/ClasspathScanner.java?rev=1550468&r1=1550467&r2=1550468&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/common/util/ClasspathScanner.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/common/util/ClasspathScanner.java Thu Dec 12 18:22:34 2013
@@ -31,7 +31,8 @@ public class ClasspathScanner {
     public static final String ALL_FILES = "**/*";
     public static final String ALL_CLASS_FILES = ALL_FILES + ".class";
     public static final String ALL_PACKAGES = "*";
-
+    public static final String CLASSPATH_URL_SCHEME = "classpath:";
+    
     static final ClasspathScanner HELPER;
     static {
         ClasspathScanner theHelper = null;
@@ -52,6 +53,20 @@ public class ClasspathScanner {
 
     /**
      * Scans list of base packages for all classes marked with specific annotations. 
+     * @param basePackage base package 
+     * @param annotations annotations to discover
+     * @return all discovered classes grouped by annotations they belong too 
+     * @throws IOException class metadata is not readable 
+     * @throws ClassNotFoundException class not found
+     */
+    public static Map< Class< ? extends Annotation >, Collection< Class< ? > > > findClasses(
+        String basePackage, Class< ? extends Annotation > ... annotations) 
+        throws IOException, ClassNotFoundException {
+        return findClasses(Collections.singletonList(basePackage), Arrays.asList(annotations));
+    }
+    
+    /**
+     * Scans list of base packages for all classes marked with specific annotations. 
      * @param basePackages list of base packages 
      * @param annotations annotations to discover
      * @return all discovered classes grouped by annotations they belong too 
@@ -87,6 +102,18 @@ public class ClasspathScanner {
     
     /**
      * Scans list of base packages for all resources with the given extension. 
+     * @param basePackage base package 
+     * @param extension the extension matching resources needs to have
+     * @return list of all discovered resource URLs 
+     * @throws IOException resource is not accessible
+     */
+    public static List<URL> findResources(String basePackage, String extension) 
+        throws IOException {
+        return findResources(Collections.singletonList(basePackage), extension);
+    }
+    
+    /**
+     * Scans list of base packages for all resources with the given extension. 
      * @param basePackages list of base packages 
      * @param extension the extension matching resources needs to have
      * @return list of all discovered resource URLs 

Modified: cxf/trunk/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java?rev=1550468&r1=1550467&r2=1550468&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/common/util/SpringClasspathScanner.java Thu Dec 12 18:22:34 2013
@@ -94,8 +94,13 @@ class SpringClasspathScanner extends Cla
         for (final String basePackage: basePackages) {
             final boolean scanAllPackages = basePackage.equals(ALL_PACKAGES);
             
+            String theBasePackage = basePackage;
+            if (theBasePackage.startsWith(CLASSPATH_URL_SCHEME)) {
+                theBasePackage = theBasePackage.substring(CLASSPATH_URL_SCHEME.length());
+            }
+            
             final String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX 
-                + (scanAllPackages ? "" : ClassUtils.convertClassNameToResourcePath(basePackage)) 
+                + (scanAllPackages ? "" : ClassUtils.convertClassNameToResourcePath(theBasePackage)) 
                 + ALL_FILES + "." + extension;
             
             final Resource[] resources = resolver.getResources(packageSearchPath);                        

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/schemas/SchemaHandler.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/schemas/SchemaHandler.java?rev=1550468&r1=1550467&r2=1550468&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/schemas/SchemaHandler.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/schemas/SchemaHandler.java Thu Dec 12 18:22:34 2013
@@ -26,6 +26,7 @@ import java.io.InputStreamReader;
 import java.io.Reader;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.logging.Logger;
 
@@ -41,6 +42,7 @@ import org.apache.cxf.Bus;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.catalog.OASISCatalogManager;
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.common.util.ClasspathScanner;
 import org.apache.cxf.common.xmlschema.LSInputImpl;
 import org.apache.cxf.jaxrs.utils.ResourceUtils;
 import org.apache.ws.commons.schema.constants.Constants;
@@ -88,15 +90,26 @@ public class SchemaHandler {
         try {
             List<Source> sources = new ArrayList<Source>();
             for (String loc : locations) {
-                URL url = ResourceUtils.getResourceURL(loc, bus);
-                if (url == null) {
-                    return null;
+                List<URL> schemaURLs = new LinkedList<URL>();
+                
+                if (loc.lastIndexOf(".") == -1) {
+                    schemaURLs = ClasspathScanner.findResources(loc, "xsd");
+                } else {
+                    URL url = ResourceUtils.getResourceURL(loc, bus);
+                    if (url != null) {
+                        schemaURLs.add(url);
+                    }
+                }
+                for (URL schemaURL : schemaURLs) {
+                    Reader r = new BufferedReader(
+                                   new InputStreamReader(schemaURL.openStream(), "UTF-8"));
+                    StreamSource source = new StreamSource(r);
+                    source.setSystemId(schemaURL.toString());
+                    sources.add(source);
                 }
-                Reader r = new BufferedReader(
-                               new InputStreamReader(url.openStream(), "UTF-8"));
-                StreamSource source = new StreamSource(r);
-                source.setSystemId(url.toString());
-                sources.add(source);
+            }
+            if (sources.isEmpty()) {
+                return null;
             }
             final OASISCatalogManager catalogResolver = OASISCatalogManager.getCatalogManager(bus);
             if (catalogResolver != null) {

Modified: cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml?rev=1550468&r1=1550467&r2=1550468&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml (original)
+++ cxf/trunk/systests/jaxrs/src/test/resources/jaxrs/WEB-INF/beans.xml Thu Dec 12 18:22:34 2013
@@ -214,7 +214,7 @@
         <property name="schemaLocations" ref="theSchemas"/>
     </bean>
     <util:list id="theSchemas">
-        <value>classpath:/org/apache/cxf/systest/jaxrs/resources/book.xsd</value>
+        <value>classpath:/org/apache/cxf/systest/jaxrs/resources/</value>
     </util:list>
     <util:list id="jsonTypes">
         <value>application/json</value>