Repository: incubator-juneau Updated Branches: refs/heads/master 068a03346 -> 7a416ffa9
DynaBean support - 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/7a416ffa Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/7a416ffa Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/7a416ffa Branch: refs/heads/master Commit: 7a416ffa992be36f51a68f55e9212d718e403605 Parents: 068a033 Author: JamesBognar <[email protected]> Authored: Wed May 3 12:32:39 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Wed May 3 12:32:39 2017 -0400 ---------------------------------------------------------------------- .../java/org/apache/juneau/jena/RdfParser.java | 2 +- .../main/java/org/apache/juneau/BeanMap.java | 36 +++++++++++++++++--- .../org/apache/juneau/BeanPropertyMeta.java | 17 ++++----- .../juneau/urlencoding/UrlEncodingParser.java | 2 +- .../java/org/apache/juneau/xml/XmlParser.java | 6 ++-- 5 files changed, 44 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7a416ffa/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java ---------------------------------------------------------------------- diff --git a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java index 91842e6..60e6b0b 100644 --- a/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java +++ b/juneau-core-rdf/src/main/java/org/apache/juneau/jena/RdfParser.java @@ -245,7 +245,7 @@ public class RdfParser extends ReaderParser { ClassMeta<?> et = cm.getElementType(); Object value = parseAnything(session, et, o, m.getBean(false), pMeta); setName(et, value, key); - pMeta.add(m, value); + pMeta.add(m, key, value); } else { Object value = parseAnything(session, cm, o, m.getBean(false), pMeta); setName(cm, value, key); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7a416ffa/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 f74a099..7e69c6c 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanMap.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanMap.java @@ -233,7 +233,7 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T return; throw new BeanRuntimeException(meta.c, "Bean property ''{0}'' not found.", property); } - p.add(this, value); + p.add(this, property, value); } @@ -338,8 +338,18 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T */ @Override /* Map */ public Set<String> keySet() { - // TODO - DynaBean - return meta.properties.keySet(); + if (meta.dynaProperty == null) + return meta.properties.keySet(); + Set<String> l = new LinkedHashSet<String>(); + for (String p : meta.properties.keySet()) + if (! "*".equals(p)) + l.add(p); + try { + l.addAll(meta.dynaProperty.getDynaMap(bean).keySet()); + } catch (Exception e) { + throw new BeanRuntimeException(e); + } + return l; } /** @@ -439,6 +449,25 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T @Override public Set<Entry<String,Object>> entrySet() { + // If this bean has a dyna-property, then we need to construct the entire set before returning. + // Otherwise, we can create an iterator without a new data structure. + if (meta.dynaProperty != null) { + Set<Entry<String,Object>> s = new LinkedHashSet<Entry<String,Object>>(); + for (BeanPropertyMeta pMeta : getProperties()) { + if (pMeta.isDyna()) { + try { + for (Map.Entry<String,Object> e : pMeta.getDynaMap(bean).entrySet()) + s.add(new BeanMapEntry(this, pMeta, e.getKey())); + } catch (Exception e) { + throw new BeanRuntimeException(e); + } + } else { + s.add(new BeanMapEntry(this, pMeta, pMeta.getName())); + } + } + return s; + } + // Construct our own anonymous set to implement this function. Set<Entry<String,Object>> s = new AbstractSet<Entry<String,Object>>() { @@ -465,7 +494,6 @@ public class BeanMap<T> extends AbstractMap<String,Object> implements Delegate<T @Override /* Iterator */ public Map.Entry<String, Object> next() { - // TODO - DynaBean return new BeanMapEntry(BeanMap.this, pIterator.next(), null); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7a416ffa/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 7aefde7..871df7f 100644 --- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java @@ -736,12 +736,11 @@ public class BeanPropertyMeta { * @throws InvocationTargetException Thrown by method invocation. */ protected void setArray(Object bean, List l) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { - String pName = name; // TODO DynaBean Object array = ArrayUtils.toArray(l, this.rawTypeMeta.getElementType().getInnerClass()); if (setter != null) - invokeSetter(bean, pName, array); + invokeSetter(bean, name, array); else if (field != null) - invokeSetField(bean, pName, array); + invokeSetField(bean, name, array); else throw new BeanRuntimeException(beanMeta.c, "Attempt to initialize array property ''{0}'', but no setter or field defined.", name); } @@ -752,12 +751,11 @@ public class BeanPropertyMeta { * arrays since it must copy the array into a larger array on each operation. * * @param m The bean of the field being set. + * @param pName The property name. * @param value The value to add to the field. * @throws BeanRuntimeException If field is not a collection or array. */ - public void add(BeanMap<?> m, Object value) throws BeanRuntimeException { - - String pName = name; // TODO DynaBean + public void add(BeanMap<?> m, String pName, Object value) throws BeanRuntimeException { // Read-only beans get their properties stored in a cache. if (m.bean == null) { @@ -847,15 +845,14 @@ public class BeanPropertyMeta { * Adds a value to a {@link Map} or bean property. * * @param m The bean of the field being set. + * @param pName The property name. * @param key The key to add to the field. * @param value The value to add to the field. * @throws BeanRuntimeException If field is not a map or array. */ - public void add(BeanMap<?> m, String key, Object value) throws BeanRuntimeException { + public void add(BeanMap<?> m, String pName, String key, Object value) throws BeanRuntimeException { - String pName = name; // TODO DynaBean - - // Read-only beans get their properties stored in a cache. + // Read-only beans get their properties stored in a cache. if (m.bean == null) { if (! m.propertyCache.containsKey(name)) m.propertyCache.put(name, new ObjectMap(m.getBeanSession())); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7a416ffa/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java index eb8c083..af4881e 100644 --- a/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/urlencoding/UrlEncodingParser.java @@ -295,7 +295,7 @@ public class UrlEncodingParser extends UonParser { ClassMeta et = pMeta.getClassMeta().getElementType(); Object value = parseAnything(session, et, r.unread(), m.getBean(false), true, pMeta); setName(et, value, currAttr); - pMeta.add(m, value); + pMeta.add(m, currAttr, value); } else { ClassMeta<?> cm = pMeta.getClassMeta(); Object value = parseAnything(session, cm, r.unread(), m.getBean(false), true, pMeta); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7a416ffa/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java index 3d38abc..9c381b5 100644 --- a/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java +++ b/juneau-core/src/main/java/org/apache/juneau/xml/XmlParser.java @@ -278,7 +278,7 @@ public class XmlParser extends ReaderParser { BeanPropertyMeta bpm = xmlMeta.getPropertyMeta(key); if (bpm == null) { if (xmlMeta.getAttrsProperty() != null) { - xmlMeta.getAttrsProperty().add(m, key, val); + xmlMeta.getAttrsProperty().add(m, key, key, val); } else { Location l = r.getLocation(); onUnknownProperty(session, key, m, l.getLineNumber(), l.getColumnNumber()); @@ -354,7 +354,7 @@ public class XmlParser extends ReaderParser { } } } else if (cp != null && cpf == ELEMENTS) { - cp.add(m, parseAnything(session, cpcm.getElementType(), cp.getName(), r, m.getBean(false), false, cp)); + cp.add(m, null, parseAnything(session, cpcm.getElementType(), cp.getName(), r, m.getBean(false), false, cp)); } else { currAttr = session.getElementName(r); BeanPropertyMeta pMeta = xmlMeta.getPropertyMeta(currAttr); @@ -369,7 +369,7 @@ public class XmlParser extends ReaderParser { ClassMeta<?> et = pMeta.getClassMeta().getElementType(); Object value = parseAnything(session, et, currAttr, r, m.getBean(false), false, pMeta); setName(et, value, currAttr); - pMeta.add(m, value); + pMeta.add(m, currAttr, value); } else if (xf == ATTR) { pMeta.set(m, currAttr, session.getAttributeValue(r, 0)); r.nextTag();
