http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/MessagesResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/MessagesResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/MessagesResource.java new file mode 100644 index 0000000..14c4b28 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/MessagesResource.java @@ -0,0 +1,62 @@ +// *************************************************************************************************************************** +// * 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 java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.transform.*; + +/** + * JUnit automated testcase resource. + * Validates that resource bundles can be defined on both parent and child classes. + */ +@RestResource( + path="/testMessages", + messages="MessagesResource", + pojoSwaps={ + MessagesResource.ResourceBundleSwap.class + } +) +public class MessagesResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Return contents of resource bundle. + //==================================================================================================== + @RestMethod(name="GET", path="/test") + public Object test(@Messages ResourceBundle nls) { + return nls; + } + + + @SuppressWarnings("serial") + @RestResource( + path="/testMessages2", + messages="Messages2Resource" + ) + public static class Messages2Resource extends MessagesResource {} + + public static class ResourceBundleSwap extends MapSwap<ResourceBundle> { + @Override /* Transform */ + public ObjectMap swap(BeanSession session, ResourceBundle o) throws SerializeException { + ObjectMap m = new ObjectMap(); + for (String k : o.keySet()) + m.put(k, o.getString(k)); + return m; + } + } +}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsPropertyResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsPropertyResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsPropertyResource.java new file mode 100644 index 0000000..3472634 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsPropertyResource.java @@ -0,0 +1,71 @@ +// *************************************************************************************************************************** +// * 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.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.serializer.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testNlsProperty", + serializers={NlsPropertyResource.TestSerializer.class}, + properties={ + @Property(name="TestProperty",value="$L{key1}") + }, + messages="NlsPropertyResource" +) +public class NlsPropertyResource extends RestServlet { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Test getting an NLS property defined on a class. + //==================================================================================================== + @RestMethod(name="GET", path="/testInheritedFromClass") + public String testInheritedFromClass() { + return null; + } + + //==================================================================================================== + // Test getting an NLS property defined on a method. + //==================================================================================================== + @RestMethod(name="GET", path="/testInheritedFromMethod", + properties={ + @Property(name="TestProperty",value="$L{key2}") + } + ) + public String testInheritedFromMethod() { + return null; + } + + public static class TestSerializer extends WriterSerializer { + + public TestSerializer(PropertyStore propertyStore) { + super(propertyStore, "text/plain"); + } + + @Override /* Serializer */ + public WriterSerializerSession createSession(SerializerSessionArgs args) { + return new WriterSerializerSession(args) { + + @Override /* SerializerSession */ + protected void doSerialize(SerializerPipe out, Object o) throws Exception { + out.getWriter().write(getStringProperty("TestProperty")); + } + }; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java new file mode 100644 index 0000000..0048e8e --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NlsResource.java @@ -0,0 +1,197 @@ +// *************************************************************************************************************************** +// * 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. + */ +@RestResource( + path="/testNls", + children={ + NlsResource.Test1.class, + NlsResource.Test2.class, + NlsResource.Test3.class, + NlsResource.Test4.class, + NlsResource.Test5.class, + NlsResource.Test6.class + } +) +@SuppressWarnings({"serial"}) +public class NlsResource extends RestServletGroupDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // test1 - Pull labels from annotations only. + //==================================================================================================== + @RestResource( + path="/test1", + messages="NlsResource", + title="Test1.a", + description="Test1.b" + ) + public static class Test1 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}", + description="Test1.c", + swagger=@MethodSwagger( + parameters={ + @Parameter(in="path", name="a", description="Test1.d"), + @Parameter(in="query", name="b", description="Test1.e"), + @Parameter(in="body", description="Test1.f"), + @Parameter(in="header", name="D", description="Test1.g"), + @Parameter(in="path", name="a2", description="Test1.h"), + @Parameter(in="query", name="b2", description="Test1.i"), + @Parameter(in="header", name="D2", description="Test1.j"), + }, + responses={ + @Response(200), + @Response(value=201, + description="Test1.l", + headers={ + @Parameter(in="foo", name="bar", description="Test1.m"), + } + ) + } + ) + ) + public String test1(@Path("a") String a, @Query("b") String b, @Body String c, @Header("D") String d, + @Path("e") String e, @Query("f") String f, @Header("g") String g) { + return null; + } + } + + //==================================================================================================== + // test2 - Pull labels from resource bundles only - simple keys. + //==================================================================================================== + @RestResource( + path="/test2", + messages="NlsResource" + ) + public static class Test2 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}" + ) + public String test2(@Path("a") String a, @Query("b") String b, @Body String c, @Header("D") String d, + @Path("e") String e, @Query("f") String f, @Header("g") String g) { + return null; + } + } + + //==================================================================================================== + // test3 - Pull labels from resource bundles only - keys with class names. + //==================================================================================================== + @RestResource( + path="/test3", + messages="NlsResource" + ) + public static class Test3 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}" + ) + public String test3(@Path("a") String a, @Query("b") String b, @Body String c, @Header("D") String d, + @Path("e") String e, @Query("f") String f, @Header("g") String g) { + return null; + } + + @RestMethod( + name="GET", path="/" + ) + public Object test3a(@Messages MessageBundle mb) { + return mb; + } + } + + //==================================================================================================== + // test4 - Pull labels from resource bundles only. Values have localized variables to resolve. + //==================================================================================================== + @RestResource( + path="/test4", + messages="NlsResource" + ) + public static class Test4 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}" + ) + public String test4(@Path("a") String a, @Query("b") String b, @Body String c, @Header("D") String d, + @Path("e") String e, @Query("f") String f, @Header("g") String g) { + return null; + } + } + + //==================================================================================================== + // test5 - Pull labels from resource bundles only. Values have request variables to resolve. + //==================================================================================================== + @RestResource( + path="/test5", + messages="NlsResource" + ) + public static class Test5 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}" + ) + public String test5(@Path("a") String a, @Query("b") String b, @Body String c, @Header("D") String d, + @Path("e") String e, @Query("f") String f, @Header("g") String g) { + return null; + } + } + + //==================================================================================================== + // test6 - Pull labels from annotations only, but annotations contain variables. + //==================================================================================================== + @RestResource( + path="/test6", + messages="NlsResource", + title="$L{foo}", + description="$L{foo}" + ) + public static class Test6 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}", + description="$L{foo}", + swagger=@MethodSwagger( + parameters={ + @Parameter(in="path", name="a", description="$L{foo}"), + @Parameter(in="query", name="b", description="$L{foo}"), + @Parameter(in="body", description="$L{foo}"), + @Parameter(in="header", name="D", description="$L{foo}"), + @Parameter(in="path", name="a2", description="$L{foo}"), + @Parameter(in="query", name="b2", description="$L{foo}"), + @Parameter(in="header", name="D2", description="$L{foo}") + }, + responses={ + @Response(200), + @Response(value=201, + description="$L{foo}", + headers={ + @Parameter(in="foo", name="bar", description="$L{foo}"), + } + ) + } + ) + ) + public String test6(@Path("a") String a, @Query("b") String b, @Body String c, @Header("D") String d, + @Path("e") String e, @Query("f") String f, @Header("g") String g) { + return null; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NoParserInputResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NoParserInputResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NoParserInputResource.java new file mode 100644 index 0000000..cbd7230 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/NoParserInputResource.java @@ -0,0 +1,57 @@ +// *************************************************************************************************************************** +// * 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.internal.IOUtils.*; + +import java.io.*; + +import org.apache.juneau.plaintext.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testNoParserInput", + serializers=PlainTextSerializer.class +) +public class NoParserInputResource extends RestServlet { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // @Body annotated InputStream. + //==================================================================================================== + @RestMethod(name="PUT", path="/testInputStream") + public String testInputStream(@Body InputStream in) throws Exception { + return read(in); + } + + //==================================================================================================== + // @Body annotated Reader. + //==================================================================================================== + @RestMethod(name="PUT", path="/testReader") + public String testReader(@Body Reader in) throws Exception { + return read(in); + } + + //==================================================================================================== + // @Body annotated PushbackReader. + // This should always fail since the servlet reader is not a pushback reader. + //==================================================================================================== + @RestMethod(name="PUT", path="/testPushbackReader") + public String testPushbackReader(@Body PushbackReader in) throws Exception { + return read(in); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPostCallResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPostCallResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPostCallResource.java new file mode 100644 index 0000000..a9414b0 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPostCallResource.java @@ -0,0 +1,110 @@ +// *************************************************************************************************************************** +// * 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.rest.annotation.HookEvent.*; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.rest.annotation.Properties; +import org.apache.juneau.serializer.*; +import org.apache.juneau.utils.*; + +/** + * JUnit automated testcase resource. + * Validates that headers + */ +@RestResource( + path="/testOnPostCall", + serializers=OnPostCallResource.TestSerializer.class, + properties={ + @Property(name="p1",value="sp1"), // Unchanged servlet-level property. + @Property(name="p2",value="sp2"), // Servlet-level property overridden by onPostCall. + @Property(name="p3",value="sp3"), // Servlet-level property overridded by method. + @Property(name="p4",value="sp4") // Servlet-level property overridden by method then onPostCall. + } +) +public class OnPostCallResource extends RestServlet { + private static final long serialVersionUID = 1L; + + public static class TestSerializer extends WriterSerializer { + + public TestSerializer(PropertyStore propertyStore) { + super(propertyStore, "test/s1", "text/s1", "text/s2", "text/s3"); + } + + @Override /* Serializer */ + public WriterSerializerSession createSession(SerializerSessionArgs args) { + return new WriterSerializerSession(args) { + + @Override /* SerializerSession */ + protected void doSerialize(SerializerPipe out, Object o) throws Exception { + out.getWriter().write("p1="+getStringProperty("p1")+",p2="+getStringProperty("p2")+",p3="+getStringProperty("p3")+",p4="+getStringProperty("p4")+",p5="+getStringProperty("p5")+",contentType="+getStringProperty("mediaType")); + } + + @Override /* SerializerSession */ + public Map<String,String> getResponseHeaders() { + ObjectMap p = getProperties(); + if (p.containsKey("Override-Content-Type")) + return new AMap<String,String>().append("Content-Type", p.getString("Override-Content-Type")); + return Collections.emptyMap(); + } + }; + } + } + + @RestHook(POST_CALL) + public void onPostCall(RestRequest req, RestResponse res) { + ObjectMap properties = req.getProperties(); + properties.put("p2", "xp2"); + properties.put("p4", "xp4"); + properties.put("p5", "xp5"); // New property + String overrideAccept = req.getHeader("Override-Accept"); + if (overrideAccept != null) + req.getHeaders().put("Accept", overrideAccept); + String overrideContentType = req.getHeader("Override-Content-Type"); + if (overrideContentType != null) + properties.put("Override-Content-Type", overrideContentType); + } + + + //==================================================================================================== + // Test1 - Properties overridden via properties annotation. + //==================================================================================================== + @RestMethod(name="PUT", path="/testPropertiesOverridenByAnnotation", + properties={ + @Property(name="p3",value="mp3"), + @Property(name="p4",value="mp4") + }, + defaultRequestHeaders="Accept: text/s2" + ) + public String testPropertiesOverridenByAnnotation() { + return ""; + } + + //==================================================================================================== + // Test2 - Properties overridden programmatically. + //==================================================================================================== + @RestMethod(name="PUT", path="/testPropertiesOverriddenProgramatically") + public String testPropertiesOverriddenProgramatically(RestRequest req, @Properties ObjectMap properties) throws Exception { + properties.put("p3", "pp3"); + properties.put("p4", "pp4"); + String accept = req.getHeader("Accept"); + if (accept == null || accept.isEmpty()) + req.getHeaders().put("Accept", "text/s2"); + return ""; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPreCallResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPreCallResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPreCallResource.java new file mode 100644 index 0000000..9fa9469 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OnPreCallResource.java @@ -0,0 +1,95 @@ +// *************************************************************************************************************************** +// * 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.rest.annotation.HookEvent.*; + +import org.apache.juneau.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; + +/** + * JUnit automated testcase resource. + * Validates that headers + */ +@RestResource( + path="/testOnPreCall", + parsers=OnPreCallResource.TestParserA.class, + serializers=PlainTextSerializer.class, + properties={ + @Property(name="p1",value="sp1"), // Unchanged servlet-level property. + @Property(name="p2",value="sp2"), // Servlet-level property overridden by onPreCall. + @Property(name="p3",value="sp3"), // Servlet-level property overridded by method. + @Property(name="p4",value="sp4") // Servlet-level property overridden by method then onPreCall. + } +) +public class OnPreCallResource extends RestServlet { + private static final long serialVersionUID = 1L; + + public static class TestParserA extends ReaderParser { + + public TestParserA(PropertyStore propertyStore) { + super(propertyStore, "text/a1", "text/a2", "text/a3"); + } + + @Override /* Parser */ + public ReaderParserSession createSession(ParserSessionArgs args) { + return new ReaderParserSession(args) { + + @Override /* ParserSession */ + @SuppressWarnings("unchecked") + protected <T> T doParse(ParserPipe pipe, ClassMeta<T> type) throws Exception { + String matchingContentType = getStringProperty("mediaType"); + return (T)("p1="+getStringProperty("p1")+",p2="+getStringProperty("p2")+",p3="+getStringProperty("p3")+",p4="+getStringProperty("p4")+",p5="+getStringProperty("p5")+",contentType="+matchingContentType); + } + }; + } + } + + @RestHook(PRE_CALL) + public void onPreCall(RestRequest req) { + ObjectMap properties = req.getProperties(); + properties.put("p2", "xp2"); + properties.put("p4", "xp4"); + properties.put("p5", "xp5"); // New property + String overrideContentType = req.getHeader("Override-Content-Type"); + if (overrideContentType != null) + req.getHeaders().put("Content-Type", overrideContentType); + } + + + //==================================================================================================== + // Properties overridden via properties annotation. + //==================================================================================================== + @RestMethod(name="PUT", path="/testPropertiesOverriddenByAnnotation", + properties={ + @Property(name="p3",value="mp3"), + @Property(name="p4",value="mp4") + } + ) + public String testPropertiesOverriddenByAnnotation(@Body String in) { + return in; + } + + //==================================================================================================== + // Properties overridden programmatically. + //==================================================================================================== + @RestMethod(name="PUT", path="/testPropertiesOverriddenProgrammatically") + public String testPropertiesOverriddenProgrammatically(RestRequest req, @Properties ObjectMap properties) throws Exception { + properties.put("p3", "pp3"); + properties.put("p4", "pp4"); + return req.getBody().asType(String.class); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OptionsWithoutNlsResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OptionsWithoutNlsResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OptionsWithoutNlsResource.java new file mode 100644 index 0000000..f31a1b1 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OptionsWithoutNlsResource.java @@ -0,0 +1,44 @@ +// *************************************************************************************************************************** +// * 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.dto.swagger.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testOptionsWithoutNls" +) +public class OptionsWithoutNlsResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Should get to the options page without errors + //==================================================================================================== + @RestMethod(name="OPTIONS", path="/testOptions/*") + public Swagger testOptions(RestRequest req) { + return req.getSwagger(); + } + + //==================================================================================================== + // Missing resource bundle should cause {!!x} string. + //==================================================================================================== + @RestMethod(name="GET", path="/testMissingResourceBundle") + public String test(RestRequest req) { + return req.getMessage("bad", 1, 2, 3); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OverlappingMethodsResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OverlappingMethodsResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OverlappingMethodsResource.java new file mode 100644 index 0000000..c769089 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/OverlappingMethodsResource.java @@ -0,0 +1,146 @@ +// *************************************************************************************************************************** +// * 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.plaintext.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testOverlappingMethods", + serializers=PlainTextSerializer.class +) +public class OverlappingMethodsResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Overlapping guards + //==================================================================================================== + @RestMethod(name="GET", path="/testOverlappingGuards1", guards=Test1Guard.class) + public String testOverlappingGuards1() { + return "test1_doGet"; + } + + //==================================================================================================== + // Overlapping guards + //==================================================================================================== + @RestMethod(name="GET", path="/testOverlappingGuards2", guards={Test1Guard.class, Test2Guard.class}) + public String testOverlappingGuards2() { + return "test2_doGet"; + } + + public static class Test1Guard extends RestGuard { + @Override /* RestGuard */ + public boolean isRequestAllowed(RestRequest req) { + return req.getQuery().getString("t1","").equals("1"); + } + } + + public static class Test2Guard extends RestGuard { + @Override /* RestGuard */ + public boolean isRequestAllowed(RestRequest req) { + return req.getQuery().getString("t2","").equals("2"); + } + } + + //==================================================================================================== + // Overlapping matchers + //==================================================================================================== + @RestMethod(name="GET", path="/testOverlappingMatchers1", matchers=Test3aMatcher.class) + public String testOverlappingMatchers1() { + return "test3a"; + } + + @RestMethod(name="GET", path="/testOverlappingMatchers1", matchers=Test3bMatcher.class) + public String test3b_doGet() { + return "test3b"; + } + + @RestMethod(name="GET", path="/testOverlappingMatchers1") + public String test3c_doGet() { + return "test3c"; + } + + public static class Test3aMatcher extends RestMatcher { + @Override /* RestMatcher */ + public boolean matches(RestRequest req) { + return req.getQuery().getString("t1","").equals("1"); + } + } + + public static class Test3bMatcher extends RestMatcher { + @Override /* RestMatcher */ + public boolean matches(RestRequest req) { + return req.getQuery().getString("t2","").equals("2"); + } + } + + //==================================================================================================== + // Overlapping matchers + //==================================================================================================== + @RestMethod(name="GET", path="/testOverlappingMatchers2") + public String test4a_doGet() { + return "test4a"; + } + + @RestMethod(name="GET", path="/testOverlappingMatchers2", matchers={Test3aMatcher.class, Test3bMatcher.class}) + public String test4b_doGet() { + return "test4b"; + } + + //==================================================================================================== + // Overlapping URL patterns + //==================================================================================================== + @RestMethod(name="GET", path="/testOverlappingUrlPatterns") + public String testOverlappingUrlPatterns1() { + return "test5a"; + } + + @RestMethod(name="GET", path="/testOverlappingUrlPatterns/*") + public String testOverlappingUrlPatterns2() { + return "test5b"; + } + + @RestMethod(name="GET", path="/testOverlappingUrlPatterns/foo") + public String testOverlappingUrlPatterns3() { + return "test5c"; + } + + @RestMethod(name="GET", path="/testOverlappingUrlPatterns/foo/*") + public String testOverlappingUrlPatterns4() { + return "test5d"; + } + + @RestMethod(name="GET", path="/testOverlappingUrlPatterns/{id}") + public String testOverlappingUrlPatterns5() { + return "test5e"; + } + + @RestMethod(name="GET", path="/testOverlappingUrlPatterns/{id}/*") + public String testOverlappingUrlPatterns6() { + return "test5f"; + } + + @RestMethod(name="GET", path="/testOverlappingUrlPatterns/{id}/foo") + public String testOverlappingUrlPatterns7() { + return "test5g"; + } + + @RestMethod(name="GET", path="/testOverlappingUrlPatterns/{id}/foo/*") + public String testOverlappingUrlPatterns8() { + return "test5h"; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java new file mode 100644 index 0000000..2ebcdaf --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParamsResource.java @@ -0,0 +1,419 @@ +// *************************************************************************************************************************** +// * 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.internal.IOUtils.*; +import static org.apache.juneau.rest.RestContext.*; + +import java.io.*; +import java.util.*; +import java.util.logging.*; + +import javax.servlet.*; +import javax.servlet.http.*; + +import org.apache.juneau.*; +import org.apache.juneau.dto.swagger.*; +import org.apache.juneau.examples.addressbook.*; +import org.apache.juneau.http.*; +import org.apache.juneau.ini.*; +import org.apache.juneau.internal.*; +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, + properties={ + @Property(name=REST_allowMethodParam, value="*") + }, + pojoSwaps={CalendarSwap.DateMedium.class}, + messages="ParamsResource" +) +public class ParamsResource extends RestServletDefault { + 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",format="PLAIN") 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",format="PLAIN") 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",format="PLAIN") 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",format="PLAIN") 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=UrlEncodingContext.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/Logger") + public boolean testOtherLogger(Logger t) { + return t != null; + } + + @RestMethod(name="GET", path="/otherObjects/JuneauLogger") + public boolean testOtherJuneauLogger(JuneauLogger 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/ConfigFile") + public boolean testOtherConfigFile(ConfigFile t) { + return t != null; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParsersResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParsersResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParsersResource.java new file mode 100644 index 0000000..9cb9d13 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/ParsersResource.java @@ -0,0 +1,151 @@ +// *************************************************************************************************************************** +// * 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.internal.IOUtils.*; +import static org.apache.juneau.rest.annotation.Inherit.*; + +import org.apache.juneau.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; + +/** + * JUnit automated testcase resource. + * Validates correct parser is used. + */ +@RestResource( + path="/testParsers", + parsers=ParsersResource.TestParserA.class, + serializers=PlainTextSerializer.class +) +public class ParsersResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + public static class TestParserA extends ReaderParser { + + public TestParserA(PropertyStore propertyStore) { + super(propertyStore, "text/a"); + } + + @Override /* Parser */ + public ReaderParserSession createSession(ParserSessionArgs args) { + return new ReaderParserSession(args) { + + @Override /* ParserSession */ + @SuppressWarnings("unchecked") + protected <T> T doParse(ParserPipe pipe, ClassMeta<T> type) throws Exception { + return (T)("text/a - " + read(pipe.getReader()).trim()); + } + }; + } + } + + //==================================================================================================== + // Parser defined on class. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserOnClass") + public String testParserOnClass(@Body String in) { + return in; + } + + //==================================================================================================== + // Parser defined on method. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserOnMethod", parsers=TestParserB.class) + public String testParserOnMethod(@Body String in) { + return in; + } + + public static class TestParserB extends ReaderParser { + + public TestParserB(PropertyStore propertyStore) { + super(propertyStore, "text/b"); + } + + @Override /* Parser */ + public ReaderParserSession createSession(ParserSessionArgs args) { + return new ReaderParserSession(args) { + + @Override /* ParserSession */ + @SuppressWarnings("unchecked") + protected <T> T doParse(ParserPipe pipe, ClassMeta<T> type) throws Exception { + return (T)("text/b - " + read(pipe.getReader()).trim()); + } + }; + } + } + + //==================================================================================================== + // Parser overridden on method. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserOverriddenOnMethod", parsers={TestParserB.class,TestParserC.class}, parsersInherit=PARSERS) + public String testParserOverriddenOnMethod(@Body String in) { + return in; + } + + public static class TestParserC extends ReaderParser { + + public TestParserC(PropertyStore propertyStore) { + super(propertyStore, "text/c"); + } + + @Override /* Parser */ + public ReaderParserSession createSession(ParserSessionArgs args) { + return new ReaderParserSession(args) { + + @Override /* ParserSession */ + @SuppressWarnings("unchecked") + protected <T> T doParse(ParserPipe pipe, ClassMeta<T> type) throws Exception { + return (T)("text/c - " + read(pipe.getReader()).trim()); + } + }; + } + } + + //==================================================================================================== + // Parser with different Accept than Content-Type. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserWithDifferentMediaTypes", parsers={TestParserD.class}, parsersInherit=PARSERS) + public String testParserWithDifferentMediaTypes(@Body String in) { + return in; + } + + public static class TestParserD extends ReaderParser { + + public TestParserD(PropertyStore propertyStore) { + super(propertyStore, "text/d"); + } + + @Override /* Parser */ + public ReaderParserSession createSession(ParserSessionArgs args) { + return new ReaderParserSession(args) { + + @Override /* ParserSession */ + @SuppressWarnings("unchecked") + protected <T> T doParse(ParserPipe pipe, ClassMeta<T> type) throws Exception { + return (T)("text/d - " + read(pipe.getReader()).trim()); + } + }; + } + } + + //==================================================================================================== + // Check for valid error response. + //==================================================================================================== + @RestMethod(name="PUT", path="/testValidErrorResponse") + public String testValidErrorResponse(@Body String in) { + return in; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathResource.java new file mode 100644 index 0000000..e1b7f5c --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathResource.java @@ -0,0 +1,69 @@ +// *************************************************************************************************************************** +// * 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.*; + +/** + * JUnit automated testcase resource. + * Tests the RestServlet.getPath() method. + */ +@RestResource( + path="/testPath", + children={ + PathResource.TestPath2.class + } +) +public class PathResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Basic tests + //==================================================================================================== + @RestMethod(name="GET", path="/") + public String doGet() { + return getContext().getPath(); + } + + @RestResource( + path="/testPath2", + children={ + PathResource.TestPath3.class + } + ) + public static class TestPath2 extends RestServletDefault { + private static final long serialVersionUID = 1L; + // Basic tests + @RestMethod(name="GET", path="/") + public String doGet() { + return getContext().getPath(); + } + } + + @RestResource( + path="/testPath3" + ) + public static class TestPath3a extends RestServletDefault { + private static final long serialVersionUID = 1L; + // Basic tests + @RestMethod(name="GET", path="/") + public String doGet() { + return getContext().getPath(); + } + } + + public static class TestPath3 extends TestPath3a { + private static final long serialVersionUID = 1L; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathVariablesResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathVariablesResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathVariablesResource.java new file mode 100644 index 0000000..1a72297 --- /dev/null +++ b/juneau-microservice/juneau-microservice-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/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathsResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathsResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathsResource.java new file mode 100644 index 0000000..d9de449 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PathsResource.java @@ -0,0 +1,70 @@ +// *************************************************************************************************************************** +// * 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.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; + +/** + * JUnit automated testcase resource. + * Tests the URL-related methods on RestRequest. + */ +@RestResource( + path="/testPaths", + children={ + PathsResource.A.class + } +) +public class PathsResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + @RestMethod(name="GET", path="/*") + public ObjectMap doGet1(RestRequest req, @PathRemainder String r) { + return getPaths(req).append("pathRemainder2", r).append("method",1); + } + + @RestMethod(name="GET", path="/test2/*") + public ObjectMap doGet2(RestRequest req, @PathRemainder String r) { + return getPaths(req).append("pathRemainder2", r).append("method",2); + } + + @RestResource( + path="/a" + ) + public static class A extends RestServletDefault { + private static final long serialVersionUID = 1L; + @RestMethod(name="GET", path="/*") + public ObjectMap doGet1(RestRequest req, @PathRemainder String r) { + return getPaths(req).append("pathRemainder2", r).append("method",3); + } + @RestMethod(name="GET", path="/test2/*") + public ObjectMap doGet2(RestRequest req, @PathRemainder String r) { + return getPaths(req).append("pathRemainder2", r).append("method",4); + } + } + + private static ObjectMap getPaths(RestRequest req) { + return new ObjectMap() + .append("pathInfo", req.getPathInfo()) + .append("pathRemainder", req.getPathMatch().getRemainder()) + .append("pathRemainderUndecoded", req.getPathMatch().getRemainderUndecoded()) + .append("requestURI", req.getRequestURI()) + .append("requestParentURI", req.getUriContext().getRootRelativePathInfoParent()) + .append("requestURL", req.getRequestURL()) + .append("servletPath", req.getServletPath()) + .append("servletURI", req.getUriContext().getRootRelativeServletPath()) + .append("servletParentURI", req.getUriContext().getRootRelativeServletPathParent()); + + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/750916a9/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PropertiesResource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PropertiesResource.java b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PropertiesResource.java new file mode 100644 index 0000000..c608a68 --- /dev/null +++ b/juneau-microservice/juneau-microservice-test/src/main/java/org/apache/juneau/rest/test/PropertiesResource.java @@ -0,0 +1,106 @@ +// *************************************************************************************************************************** +// * 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 java.lang.String.*; + +import org.apache.juneau.*; +import org.apache.juneau.rest.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.serializer.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testProperties", + properties={ + @Property(name="A1",value="a1"), + @Property(name="A2",value="a2"), + @Property(name="foo",value="bar"), + @Property(name="bar",value="baz"), + @Property(name="R1a",value="$R{requestURI}"), + @Property(name="R1b",value="$R{requestParentURI}"), + @Property(name="R2",value="$R{foo}"), + @Property(name="R3",value="$R{$R{foo}}"), + @Property(name="R4",value="$R{A1}"), + @Property(name="R5",value="$R{A2}"), + @Property(name="R6",value="$R{C}"), + } +) +public class PropertiesResource extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Properties defined on method. + //==================================================================================================== + @RestMethod(name="GET", path="/testPropertiesDefinedOnMethod", + properties={ + @Property(name="B1",value="b1"), + @Property(name="B2",value="b2") + }, + serializers=PropertySerializer1.class + ) + public void testPropertiesDefinedOnMethod(RestResponse res) { + res.setProperty("A2", "c"); + res.setProperty("B2", "c"); + res.setProperty("C", "c"); + res.setOutput(null); + } + + public static class PropertySerializer1 extends WriterSerializer { + + public PropertySerializer1(PropertyStore propertyStore) { + super(propertyStore, "application/json", "*/json"); + } + + @Override /* Serializer */ + public WriterSerializerSession createSession(SerializerSessionArgs args) { + return new WriterSerializerSession(args) { + + @Override /* SerializerSession */ + protected void doSerialize(SerializerPipe out, Object o) throws Exception { + out.getWriter().write(format("A1=%s,A2=%s,B1=%s,B2=%s,C=%s,R1a=%s,R1b=%s,R2=%s,R3=%s,R4=%s,R5=%s,R6=%s", + getStringProperty("A1"), getStringProperty("A2"), getStringProperty("B1"), getStringProperty("B2"), getStringProperty("C"), + getStringProperty("R1a"), getStringProperty("R1b"), getStringProperty("R2"), getStringProperty("R3"), getStringProperty("R4"), getStringProperty("R5"), getStringProperty("R6"))); + } + }; + } + } + + //==================================================================================================== + // Make sure attributes/parameters/headers are available through ctx.getProperties(). + //==================================================================================================== + @RestMethod(name="GET", path="/testProperties/{A}", serializers=PropertySerializer2.class) + public void testProperties(RestResponse res) { + res.setOutput(null); + } + + public static class PropertySerializer2 extends WriterSerializer { + + public PropertySerializer2(PropertyStore propertyStore) { + super(propertyStore, "application/json", "*/json"); + } + + @Override /* Serializer */ + public WriterSerializerSession createSession(SerializerSessionArgs args) { + return new WriterSerializerSession(args) { + + @Override /* SerializerSession */ + protected void doSerialize(SerializerPipe out, Object o) throws Exception { + out.getWriter().write(format("A=%s,P=%s,H=%s", getStringProperty("A"), getStringProperty("P"), getStringProperty("h"))); + } + }; + } + } +}
