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();

Reply via email to