http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/InheritanceResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/InheritanceResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/InheritanceResource.java new file mode 100755 index 0000000..02c7ffe --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/InheritanceResource.java @@ -0,0 +1,317 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import static org.apache.juneau.server.annotation.Inherit.*; + +import java.io.*; +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.encoders.*; +import org.apache.juneau.json.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.annotation.*; +import org.apache.juneau.server.annotation.Properties; +import org.apache.juneau.transform.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testInheritance", + serializers={InheritanceResource.S1.class,InheritanceResource.S2.class}, + parsers={InheritanceResource.P1.class,InheritanceResource.P2.class}, + encoders={InheritanceResource.E1.class,InheritanceResource.E2.class}, + pojoSwaps={InheritanceResource.F1Swap.class}, + properties={@Property(name="p1",value="v1"), @Property(name="p2",value="v2")} +) +public class InheritanceResource extends RestServlet { + private static final long serialVersionUID = 1L; + + @RestResource( + serializers={S3.class,S4.class}, + parsers={P3.class,P4.class}, + encoders={E3.class,E4.class}, + pojoSwaps={F2Swap.class}, + properties={@Property(name="p2",value="v2a"), @Property(name="p3",value="v3"), @Property(name="p4",value="v4")} + ) + public static class Sub extends InheritanceResource { + private static final long serialVersionUID = 1L; + } + + //==================================================================================================== + // Test serializer inheritance. + //==================================================================================================== + @RestResource(path="/testInheritanceSerializers") + public static class TestSerializers extends Sub { + private static final long serialVersionUID = 1L; + + // Should show ['text/s3','text/s4','text/s1','text/s2'] + @RestMethod( + name="GET", + path="/test1" + ) + public Reader test1(RestResponse res) { + return new StringReader(new ObjectList(res.getSupportedMediaTypes()).toString()); + } + + // Should show ['text/s5'] + @RestMethod( + name="GET", + path="/test2", + serializers=S5.class + ) + public Reader test2(RestResponse res) { + return new StringReader(new ObjectList(res.getSupportedMediaTypes()).toString()); + } + + // Should show ['text/s5','text/s3','text/s4','text/s1','text/s2'] + @RestMethod( + name="GET", + path="/test3", + serializers=S5.class, + serializersInherit=SERIALIZERS + ) + public Reader test3(RestResponse res) { + return new StringReader(new ObjectList(res.getSupportedMediaTypes()).toString()); + } + } + + //==================================================================================================== + // Test parser inheritance. + //==================================================================================================== + @RestResource(path="/testInheritanceParsers") + public static class TestParsers extends Sub { + private static final long serialVersionUID = 1L; + + // Should show ['text/p3','text/p4','text/p1','text/p2'] + @RestMethod( + name="GET", + path="/test1" + ) + public Reader test1(RestRequest req) { + return new StringReader(new ObjectList(req.getSupportedMediaTypes()).toString()); + } + + // Should show ['text/p5'] + @RestMethod( + name="GET", + path="/test2", + parsers=P5.class + ) + public Reader test2(RestRequest req) { + return new StringReader(new ObjectList(req.getSupportedMediaTypes()).toString()); + } + + // Should show ['text/p5','text/p3','text/p4','text/p1','text/p2'] + @RestMethod( + name="GET", + path="/test3", + parsers=P5.class, + parsersInherit=PARSERS + ) + public Reader test3(RestRequest req) { + return new StringReader(new ObjectList(req.getSupportedMediaTypes()).toString()); + } + } + + //==================================================================================================== + // Test encoder inheritance. + //==================================================================================================== + @RestResource(path="/testInheritanceEncoders") + public static class TestEncoders extends Sub { + private static final long serialVersionUID = 1L; + + // Should show ['e3','e4','e1','e2','identity'] + @RestMethod(name="GET", path="/test") + public Reader test(RestResponse res) throws RestServletException { + return new StringReader(new ObjectList(res.getSupportedEncodings()).toString()); + } + } + + //==================================================================================================== + // Test filter inheritance. + //==================================================================================================== + @RestResource(path="/testInheritanceTransforms", serializers=JsonSerializer.Simple.class) + public static class TestTransforms extends Sub { + private static final long serialVersionUID = 1L; + + // Should show ['F1Swap','F2Swap','Foo3'] + @RestMethod(name="GET", path="/test1") + public Object[] test1() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['F1Swap','F2Swap','F3Swap'] + // Inherited serializer already has parent filters applied. + @RestMethod(name="GET", path="/test2", pojoSwaps=F3Swap.class) + public Object[] test2() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['F1Swap','F2Swap','F3Swap'] + @RestMethod(name="GET", path="/test3", pojoSwaps=F3Swap.class, serializersInherit=TRANSFORMS) + public Object[] test3() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['Foo1','Foo2','F3Swap'] + // Overriding serializer does not have parent filters applied. + @RestMethod(name="GET", path="/test4", serializers=JsonSerializer.Simple.class, pojoSwaps=F3Swap.class) + public Object[] test4() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['F1Swap','F2Swap','F3Swap'] + // Overriding serializer does have parent filters applied. + @RestMethod(name="GET", path="/test5", serializers=JsonSerializer.Simple.class, pojoSwaps=F3Swap.class, serializersInherit=TRANSFORMS) + public Object[] test5() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + } + + //==================================================================================================== + // Test properties inheritance. + //==================================================================================================== + @RestResource(path="/testInheritanceProperties", serializers=JsonSerializer.Simple.class) + public static class TestProperties extends Sub { + private static final long serialVersionUID = 1L; + + // Should show {p1:'v1',p2:'v2a',p3:'v3',p4:'v4'} + @RestMethod(name="GET", path="/test1") + public ObjectMap test1(@Properties ObjectMap properties) { + return transform(properties); + } + + // Should show {p1:'v1',p2:'v2a',p3:'v3',p4:'v4a',p5:'v5'} when override is false. + // Should show {p1:'x',p2:'x',p3:'x',p4:'x',p5:'x'} when override is true. + @RestMethod(name="GET", path="/test2", + properties={@Property(name="p4",value="v4a"), @Property(name="p5", value="v5")}) + public ObjectMap test2(@Properties ObjectMap properties, @HasParam("override") boolean override) { + if (override) { + properties.put("p1", "x"); + properties.put("p2", "x"); + properties.put("p3", "x"); + properties.put("p4", "x"); + properties.put("p5", "x"); + } + return transform(properties); + } + + private ObjectMap transform(ObjectMap properties) { + ObjectMap m = new ObjectMap(); + for (Map.Entry<String,Object> e : properties.entrySet()) { + if (e.getKey().startsWith("p")) + m.put(e.getKey(), e.getValue()); + } + return m; + } + } + + public static class DummyParser extends ReaderParser { + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return null; + } + } + + public static class DummySerializer extends WriterSerializer { + @Override /* Serializer */ + protected void doSerialize(SerializerSession session, Object o) throws Exception { + session.getWriter().write(o.toString()); + } + } + + @Consumes("text/p1") + public static class P1 extends DummyParser{} + + @Consumes("text/p2") + public static class P2 extends DummyParser{} + + @Consumes("text/p3") + public static class P3 extends DummyParser{} + + @Consumes("text/p4") + public static class P4 extends DummyParser{} + + @Consumes("text/p5") + public static class P5 extends DummyParser{} + + @Produces("text/s1") + public static class S1 extends DummySerializer{} + + @Produces("text/s2") + public static class S2 extends DummySerializer{} + + @Produces("text/s3") + public static class S3 extends DummySerializer{} + + @Produces("text/s4") + public static class S4 extends DummySerializer{} + + @Produces("text/s5") + public static class S5 extends DummySerializer{} + + public static class E1 extends IdentityEncoder { + @Override public String[] getCodings() { + return new String[]{"e1"}; + } + } + + public static class E2 extends IdentityEncoder { + @Override public String[] getCodings() { + return new String[]{"e2"}; + } + } + + public static class E3 extends IdentityEncoder { + @Override public String[] getCodings() { + return new String[]{"e3"}; + } + } + + public static class E4 extends IdentityEncoder { + @Override public String[] getCodings() { + return new String[]{"e4"}; + } + } + + public static class Foo1 {@Override public String toString(){return "Foo1";}} + public static class Foo2 {@Override public String toString(){return "Foo2";}} + public static class Foo3 {@Override public String toString(){return "Foo3";}} + + public static class F1Swap extends PojoSwap<Foo1,String> { + @Override /* PojoSwap */ + public String swap(Foo1 o) throws SerializeException { + return "F1"; + } + } + + public static class F2Swap extends PojoSwap<Foo2,String> { + @Override /* PojoSwap */ + public String swap(Foo2 o) throws SerializeException { + return "F2"; + } + } + + public static class F3Swap extends PojoSwap<Foo3,String> { + @Override /* PojoSwap */ + public String swap(Foo3 o) throws SerializeException { + return "F3"; + } + } +}
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojo.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojo.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojo.java new file mode 100755 index 0000000..fc97420 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojo.java @@ -0,0 +1,45 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import java.util.*; + +/** + * A large POJO object. + */ +@SuppressWarnings("serial") +public class LargePojo { + public A1Map a1Map; + public A1List a1List; + public A1[] a1Array; + + public static LargePojo create() { + LargePojo a = new LargePojo(); + a.a1Map = new A1Map(); + a.a1List = new A1List(); + for (int i = 0; i < 20000; i++) { + a.a1Map.put(String.valueOf(i), new A1()); + a.a1List.add(new A1()); + } + a.a1Array = a.a1List.toArray(new A1[0]); + return a; + } + + public static class A1 { + public String f1 = "a123456789b123456789c123456789d123456789e123456789f123456789g123456789h123456789i123456789j123456789"; + } + + public static class A1Map extends LinkedHashMap<String,A1> {} + + public static class A1List extends LinkedList<A1> {} +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojosResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojosResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojosResource.java new file mode 100755 index 0000000..09e620b --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/LargePojosResource.java @@ -0,0 +1,39 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import org.apache.juneau.server.annotation.*; +import org.apache.juneau.server.jena.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testLargePojos" +) +public class LargePojosResource extends RestServletJenaDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Test how long it takes to serialize/parse various content types. + //==================================================================================================== + @RestMethod(name="GET", path="/") + public LargePojo testGet() { + return LargePojo.create(); + } + + @RestMethod(name="PUT", path="/") + public String testPut(@Content LargePojo in) { + return "ok"; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/MessagesResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/MessagesResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/MessagesResource.java new file mode 100755 index 0000000..c470e8a --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/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.server.test; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.annotation.*; +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 PojoSwap<ResourceBundle,ObjectMap> { + @Override /* Transform */ + public ObjectMap swap(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/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsPropertyResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsPropertyResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsPropertyResource.java new file mode 100755 index 0000000..47ade8f --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsPropertyResource.java @@ -0,0 +1,61 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import org.apache.juneau.annotation.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.annotation.*; + +/** + * 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; + } + + @Produces("text/plain") + public static class TestSerializer extends WriterSerializer { + @Override /* Serializer */ + protected void doSerialize(SerializerSession session, Object o) throws Exception { + session.getWriter().write(session.getProperties().getString("TestProperty")); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsResource.java new file mode 100755 index 0000000..1929a15 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/NlsResource.java @@ -0,0 +1,195 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import org.apache.juneau.server.*; +import org.apache.juneau.server.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", + label="Test1.a", + description="Test1.b" + ) + public static class Test1 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}", + description="Test1.c", + input={ + @Var(category="attr", name="a", description="Test1.d"), + @Var(category="param", name="b", description="Test1.e"), + @Var(category="content", description="Test1.f"), + @Var(category="header", name="D", description="Test1.g"), + @Var(category="attr", name="a2", description="Test1.h"), + @Var(category="param", name="b2", description="Test1.i"), + @Var(category="header", name="D2", description="Test1.j"), + @Var(category="foo", name="bar", description="Test1.k"), + }, + responses={ + @Response(200), + @Response(value=201, + description="Test1.l", + output={ + @Var(category="foo", name="bar", description="Test1.m"), + } + ) + } + ) + public String test1(@Attr("a") String a, @Param("b") String b, @Content String c, @Header("D") String d, + @Attr("e") String e, @Param("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(@Attr("a") String a, @Param("b") String b, @Content String c, @Header("D") String d, + @Attr("e") String e, @Param("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(@Attr("a") String a, @Param("b") String b, @Content String c, @Header("D") String d, + @Attr("e") String e, @Param("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(@Attr("a") String a, @Param("b") String b, @Content String c, @Header("D") String d, + @Attr("e") String e, @Param("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(@Attr("a") String a, @Param("b") String b, @Content String c, @Header("D") String d, + @Attr("e") String e, @Param("f") String f, @Header("g") String g) { + return null; + } + } + + //==================================================================================================== + // test6 - Pull labels from annotations only, but annotations contain variables. + //==================================================================================================== + @RestResource( + path="/test6", + messages="NlsResource", + label="$L{foo}", + description="$L{foo}" + ) + public static class Test6 extends RestServletDefault { + + @RestMethod( + name="POST", path="/{a}", + description="$L{foo}", + input={ + @Var(category="attr", name="a", description="$L{foo}"), + @Var(category="param", name="b", description="$L{foo}"), + @Var(category="content", description="$L{foo}"), + @Var(category="header", name="D", description="$L{foo}"), + @Var(category="attr", name="a2", description="$L{foo}"), + @Var(category="param", name="b2", description="$L{foo}"), + @Var(category="header", name="D2", description="$L{foo}"), + @Var(category="foo", name="bar", description="$L{foo}"), + }, + responses={ + @Response(200), + @Response(value=201, + description="$L{foo}", + output={ + @Var(category="foo", name="bar", description="$L{foo}"), + } + ) + } + ) + public String test6(@Attr("a") String a, @Param("b") String b, @Content String c, @Header("D") String d, + @Attr("e") String e, @Param("f") String f, @Header("g") String g) { + return null; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/NoParserInputResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/NoParserInputResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/NoParserInputResource.java new file mode 100755 index 0000000..66a9170 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/NoParserInputResource.java @@ -0,0 +1,56 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import java.io.*; + +import org.apache.juneau.internal.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testNoParserInput", + serializers=PlainTextSerializer.class +) +public class NoParserInputResource extends RestServlet { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // @Content annotated InputStream. + //==================================================================================================== + @RestMethod(name="PUT", path="/testInputStream") + public String testInputStream(@Content InputStream in) throws Exception { + return IOUtils.read(in); + } + + //==================================================================================================== + // @Content annotated Reader. + //==================================================================================================== + @RestMethod(name="PUT", path="/testReader") + public String testReader(@Content Reader in) throws Exception { + return IOUtils.read(in); + } + + //==================================================================================================== + // @Content annotated PushbackReader. + // This should always fail since the servlet reader is not a pushback reader. + //==================================================================================================== + @RestMethod(name="PUT", path="/testPushbackReader") + public String testPushbackReader(@Content PushbackReader in) throws Exception { + return IOUtils.read(in); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPostCallResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPostCallResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPostCallResource.java new file mode 100755 index 0000000..9e4c2b7 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPostCallResource.java @@ -0,0 +1,94 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.annotation.*; + +/** + * 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; + + @Produces({"text/s1","text/s2","text/s3"}) + public static class TestSerializer extends WriterSerializer { + @Override /* Serializer */ + protected void doSerialize(SerializerSession session, Object o) throws Exception { + ObjectMap p = session.getProperties(); + session.getWriter().write("p1="+p.get("p1")+",p2="+p.get("p2")+",p3="+p.get("p3")+",p4="+p.get("p4")+",p5="+p.get("p5")+",contentType="+session.getProperties().getString("mediaType")); + } + @Override /* Serializer */ + public ObjectMap getResponseHeaders(ObjectMap properties) { + if (properties.containsKey("Override-Content-Type")) + return new ObjectMap().append("Content-Type", properties.get("Override-Content-Type")); + return null; + } + } + + @Override /* RestServlet */ + protected 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.setHeader("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.setHeader("Accept", "text/s2"); + return ""; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPreCallResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPreCallResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPreCallResource.java new file mode 100755 index 0000000..69bcf21 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/OnPreCallResource.java @@ -0,0 +1,85 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.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; + + @Consumes({"text/a1","text/a2","text/a3"}) + public static class TestParserA extends ReaderParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + ObjectMap p = session.getProperties(); + String matchingContentType = session.getProperties().getString("mediaType"); + return (T)("p1="+p.get("p1")+",p2="+p.get("p2")+",p3="+p.get("p3")+",p4="+p.get("p4")+",p5="+p.get("p5")+",contentType="+matchingContentType); + } + } + + @Override /* RestServlet */ + protected 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.setHeader("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(@Content 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.getInput(String.class); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/OptionsWithoutNlsResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/OptionsWithoutNlsResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/OptionsWithoutNlsResource.java new file mode 100755 index 0000000..fb34878 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/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.server.test; + +import org.apache.juneau.server.*; +import org.apache.juneau.server.annotation.*; +import org.apache.juneau.server.labels.*; + +/** + * 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 ResourceOptions testOptions(RestRequest req) { + return new ResourceOptions(this, req); + } + + //==================================================================================================== + // 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/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/OverlappingMethodsResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/OverlappingMethodsResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/OverlappingMethodsResource.java new file mode 100755 index 0000000..f3dc673 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/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.server.test; + +import org.apache.juneau.plaintext.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.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.getParameter("t1","").equals("1"); + } + } + + public static class Test2Guard extends RestGuard { + @Override /* RestGuard */ + public boolean isRequestAllowed(RestRequest req) { + return req.getParameter("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.getParameter("t1","").equals("1"); + } + } + + public static class Test3bMatcher extends RestMatcher { + @Override /* RestMatcher */ + public boolean matches(RestRequest req) { + return req.getParameter("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/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParamsResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParamsResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParamsResource.java new file mode 100755 index 0000000..9e2d339 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParamsResource.java @@ -0,0 +1,293 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import static org.apache.juneau.server.RestServletContext.*; +import static org.apache.juneau.urlencoding.UrlEncodingContext.*; + +import java.util.*; + +import javax.servlet.http.*; + +import org.apache.juneau.*; +import org.apache.juneau.json.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.samples.addressbook.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.annotation.*; +import org.apache.juneau.transforms.*; +import org.apache.juneau.urlencoding.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testParams", + serializers=PlainTextSerializer.class, + properties={ + @Property(name=REST_allowMethodParam, value="*") + } +) +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.getPathRemainder()); + } + + // Test method name with overlapping name, remainder allowed. + @RestMethod(name="GET2") + public void get2(RestRequest req, RestResponse res) { + res.setOutput("GET2 remainder="+req.getPathRemainder()); + } + + // Default POST + @RestMethod(name="POST") + public void doPost(RestRequest req, RestResponse res) { + res.setOutput("POST remainder="+req.getPathRemainder()); + } + + // 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.getPathRemainder()); + } + + // 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); + } + + @Override /* RestServlet */ + public Class<?>[] createPojoSwaps() { + return new Class[]{CalendarSwap.Medium.class}; + } + + //==================================================================================================== + // @Param annotation - GET + //==================================================================================================== + @RestMethod(name="GET", path="/testParamGet/*") + public String testParamGet(RestRequest req, @Param("p1") String p1, @Param("p2") int p2) throws Exception { + return "p1=["+p1+","+req.getParameter("p1")+","+req.getParameter("p1", String.class)+"],p2=["+p2+","+req.getParameter("p2")+","+req.getParameter("p2", int.class)+"]"; + } + + //==================================================================================================== + // @Param annotation - POST + //==================================================================================================== + @RestMethod(name="POST", path="/testParamPost/*") + public String testParamPost(RestRequest req, @Param("p1") String p1, @Param("p2") int p2) throws Exception { + return "p1=["+p1+","+req.getParameter("p1")+","+req.getParameter("p1", String.class)+"],p2=["+p2+","+req.getParameter("p2")+","+req.getParameter("p2", int.class)+"]"; + } + + //==================================================================================================== + // @QParam annotation - GET + //==================================================================================================== + @RestMethod(name="GET", path="/testQParamGet/*") + public String testQParamGet(RestRequest req, @QParam("p1") String p1, @QParam("p2") int p2) throws Exception { + return "p1=["+p1+","+req.getQueryParameter("p1")+","+req.getQueryParameter("p1", String.class)+"],p2=["+p2+","+req.getQueryParameter("p2")+","+req.getQueryParameter("p2", int.class)+"]"; + } + + //==================================================================================================== + // @QParam annotation - POST + //==================================================================================================== + @RestMethod(name="POST", path="/testQParamPost/*") + public String testQParamPost(RestRequest req, @QParam("p1") String p1, @QParam("p2") int p2) throws Exception { + return "p1=["+p1+","+req.getQueryParameter("p1")+","+req.getQueryParameter("p1", String.class)+"],p2=["+p2+","+req.getQueryParameter("p2")+","+req.getQueryParameter("p2", int.class)+"]"; + } + + //==================================================================================================== + // @Param(format=PLAIN) annotation - GET + //==================================================================================================== + @RestMethod(name="GET", path="/testPlainParamGet/*") + public String testPlainParamGet(RestRequest req, @Param(value="p1",format="PLAIN") String p1) throws Exception { + return "p1=["+p1+","+req.getParameter("p1")+","+req.getParameter("p1", String.class)+"]"; + } + + //==================================================================================================== + // @Param(format=PLAIN) annotation - POST + //==================================================================================================== + @RestMethod(name="POST", path="/testPlainParamPost/*") + public String testPlainParamPost(RestRequest req, @Param(value="p1",format="PLAIN") String p1) throws Exception { + return "p1=["+p1+","+req.getParameter("p1")+","+req.getParameter("p1", String.class)+"]"; + } + + //==================================================================================================== + // @QParam(format=PLAIN) annotation - GET + //==================================================================================================== + @RestMethod(name="GET", path="/testPlainQParamGet/*") + public String testPlainQParamGet(RestRequest req, @QParam(value="p1",format="PLAIN") String p1) throws Exception { + return "p1=["+p1+","+req.getQueryParameter("p1")+","+req.getQueryParameter("p1", String.class)+"]"; + } + + //==================================================================================================== + // @QParam(format=PLAIN) annotation - POST + //==================================================================================================== + @RestMethod(name="POST", path="/testPlainQParamPost/*") + public String testPlainQParamPost(RestRequest req, @QParam(value="p1",format="PLAIN") String p1) throws Exception { + return "p1=["+p1+","+req.getQueryParameter("p1")+","+req.getQueryParameter("p1", String.class)+"]"; + } + + //==================================================================================================== + // @HasParam annotation - GET + //==================================================================================================== + @RestMethod(name="GET", path="/testHasParamGet/*") + public String testHasParamGet(RestRequest req, @HasParam("p1") boolean p1, @HasParam("p2") Boolean p2) throws Exception { + return "p1=["+p1+","+req.hasParameter("p1")+"],p2=["+p2+","+req.hasParameter("p2")+"]"; + } + + //==================================================================================================== + // @HasParam annotation - POST + //==================================================================================================== + @RestMethod(name="POST", path="/testHasParamPost/*") + public String testHasParamPost(RestRequest req, @HasParam("p1") boolean p1, @HasParam("p2") Boolean p2) throws Exception { + return "p1=["+p1+","+req.hasParameter("p1")+"],p2=["+p2+","+req.hasParameter("p2")+"]"; + } + + //==================================================================================================== + // @HasQParam annotation - GET + //==================================================================================================== + @RestMethod(name="GET", path="/testHasQParamGet/*") + public String testHasQParamGet(RestRequest req, @HasQParam("p1") boolean p1, @HasQParam("p2") Boolean p2) throws Exception { + return "p1=["+p1+","+req.hasQueryParameter("p1")+"],p2=["+p2+","+req.hasQueryParameter("p2")+"]"; + } + + //==================================================================================================== + // @HasQParam annotation - POST + //==================================================================================================== + @RestMethod(name="POST", path="/testHasQParamPost/*") + public String testHasQParamPost_post(RestRequest req, @HasQParam("p1") boolean p1, @HasQParam("p2") Boolean p2) throws Exception { + return "p1=["+p1+","+req.hasQueryParameter("p1")+"],p2=["+p2+","+req.hasQueryParameter("p2")+"]"; + } + + //==================================================================================================== + // Form POSTS with @Content parameter + //==================================================================================================== + @RestMethod(name="POST", path="/testFormPostAsContent/*") + public String testFormPostAsContent(@Content Test6Bean bean, + @HasQParam("p1") boolean hqp1, @HasQParam("p2") boolean hqp2, + @QParam("p1") String qp1, @QParam("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 @Param and @QParam annotations when using multi-part parameters (e.g. &key=val1,&key=val2). + //==================================================================================================== + @RestMethod(name="GET", path="/testMultiPartParams") + public String testMultiPartParams( + @QParam(value="p1",multipart=true) String[] p1, + @QParam(value="p2",multipart=true) int[] p2, + @QParam(value="p3",multipart=true) List<String> p3, + @QParam(value="p4",multipart=true) List<Integer> p4, + @Param(value="p5",multipart=true) String[] p5, + @Param(value="p6",multipart=true) int[] p6, + @Param(value="p7",multipart=true) List<String> p7, + @Param(value="p8",multipart=true) List<Integer> p8, + @QParam(value="p9",multipart=true) A[] p9, + @QParam(value="p10",multipart=true) List<A> p10, + @Param(value="p11",multipart=true) A[] p11, + @Param(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=URLENC_expandedParams, value="true"), + @Property(name=UonSerializerContext.UON_simpleMode, value="true") + } + ) + public DTO2s.B testFormPostsWithMultiParamsViaProperty(@Content 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", + properties={ + @Property(name=UonSerializerContext.UON_simpleMode, value="true") + } + ) + public DTO2s.C testFormPostsWithMultiParamsUsingAnnotation(@Content DTO2s.C content) throws Exception { + return content; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParsersResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParsersResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParsersResource.java new file mode 100755 index 0000000..d6a8ac5 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/test/ParsersResource.java @@ -0,0 +1,112 @@ +// *************************************************************************************************************************** +// * 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.server.test; + +import static org.apache.juneau.server.annotation.Inherit.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.internal.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.server.*; +import org.apache.juneau.server.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; + + @Consumes("text/a") + public static class TestParserA extends ReaderParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)("text/a - " + IOUtils.read(session.getReader()).trim()); + } + } + + //==================================================================================================== + // Parser defined on class. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserOnClass") + public String testParserOnClass(@Content String in) { + return in; + } + + //==================================================================================================== + // Parser defined on method. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserOnMethod", parsers=TestParserB.class) + public String testParserOnMethod(@Content String in) { + return in; + } + + @Consumes("text/b") + public static class TestParserB extends ReaderParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)("text/b - " + IOUtils.read(session.getReader()).trim()); + } + } + + //==================================================================================================== + // Parser overridden on method. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserOverriddenOnMethod", parsers={TestParserB.class,TestParserC.class}, parsersInherit=PARSERS) + public String testParserOverriddenOnMethod(@Content String in) { + return in; + } + + @Consumes("text/c") + public static class TestParserC extends ReaderParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)("text/c - " + IOUtils.read(session.getReader()).trim()); + } + } + + //==================================================================================================== + // Parser with different Accept than Content-Type. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParserWithDifferentMediaTypes", parsers={TestParserD.class}, parsersInherit=PARSERS) + public String testParserWithDifferentMediaTypes(@Content String in) { + return in; + } + + @Consumes({"text/a","text/d"}) + public static class TestParserD extends ReaderParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)("text/d - " + IOUtils.read(session.getReader()).trim()); + } + } + + //==================================================================================================== + // Check for valid error response. + //==================================================================================================== + @RestMethod(name="PUT", path="/testValidErrorResponse") + public String testValidErrorResponse(@Content String in) { + return in; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d45e1351/juneau-server-test/src/main/java/org/apache/juneau/server/test/PathResource.java ---------------------------------------------------------------------- diff --git a/juneau-server-test/src/main/java/org/apache/juneau/server/test/PathResource.java b/juneau-server-test/src/main/java/org/apache/juneau/server/test/PathResource.java new file mode 100755 index 0000000..e6aa718 --- /dev/null +++ b/juneau-server-test/src/main/java/org/apache/juneau/server/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.server.test; + +import org.apache.juneau.server.*; +import org.apache.juneau.server.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 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 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 getPath(); + } + } + + public static class TestPath3 extends TestPath3a { + private static final long serialVersionUID = 1L; + } +}
