blob: 1c73265d72ab119689ac8133b7aedafac000f480 [file] [log] [blame]
// ***************************************************************************************************************************
// * 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.apache.juneau.http.HttpMethodName.*;
import static org.apache.juneau.internal.IOUtils.*;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.juneau.*;
import org.apache.juneau.config.*;
import org.apache.juneau.dto.swagger.*;
import org.apache.juneau.examples.addressbook.*;
import org.apache.juneau.http.*;
import org.apache.juneau.httppart.*;
import org.apache.juneau.json.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.plaintext.*;
import org.apache.juneau.rest.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.transforms.*;
import org.apache.juneau.urlencoding.*;
import org.apache.juneau.utils.*;
/**
* JUnit automated testcase resource.
*/
@RestResource(
path="/testParams",
serializers=PlainTextSerializer.class,
allowedMethodParams="*",
pojoSwaps={CalendarSwap.DateMedium.class},
messages="ParamsResource"
)
public class ParamsResource extends BasicRestServlet {
private static final long serialVersionUID = 1L;
//====================================================================================================
// Basic tests
//====================================================================================================
@RestMethod(name=GET, path="/")
public void doGet(RestResponse res) {
res.setOutput(GET);
}
@RestMethod(name=GET, path="/get1")
public String doGet1() {
return "GET /get1";
}
@RestMethod(name=GET, path="/get1/{foo}")
public void doGet1a(RestResponse res, String foo) {
res.setOutput("GET /get1a " + foo);
}
@RestMethod(name=GET, path="/get1/{foo}/{bar}")
public void doGet1b(RestResponse res, String foo, String bar) {
res.setOutput("GET /get1b " + foo + "," + bar);
}
@RestMethod(name=GET, path="/get3/{foo}/{bar}/*")
public void doGet3(HttpServletRequest reqx, HttpServletResponse resx, String foo, int bar) {
RestRequest req = (RestRequest)reqx;
RestResponse res = (RestResponse)resx;
res.setOutput("GET /get3/"+foo+"/"+bar+" remainder="+req.getPathMatch().getRemainder());
}
// Test method name with overlapping name, remainder allowed.
@RestMethod(name="GET2")
public void get2(RestRequest req, RestResponse res) {
res.setOutput("GET2 remainder="+req.getPathMatch().getRemainder());
}
// Default POST
@RestMethod(name=POST)
public void doPost(RestRequest req, RestResponse res) {
res.setOutput("POST remainder="+req.getPathMatch().getRemainder());
}
// Bean parameter
@RestMethod(name=POST, path="/person/{person}")
public void doPost(RestRequest req, RestResponse res, Person p) {
res.setOutput("POST /person/{name="+p.name+",birthDate.year="+p.birthDate.get(Calendar.YEAR)+"} remainder="+req.getPathMatch().getRemainder());
}
// Various primitive types
@RestMethod(name=PUT, path="/primitives/{xInt}/{xShort}/{xLong}/{xChar}/{xFloat}/{xDouble}/{xByte}/{xBoolean}")
public void doPut1(RestResponse res, int xInt, short xShort, long xLong, char xChar, float xFloat, double xDouble, byte xByte, boolean xBoolean) {
res.setOutput("PUT /primitives/"+xInt+"/"+xShort+"/"+xLong+"/"+xChar+"/"+xFloat+"/"+xDouble+"/"+xByte+"/"+xBoolean);
}
// Various primitive objects
@RestMethod(name=PUT, path="/primitiveObjects/{xInt}/{xShort}/{xLong}/{xChar}/{xFloat}/{xDouble}/{xByte}/{xBoolean}")
public void doPut2(RestResponse res, Integer xInt, Short xShort, Long xLong, Character xChar, Float xFloat, Double xDouble, Byte xByte, Boolean xBoolean) {
res.setOutput("PUT /primitiveObjects/"+xInt+"/"+xShort+"/"+xLong+"/"+xChar+"/"+xFloat+"/"+xDouble+"/"+xByte+"/"+xBoolean);
}
// Object with forString(String) method
@RestMethod(name=PUT, path="/uuid/{uuid}")
public void doPut1(RestResponse res, UUID uuid) {
res.setOutput("PUT /uuid/"+uuid);
}
//====================================================================================================
// @FormData annotation - GET
//====================================================================================================
@RestMethod(name=GET, path="/testParamGet/*")
public String testParamGet(RestRequest req, @Query("p1") String p1, @Query("p2") int p2) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+req.getQuery().getString("p1")+","+q.get("p1", String.class)+"],p2=["+p2+","+q.getString("p2")+","+q.get("p2", int.class)+"]";
}
//====================================================================================================
// @FormData annotation - POST
//====================================================================================================
@RestMethod(name=POST, path="/testParamPost/*")
public String testParamPost(RestRequest req, @FormData("p1") String p1, @FormData("p2") int p2) throws Exception {
RequestFormData f = req.getFormData();
return "p1=["+p1+","+req.getFormData().getString("p1")+","+f.get("p1", String.class)+"],p2=["+p2+","+req.getFormData().getString("p2")+","+f.get("p2", int.class)+"]";
}
//====================================================================================================
// @Query annotation - GET
//====================================================================================================
@RestMethod(name=GET, path="/testQParamGet/*")
public String testQParamGet(RestRequest req, @Query("p1") String p1, @Query("p2") int p2) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+req.getQuery().getString("p1")+","+q.get("p1", String.class)+"],p2=["+p2+","+q.getString("p2")+","+q.get("p2", int.class)+"]";
}
//====================================================================================================
// @Query annotation - POST
//====================================================================================================
@RestMethod(name=POST, path="/testQParamPost/*")
public String testQParamPost(RestRequest req, @Query("p1") String p1, @Query("p2") int p2) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+req.getQuery().getString("p1")+","+q.get("p1", String.class)+"],p2=["+p2+","+q.getString("p2")+","+q.get("p2", int.class)+"]";
}
//====================================================================================================
// @FormData(format=PLAIN) annotation - GET
//====================================================================================================
@RestMethod(name=GET, path="/testPlainParamGet/*")
public String testPlainParamGet(RestRequest req, @Query(value="p1",parser=SimplePartParser.class) String p1) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+req.getQuery().getString("p1")+","+q.get("p1", String.class)+"]";
}
//====================================================================================================
// @FormData(format=PLAIN) annotation - POST
//====================================================================================================
@RestMethod(name=POST, path="/testPlainParamPost/*")
public String testPlainParamPost(RestRequest req, @FormData(value="p1",parser=SimplePartParser.class) String p1) throws Exception {
RequestFormData f = req.getFormData();
return "p1=["+p1+","+req.getFormData().getString("p1")+","+f.get("p1", String.class)+"]";
}
//====================================================================================================
// @Query(format=PLAIN) annotation - GET
//====================================================================================================
@RestMethod(name=GET, path="/testPlainQParamGet/*")
public String testPlainQParamGet(RestRequest req, @Query(value="p1",parser=SimplePartParser.class) String p1) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+req.getQuery().getString("p1")+","+q.get("p1", String.class)+"]";
}
//====================================================================================================
// @Query(format=PLAIN) annotation - POST
//====================================================================================================
@RestMethod(name=POST, path="/testPlainQParamPost/*")
public String testPlainQParamPost(RestRequest req, @Query(value="p1",parser=SimplePartParser.class) String p1) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+req.getQuery().getString("p1")+","+q.get("p1", String.class)+"]";
}
//====================================================================================================
// @HasQuery annotation - GET
//====================================================================================================
@RestMethod(name=GET, path="/testHasParamGet/*")
public String testHasParamGet(RestRequest req, @HasQuery("p1") boolean p1, @HasQuery("p2") Boolean p2) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+q.containsKey("p1")+"],p2=["+p2+","+q.containsKey("p2")+"]";
}
//====================================================================================================
// @HasQuery annotation - POST
//====================================================================================================
@RestMethod(name=POST, path="/testHasParamPost/*")
public String testHasParamPost(RestRequest req, @HasFormData("p1") boolean p1, @HasFormData("p2") Boolean p2) throws Exception {
RequestFormData f = req.getFormData();
return "p1=["+p1+","+f.containsKey("p1")+"],p2=["+p2+","+f.containsKey("p2")+"]";
}
//====================================================================================================
// @HasQuery annotation - GET
//====================================================================================================
@RestMethod(name=GET, path="/testHasQParamGet/*")
public String testHasQParamGet(RestRequest req, @HasQuery("p1") boolean p1, @HasQuery("p2") Boolean p2) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+q.containsKey("p1")+"],p2=["+p2+","+q.containsKey("p2")+"]";
}
//====================================================================================================
// @HasQuery annotation - POST
//====================================================================================================
@RestMethod(name=POST, path="/testHasQParamPost/*")
public String testHasQParamPost_post(RestRequest req, @HasQuery("p1") boolean p1, @HasQuery("p2") Boolean p2) throws Exception {
RequestQuery q = req.getQuery();
return "p1=["+p1+","+q.containsKey("p1")+"],p2=["+p2+","+q.containsKey("p2")+"]";
}
//====================================================================================================
// Form POSTS with @Body parameter
//====================================================================================================
@RestMethod(name=POST, path="/testFormPostAsContent/*")
public String testFormPostAsContent(@Body Test6Bean bean,
@HasQuery("p1") boolean hqp1, @HasQuery("p2") boolean hqp2,
@Query("p1") String qp1, @Query("p2") int qp2) throws Exception {
return "bean=["+JsonSerializer.DEFAULT_LAX.toString(bean)+"],qp1=["+qp1+"],qp2=["+qp2+"],hqp1=["+hqp1+"],hqp2=["+hqp2+"]";
}
public static class Test6Bean {
public String p1;
public int p2;
}
//====================================================================================================
// Test @FormData and @Query annotations when using multi-part parameters (e.g. &key=val1,&key=val2).
//====================================================================================================
@RestMethod(name=GET, path="/testMultiPartParams")
public String testMultiPartParams(
@Query(value="p1",multipart=true) String[] p1,
@Query(value="p2",multipart=true) int[] p2,
@Query(value="p3",multipart=true) List<String> p3,
@Query(value="p4",multipart=true) List<Integer> p4,
@Query(value="p5",multipart=true) String[] p5,
@Query(value="p6",multipart=true) int[] p6,
@Query(value="p7",multipart=true) List<String> p7,
@Query(value="p8",multipart=true) List<Integer> p8,
@Query(value="p9",multipart=true) A[] p9,
@Query(value="p10",multipart=true) List<A> p10,
@Query(value="p11",multipart=true) A[] p11,
@Query(value="p12",multipart=true) List<A> p12) throws Exception {
ObjectMap m = new ObjectMap()
.append("p1", p1)
.append("p2", p2)
.append("p3", p3)
.append("p4", p4)
.append("p5", p5)
.append("p6", p6)
.append("p7", p7)
.append("p8", p8)
.append("p9", p9)
.append("p10", p10)
.append("p11", p11)
.append("p12", p12);
return JsonSerializer.DEFAULT_LAX.toString(m);
}
public static class A {
public String a;
public int b;
public boolean c;
}
//====================================================================================================
// Test multi-part parameter keys on bean properties of type array/Collection (i.e. &key=val1,&key=val2)
// using URLENC_expandedParams property.
// A simple round-trip test to verify that both serializing and parsing works.
//====================================================================================================
@RestMethod(name=POST, path="/testFormPostsWithMultiParamsUsingProperty",
properties={
@Property(name=UrlEncodingSerializer.URLENC_expandedParams, value="true"),
@Property(name=UrlEncodingParser.URLENC_expandedParams, value="true")
}
)
public DTO2s.B testFormPostsWithMultiParamsViaProperty(@Body DTO2s.B content) throws Exception {
return content;
}
//====================================================================================================
// Test multi-part parameter keys on bean properties of type array/Collection (i.e. &key=val1,&key=val2)
// using @UrlEncoding(expandedParams=true) annotation.
// A simple round-trip test to verify that both serializing and parsing works.
//====================================================================================================
@RestMethod(name=POST, path="/testFormPostsWithMultiParamsUsingAnnotation")
public DTO2s.C testFormPostsWithMultiParamsUsingAnnotation(@Body DTO2s.C content) throws Exception {
return content;
}
//====================================================================================================
// Test other available object types as parameters.
//====================================================================================================
@RestMethod(name=GET, path="/otherObjects/ResourceBundle")
public String testOtherResourceBundle(ResourceBundle t) {
if (t != null)
return t.getString("foo");
return null;
}
@RestMethod(name=GET, path="/otherObjects/MessageBundle")
public String testOtherMessages(MessageBundle t) {
if (t != null)
return t.getString("foo");
return null;
}
@RestMethod(name=POST, path="/otherObjects/InputStream")
public String testOtherInputStream(InputStream t) throws IOException {
return read(t);
}
@RestMethod(name=POST, path="/otherObjects/ServletInputStream")
public String testOtherServletInputStream(ServletInputStream t) throws IOException {
return read(t);
}
@RestMethod(name=POST, path="/otherObjects/Reader")
public String testOtherReader(Reader t) throws IOException {
return read(t);
}
@RestMethod(name=GET, path="/otherObjects/OutputStream")
public void testOtherOutputStream(OutputStream t) throws IOException {
t.write("OK".getBytes());
}
@RestMethod(name=GET, path="/otherObjects/ServletOutputStream")
public void testOtherServletOutputStream(ServletOutputStream t) throws IOException {
t.write("OK".getBytes());
}
@RestMethod(name=GET, path="/otherObjects/Writer")
public void testOtherWriter(Writer t) throws IOException {
t.write("OK");
}
@RestMethod(name=GET, path="/otherObjects/RequestHeaders")
public boolean testOtherRequestHeaders(RequestHeaders t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/RequestQuery")
public boolean testOtherRequestQueryParams(RequestQuery t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/RequestFormData")
public boolean testOtherRequestFormData(RequestFormData t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/HttpMethod")
public String testOtherHttpMethod(HttpMethod t) {
return t.toString();
}
@RestMethod(name=GET, path="/otherObjects/RestLogger")
public boolean testOtherLogger(RestLogger t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/RestContext")
public boolean testOtherRestContext(RestContext t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/Parser")
public String testOtherParser(Parser t) {
return t.getClass().getName();
}
@RestMethod(name=GET, path="/otherObjects/Locale")
public String testOtherLocale(Locale t) {
return t.toString();
}
@RestMethod(name=GET, path="/otherObjects/Swagger")
public boolean testOtherSwagger(Swagger t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/RequestPathMatch")
public boolean testOtherRequestPathMatch(RequestPathMatch t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/RequestBody")
public boolean testOtherRequestBody(RequestBody t) {
return t != null;
}
@RestMethod(name=GET, path="/otherObjects/Config")
public boolean testOtherConfig(Config t) {
return t != null;
}
}