View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.rest.annotation;
18  
19  import org.apache.juneau.*;
20  import org.apache.juneau.annotation.*;
21  import org.apache.juneau.rest.mock.*;
22  import org.apache.juneau.rest.servlet.*;
23  import org.junit.jupiter.api.*;
24  
25  @SuppressWarnings("serial")
26  class RestOp_BeanConfig_Test extends TestBase {
27  
28  	//------------------------------------------------------------------------------------------------------------------
29  	// @BeanConfig(bpi)
30  	//------------------------------------------------------------------------------------------------------------------
31  
32  	public static class A1 extends BasicRestServlet {
33  		@RestGet
34  		@Bean(onClass=X1.class, properties="a,_b")
35  		public Object a() {
36  			return new X1().init();
37  		}
38  		@RestGet
39  		@Bean(onClass=X1.class, p="a")
40  		public Object b() {
41  			return new X1().init();
42  		}
43  		@RestGet
44  		@Bean(onClass=X1.class, p="_b")
45  		public Object c() {
46  			return new X1().init();
47  		}
48  	}
49  
50  	@Test void a01_bpi() throws Exception {
51  		var a1 = MockRestClient.build(A1.class);
52  		a1.get("/a").json().run().assertContent("{\"a\":1,\"_b\":\"foo\"}");
53  		a1.get("/a").xml().run().assertContent().isContains("<object><a>1</a><_b>foo</_b></object>");
54  		a1.get("/a").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr><tr><td>_b</td><td>foo</td></tr></table>");
55  		a1.get("/a").uon().run().assertContent("(a=1,_b=foo)");
56  		a1.get("/a").urlEnc().run().assertContent("a=1&_b=foo");
57  		a1.get("/b").json().run().assertContent("{\"a\":1}");
58  		a1.get("/b").xml().run().assertContent().isContains("<object><a>1</a></object>");
59  		a1.get("/b").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr></table>");
60  		a1.get("/b").uon().run().assertContent("(a=1)");
61  		a1.get("/b").urlEnc().run().assertContent("a=1");
62  		a1.get("/c").json().run().assertContent("{\"_b\":\"foo\"}");
63  		a1.get("/c").xml().run().assertContent().isContains("<object><_b>foo</_b></object>");
64  		a1.get("/c").html().run().assertContent().isContains("<table><tr><td>_b</td><td>foo</td></tr></table>");
65  		a1.get("/c").uon().run().assertContent("(_b=foo)");
66  		a1.get("/c").urlEnc().run().assertContent("_b=foo");
67  	}
68  
69  	//------------------------------------------------------------------------------------------------------------------
70  	// @BeanConfig(bpx)
71  	//------------------------------------------------------------------------------------------------------------------
72  
73  	public static class A2 extends BasicRestServlet {
74  		@RestGet
75  		@Bean(on="X1", excludeProperties="a,_b")
76  		public Object a() {
77  			return new X1().init();
78  		}
79  		@RestGet
80  		@Bean(on="X1", xp="a")
81  		public Object b() {
82  			return new X1().init();
83  		}
84  		@RestGet
85  		@Bean(on="X1", xp="_b")
86  		public Object c() {
87  			return new X1().init();
88  		}
89  	}
90  
91  	@Test void a02_bpx() throws Exception {
92  		var a2 = MockRestClient.build(A2.class);
93  		a2.get("/a").json().run().assertContent("{}");
94  		a2.get("/a").xml().run().assertContent().isContains("<object/>");
95  		a2.get("/a").html().run().assertContent().isContains("<table></table>");
96  		a2.get("/a").uon().run().assertContent("()");
97  		a2.get("/a").urlEnc().run().assertContent("");
98  		a2.get("/b").json().run().assertContent("{\"_b\":\"foo\"}");
99  		a2.get("/b").xml().run().assertContent().isContains("<object><_b>foo</_b></object>");
100 		a2.get("/b").html().run().assertContent().isContains("<table><tr><td>_b</td><td>foo</td></tr></table>");
101 		a2.get("/b").uon().run().assertContent("(_b=foo)");
102 		a2.get("/b").urlEnc().run().assertContent("_b=foo");
103 		a2.get("/c").json().run().assertContent("{\"a\":1}");
104 		a2.get("/c").xml().run().assertContent().isContains("<object><a>1</a></object>");
105 		a2.get("/c").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr></table>");
106 		a2.get("/c").uon().run().assertContent("(a=1)");
107 		a2.get("/c").urlEnc().run().assertContent("a=1");
108 	}
109 
110 	//------------------------------------------------------------------------------------------------------------------
111 	// @BeanConfig(bpi) and @Bean(bpi)
112 	//------------------------------------------------------------------------------------------------------------------
113 
114 	public static class A3 extends BasicRestServlet {
115 		@RestGet
116 		@Bean(onClass=X2.class, p="a,_b")
117 		public Object a() {
118 			return new X2().init();
119 		}
120 		@RestGet
121 		@Bean(onClass=X2.class, p="a")
122 		public Object b() {
123 			return new X2().init();
124 		}
125 		@RestGet
126 		@Bean(onClass=X2.class, p="_b")
127 		public Object c() {
128 			return new X2().init();
129 		}
130 	}
131 
132 	@Test void a03_bpi_overridesClass() throws Exception {
133 		var c = MockRestClient.build(A3.class);
134 		c.get("/a").json().run().assertContent("{\"a\":1,\"_b\":\"foo\"}");
135 		c.get("/a").xml().run().assertContent().isContains("<object><a>1</a><_b>foo</_b></object>");
136 		c.get("/a").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr><tr><td>_b</td><td>foo</td></tr></table>");
137 		c.get("/a").uon().run().assertContent("(a=1,_b=foo)");
138 		c.get("/a").urlEnc().run().assertContent("a=1&_b=foo");
139 		c.get("/b").json().run().assertContent("{\"a\":1}");
140 		c.get("/b").xml().run().assertContent().isContains("<object><a>1</a></object>");
141 		c.get("/b").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr></table>");
142 		c.get("/b").uon().run().assertContent("(a=1)");
143 		c.get("/b").urlEnc().run().assertContent("a=1");
144 		c.get("/c").json().run().assertContent("{\"_b\":\"foo\"}");
145 		c.get("/c").xml().run().assertContent().isContains("<object><_b>foo</_b></object>");
146 		c.get("/c").html().run().assertContent().isContains("<table><tr><td>_b</td><td>foo</td></tr></table>");
147 		c.get("/c").uon().run().assertContent("(_b=foo)");
148 		c.get("/c").urlEnc().run().assertContent("_b=foo");
149 	}
150 
151 	//------------------------------------------------------------------------------------------------------------------
152 	// @BeanConfig(bpx) and @Bean(bpi)
153 	//------------------------------------------------------------------------------------------------------------------
154 
155 	public static class A4 extends BasicRestServlet {
156 		@RestGet
157 		@Bean(onClass=X2.class, xp="a,_b")
158 		public Object a() {
159 			return new X2().init();
160 		}
161 		@RestGet
162 		@Bean(onClass=X2.class, xp="a")
163 		public Object b() {
164 			return new X2().init();
165 		}
166 		@RestGet
167 		@Bean(onClass=X2.class, xp="_b")
168 		public Object c() {
169 			return new X2().init();
170 		}
171 	}
172 
173 	@Test void a04_bpx_overridesClass() throws Exception {
174 		var a4 = MockRestClient.build(A4.class);
175 		a4.get("/a").json().run().assertContent("{}");
176 		a4.get("/a").xml().run().assertContent().isContains("<object/>");
177 		a4.get("/a").html().run().assertContent().isContains("<table></table>");
178 		a4.get("/a").uon().run().assertContent("()");
179 		a4.get("/a").urlEnc().run().assertContent("");
180 		a4.get("/b").json().run().assertContent("{\"_b\":\"foo\"}");
181 		a4.get("/b").xml().run().assertContent().isContains("<object><_b>foo</_b></object>");
182 		a4.get("/b").html().run().assertContent().isContains("<table><tr><td>_b</td><td>foo</td></tr></table>");
183 		a4.get("/b").uon().run().assertContent("(_b=foo)");
184 		a4.get("/b").urlEnc().run().assertContent("_b=foo");
185 		a4.get("/c").json().run().assertContent("{\"a\":1}");
186 		a4.get("/c").xml().run().assertContent().isContains("<object><a>1</a></object>");
187 		a4.get("/c").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr></table>");
188 		a4.get("/c").uon().run().assertContent("(a=1)");
189 		a4.get("/c").urlEnc().run().assertContent("a=1");
190 	}
191 
192 	//------------------------------------------------------------------------------------------------------------------
193 	// @BeanConfig(bpi), meta-matching
194 	//------------------------------------------------------------------------------------------------------------------
195 
196 	public static class A5 extends BasicRestServlet {
197 		@RestGet
198 		@Bean(on="*", p="a")
199 		public Object a() {
200 			return new X1().init();
201 		}
202 	}
203 
204 	@Test void a05_bpi_metaMatching() throws Exception {
205 		var a5 = MockRestClient.build(A5.class);
206 		a5.get("/a").json().run().assertContent("{\"a\":1}");
207 		a5.get("/a").xml().run().assertContent().isContains("<object><a>1</a></object>");
208 		a5.get("/a").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr></table>");
209 		a5.get("/a").uon().run().assertContent("(a=1)");
210 		a5.get("/a").urlEnc().run().assertContent("a=1");
211 	}
212 
213 	//------------------------------------------------------------------------------------------------------------------
214 	// @BeanConfig(bpi), fully-qualified class name
215 	//------------------------------------------------------------------------------------------------------------------
216 
217 	public static class A6 extends BasicRestServlet {
218 		@RestGet
219 		@Bean(on="org.apache.juneau.rest.annotation.RestOp_BeanConfig_Test$X1", p="a")
220 		public Object a() {
221 			return new X1().init();
222 		}
223 	}
224 
225 	@Test void a06_bpi_fullyQualifiedClassNames() throws Exception {
226 		var a6 = MockRestClient.build(A6.class);
227 		a6.get("/a").json().run().assertContent("{\"a\":1}");
228 		a6.get("/a").xml().run().assertContent().isContains("<object><a>1</a></object>");
229 		a6.get("/a").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr></table>");
230 		a6.get("/a").uon().run().assertContent("(a=1)");
231 		a6.get("/a").urlEnc().run().assertContent("a=1");
232 	}
233 
234 	//------------------------------------------------------------------------------------------------------------------
235 	// @BeanConfig(bpi), negative matching
236 	//------------------------------------------------------------------------------------------------------------------
237 
238 	public static class A7 extends BasicRestServlet {
239 		@RestGet
240 		@Bean(on="MyBean", p="a")
241 		public Object a() {
242 			// Should not match.
243 			return new X1().init();
244 		}
245 		@RestGet
246 		@Bean(on="MyBean", p="a")
247 		public Object b() {
248 			// Should not match.  We don't support meta-matches in class names.
249 			return new X1().init();
250 		}
251 	}
252 
253 	@Test void a07_bpi_negativeMatching() throws Exception {
254 		var a7 = MockRestClient.build(A7.class);
255 		a7.get("/a").json().run().assertContent("{\"a\":1,\"_b\":\"foo\"}");
256 		a7.get("/a").xml().run().assertContent().isContains("<object><a>1</a><_b>foo</_b></object>");
257 		a7.get("/a").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr><tr><td>_b</td><td>foo</td></tr></table>");
258 		a7.get("/a").uon().run().assertContent("(a=1,_b=foo)");
259 		a7.get("/a").urlEnc().run().assertContent("a=1&_b=foo");
260 		a7.get("/b").json().run().assertContent("{\"a\":1,\"_b\":\"foo\"}");
261 		a7.get("/b").xml().run().assertContent().isContains("<object><a>1</a><_b>foo</_b></object>");
262 		a7.get("/b").html().run().assertContent().isContains("<table><tr><td>a</td><td>1</td></tr><tr><td>_b</td><td>foo</td></tr></table>");
263 		a7.get("/b").uon().run().assertContent("(a=1,_b=foo)");
264 		a7.get("/b").urlEnc().run().assertContent("a=1&_b=foo");
265 	}
266 
267 	//------------------------------------------------------------------------------------------------------------------
268 	// Beans
269 	//------------------------------------------------------------------------------------------------------------------
270 
271 	public static class X1 {
272 		public int a;
273 		@Beanp("_b") public String b;
274 
275 		X1 init() {
276 			a = 1;
277 			b = "foo";
278 			return this;
279 		}
280 	}
281 
282 	@Bean(properties="_b,a")
283 	public static class X2 {
284 		public int a;
285 		@Beanp("_b") public String b;
286 
287 		X2 init() {
288 			a = 1;
289 			b = "foo";
290 			return this;
291 		}
292 	}
293 }