http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/juneau-server-test.launch ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/juneau-server-test.launch b/org.apache.juneau.server.test/juneau-server-test.launch new file mode 100755 index 0000000..0d9fb35 --- /dev/null +++ b/org.apache.juneau.server.test/juneau-server-test.launch @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> +<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> +<listEntry value="/org.apache.juneau.microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java"/> +</listAttribute> +<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> +<listEntry value="1"/> +</listAttribute> +<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/> +<listAttribute key="org.eclipse.jdt.launching.CLASSPATH"> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" javaProject="org.apache.juneau.server" path="1" type="4"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="org.apache.juneau.server.test" type="1"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="org.apache.juneau.microservice" type="1"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/commons-codec-1.9.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/commons-io-1.2.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/commons-logging-1.1.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/httpclient-4.5.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/httpcore-4.4.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/httpmime-4.5.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/jetty-all-8.1.0.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/javax.servlet-api-3.0.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.microservice/lib/org.apache.commons.fileupload_1.3.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="org.apache.juneau.server" type="1"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="org.apache.juneau.releng" type="1"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="org.apache.juneau.client" type="1"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="org.apache.juneau" type="1"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/derby/derby.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jaxrs/jsr311-api-1.1.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/javax.servlet_2.5.0.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/commons-codec-1.9/commons-codec-1.9.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/commons-fileupload/org.apache.commons.fileupload_1.3.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/httpclient/commons-logging-1.1.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/httpclient/httpclient-4.5.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/httpclient/httpcomponents-client-4.5-src.zip" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/httpclient/httpcore-4.4.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/httpclient/httpmime-4.5.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jaxrs/wink-common-1.2.1-incubating.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jaxrs/wink-server-1.2.1-incubating.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jena/jena-core-2.7.1-sources.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jena/jena-core-2.7.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jena/jena-iri-0.9.2.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jena/log4j-1.2.16.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jena/slf4j-api-1.6.4.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jena/slf4j-log4j12-1.6.4.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/junit/hamcrest-core-1.3.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/junit/junit-4.12.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/org.apache.juneau.releng/lib/jena/xercesImpl-2.9.1.jar" path="3" type="2"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="org.apache.juneau.samples" type="1"/> "/> +<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="org.apache.juneau.server"/> </runtimeClasspathEntry> "/> +</listAttribute> +<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/> +<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/> +<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.apache.juneau.microservice.RestMicroservice"/> +<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.apache.juneau.server.test"/> +<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/> +</launchConfiguration>
http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/pom.xml ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/pom.xml b/org.apache.juneau.server.test/pom.xml new file mode 100644 index 0000000..8c6d675 --- /dev/null +++ b/org.apache.juneau.server.test/pom.xml @@ -0,0 +1,36 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.juneau</groupId> + <artifactId>org.apache.juneau.server.test</artifactId> + <version>6.0.0-SNAPSHOT</version> + <name>org.apache.juneau.server.test</name> + <description>org.apache.juneau.server.test</description> + <build> + <resources> + <resource> + <directory>src/main/java</directory> + <excludes> + <exclude>**/*.java</exclude> + </excludes> + </resource> + </resources> + <testResources> + <testResource> + <directory>src/test/java</directory> + <excludes> + <exclude>**/*.java</exclude> + </excludes> + </testResource> + </testResources> + <plugins> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.3</version> + <configuration> + <source>1.6</source> + <target>1.6</target> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/DTO2s.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/DTO2s.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/DTO2s.java new file mode 100755 index 0000000..4b9d40d --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/DTO2s.java @@ -0,0 +1,136 @@ +/*************************************************************************************************************************** + * 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; + +import java.util.*; + +import org.apache.juneau.urlencoding.annotation.*; + +public class DTO2s { + + public static class A { + public String a; + public int b; + public boolean c; + + public static A create() { + A t = new A(); + t.a = "a"; + t.b = 1; + t.c = true; + return t; + } + + } + + @SuppressWarnings("serial") + public static class B { + public String[] f1; + public List<String> f2; + public int[] f3; + public List<Integer> f4; + public String[][] f5; + public List<String[]> f6; + public A[] f7; + public List<A> f8; + public A[][] f9; + public List<List<A>> f10; + + private String[] f11; + private List<String> f12; + private int[] f13; + private List<Integer> f14; + private String[][] f15; + private List<String[]> f16; + private A[] f17; + private List<A> f18; + private A[][] f19; + private List<List<A>> f20; + + public String[] getF11() { return f11; } + public List<String> getF12() { return f12; } + public int[] getF13() { return f13; } + public List<Integer> getF14() { return f14; } + public String[][] getF15() { return f15; } + public List<String[]> getF16() { return f16; } + public A[] getF17() { return f17; } + public List<A> getF18() { return f18; } + public A[][] getF19() { return f19; } + public List<List<A>> getF20() { return f20; } + + public void setF11(String[] f11) { this.f11 = f11; } + public void setF12(List<String> f12) { this.f12 = f12; } + public void setF13(int[] f13) { this.f13 = f13; } + public void setF14(List<Integer> f14) { this.f14 = f14; } + public void setF15(String[][] f15) { this.f15 = f15; } + public void setF16(List<String[]> f16) { this.f16 = f16; } + public void setF17(A[] f17) { this.f17 = f17; } + public void setF18(List<A> f18) { this.f18 = f18; } + public void setF19(A[][] f19) { this.f19 = f19; } + public void setF20(List<List<A>> f20) { this.f20 = f20; } + + static B create() { + B t = new B(); + t.f1 = new String[]{"a","b"}; + t.f2 = new ArrayList<String>(){{add("c");add("d");}}; + t.f3 = new int[]{1,2}; + t.f4 = new ArrayList<Integer>(){{add(3);add(4);}}; + t.f5 = new String[][]{{"e","f"},{"g","h"}}; + t.f6 = new ArrayList<String[]>(){{add(new String[]{"i","j"});add(new String[]{"k","l"});}}; + t.f7 = new A[]{A.create(),A.create()}; + t.f8 = new ArrayList<A>(){{add(A.create());add(A.create());}}; + t.f9 = new A[][]{{A.create()},{A.create()}}; + t.f10 = new ArrayList<List<A>>(){{add(Arrays.asList(A.create()));add(Arrays.asList(A.create()));}}; + t.setF11(new String[]{"a","b"}); + t.setF12(new ArrayList<String>(){{add("c");add("d");}}); + t.setF13(new int[]{1,2}); + t.setF14(new ArrayList<Integer>(){{add(3);add(4);}}); + t.setF15(new String[][]{{"e","f"},{"g","h"}}); + t.setF16(new ArrayList<String[]>(){{add(new String[]{"i","j"});add(new String[]{"k","l"});}}); + t.setF17(new A[]{A.create(),A.create()}); + t.setF18(new ArrayList<A>(){{add(A.create());add(A.create());}}); + t.setF19(new A[][]{{A.create()},{A.create()}}); + t.setF20(new ArrayList<List<A>>(){{add(Arrays.asList(A.create()));add(Arrays.asList(A.create()));}}); + return t; + } + } + + @UrlEncoding(expandedParams=true) + public static class C extends B { + @SuppressWarnings("serial") + static C create() { + C t = new C(); + t.f1 = new String[]{"a","b"}; + t.f2 = new ArrayList<String>(){{add("c");add("d");}}; + t.f3 = new int[]{1,2}; + t.f4 = new ArrayList<Integer>(){{add(3);add(4);}}; + t.f5 = new String[][]{{"e","f"},{"g","h"}}; + t.f6 = new ArrayList<String[]>(){{add(new String[]{"i","j"});add(new String[]{"k","l"});}}; + t.f7 = new A[]{A.create(),A.create()}; + t.f8 = new ArrayList<A>(){{add(A.create());add(A.create());}}; + t.f9 = new A[][]{{A.create()},{A.create()}}; + t.f10 = new ArrayList<List<A>>(){{add(Arrays.asList(A.create()));add(Arrays.asList(A.create()));}}; + t.setF11(new String[]{"a","b"}); + t.setF12(new ArrayList<String>(){{add("c");add("d");}}); + t.setF13(new int[]{1,2}); + t.setF14(new ArrayList<Integer>(){{add(3);add(4);}}); + t.setF15(new String[][]{{"e","f"},{"g","h"}}); + t.setF16(new ArrayList<String[]>(){{add(new String[]{"i","j"});add(new String[]{"k","l"});}}); + t.setF17(new A[]{A.create(),A.create()}); + t.setF18(new ArrayList<A>(){{add(A.create());add(A.create());}}); + t.setF19(new A[][]{{A.create()},{A.create()}}); + t.setF20(new ArrayList<List<A>>(){{add(Arrays.asList(A.create()));add(Arrays.asList(A.create()));}}); + return t; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/LargePojo.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/LargePojo.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/LargePojo.java new file mode 100755 index 0000000..d610d70 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/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; + +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/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/Root.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/Root.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/Root.java new file mode 100755 index 0000000..29d1fc2 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/Root.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.server; + +import org.apache.juneau.microservice.resources.*; +import org.apache.juneau.server.annotation.*; +import org.apache.juneau.server.labels.*; + +@RestResource( + path="/", + children={ + TestAcceptCharset.class, + TestBeanContextProperties.class, + TestCallbackStrings.class, + TestCharsetEncodings.class, + TestClientVersion.class, + TestConfig.class, + TestContent.class, + TestDefaultContentTypes.class, + TestErrorConditions.class, + TestTransforms.class, + TestGroups.class, + TestGzip.TestGzipOff.class, + TestGzip.TestGzipOn.class, + TestInheritance.TestEncoders.class, + TestInheritance.TestTransforms.class, + TestInheritance.TestParsers.class, + TestInheritance.TestProperties.class, + TestInheritance.TestSerializers.class, + TestLargePojos.class, + TestMessages.TestMessages2.class, + TestMessages.class, + TestNls.class, + TestNlsProperty.class, + TestNoParserInput.class, + TestOnPostCall.class, + TestOnPreCall.class, + TestOptionsWithoutNls.class, + TestOverlappingMethods.class, + TestParams.class, + TestParsers.class, + TestPath.class, + TestPaths.class, + TestProperties.class, + TestRestClient2.class, + TestSerializers.class, + TestStaticFiles.class, + TestUris.class, + TestUrlContent.class, + ShutdownResource.class + } +) +public class Root extends RestServletDefault { + private static final long serialVersionUID = 1L; + + @RestMethod(name="GET", path="/") + public ChildResourceDescriptions doGet(RestRequest req) { + return new ChildResourceDescriptions(this, req); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestAcceptCharset.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestAcceptCharset.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestAcceptCharset.java new file mode 100755 index 0000000..9efa109 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestAcceptCharset.java @@ -0,0 +1,75 @@ +/*************************************************************************************************************************** + * 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; + +import static org.apache.juneau.server.RestServletContext.*; + +import java.io.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testAcceptCharset", + serializers={PlainTextSerializer.class}, + properties={ + // Some versions of Jetty default to ISO8601, so specify UTF-8 for test consistency. + @Property(name=REST_defaultCharset,value="utf-8") + } +) +public class TestAcceptCharset extends RestServlet { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Test that Q-values are being resolved correctly. + //==================================================================================================== + @RestMethod(name="GET", path="/testQValues") + public String testQValues() { + return "foo"; + } + + //==================================================================================================== + // Validate various Accept-Charset variations. + //==================================================================================================== + @RestMethod(name="PUT", path="/testCharsetOnResponse", parsers=TestParser.class, serializers=TestSerializer.class) + public String testCharsetOnResponse(@Content String in) { + return in; + } + + @Consumes("text/plain") + public static class TestParser extends InputStreamParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)session.getProperties().getString("characterEncoding"); + } + } + + @Produces("text/plain") + public static class TestSerializer extends OutputStreamSerializer { + @Override /* Serializer */ + protected void doSerialize(SerializerSession session, Object o) throws Exception { + Writer w = new OutputStreamWriter(session.getOutputStream()); + w.append(o.toString()).append('/').append(session.getProperties().getString("characterEncoding")); + w.flush(); + w.close(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestBeanContextProperties.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestBeanContextProperties.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestBeanContextProperties.java new file mode 100755 index 0000000..f4a1ba8 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestBeanContextProperties.java @@ -0,0 +1,41 @@ +/*************************************************************************************************************************** + * 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; + +import java.io.*; +import java.util.*; + +import org.apache.juneau.server.annotation.*; +import org.apache.juneau.transforms.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testBeanContext", + transforms=DateTransform.ISO8601DTZ.class +) +public class TestBeanContextProperties extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Validate that transforms defined on class transform to underlying bean context. + //==================================================================================================== + @RestMethod(name="GET", path="/testClassTransforms/{d1}") + public Reader testClassTransforms(@Attr("d1") Date d1, @Param("d2") Date d2, @Header("X-D3") Date d3) throws Exception { + DateTransform df = DateTransform.ISO8601DTZ.class.newInstance(); + return new StringReader( + "d1="+df.transform(d1)+",d2="+df.transform(d2)+",d3="+df.transform(d3)+"" + ); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCallbackStrings.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCallbackStrings.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCallbackStrings.java new file mode 100755 index 0000000..4527f26 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCallbackStrings.java @@ -0,0 +1,52 @@ +/*************************************************************************************************************************** + * 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; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testCallback" +) +public class TestCallbackStrings extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Test GET + //==================================================================================================== + @RestMethod(name="GET", path="/") + public ObjectMap test1(RestRequest req) throws Exception { + return new ObjectMap().append("method","GET").append("headers", getFooHeaders(req)).append("content", req.getInputAsString()); + } + + //==================================================================================================== + // Test PUT + //==================================================================================================== + @RestMethod(name="PUT", path="/") + public ObjectMap testCharsetOnResponse(RestRequest req) throws Exception { + return new ObjectMap().append("method","PUT").append("headers", getFooHeaders(req)).append("content", req.getInputAsString()); + } + + private Map<String,Object> getFooHeaders(RestRequest req) { + Map<String,Object> m = new TreeMap<String,Object>(); + for (Map.Entry<String,Object> e : req.getHeaders().entrySet()) + if (e.getKey().startsWith("Foo-")) + m.put(e.getKey(), e.getValue()); + return m; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCharsetEncodings.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCharsetEncodings.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCharsetEncodings.java new file mode 100755 index 0000000..f95b368 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestCharsetEncodings.java @@ -0,0 +1,54 @@ +/*************************************************************************************************************************** + * 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; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.internal.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testCharsetEncodings", + defaultRequestHeaders={"Accept: text/s", "Content-Type: text/p"}, + parsers={TestCharsetEncodings.CtParser.class}, serializers={TestCharsetEncodings.ASerializer.class} +) +public class TestCharsetEncodings extends RestServlet { + private static final long serialVersionUID = 1L; + + @Consumes("text/p") + public static class CtParser extends ReaderParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)IOUtils.read(session.getReader()); + } + } + + @Produces("text/s") + public static class ASerializer extends WriterSerializer { + @Override /* Serializer */ + protected void doSerialize(SerializerSession session, Object o) throws Exception { + session.getWriter().write(o.toString()); + } + } + + @RestMethod(name="PUT", path="/") + public String test1(RestRequest req, @Content String in) { + return req.getCharacterEncoding() + "/" + in + "/" + req.getCharacterEncoding(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestClientVersion.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestClientVersion.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestClientVersion.java new file mode 100644 index 0000000..65fec38 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestClientVersion.java @@ -0,0 +1,93 @@ +/*************************************************************************************************************************** + * 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; + +import org.apache.juneau.microservice.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testClientVersion", + children={ + TestClientVersion.DefaultHeader.class, + TestClientVersion.CustomHeader.class + } +) +@SuppressWarnings("serial") +public class TestClientVersion extends Resource { + + @RestResource( + path="/defaultHeader" + ) + public static class DefaultHeader extends Resource { + + @RestMethod(name="GET", path="/") + public String test0() { + return "no-version"; + } + + @RestMethod(name="GET", path="/", clientVersion="[0.0,1.0)") + public String test1() { + return "[0.0,1.0)"; + } + + @RestMethod(name="GET", path="/", clientVersion="[1.0,1.0]") + public String test2() { + return "[1.0,1.0]"; + } + + @RestMethod(name="GET", path="/", clientVersion="[1.1,2)") + public String test3() { + return "[1.1,2)"; + } + + @RestMethod(name="GET", path="/", clientVersion="2") + public String test4() { + return "2"; + } + } + + @RestResource( + path="/customHeader", + clientVersionHeader="Custom-Client-Version" + ) + public static class CustomHeader extends Resource { + + @RestMethod(name="GET", path="/") + public String test0() { + return "no-version"; + } + + @RestMethod(name="GET", path="/", clientVersion="[0.0,1.0)") + public String test1() { + return "[0.0,1.0)"; + } + + @RestMethod(name="GET", path="/", clientVersion="[1.0,1.0]") + public String test2() { + return "[1.0,1.0]"; + } + + @RestMethod(name="GET", path="/", clientVersion="[1.1,2)") + public String test3() { + return "[1.1,2)"; + } + + @RestMethod(name="GET", path="/", clientVersion="2") + public String test4() { + return "2"; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestConfig.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestConfig.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestConfig.java new file mode 100755 index 0000000..ceafea0 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestConfig.java @@ -0,0 +1,37 @@ +/*************************************************************************************************************************** + * 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; + +import org.apache.juneau.ini.*; +import org.apache.juneau.microservice.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testConfig" +) +@SuppressWarnings("serial") +public class TestConfig extends Resource { + + @RestMethod(name="GET", path="/") + public ConfigFile test1(RestRequest req) { + return req.getConfig(); + } + + @RestMethod(name="GET", path="/{key}/{class}") + public Object test2(RestRequest req, @Attr("key") String key, @Attr("class") Class<?> c) throws Exception { + return req.getConfig().getObject(c, key); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestContent.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestContent.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestContent.java new file mode 100755 index 0000000..036fb5b --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestContent.java @@ -0,0 +1,80 @@ +/*************************************************************************************************************************** + * 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; + +import static org.apache.juneau.server.RestServletContext.*; + +import java.util.*; + +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testContent", + properties={ + @Property(name=REST_allowMethodParam, value="*") + } +) +public class TestContent extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Basic tests + //==================================================================================================== + @RestMethod(name="POST", path="/boolean") + public boolean testBool(@Content boolean b) { + return b; + } + + @RestMethod(name="POST", path="/Boolean") + public Boolean testBoolean(@Content Boolean b) { + return b; + } + + @RestMethod(name="POST", path="/int") + public int testInt(@Content int i) { + return i; + } + + @RestMethod(name="POST", path="/Integer") + public Integer testInteger(@Content Integer i) { + return i; + } + + @RestMethod(name="POST", path="/float") + public float testFloat(@Content float f) { + return f; + } + + @RestMethod(name="POST", path="/Float") + public Float testFloat2(@Content Float f) { + return f; + } + + @RestMethod(name="POST", path="/Map") + public TreeMap<String,String> testMap(@Content TreeMap<String,String> m) { + return m; + } + + @RestMethod(name="POST", path="/B") + public DTO2s.B testPojo1(@Content DTO2s.B b) { + return b; + } + + @RestMethod(name="POST", path="/C") + public DTO2s.C testPojo2(@Content DTO2s.C c) { + return c; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestDefaultContentTypes.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestDefaultContentTypes.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestDefaultContentTypes.java new file mode 100755 index 0000000..b17c974 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestDefaultContentTypes.java @@ -0,0 +1,127 @@ +/*************************************************************************************************************************** + * 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; + +import static org.apache.juneau.server.annotation.Inherit.*; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testDefaultContentTypes", + defaultRequestHeaders={" Accept : text/s2 "," Content-Type : text/p2 "}, + parsers={TestDefaultContentTypes.P1.class,TestDefaultContentTypes.P2.class}, serializers={TestDefaultContentTypes.S1.class,TestDefaultContentTypes.S2.class} +) +@SuppressWarnings("synthetic-access") +public class TestDefaultContentTypes extends RestServlet { + private static final long serialVersionUID = 1L; + + @Consumes("text/p1") + public static class P1 extends DummyParser { public P1() {super("p1");}} + + @Consumes("text/p2") + public static class P2 extends DummyParser { public P2() {super("p2");}} + + @Consumes("text/p3") + public static class P3 extends DummyParser { public P3() {super("p3");}} + + @Produces("text/s1") + public static class S1 extends DummySerializer { public S1() {super("s1");}} + + @Produces("text/s2") + public static class S2 extends DummySerializer { public S2() {super("s2");}} + + @Produces("text/s3") + public static class S3 extends DummySerializer { public S3() {super("s3");}} + + /** + * Test that default Accept and Content-Type headers on servlet annotation are picked up. + */ + @RestMethod(name="PUT", path="/testDefaultHeadersOnServletAnnotation") + public String testDefaultHeadersOnServletAnnotation(@Content String in) { + return in; + } + + //==================================================================================================== + // Test that default Accept and Content-Type headers on servlet annotation are picked up + // when @RestMethod.parsers/serializers annotations are used. + //==================================================================================================== + @RestMethod(name="PUT", path="/testRestMethodParsersSerializers", parsers=P3.class, serializers=S3.class) + public String testRestMethodParsersSerializers(@Content String in) { + return in; + } + + //==================================================================================================== + // Test that default Accept and Content-Type headers on servlet annotation are picked up + // when @RestMethod.addParsers/addSerializers annotations are used. + //==================================================================================================== + @RestMethod(name="PUT", path="/testRestMethodAddParsersSerializers", parsers=P3.class, parsersInherit=PARSERS, serializers=S3.class, serializersInherit=SERIALIZERS) + public String testRestMethodAddParsersSerializers(@Content String in) { + return in; + } + + //==================================================================================================== + // Various Accept incantations. + //==================================================================================================== + @RestMethod(name="PUT", path="/testAccept") + public String testAccept(@Content String in) { + return in; + } + + //==================================================================================================== + // Test that default Accept and Content-Type headers on method annotation are picked up + // when @RestMethod.parsers/serializers annotations are used. + //==================================================================================================== + @RestMethod(name="PUT", path="/testRestMethodParserSerializerAnnotations", defaultRequestHeaders={"Accept: text/s3","Content-Type: text/p3"}, parsers=P3.class, serializers=S3.class) + public String testRestMethodParserSerializerAnnotations(@Content String in) { + return in; + } + + //==================================================================================================== + // Test that default Accept and Content-Type headers on method annotation are picked up + // when @RestMethod.addParsers/addSerializers annotations are used. + //==================================================================================================== + @RestMethod(name="PUT", path="/testRestMethodAddParsersSerializersAnnotations", defaultRequestHeaders={"Accept: text/s3","Content-Type: text/p3"}, parsers=P3.class, parsersInherit=PARSERS, serializers=S3.class, serializersInherit=SERIALIZERS) + public String testRestMethodAddParsersSerializersAnnotations(@Content String in) { + return in; + } + + public static class DummyParser extends ReaderParser { + private String name; + private DummyParser(String name) { + this.name = name; + } + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)name; + } + } + + public static class DummySerializer extends WriterSerializer { + private String name; + private DummySerializer(String name) { + this.name = name; + } + @Override /* Serializer */ + protected void doSerialize(SerializerSession session, Object output) throws Exception { + session.getWriter().write(name + "/" + output); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestErrorConditions.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestErrorConditions.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestErrorConditions.java new file mode 100755 index 0000000..90311a1 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestErrorConditions.java @@ -0,0 +1,135 @@ +/*************************************************************************************************************************** + * 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; + +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + * Validates correct parser is used. + */ +@RestResource( + path="/testErrorConditions" +) +@SuppressWarnings("unused") +public class TestErrorConditions extends RestServletDefault { + private static final long serialVersionUID = 1L; + + //==================================================================================================== + // Test non-existent properties + //==================================================================================================== + @RestMethod(name="PUT", path="/testNonExistentBeanProperties") + public String testNonExistentBeanProperties(@Content Test1 in) { + return "OK"; + } + + public static class Test1 { + public String f1; + } + + //==================================================================================================== + // Test trying to set properties to wrong data type + //==================================================================================================== + @RestMethod(name="PUT", path="/testWrongDataType") + public String testWrongDataType(@Content Test2 in) { + return "OK"; + } + + public static class Test2 { + public int f1; + } + + //==================================================================================================== + // Test trying to parse into class with non-public no-arg constructor. + //==================================================================================================== + @RestMethod(name="PUT", path="/testParseIntoNonConstructableBean") + public String testParseIntoNonConstructableBean(@Content Test3a in) { + return "OK"; + } + + public static class Test3a { + public int f1; + private Test3a(){} + } + + //==================================================================================================== + // Test trying to parse into non-static inner class + //==================================================================================================== + @RestMethod(name="PUT", path="/testParseIntoNonStaticInnerClass") + public String testParseIntoNonStaticInnerClass(@Content Test3b in) { + return "OK"; + } + + public class Test3b { + public Test3b(){} + } + + //==================================================================================================== + // Test trying to parse into non-public inner class + //==================================================================================================== + @RestMethod(name="PUT", path="/testParseIntoNonPublicInnerClass") + public String testParseIntoNonPublicInnerClass(@Content Test3b1 in) { + return "OK"; + } + + static class Test3b1 { + public Test3b1(){} + } + + //==================================================================================================== + // Test exception thrown during bean construction. + //==================================================================================================== + @RestMethod(name="PUT", path="/testThrownConstructorException") + public String testThrownConstructorException(@Content Test3c in) { + return "OK"; + } + + public static class Test3c { + public int f1; + private Test3c(){} + public static Test3c valueOf(String s) { + throw new RuntimeException("Test error"); + } + } + + //==================================================================================================== + // Test trying to set parameters to invalid types. + //==================================================================================================== + @RestMethod(name="PUT", path="/testSetParameterToInvalidTypes/{a1}") + public String testSetParameterToInvalidTypes(@Param("p1") int t1, @Attr int a1, @Header("h1") int h1) { + return "OK"; + } + + //==================================================================================================== + // Test SC_NOT_FOUND & SC_METHOD_NOT_ALLOWED + //==================================================================================================== + @RestMethod(name="GET", path="/test404and405") + public String test404and405() { + return "OK"; + } + + //==================================================================================================== + // Test SC_PRECONDITION_FAILED + //==================================================================================================== + @RestMethod(name="GET", path="/test412", matchers=NeverMatcher.class) + public String test412() { + return "OK"; + } + + public static class NeverMatcher extends RestMatcher { + @Override /* RestMatcher */ + public boolean matches(RestRequest req) { + return false; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGroups.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGroups.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGroups.java new file mode 100755 index 0000000..d105918 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGroups.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.server; + +import org.apache.juneau.*; +import org.apache.juneau.annotation.*; +import org.apache.juneau.internal.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testGroups" +) +public class TestGroups extends RestServlet { + private static final long serialVersionUID = 1L; + + @Produces({"text/s1","text/s2"}) + public static class SSerializer extends WriterSerializer { + @Override /* Serializer */ + protected void doSerialize(SerializerSession session, Object output) throws Exception { + session.getWriter().write("text/s," + output); + } + } + + @Consumes({"text/p1","text/p2"}) + public static class PParser extends ReaderParser { + @SuppressWarnings("unchecked") + @Override /* Parser */ + protected <T> T doParse(ParserSession session, ClassMeta<T> type) throws Exception { + return (T)IOUtils.read(session.getReader()); + } + } + + + @Override /* RestServlet */ + public SerializerGroup createSerializers(ObjectMap properties, Class<?>[] filters) throws Exception { + return new SerializerGroup().append(SSerializer.class).setProperties(properties).addTransforms(filters); + } + + @Override /* RestServlet */ + public ParserGroup createParsers(ObjectMap properties, Class<?>[] filters) throws Exception { + return new ParserGroup().append(PParser.class).setProperties(properties).addTransforms(filters); + } + + //==================================================================================================== + // Serializer defined on class. + //==================================================================================================== + @RestMethod(name="GET", path="/testSerializerDefinedOnClass") + public String testSerializerDefinedOnClass_get() { + return "GET"; + } + + @RestMethod(name="PUT", path="/testSerializerDefinedOnClass") + public String testSerializerDefinedOnClass_put(@Content String in) { + return in; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGzip.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGzip.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGzip.java new file mode 100755 index 0000000..787488b --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestGzip.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.server; + +import java.io.*; + +import org.apache.juneau.encoders.*; +import org.apache.juneau.plaintext.*; +import org.apache.juneau.server.annotation.*; + +/** + * JUnit automated testcase resource. + */ +public class TestGzip { + + //================================================================================ + // Encoder for "myencoding" encoding + //================================================================================ + public static class MyEncoder extends GzipEncoder { + @Override /* Encoder */ + public String[] getCodings() { + return new String[]{"mycoding"}; + } + } + + //==================================================================================================== + // Test with no compression enabled. + //==================================================================================================== + @RestResource( + path="/testGzipOff", + serializers=PlainTextSerializer.class, + parsers=PlainTextParser.class + ) + public static class TestGzipOff extends RestServlet { + private static final long serialVersionUID = 1L; + @RestMethod(name="GET", path="/") + public String test1get() { + return "foo"; + } + @RestMethod(name="PUT", path="/") + public String test1put(@Content String in) { + return in; + } + } + + //==================================================================================================== + // Test with compression enabled. + //==================================================================================================== + @RestResource( + path="/testGzipOn", + serializers=PlainTextSerializer.class, + parsers=PlainTextParser.class, + encoders=MyEncoder.class + ) + public static class TestGzipOn extends RestServlet { + private static final long serialVersionUID = 1L; + @RestMethod(name="GET", path="/") + public String test1() { + return "foo"; + } + @RestMethod(name="PUT", path="/") + public String test1put(@Content String in) { + return in; + } + // This method bypasses the content type and encoding from + // the serializers and encoders when calling getOutputStream() directly. + @RestMethod(name="GET", path="/direct") + public void direct(RestResponse res) throws Exception { + res.setContentType("text/direct"); + OutputStream os = res.getOutputStream(); + os.write("test".getBytes()); + os.flush(); + } + + // This method bypasses the content type and encoding from + // the serializers and encoders when calling getWriter() directly. + @RestMethod(name="GET", path="/direct2") + public void direct2(RestResponse res) throws Exception { + Writer w = res.getWriter(); + w.append("test"); + w.flush(); + } + + // This method uses getNegotiatedWriter() which should use GZip encoding. + @RestMethod(name="GET", path="/direct3") + public void direct3(RestResponse res) throws Exception { + Writer w = res.getNegotiatedWriter(); + w.append("test"); + w.flush(); + } + + // This method overrides the set of encoders at the method level and so shouldn't use GZip encoding. + @RestMethod(name="GET", path="/direct4", inheritEncoders=false) + public void direct4(RestResponse res) throws Exception { + Writer w = res.getNegotiatedWriter(); + w.append("test"); + w.flush(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestInheritance.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestInheritance.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestInheritance.java new file mode 100755 index 0000000..6bbee72 --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestInheritance.java @@ -0,0 +1,316 @@ +/*************************************************************************************************************************** + * 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; + +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.annotation.*; +import org.apache.juneau.server.annotation.Properties; +import org.apache.juneau.transform.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testInheritance", + serializers={TestInheritance.S1.class,TestInheritance.S2.class}, + parsers={TestInheritance.P1.class,TestInheritance.P2.class}, + encoders={TestInheritance.E1.class,TestInheritance.E2.class}, + transforms={TestInheritance.F1.class}, + properties={@Property(name="p1",value="v1"), @Property(name="p2",value="v2")} +) +public class TestInheritance extends RestServlet { + private static final long serialVersionUID = 1L; + + @RestResource( + serializers={S3.class,S4.class}, + parsers={P3.class,P4.class}, + encoders={E3.class,E4.class}, + transforms={F2.class}, + properties={@Property(name="p2",value="v2a"), @Property(name="p3",value="v3"), @Property(name="p4",value="v4")} + ) + public static class Sub extends TestInheritance { + 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 ['F1','F2','Foo3'] + @RestMethod(name="GET", path="/test1") + public Object[] test1() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['F1','F2','F3'] + // Inherited serializer already has parent filters applied. + @RestMethod(name="GET", path="/test2", transforms=F3.class) + public Object[] test2() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['F1','F2','F3'] + @RestMethod(name="GET", path="/test3", transforms=F3.class, serializersInherit=TRANSFORMS) + public Object[] test3() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['Foo1','Foo2','F3'] + // Overriding serializer does not have parent filters applied. + @RestMethod(name="GET", path="/test4", serializers=JsonSerializer.Simple.class, transforms=F3.class) + public Object[] test4() { + return new Object[]{new Foo1(), new Foo2(), new Foo3()}; + } + + // Should show ['F1','F2','F3'] + // Overriding serializer does have parent filters applied. + @RestMethod(name="GET", path="/test5", serializers=JsonSerializer.Simple.class, transforms=F3.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 F1 extends PojoTransform<Foo1,String> { + @Override /* PojoTransform */ + public String transform(Foo1 o) throws SerializeException { + return "F1"; + } + } + + public static class F2 extends PojoTransform<Foo2,String> { + @Override /* PojoTransform */ + public String transform(Foo2 o) throws SerializeException { + return "F2"; + } + } + + public static class F3 extends PojoTransform<Foo3,String> { + @Override /* PojoTransform */ + public String transform(Foo3 o) throws SerializeException { + return "F3"; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestLargePojos.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestLargePojos.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestLargePojos.java new file mode 100755 index 0000000..671bf6b --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestLargePojos.java @@ -0,0 +1,41 @@ +/*************************************************************************************************************************** + * 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; + + +import org.apache.juneau.server.annotation.*; +import org.apache.juneau.server.jena.*; + +/** + * JUnit automated testcase resource. + */ +@RestResource( + path="/testLargePojos" +) +public class TestLargePojos 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="/") + @SuppressWarnings("unused") + public String testPut(@Content LargePojo in) { + return "ok"; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/244cc21a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestMessages.java ---------------------------------------------------------------------- diff --git a/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestMessages.java b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestMessages.java new file mode 100755 index 0000000..43f0e7f --- /dev/null +++ b/org.apache.juneau.server.test/src/main/java/org/apache/juneau/server/TestMessages.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; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.serializer.*; +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="TestMessages", + transforms={ + TestMessages.ResourceBundleTransform.class + } +) +public class TestMessages 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="TestMessages2" + ) + public static class TestMessages2 extends TestMessages {} + + public static class ResourceBundleTransform extends PojoTransform<ResourceBundle,ObjectMap> { + @Override /* Transform */ + public ObjectMap transform(ResourceBundle o) throws SerializeException { + ObjectMap m = new ObjectMap(); + for (String k : o.keySet()) + m.put(k, o.getString(k)); + return m; + } + } +}
