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;
}