blob: 3812bcd0afa0001e570e394e8da7cc47b571ace5 [file] [log] [blame]
// ***************************************************************************************************************************
// * 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;
}
}
}