Repository: incubator-juneau Updated Branches: refs/heads/master f27bfcb46 -> ef55eca75
DynaBeans - checkpoint Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/ef55eca7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/ef55eca7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/ef55eca7 Branch: refs/heads/master Commit: ef55eca75776f2e4ee631daa6893eeda854223da Parents: f27bfcb Author: JamesBognar <[email protected]> Authored: Wed May 3 20:55:15 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Wed May 3 20:55:15 2017 -0400 ---------------------------------------------------------------------- .../test/java/org/apache/juneau/ComboTest.java | 1 + .../org/apache/juneau/DynaBeanComboTest.java | 98 ++++++++++++++++++++ .../main/java/org/apache/juneau/BeanMap.java | 7 +- .../main/java/org/apache/juneau/BeanMeta.java | 5 +- .../org/apache/juneau/BeanPropertyMeta.java | 14 ++- .../java/org/apache/juneau/xml/XmlBeanMeta.java | 2 + .../org/apache/juneau/xml/XmlSerializer.java | 4 +- 7 files changed, 123 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ef55eca7/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java b/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java index 00535bf..8a13997 100644 --- a/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java +++ b/juneau-core-test/src/test/java/org/apache/juneau/ComboTest.java @@ -177,6 +177,7 @@ public abstract class ComboTest { } catch (AssertionError e) { throw e; } catch (Exception e) { + e.printStackTrace(); throw new AssertionError(comboInput.label + "/" + testName + " failed. exception=" + e.getLocalizedMessage()); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ef55eca7/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java ---------------------------------------------------------------------- diff --git a/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java b/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java new file mode 100644 index 0000000..bb9ac79 --- /dev/null +++ b/juneau-core-test/src/test/java/org/apache/juneau/DynaBeanComboTest.java @@ -0,0 +1,98 @@ +// *************************************************************************************************************************** +// * 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.*; + +import java.util.*; + +import org.apache.juneau.annotation.*; +import org.apache.juneau.parser.*; +import org.apache.juneau.serializer.*; +import org.junit.runner.*; +import org.junit.runners.*; + +/** + * Exhaustive serialization tests DynaBean support. + */ +@RunWith(Parameterized.class) +@SuppressWarnings({"javadoc"}) +public class DynaBeanComboTest extends ComboTest { + + @Parameterized.Parameters + public static Collection<Object[]> getParameters() { + return Arrays.asList(new Object[][] { + { /* 0 */ + new ComboInput<A>( + "A", + A.class, + new A().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" + ) + { + public void verify(A o) { + assertType(A.class, o); + } + } + }, + }); + } + + 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(); + } + + public static class A { + public int f1; + @BeanProperty(name="*") + public Map<String,Object> f2 = new LinkedHashMap<String,Object>(); + public int f3; + + public A init() { + this.f1 = 1; + this.f2 = new ObjectMap().append("f2a", "a").append("f2b", "b"); + this.f3 = 3; + return this; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ef55eca7/juneau-core/src/main/java/org/apache/juneau/BeanMap.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java index 7e69c6c..85e1670 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java @@ -417,8 +417,11 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T for (BeanPropertyMeta bpm : properties) { try { if (bpm.isDyna()) { - for (Map.Entry<String,Object> e : bpm.getDynaMap(this).entrySet()) - l.add(new BeanPropertyValue(bpm, e.getKey(), e.getValue(), null)); + for (Map.Entry<String,Object> e : bpm.getDynaMap(bean).entrySet()) { + Object val = e.getValue(); + if (val != null || ! ignoreNulls) + l.add(new BeanPropertyValue(bpm, e.getKey(), val, null)); + } } else { Object val = bpm.get(this, null); if (val != null || ! ignoreNulls) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ef55eca7/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java index ca2cfc6..bfa5246 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java @@ -660,7 +660,10 @@ public class BeanMeta<T> { * on this bean. */ public BeanPropertyMeta getPropertyMeta(String name) { - return this.properties.get(name); + BeanPropertyMeta bpm = properties.get(name); + if (bpm == null) + bpm = dynaProperty; + return bpm; } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ef55eca7/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java index eb3efc6..ca20da7 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java @@ -166,6 +166,11 @@ public class BeanPropertyMeta { isDyna = "*".equals(name); + if (isDyna) + rawTypeMeta = rawTypeMeta.getValueType(); + if (rawTypeMeta == null) + return false; + // Do some annotation validation. Class<?> c = rawTypeMeta.getInnerClass(); if (getter != null) { @@ -668,7 +673,7 @@ public class BeanPropertyMeta { m = (Map<String,Object>)field.get(bean); else throw new BeanRuntimeException(beanMeta.c, "Cannot set property ''{0}'' of type ''{1}'' to object of type ''{2}'' because no setter is defined on this property, and the existing property value is null", name, this.getClassMeta().getInnerClass().getName(), findClassName(val)); - return (m == null ? null : m.get(pName)); + return (m == null ? null : m.put(pName, val)); } if (setter != null) return setter.invoke(bean, val); @@ -692,8 +697,11 @@ public class BeanPropertyMeta { */ public Map<String,Object> getDynaMap(Object bean) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { if (isDyna) { - Map<String,Object> m = (Map<String,Object>)getter.invoke(bean); - return m == null ? Collections.EMPTY_MAP : m; + if (getter != null) + return (Map)getter.invoke(bean); + if (field != null) + return (Map)field.get(bean); + throw new BeanRuntimeException(beanMeta.c, "Getter or public field not defined on property ''{0}''", name); } return Collections.EMPTY_MAP; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ef55eca7/juneau-core/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java index 7b00113..ed7ebb8 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java @@ -258,6 +258,8 @@ public class XmlBeanMeta extends BeanMetaExtended { protected BeanPropertyMeta getPropertyMeta(String fieldName) { if (collapsedProperties != null) { BeanPropertyMeta bpm = collapsedProperties.get(fieldName); + if (bpm == null) + bpm = collapsedProperties.get("*"); if (bpm != null) return bpm; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/ef55eca7/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java index c16fcba..4b63fa5 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlSerializer.java @@ -629,7 +629,7 @@ public class XmlSerializer extends WriterSerializer { ClassMeta<?> contentType = null; for (BeanPropertyValue p : lp) { String n = p.getName(); - if (attrs.contains(n) || n.equals(attrsProperty)) { + if (attrs.contains(n) || attrs.contains("*") || n.equals(attrsProperty)) { BeanPropertyMeta pMeta = p.getMeta(); ClassMeta<?> cMeta = p.getClassMeta(); @@ -692,7 +692,7 @@ public class XmlSerializer extends WriterSerializer { hasContent = false; else if (contentType.isArray() && Array.getLength(content) == 0) hasContent = false; - } else if (elements.contains(n) || collapsedElements.contains(n)) { + } else if (elements.contains(n) || collapsedElements.contains(n) || elements.contains("*") || collapsedElements.contains("*") ) { String key = p.getName(); Object value = p.getValue(); Throwable t = p.getThrown();
