This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 4149ca3  JUNEAU-177 Allow REST methods at specific paths to be 
overridden by methods in child classes.
4149ca3 is described below

commit 4149ca354e13afd1fef009955cb4ca5de6bc9c92
Author: JamesBognar <[email protected]>
AuthorDate: Sat Jan 11 11:11:29 2020 -0500

    JUNEAU-177 Allow REST methods at specific paths to be overridden by
    methods in child classes.
---
 .../juneau/rest/annotation/RestMethodPathTest.java | 26 ++++++++++++++++++++++
 .../org/apache/juneau/rest/RestCallRouter.java     |  9 +-------
 .../java/org/apache/juneau/rest/RestContext.java   |  2 +-
 .../org/apache/juneau/rest/RestMethodContext.java  | 17 ++++++++++++++
 4 files changed, 45 insertions(+), 9 deletions(-)

diff --git 
a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
 
b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
index f944245..4a89ea5 100644
--- 
a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
+++ 
b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestMethodPathTest.java
@@ -84,4 +84,30 @@ public class RestMethodPathTest {
                a.get("/x/foo").execute().assertBody("g");
                a.get("/x/foo/x").execute().assertBody("h");
        }
+
+       
//=================================================================================================================
+       // Overridden URL patterns
+       
//=================================================================================================================
+
+       @Rest
+       public static class B1 {
+               @RestMethod(name=GET, path="/foo")
+               public String b01a() {
+                       return "a";
+               }
+       }
+
+       @Rest
+       public static class B2 extends B1 {
+               @RestMethod(name=GET, path="/foo")
+               public String b02a() {  // Overrides method on parent.
+                       return "b";
+               }
+       }
+       static MockRest b2 = MockRest.build(B2.class, null);
+
+       @Test
+       public void b01_pathOverriddenByChild() throws Exception {
+               b2.get("/foo").execute().assertBody("b");
+       }
 }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java
index 6aa2fe3..45ef6c4 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestCallRouter.java
@@ -40,7 +40,6 @@ public class RestCallRouter {
         */
        static final class Builder {
                private List<RestMethodContext> childMethods = new 
ArrayList<>();
-               private Set<String> collisions = new HashSet<>();
                private String httpMethodName;
 
                Builder(String httpMethodName) {
@@ -51,13 +50,7 @@ public class RestCallRouter {
                        return httpMethodName;
                }
 
-               Builder add(RestMethodContext m) throws RestServletException {
-                       if (! m.hasGuardsOrMatchers()) {
-                               String p = m.getHttpMethod() + ":" + 
m.getPathPattern();
-                               if (collisions.contains(p))
-                                       throw new 
RestServletException("Duplicate Java methods assigned to the same 
method/pattern:  ''{0}''", p);
-                               collisions.add(p);
-                       }
+               Builder add(RestMethodContext m) {
                        childMethods.add(m);
                        return this;
                }
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index cbf42b1..3984786 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -3936,7 +3936,7 @@ public final class RestContext extends BeanContext {
                }
        }
 
-       private static void addToRouter(Map<String, RestCallRouter.Builder> 
routers, String httpMethodName, RestMethodContext cm) throws 
RestServletException {
+       private static void addToRouter(Map<String, RestCallRouter.Builder> 
routers, String httpMethodName, RestMethodContext cm) {
                if (! routers.containsKey(httpMethodName))
                        routers.put(httpMethodName, new 
RestCallRouter.Builder(httpMethodName));
                routers.get(httpMethodName).add(cm);
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java
index fc20866..e0144a1 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestMethodContext.java
@@ -580,6 +580,7 @@ public class RestMethodContext extends BeanContext 
implements Comparable<RestMet
        final ResponseBeanMeta responseMeta;
 
        final Enablement debug;
+       final int hierarchyDepth;
 
        @SuppressWarnings("deprecation")
        RestMethodContext(RestMethodContextBuilder b) throws ServletException {
@@ -593,6 +594,14 @@ public class RestMethodContext extends BeanContext 
implements Comparable<RestMet
                // Need this to access methods in anonymous inner classes.
                mi.setAccessible();
 
+               int hd = 0;
+               Class<?> sc = b.method.getDeclaringClass().getSuperclass();
+               while (sc != null) {
+                       hd++;
+                       sc = sc.getSuperclass();
+               }
+               hierarchyDepth = hd;
+
                PropertyStore ps = getPropertyStore();
                ResourceResolver rr = context.getResourceResolver();
                Object r = context.getResource();
@@ -960,6 +969,10 @@ public class RestMethodContext extends BeanContext 
implements Comparable<RestMet
                if (c != 0)
                        return c;
 
+               c = compare(o.hierarchyDepth, hierarchyDepth);
+               if (c != 0)
+                       return c;
+
                c = compare(o.requiredMatchers.length, requiredMatchers.length);
                if (c != 0)
                        return c;
@@ -972,6 +985,10 @@ public class RestMethodContext extends BeanContext 
implements Comparable<RestMet
                if (c != 0)
                        return c;
 
+               c = compare(method.getName(), o.method.getName());
+               if (c != 0)
+                       return c;
+
                return 0;
        }
 

Reply via email to