| // *************************************************************************************************************************** |
| // * 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; |
| |
| import static org.apache.juneau.testutils.TestUtils.*; |
| |
| import java.util.*; |
| |
| import org.apache.juneau.annotation.*; |
| import org.apache.juneau.parser.*; |
| import org.apache.juneau.serializer.*; |
| import org.apache.juneau.transforms.*; |
| import org.junit.*; |
| import org.junit.runner.*; |
| import org.junit.runners.*; |
| |
| /** |
| * Exhaustive serialization tests DynaBean support. |
| */ |
| @RunWith(Parameterized.class) |
| @SuppressWarnings({}) |
| public class DynaBeanComboTest extends ComboRoundTripTest { |
| |
| @Parameterized.Parameters |
| public static Collection<Object[]> getParameters() { |
| return Arrays.asList(new Object[][] { |
| { /* 0 */ |
| new ComboInput<BeanWithDynaField>( |
| "BeanWithDynaField", |
| BeanWithDynaField.class, |
| new BeanWithDynaField().init(), |
| /* Json */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonT */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonR */ "{\n\tf1: 1,\n\tf2a: 'a',\n\tf2b: 'b',\n\tf3: 3\n}", |
| /* Xml */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlT */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlR */ "<object>\n\t<f1>1</f1>\n\t<f2a>a</f2a>\n\t<f2b>b</f2b>\n\t<f3>3</f3>\n</object>\n", |
| /* XmlNs */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* Html */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlT */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlR */ "<table>\n\t<tr>\n\t\t<td>f1</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2a</td>\n\t\t<td>a</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2b</td>\n\t\t<td>b</td>\n\t</tr>\n\t<tr>\n\t\t<td>f3</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n", |
| /* Uon */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonT */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonR */ "(\n\tf1=1,\n\tf2a=a,\n\tf2b=b,\n\tf3=3\n)", |
| /* UrlEnc */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncT */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncR */ "f1=1\n&f2a=a\n&f2b=b\n&f3=3", |
| /* MsgPack */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* MsgPackT */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:f1>1</jp:f1>\n <jp:f2a>a</jp:f2a>\n <jp:f2b>b</jp:f2b>\n <jp:f3>3</jp:f3>\n </rdf:Description>\n</rdf:RDF>\n" |
| ) |
| { |
| @Override |
| public void verify(BeanWithDynaField o) { |
| assertInstanceOf(BeanWithDynaField.class, o); |
| } |
| } |
| }, |
| { /* 1 */ |
| new ComboInput<BeanWithDynaMethods>( |
| "BeanWithDynaMethods", |
| BeanWithDynaMethods.class, |
| new BeanWithDynaMethods().init(), |
| /* Json */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonT */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonR */ "{\n\tf1: 1,\n\tf2a: 'a',\n\tf2b: 'b',\n\tf3: 3\n}", |
| /* Xml */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlT */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlR */ "<object>\n\t<f1>1</f1>\n\t<f2a>a</f2a>\n\t<f2b>b</f2b>\n\t<f3>3</f3>\n</object>\n", |
| /* XmlNs */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* Html */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlT */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlR */ "<table>\n\t<tr>\n\t\t<td>f1</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2a</td>\n\t\t<td>a</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2b</td>\n\t\t<td>b</td>\n\t</tr>\n\t<tr>\n\t\t<td>f3</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n", |
| /* Uon */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonT */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonR */ "(\n\tf1=1,\n\tf2a=a,\n\tf2b=b,\n\tf3=3\n)", |
| /* UrlEnc */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncT */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncR */ "f1=1\n&f2a=a\n&f2b=b\n&f3=3", |
| /* MsgPack */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* MsgPackT */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:f1>1</jp:f1>\n <jp:f2a>a</jp:f2a>\n <jp:f2b>b</jp:f2b>\n <jp:f3>3</jp:f3>\n </rdf:Description>\n</rdf:RDF>\n" |
| ) |
| { |
| @Override |
| public void verify(BeanWithDynaMethods o) { |
| assertInstanceOf(BeanWithDynaMethods.class, o); |
| Assert.assertTrue(o.setterCalled); |
| } |
| } |
| }, |
| { /* 2 */ |
| new ComboInput<BeanWithDynaGetterOnly>( |
| "BeanWithDynaGetterOnly", |
| BeanWithDynaGetterOnly.class, |
| new BeanWithDynaGetterOnly().init(), |
| /* Json */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonT */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonR */ "{\n\tf1: 1,\n\tf2a: 'a',\n\tf2b: 'b',\n\tf3: 3\n}", |
| /* Xml */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlT */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlR */ "<object>\n\t<f1>1</f1>\n\t<f2a>a</f2a>\n\t<f2b>b</f2b>\n\t<f3>3</f3>\n</object>\n", |
| /* XmlNs */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* Html */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlT */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlR */ "<table>\n\t<tr>\n\t\t<td>f1</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2a</td>\n\t\t<td>a</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2b</td>\n\t\t<td>b</td>\n\t</tr>\n\t<tr>\n\t\t<td>f3</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n", |
| /* Uon */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonT */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonR */ "(\n\tf1=1,\n\tf2a=a,\n\tf2b=b,\n\tf3=3\n)", |
| /* UrlEnc */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncT */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncR */ "f1=1\n&f2a=a\n&f2b=b\n&f3=3", |
| /* MsgPack */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* MsgPackT */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:f1>1</jp:f1>\n <jp:f2a>a</jp:f2a>\n <jp:f2b>b</jp:f2b>\n <jp:f3>3</jp:f3>\n </rdf:Description>\n</rdf:RDF>\n" |
| ) |
| { |
| @Override |
| public void verify(BeanWithDynaGetterOnly o) { |
| assertInstanceOf(BeanWithDynaGetterOnly.class, o); |
| } |
| } |
| }, |
| { /* 3 */ |
| new ComboInput<BeanWithDynaFieldSwapped>( |
| "BeanWithDynaFieldSwapped", |
| BeanWithDynaFieldSwapped.class, |
| new BeanWithDynaFieldSwapped().init(), |
| /* Json */ "{f1a:'1901-03-03T18:11:12Z'}", |
| /* JsonT */ "{f1a:'1901-03-03T18:11:12Z'}", |
| /* JsonR */ "{\n\tf1a: '1901-03-03T18:11:12Z'\n}", |
| /* Xml */ "<object><f1a>1901-03-03T18:11:12Z</f1a></object>", |
| /* XmlT */ "<object><f1a>1901-03-03T18:11:12Z</f1a></object>", |
| /* XmlR */ "<object>\n\t<f1a>1901-03-03T18:11:12Z</f1a>\n</object>\n", |
| /* XmlNs */ "<object><f1a>1901-03-03T18:11:12Z</f1a></object>", |
| /* Html */ "<table><tr><td>f1a</td><td>1901-03-03T18:11:12Z</td></tr></table>", |
| /* HtmlT */ "<table><tr><td>f1a</td><td>1901-03-03T18:11:12Z</td></tr></table>", |
| /* HtmlR */ "<table>\n\t<tr>\n\t\t<td>f1a</td>\n\t\t<td>1901-03-03T18:11:12Z</td>\n\t</tr>\n</table>\n", |
| /* Uon */ "(f1a=1901-03-03T18:11:12Z)", |
| /* UonT */ "(f1a=1901-03-03T18:11:12Z)", |
| /* UonR */ "(\n\tf1a=1901-03-03T18:11:12Z\n)", |
| /* UrlEnc */ "f1a=1901-03-03T18:11:12Z", |
| /* UrlEncT */ "f1a=1901-03-03T18:11:12Z", |
| /* UrlEncR */ "f1a=1901-03-03T18:11:12Z", |
| /* MsgPack */ "81A3663161B4313930312D30332D30335431383A31313A31325A", |
| /* MsgPackT */ "81A3663161B4313930312D30332D30335431383A31313A31325A", |
| /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1a>1901-03-03T18:11:12Z</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1a>1901-03-03T18:11:12Z</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:f1a>1901-03-03T18:11:12Z</jp:f1a>\n </rdf:Description>\n</rdf:RDF>\n" |
| ) |
| { |
| @Override |
| public void verify(BeanWithDynaFieldSwapped o) { |
| assertInstanceOf(BeanWithDynaFieldSwapped.class, o); |
| assertInstanceOf(Calendar.class, o.f1.get("f1a")); |
| } |
| } |
| }, |
| { /* 4 */ |
| new ComboInput<BeanWithDynaFieldStringList>( |
| "BeanWithDynaFieldStringList", |
| BeanWithDynaFieldStringList.class, |
| new BeanWithDynaFieldStringList().init(), |
| /* Json */ "{f1a:['foo','bar']}", |
| /* JsonT */ "{f1a:['foo','bar']}", |
| /* JsonR */ "{\n\tf1a: [\n\t\t'foo',\n\t\t'bar'\n\t]\n}", |
| /* Xml */ "<object><f1a><string>foo</string><string>bar</string></f1a></object>", |
| /* XmlT */ "<object><f1a><string>foo</string><string>bar</string></f1a></object>", |
| /* XmlR */ "<object>\n\t<f1a>\n\t\t<string>foo</string>\n\t\t<string>bar</string>\n\t</f1a>\n</object>\n", |
| /* XmlNs */ "<object><f1a><string>foo</string><string>bar</string></f1a></object>", |
| /* Html */ "<table><tr><td>f1a</td><td><ul><li>foo</li><li>bar</li></ul></td></tr></table>", |
| /* HtmlT */ "<table><tr><td>f1a</td><td><ul><li>foo</li><li>bar</li></ul></td></tr></table>", |
| /* HtmlR */ "<table>\n\t<tr>\n\t\t<td>f1a</td>\n\t\t<td>\n\t\t\t<ul>\n\t\t\t\t<li>foo</li>\n\t\t\t\t<li>bar</li>\n\t\t\t</ul>\n\t\t</td>\n\t</tr>\n</table>\n", |
| /* Uon */ "(f1a=@(foo,bar))", |
| /* UonT */ "(f1a=@(foo,bar))", |
| /* UonR */ "(\n\tf1a=@(\n\t\tfoo,\n\t\tbar\n\t)\n)", |
| /* UrlEnc */ "f1a=@(foo,bar)", |
| /* UrlEncT */ "f1a=@(foo,bar)", |
| /* UrlEncR */ "f1a=@(\n\tfoo,\n\tbar\n)", |
| /* MsgPack */ "81A366316192A3666F6FA3626172", |
| /* MsgPackT */ "81A366316192A3666F6FA3626172", |
| /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1a>\n<rdf:Seq>\n<rdf:li>foo</rdf:li>\n<rdf:li>bar</rdf:li>\n</rdf:Seq>\n</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1a>\n<rdf:Seq>\n<rdf:li>foo</rdf:li>\n<rdf:li>bar</rdf:li>\n</rdf:Seq>\n</jp:f1a>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:f1a>\n <rdf:Seq>\n <rdf:li>foo</rdf:li>\n <rdf:li>bar</rdf:li>\n </rdf:Seq>\n </jp:f1a>\n </rdf:Description>\n</rdf:RDF>\n" |
| ) |
| { |
| @Override |
| public void verify(BeanWithDynaFieldStringList o) { |
| assertInstanceOf(BeanWithDynaFieldStringList.class, o); |
| } |
| } |
| }, |
| { /* 5 */ |
| new ComboInput<BeanWithDynaMethodsAndExtraKeys>( |
| "BeanWithDynaMethodsAndExtraKeys", |
| BeanWithDynaMethodsAndExtraKeys.class, |
| new BeanWithDynaMethodsAndExtraKeys().init(), |
| /* Json */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonT */ "{f1:1,f2a:'a',f2b:'b',f3:3}", |
| /* JsonR */ "{\n\tf1: 1,\n\tf2a: 'a',\n\tf2b: 'b',\n\tf3: 3\n}", |
| /* Xml */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlT */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* XmlR */ "<object>\n\t<f1>1</f1>\n\t<f2a>a</f2a>\n\t<f2b>b</f2b>\n\t<f3>3</f3>\n</object>\n", |
| /* XmlNs */ "<object><f1>1</f1><f2a>a</f2a><f2b>b</f2b><f3>3</f3></object>", |
| /* Html */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlT */ "<table><tr><td>f1</td><td>1</td></tr><tr><td>f2a</td><td>a</td></tr><tr><td>f2b</td><td>b</td></tr><tr><td>f3</td><td>3</td></tr></table>", |
| /* HtmlR */ "<table>\n\t<tr>\n\t\t<td>f1</td>\n\t\t<td>1</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2a</td>\n\t\t<td>a</td>\n\t</tr>\n\t<tr>\n\t\t<td>f2b</td>\n\t\t<td>b</td>\n\t</tr>\n\t<tr>\n\t\t<td>f3</td>\n\t\t<td>3</td>\n\t</tr>\n</table>\n", |
| /* Uon */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonT */ "(f1=1,f2a=a,f2b=b,f3=3)", |
| /* UonR */ "(\n\tf1=1,\n\tf2a=a,\n\tf2b=b,\n\tf3=3\n)", |
| /* UrlEnc */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncT */ "f1=1&f2a=a&f2b=b&f3=3", |
| /* UrlEncR */ "f1=1\n&f2a=a\n&f2b=b\n&f3=3", |
| /* MsgPack */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* MsgPackT */ "84A2663101A3663261A161A3663262A162A2663303", |
| /* RdfXml */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlT */ "<rdf:RDF>\n<rdf:Description>\n<jp:f1>1</jp:f1>\n<jp:f2a>a</jp:f2a>\n<jp:f2b>b</jp:f2b>\n<jp:f3>3</jp:f3>\n</rdf:Description>\n</rdf:RDF>\n", |
| /* RdfXmlR */ "<rdf:RDF>\n <rdf:Description>\n <jp:f1>1</jp:f1>\n <jp:f2a>a</jp:f2a>\n <jp:f2b>b</jp:f2b>\n <jp:f3>3</jp:f3>\n </rdf:Description>\n</rdf:RDF>\n" |
| ) |
| { |
| @Override |
| public void verify(BeanWithDynaMethodsAndExtraKeys o) { |
| assertInstanceOf(BeanWithDynaMethodsAndExtraKeys.class, o); |
| Assert.assertTrue(o.setterCalled); |
| } |
| } |
| }, |
| }); |
| } |
| |
| public DynaBeanComboTest(ComboInput<?> comboInput) { |
| super(comboInput); |
| } |
| |
| @Override |
| protected Serializer applySettings(Serializer s) throws Exception { |
| return s.builder().trimNullProperties(false).build(); |
| } |
| |
| @Override |
| protected Parser applySettings(Parser p) throws Exception { |
| return p.builder().build(); |
| } |
| |
| @Bean(sort=true) |
| public static class BeanWithDynaField { |
| public int f1; |
| @Beanp(name="*") |
| public Map<String,Object> f2 = new LinkedHashMap<>(); |
| public int f3; |
| |
| public BeanWithDynaField init() { |
| this.f1 = 1; |
| this.f2 = new ObjectMap().append("f2a", "a").append("f2b", "b"); |
| this.f3 = 3; |
| return this; |
| } |
| } |
| |
| @Bean(sort=true) |
| public static class BeanWithDynaMethods { |
| |
| private int f1, f3; |
| private Map<String,Object> f2 = new LinkedHashMap<>(); |
| private boolean setterCalled = false; |
| |
| public int getF1() { |
| return f1; |
| } |
| public void setF1(int f1) { |
| this.f1 = f1; |
| } |
| public int getF3() { |
| return f3; |
| } |
| public void setF3(int f3) { |
| this.f3 = f3; |
| } |
| |
| @Beanp(name="*") |
| public Map<String, Object> xxx() { |
| return f2; |
| } |
| |
| @Beanp(name="*") |
| public void setYYY(String name, Object o) { |
| setterCalled = true; |
| this.f2.put(name, o); |
| } |
| |
| public BeanWithDynaMethods init() { |
| this.f1 = 1; |
| this.f2 = new ObjectMap().append("f2a", "a").append("f2b", "b"); |
| this.f3 = 3; |
| return this; |
| } |
| } |
| |
| @Bean(sort=true) |
| public static class BeanWithDynaMethodsAndExtraKeys { |
| |
| private int f1, f3; |
| private Map<String,Object> f2 = new LinkedHashMap<>(); |
| private boolean setterCalled = false; |
| |
| public int getF1() { |
| return f1; |
| } |
| public void setF1(int f1) { |
| this.f1 = f1; |
| } |
| public int getF3() { |
| return f3; |
| } |
| public void setF3(int f3) { |
| this.f3 = f3; |
| } |
| |
| @Beanp(name="*") |
| public Object get(String name) { |
| return f2.get(name); |
| } |
| |
| @Beanp(name="*") |
| public void set(String name, Object o) { |
| setterCalled = true; |
| this.f2.put(name, o); |
| } |
| |
| @Beanp(name="*") |
| public Collection<String> getExtraKeys() { |
| return f2.keySet(); |
| } |
| |
| public BeanWithDynaMethodsAndExtraKeys init() { |
| this.f1 = 1; |
| this.f2 = new ObjectMap().append("f2a", "a").append("f2b", "b"); |
| this.f3 = 3; |
| return this; |
| } |
| } |
| |
| @Bean(sort=true) |
| public static class BeanWithDynaGetterOnly { |
| |
| private int f1, f3; |
| private Map<String,Object> f2 = new LinkedHashMap<>(); |
| |
| public int getF1() { |
| return f1; |
| } |
| public void setF1(int f1) { |
| this.f1 = f1; |
| } |
| public int getF3() { |
| return f3; |
| } |
| public void setF3(int f3) { |
| this.f3 = f3; |
| } |
| |
| @Beanp(name="*") |
| public Map<String, Object> xxx() { |
| return f2; |
| } |
| |
| public BeanWithDynaGetterOnly init() { |
| this.f1 = 1; |
| this.f2 = new ObjectMap().append("f2a", "a").append("f2b", "b"); |
| this.f3 = 3; |
| return this; |
| } |
| } |
| |
| private static Calendar singleDate = new GregorianCalendar(TimeZone.getTimeZone("PST")); |
| static { |
| singleDate.setTimeInMillis(0); |
| singleDate.set(1901, 2, 3, 10, 11, 12); |
| } |
| |
| @Bean(sort=true) |
| public static class BeanWithDynaFieldSwapped { |
| @Beanp(name="*") |
| @Swap(TemporalCalendarSwap.IsoInstant.class) |
| public Map<String,Calendar> f1 = new LinkedHashMap<>(); |
| |
| public BeanWithDynaFieldSwapped init() { |
| this.f1.put("f1a", singleDate); |
| return this; |
| } |
| } |
| |
| @Bean(sort=true) |
| public static class BeanWithDynaFieldStringList { |
| @Beanp(name="*") |
| public Map<String,List<String>> f1 = new LinkedHashMap<>(); |
| |
| public BeanWithDynaFieldStringList init() { |
| this.f1.put("f1a", Arrays.asList(new String[]{"foo","bar"})); |
| return this; |
| } |
| } |
| } |