Repository: cxf
Updated Branches:
  refs/heads/3.1.x-fixes 5823ebb3a -> e4bfc1647


[CXF-6789] Setting Swagger feature resource package to the shared package if 
multiple service classes are available


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/e4bfc164
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/e4bfc164
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/e4bfc164

Branch: refs/heads/3.1.x-fixes
Commit: e4bfc1647e12b39b25bc363bdb9fe8beb2372a3b
Parents: 5823ebb
Author: Sergey Beryozkin <[email protected]>
Authored: Wed Feb 24 14:07:22 2016 +0000
Committer: Sergey Beryozkin <[email protected]>
Committed: Wed Feb 24 14:08:19 2016 +0000

----------------------------------------------------------------------
 .../apache/cxf/common/util/PackageUtils.java    | 28 ++++++++++++
 .../cxf/common/util/PackageUtilsTest.java       | 46 +++++++++++++++++++-
 .../jaxrs/swagger/AbstractSwaggerFeature.java   | 26 ++++++++---
 3 files changed, 93 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/e4bfc164/core/src/main/java/org/apache/cxf/common/util/PackageUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/cxf/common/util/PackageUtils.java 
b/core/src/main/java/org/apache/cxf/common/util/PackageUtils.java
index ada4e1b..b743320 100644
--- a/core/src/main/java/org/apache/cxf/common/util/PackageUtils.java
+++ b/core/src/main/java/org/apache/cxf/common/util/PackageUtils.java
@@ -20,6 +20,7 @@
 package org.apache.cxf.common.util;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.StringTokenizer;
 
@@ -49,6 +50,33 @@ public final class PackageUtils {
         return getPackageName(className);
     }
     
+    public static String getSharedPackageName(List<Class<?>> classes) {
+        List<String> currentParts = null;
+        for (Class<?> cls : classes) {
+            List<String> parts = StringUtils.getParts(getPackageName(cls), 
"\\.");
+            if (currentParts == null) {
+                currentParts = parts;
+            } else {
+                List<String> subList = Collections.emptyList();
+                for (int i = parts.size() - 1; i > 0; i--) {
+                    subList = parts.subList(0, i + 1);
+                    if (currentParts.equals(subList)) {
+                        break;
+                    }
+                }
+                currentParts.retainAll(subList);
+            }
+        }
+        StringBuilder sb = new StringBuilder();
+        for (String part : currentParts) {
+            if (sb.length() > 0) {
+                sb.append(".");
+            }
+            sb.append(part);
+        }
+        return sb.toString();
+    }
+    
     public static String parsePackageName(String namespace, String 
defaultPackageName) {
         String packageName = (defaultPackageName != null && 
defaultPackageName.trim().length() > 0)
             ? defaultPackageName : null;

http://git-wip-us.apache.org/repos/asf/cxf/blob/e4bfc164/core/src/test/java/org/apache/cxf/common/util/PackageUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/cxf/common/util/PackageUtilsTest.java 
b/core/src/test/java/org/apache/cxf/common/util/PackageUtilsTest.java
index f8d49a0..644e529 100644
--- a/core/src/test/java/org/apache/cxf/common/util/PackageUtilsTest.java
+++ b/core/src/test/java/org/apache/cxf/common/util/PackageUtilsTest.java
@@ -20,19 +20,61 @@
 package org.apache.cxf.common.util;
 
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.Collections;
+
 import org.junit.Assert;
 import org.junit.Test;
 
 public class PackageUtilsTest extends Assert {
     @Test
-    public void testgetPackageName() throws Exception {
+    public void testGetClassPackageName() throws Exception {
         String packageName = PackageUtils.getPackageName(this.getClass());     
  
         assertEquals("Should get same packageName", 
this.getClass().getPackage().getName(), packageName);
     }
     
     @Test
-    public void testGetPackageName() throws Exception {
+    public void testGetEmptyPackageName() throws Exception {
         String className = "HelloWorld";
         assertEquals("Should return empty string", "", 
PackageUtils.getPackageName(className));
     }
+    
+    @Test
+    public void testSharedPackageNameSingleClass() throws Exception {
+        String packageName = PackageUtils.getSharedPackageName(
+            Collections.singletonList(this.getClass()));       
+        assertEquals(this.getClass().getPackage().getName(), packageName);
+    }
+    @Test
+    public void testSharedPackageNameManyClassesInSamePackage() throws 
Exception {
+        String packageName = PackageUtils.getSharedPackageName(
+            Arrays.asList(Integer.class, Number.class));       
+        assertEquals("java.lang", packageName);
+    }
+    @Test
+    public void testSharedPackageNameManyClassesInDiffPackages() throws 
Exception {
+        String packageName = PackageUtils.getSharedPackageName(
+            Arrays.asList(Integer.class, this.getClass()));       
+        assertEquals("", packageName);
+    }
+    @Test
+    public void testSharedPackageNameManyClassesCommonRoot() throws Exception {
+        String packageName = PackageUtils.getSharedPackageName(
+            Arrays.asList(Integer.class, Annotation.class));       
+        assertEquals("java.lang", packageName);
+    }
+    @Test
+    public void testSharedPackageNameManyClassesCommonRoot2() throws Exception 
{
+        String packageName = PackageUtils.getSharedPackageName(
+            Arrays.asList(Annotation.class, Integer.class));       
+        assertEquals("java.lang", packageName);
+    }
+    @Test
+    public void testSharedPackageNameManyClassesCommonRoot3() throws Exception 
{
+        String packageName = PackageUtils.getSharedPackageName(
+            Arrays.asList(Annotation.class, Array.class));       
+        assertEquals("java.lang", packageName);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/e4bfc164/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/AbstractSwaggerFeature.java
----------------------------------------------------------------------
diff --git 
a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/AbstractSwaggerFeature.java
 
b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/AbstractSwaggerFeature.java
index 386855d..7408c6d 100644
--- 
a/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/AbstractSwaggerFeature.java
+++ 
b/rt/rs/description/src/main/java/org/apache/cxf/jaxrs/swagger/AbstractSwaggerFeature.java
@@ -18,11 +18,16 @@
  */
 package org.apache.cxf.jaxrs.swagger;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.Bus;
+import org.apache.cxf.common.util.PackageUtils;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.feature.AbstractFeature;
 import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
-import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
+import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 
 public abstract class AbstractSwaggerFeature extends AbstractFeature {
 
@@ -72,13 +77,24 @@ public abstract class AbstractSwaggerFeature extends 
AbstractFeature {
     protected abstract void setBasePathByAddress(String address);
 
     private void calculateDefaultResourcePackage(Server server) {
+        if (!StringUtils.isEmpty(getResourcePackage())) {
+            return;
+        }
         JAXRSServiceFactoryBean serviceFactoryBean = 
             
(JAXRSServiceFactoryBean)server.getEndpoint().get(JAXRSServiceFactoryBean.class.getName());
-        AbstractResourceInfo resourceInfo = 
serviceFactoryBean.getClassResourceInfo().get(0);
+        List<ClassResourceInfo> resourceInfos = 
serviceFactoryBean.getClassResourceInfo();
         
-        if ((resourceInfo != null) 
-            && (getResourcePackage() == null || getResourcePackage().length() 
== 0)) {
-            
setResourcePackage(resourceInfo.getServiceClass().getPackage().getName());
+        if (resourceInfos.size() == 1) {
+            
setResourcePackage(resourceInfos.get(0).getServiceClass().getPackage().getName());
+        } else {
+            List<Class<?>> serviceClasses = new 
ArrayList<Class<?>>(resourceInfos.size());
+            for (ClassResourceInfo cri : resourceInfos) {
+                serviceClasses.add(cri.getServiceClass());
+            }
+            String sharedPackage = 
PackageUtils.getSharedPackageName(serviceClasses);
+            if (!StringUtils.isEmpty(getResourcePackage())) {
+                setResourcePackage(sharedPackage);
+            }
         }
     }
     

Reply via email to