Repository: incubator-juneau Updated Branches: refs/heads/master e86b4cda4 -> 9ee67bd02
@RestMethod.path() annotation should support numeric variable indexes. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/9ee67bd0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/9ee67bd0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/9ee67bd0 Branch: refs/heads/master Commit: 9ee67bd02614919980ac8c3cb78a28d1a47d8e41 Parents: e86b4cd Author: JamesBognar <[email protected]> Authored: Sat Apr 1 19:54:15 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Sat Apr 1 19:54:15 2017 -0400 ---------------------------------------------------------------------- .../juneau/rest/test/PathVariablesResource.java | 48 ++++++++++++++++++ .../java/org/apache/juneau/rest/test/Root.java | 1 + .../juneau/rest/test/PathVariableTest.java | 51 ++++++++++++++++++++ .../java/org/apache/juneau/rest/CallMethod.java | 14 +++++- .../org/apache/juneau/rest/annotation/Path.java | 9 ++++ .../juneau/rest/annotation/RestMethod.java | 11 +++++ 6 files changed, 132 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9ee67bd0/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/PathVariablesResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/PathVariablesResource.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/PathVariablesResource.java new file mode 100644 index 0000000..1a72297 --- /dev/null +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/PathVariablesResource.java @@ -0,0 +1,48 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest.test; + +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.utils.*; + +/** + * JUnit automated testcase resource. + * Tests the <code>@RestMethod.path()</code> annotation. + */ +@RestResource( + path="/testPathVariables" +) +public class PathVariablesResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + @RestMethod(name="GET", path="/test1/{x}/foo/{y}/bar/{z}/*") + public StringMessage test1(@Path String x, @Path int y, @Path boolean z) { + return new StringMessage("x={0},y={1},z={2}", x, y, z); + } + + @RestMethod(name="GET", path="/test2/{z}/foo/{y}/bar/{x}/*") + public StringMessage test2(@Path("x") String x, @Path("y") int y, @Path("z") boolean z) { + return new StringMessage("x={0},y={1},z={2}", x, y, z); + } + + @RestMethod(name="GET", path="/test3/{0}/foo/{1}/bar/{2}/*") + public StringMessage test3(@Path String x, @Path int y, @Path boolean z) { + return new StringMessage("x={0},y={1},z={2}", x, y, z); + } + + @RestMethod(name="GET", path="/test4/{2}/foo/{1}/bar/{0}/*") + public StringMessage test4(@Path String x, @Path int y, @Path boolean z) { + return new StringMessage("x={0},y={1},z={2}", x, y, z); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9ee67bd0/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java index 74834a0..10bbb18 100644 --- a/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java +++ b/juneau-rest-test/src/main/java/org/apache/juneau/rest/test/Root.java @@ -54,6 +54,7 @@ import org.apache.juneau.rest.labels.*; ParsersResource.class, PathResource.class, PathsResource.class, + PathVariablesResource.class, PropertiesResource.class, RestClient2Resource.class, SerializersResource.class, http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9ee67bd0/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java new file mode 100644 index 0000000..3f20146 --- /dev/null +++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/PathVariableTest.java @@ -0,0 +1,51 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest.test; + +import static org.junit.Assert.*; + +import org.apache.juneau.rest.client.*; +import org.junit.*; + +/** + * Tests the <code>@RestMethod.path()</code> annotation. + */ +public class PathVariableTest extends RestTestcase { + + private static String URL = "/testPathVariables"; + RestClient client = TestMicroservice.DEFAULT_CLIENT; + + @Test + public void test1() throws Exception { + String r = client.doGet(URL + "/test1/xxx/foo/123/bar/true").getResponseAsString(); + assertEquals("x=xxx,y=123,z=true", r); + } + + @Test + public void test2() throws Exception { + String r = client.doGet(URL + "/test2/true/foo/123/bar/xxx").getResponseAsString(); + assertEquals("x=xxx,y=123,z=true", r); + } + + @Test + public void test3() throws Exception { + String r = client.doGet(URL + "/test3/xxx/foo/123/bar/true").getResponseAsString(); + assertEquals("x=xxx,y=123,z=true", r); + } + + @Test + public void test4() throws Exception { + String r = client.doGet(URL + "/test4/true/foo/123/bar/xxx").getResponseAsString(); + assertEquals("x=xxx,y=123,z=true", r); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9ee67bd0/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java index 8125cdc..c26e53c 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java @@ -382,9 +382,19 @@ class CallMethod implements Comparable<CallMethod> { _paramType = PATH; if (_paramType == PATH && _name.isEmpty()) { - if (pathPattern.getVars().length <= attrIdx) + int idx = attrIdx++; + String[] vars = pathPattern.getVars(); + if (vars.length <= idx) throw new RestServletException("Number of attribute parameters in method ''{0}'' exceeds the number of URL pattern variables.", method.getName()); - _name = pathPattern.getVars()[attrIdx++]; + + // Check for {#} variables. + String idxs = String.valueOf(idx); + for (int i = 0; i < vars.length; i++) + if (StringUtils.isNumeric(vars[i]) && vars[i].equals(idxs)) + _name = vars[i]; + + if (_name.isEmpty()) + _name = pathPattern.getVars()[idx]; } this.paramType = _paramType; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9ee67bd0/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Path.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Path.java b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Path.java index d9bdff9..d3c5c89 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Path.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Path.java @@ -56,6 +56,15 @@ import java.lang.annotation.*; * ... * } * </p> + * You can also use <code>{#}</code> notation to specify path parameters without specifying names. + * <p> + * <p class='bcode'> + * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/myurl/{0}/{1}/{2}/*"</js>) + * <jk>public void</jk> doGet(RestRequest req, RestResponse res, + * <ja>@Path</ja> String foo, <ja>@Path</ja> <jk>int</jk> bar, <ja>@Path</ja> UUID baz) { + * ... + * } + * </p> */ @Documented @Target(PARAMETER) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/9ee67bd0/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java index 986aa74..1720066 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java @@ -69,6 +69,17 @@ public @interface RestMethod { * Appending <js>"/*"</js> to the end of the path pattern will make it match any remainder too.<br> * Not appending <js>"/*"</js> to the end of the pattern will cause a 404 (Not found) error to occur * if the exact pattern is not found. + * <p> + * The path can contain variables that get resolved to {@link Path @Path} parameters: + * <p class='bcode'> + * <jc>// Example 1</jc> + * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/myurl/{foo}/{bar}/{baz}/*"</js>) + * + * <jc>// Example 2</jc> + * <ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/myurl/{0}/{1}/{2}/*"</js>) + * </p> + * <p> + * Refer to {@link Path @Path} on how path variables get resolved. */ String path() default "/*";
