From: <ms...@us...> - 2009-04-21 02:43:32
|
Revision: 9213 http://wonder.svn.sourceforge.net/wonder/?rev=9213&view=rev Author: mschrag Date: 2009-04-21 02:43:23 +0000 (Tue, 21 Apr 2009) Log Message: ----------- implement KVC on ERXRestRequestNodes Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-21 02:41:01 UTC (rev 9212) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-21 02:43:23 UTC (rev 9213) @@ -34,7 +34,7 @@ * * @author mschrag */ -public class ERXRestRequestNode { +public class ERXRestRequestNode implements NSKeyValueCoding { private String _name; private Object _value; private NSMutableDictionary<String, String> _attributes; @@ -56,6 +56,44 @@ this(name); _value = value; } + + public void takeValueForKey(Object value, String key) { + if (_attributes.containsKey(key)) { + _attributes.setObjectForKey((String)value, key); + } + else { + ERXRestRequestNode child = childNamed(key); + if (child == null) { + throw new NSKeyValueCoding.UnknownKeyException("There is no key named '" + key + "' on this node.", this, key); + } + else if (child.children().size() == 0) { + child.setValue(value); + } + else { + throw new IllegalArgumentException("Unable to set the value of '" + key + "' to " + value + "."); + } + } + } + + public Object valueForKey(String key) { + Object value; + if (_attributes.containsKey(key)) { + value = _attributes.objectForKey(key); + } + else { + ERXRestRequestNode child = childNamed(key); + if (child == null) { + throw new NSKeyValueCoding.UnknownKeyException("There is no key named '" + key + "' on this node.", this, key); + } + else if (child.children().size() == 0) { + value = child.value(); + } + else { + value = child; + } + } + return value; + } /** * Returns the first child named 'name'. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-04-22 19:54:22
|
Revision: 9235 http://wonder.svn.sourceforge.net/wonder/?rev=9235&view=rev Author: mschrag Date: 2009-04-22 19:54:19 +0000 (Wed, 22 Apr 2009) Log Message: ----------- WONDER-269 ERXRestRequestNode unexpected null value Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-22 19:35:51 UTC (rev 9234) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-22 19:54:19 UTC (rev 9235) @@ -55,11 +55,13 @@ _name = name; _attributes = new NSMutableDictionary<String, String>(); _children = new NSMutableArray<ERXRestRequestNode>(); + guessNull(); } public ERXRestRequestNode(String name, Object value) { this(name); _value = value; + guessNull(); } public Object toCollection() { @@ -201,6 +203,10 @@ return attributeForKey(ERXRestRequestNode.TYPE_KEY); } + protected void guessNull() { + setNull(_value == null && _children.size() == 0 && attributeForKey("id") == null); + } + public void setNull(boolean isNull) { if (isNull) { setAttributeForKey("true", "nil"); @@ -245,7 +251,7 @@ */ public void setValue(Object value) { _value = value; - setNull(_value == null); + guessNull(); } /** @@ -258,6 +264,7 @@ */ public void setAttributeForKey(String attribute, String key) { _attributes.setObjectForKey(attribute, key); + guessNull(); } /** @@ -288,6 +295,7 @@ */ public void addChild(ERXRestRequestNode child) { _children.addObject(child); + guessNull(); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2010-09-07 04:47:36
|
Revision: 11223 http://wonder.svn.sourceforge.net/wonder/?rev=11223&view=rev Author: mschrag Date: 2010-09-07 04:47:30 +0000 (Tue, 07 Sep 2010) Log Message: ----------- unusued import Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-09-06 20:06:56 UTC (rev 11222) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-09-07 04:47:30 UTC (rev 11223) @@ -22,7 +22,6 @@ import er.extensions.eof.ERXKey; import er.extensions.eof.ERXKeyFilter; -import er.extensions.localization.ERXLocalizer; import er.rest.format.ERXRestFormat; import er.rest.format.ERXWORestResponse; import er.rest.format.IERXRestWriter; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <df...@us...> - 2009-04-23 04:45:20
|
Revision: 9246 http://wonder.svn.sourceforge.net/wonder/?rev=9246&view=rev Author: dfrolov Date: 2009-04-23 04:45:09 +0000 (Thu, 23 Apr 2009) Log Message: ----------- preventing circular dependency (setAttributeForKey -> guessNull -> setAttributeForKey -> ...) Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-22 23:59:51 UTC (rev 9245) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-23 04:45:09 UTC (rev 9246) @@ -264,7 +264,9 @@ */ public void setAttributeForKey(String attribute, String key) { _attributes.setObjectForKey(attribute, key); - guessNull(); + if (!"nil".equals(key)) { + guessNull(); + } } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-04-25 20:25:08
|
Revision: 9271 http://wonder.svn.sourceforge.net/wonder/?rev=9271&view=rev Author: mschrag Date: 2009-04-25 20:24:59 +0000 (Sat, 25 Apr 2009) Log Message: ----------- * empty array is not null * prevent NPE when pk value is null * prevent NPE when obj is null * support for directly rendering primitive values as root nods Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 20:24:02 UTC (rev 9270) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 20:24:59 UTC (rev 9271) @@ -114,6 +114,7 @@ public void setArray(boolean array) { _array = array; + guessNull(); } public boolean isArray() { @@ -204,7 +205,7 @@ } protected void guessNull() { - setNull(_value == null && _children.size() == 0 && attributeForKey("id") == null); + setNull(_value == null && _children.size() == 0 && attributeForKey("id") == null && !isArray()); } public void setNull(boolean isNull) { @@ -345,13 +346,17 @@ public Object objectWithFilter(String entityName, ERXKeyFilter keyFilter, ERXRestRequestNode.Delegate delegate) throws ParseException, ERXRestException { Object obj = delegate.objectOfEntityNamedWithRequestNode(entityName, this); - // updateObjectWithFilter(obj, keyFilter, delegate); + if (keyFilter != null) { + updateObjectWithFilter(obj, keyFilter, delegate); + } return obj; } public Object createObjectWithFilter(String entityName, ERXKeyFilter keyFilter, ERXRestRequestNode.Delegate delegate) throws ParseException, ERXRestException { Object obj = delegate.createObjectOfEntityNamed(entityName); - updateObjectWithFilter(obj, keyFilter, delegate); + if (keyFilter != null) { + updateObjectWithFilter(obj, keyFilter, delegate); + } return obj; } @@ -374,7 +379,10 @@ } setAssociatedObject(obj); setAttributeForKey(entity.name(), ERXRestRequestNode.TYPE_KEY); - setAttributeForKey(String.valueOf(entity.primaryKeyValue(obj)), ERXRestRequestNode.ID_KEY); + Object pkValue = entity.primaryKeyValue(obj); + if (pkValue != null) { + setAttributeForKey(String.valueOf(pkValue), ERXRestRequestNode.ID_KEY); + } if (!visitedObjects.contains(obj)) { visitedObjects.add(obj); @@ -433,12 +441,17 @@ } public static ERXRestRequestNode requestNodeWithObjectAndFilter(Object obj, ERXKeyFilter keyFilter) { - String shortName = IERXEntity.Factory.entityForObject(obj).shortName(); + String shortName = (obj != null) ? IERXEntity.Factory.entityForObject(obj).shortName() : null; ERXRestRequestNode requestNode = new ERXRestRequestNode(shortName); - if (!(obj instanceof List)) { - requestNode.setType(shortName); + if (ERXRestUtils.isPrimitive(obj)) { + requestNode.setValue(obj); } - requestNode._fillInWithObjectAndFilter(obj, keyFilter, new HashSet<Object>()); + else { + if (!(obj instanceof List)) { + requestNode.setType(shortName); + } + requestNode._fillInWithObjectAndFilter(obj, keyFilter, new HashSet<Object>()); + } return requestNode; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-04-25 21:10:22
|
Revision: 9279 http://wonder.svn.sourceforge.net/wonder/?rev=9279&view=rev Author: mschrag Date: 2009-04-25 21:10:12 +0000 (Sat, 25 Apr 2009) Log Message: ----------- support for non-eomodel relationships on EOs Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 21:09:46 UTC (rev 9278) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 21:10:12 UTC (rev 9279) @@ -22,6 +22,7 @@ import er.extensions.localization.ERXLocalizer; import er.rest.format.ERXStringBufferRestResponse; import er.rest.format.IERXRestWriter; +import er.rest.routes.model.EOEntityProxy; import er.rest.routes.model.IERXAttribute; import er.rest.routes.model.IERXEntity; import er.rest.routes.model.IERXRelationship; @@ -207,7 +208,7 @@ protected void guessNull() { setNull(_value == null && _children.size() == 0 && attributeForKey("id") == null && !isArray()); } - + public void setNull(boolean isNull) { if (isNull) { setAttributeForKey("true", "nil"); @@ -462,22 +463,38 @@ for (Map.Entry<String, String> attribute : _attributes.entrySet()) { ERXKey<Object> key = keyFilter.keyMap(new ERXKey<Object>(attribute.getKey())); - if (keyFilter.matches(key, ERXKey.Type.Attribute) && delegate.isClassProperty(obj, key.key())) { - Object value = ERXRestUtils.coerceValueToAttributeType(attribute.getValue(), null, obj, key.key()); + String keyName = key.key(); + if (keyFilter.matches(key, ERXKey.Type.Attribute) && delegate.isClassProperty(obj, keyName)) { + Object value = ERXRestUtils.coerceValueToAttributeType(attribute.getValue(), null, obj, keyName); key.takeValueInObject(value, obj); } } for (ERXRestRequestNode childNode : _children) { ERXKey<Object> key = keyFilter.keyMap(new ERXKey<Object>(childNode.name())); - if (delegate.isClassProperty(obj, key.key())) { - NSKeyValueCoding._KeyBinding binding = NSKeyValueCoding.DefaultImplementation._keyGetBindingForKey(obj, key.key()); + String keyName = key.key(); + if (delegate.isClassProperty(obj, keyName)) { + IERXEntity entity = IERXEntity.Factory.entityForObject(obj); + IERXRelationship relationship = entity.relationshipNamed(keyName); + IERXAttribute attribute = entity.attributeNamed(keyName); + + NSKeyValueCoding._KeyBinding binding = NSKeyValueCoding.DefaultImplementation._keyGetBindingForKey(obj, keyName); Class valueType = binding.valueType(); + if (List.class.isAssignableFrom(valueType) && keyFilter.matches(key, ERXKey.Type.ToManyRelationship)) { - IERXEntity destinationEntity = IERXEntity.Factory.entityForObject(obj).relationshipNamed(key.key()).destinationEntity(); + // this is sort of expensive, but we want to support non-eomodel to-many relationships on EO's, so + // we fallback and lookup the class entity ... + if (relationship == null && entity instanceof EOEntityProxy) { + IERXEntity classEntity = IERXEntity.Factory.entityForObject(obj.getClass()); + relationship = classEntity.relationshipNamed(keyName); + if (relationship == null) { + throw new IllegalArgumentException("There is no to-many relationship named '" + key.key() + "' on '" + entity.name() + "'."); + } + } + IERXEntity destinationEntity = relationship.destinationEntity(); @SuppressWarnings("unchecked") - List<Object> existingValues = (List<Object>) NSKeyValueCoding.DefaultImplementation.valueForKey(obj, key.key()); + List<Object> existingValues = (List<Object>) NSKeyValueCoding.DefaultImplementation.valueForKey(obj, keyName); Set<Object> removedValues = new HashSet<Object>(existingValues); List<Object> newValues = new LinkedList<Object>(); @@ -494,34 +511,46 @@ if (obj instanceof EOEnterpriseObject) { for (Object removedValue : removedValues) { - ((EOEnterpriseObject) obj).removeObjectFromBothSidesOfRelationshipWithKey((EOEnterpriseObject) removedValue, key.key()); + ((EOEnterpriseObject) obj).removeObjectFromBothSidesOfRelationshipWithKey((EOEnterpriseObject) removedValue, keyName); } for (Object newValue : newValues) { - ((EOEnterpriseObject) obj).addObjectToBothSidesOfRelationshipWithKey((EOEnterpriseObject) newValue, key.key()); + ((EOEnterpriseObject) obj).addObjectToBothSidesOfRelationshipWithKey((EOEnterpriseObject) newValue, keyName); } } else { key.takeValueInObject(allValues, obj); } } - else if (ERXRestUtils.isPrimitive(valueType) && keyFilter.matches(key, ERXKey.Type.Attribute)) { - Object value = childNode.value(); - if (value instanceof String) { - value = ERXRestUtils.coerceValueToAttributeType(value, null, obj, key.key()); + else if (!ERXRestUtils.isPrimitive(valueType) && keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { + // this is sort of expensive, but we want to support non-eomodel to-one relationships on EO's, so + // we fallback and lookup the class entity ... + if (relationship == null && entity instanceof EOEntityProxy) { + IERXEntity classEntity = IERXEntity.Factory.entityForObject(obj.getClass()); + relationship = classEntity.relationshipNamed(keyName); + if (relationship == null) { + throw new IllegalArgumentException("There is no to-one relationship named '" + key.key() + "' on '" + entity.name() + "'."); + } } - key.takeValueInObject(value, obj); - } - else if (keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { - IERXEntity destinationEntity = IERXEntity.Factory.entityForObject(obj).relationshipNamed(key.key()).destinationEntity(); + IERXEntity destinationEntity = relationship.destinationEntity(); Object childObj = delegate.objectOfEntityWithRequestNode(destinationEntity, childNode); childNode.updateObjectWithFilter(childObj, keyFilter._filterForKey(key), delegate); if (obj instanceof EOEnterpriseObject && childObj instanceof EOEnterpriseObject) { - ((EOEnterpriseObject) obj).addObjectToBothSidesOfRelationshipWithKey((EOEnterpriseObject) childObj, key.key()); + ((EOEnterpriseObject) obj).addObjectToBothSidesOfRelationshipWithKey((EOEnterpriseObject) childObj, keyName); } else { key.takeValueInObject(childObj, obj); } } + else if (/* entity.attributeNamed(keyName) != null && */keyFilter.matches(key, ERXKey.Type.Attribute)) { + Object value = childNode.value(); + if (value instanceof String) { + value = ERXRestUtils.coerceValueToAttributeType(value, null, obj, keyName); + } + key.takeValueInObject(value, obj); + } + else { + // ignore key + } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-04-25 21:29:43
|
Revision: 9280 http://wonder.svn.sourceforge.net/wonder/?rev=9280&view=rev Author: mschrag Date: 2009-04-25 21:29:29 +0000 (Sat, 25 Apr 2009) Log Message: ----------- don't NPE on null to-one relationship values Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 21:10:12 UTC (rev 9279) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 21:29:29 UTC (rev 9280) @@ -417,10 +417,12 @@ addChild(toManyRelationshipNode); } else if (!relationship.isToMany() && keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { - ERXRestRequestNode toOneRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); Object value = key.valueInObject(obj); - toOneRelationshipNode._fillInWithObjectAndFilter(value, keyFilter._filterForKey(key), visitedObjects); - addChild(toOneRelationshipNode); + if (value != null) { + ERXRestRequestNode toOneRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); + toOneRelationshipNode._fillInWithObjectAndFilter(value, keyFilter._filterForKey(key), visitedObjects); + addChild(toOneRelationshipNode); + } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-04-25 21:39:24
|
Revision: 9282 http://wonder.svn.sourceforge.net/wonder/?rev=9282&view=rev Author: mschrag Date: 2009-04-25 21:39:15 +0000 (Sat, 25 Apr 2009) Log Message: ----------- fixed spacing Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 21:30:36 UTC (rev 9281) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 21:39:15 UTC (rev 9282) @@ -419,9 +419,9 @@ else if (!relationship.isToMany() && keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { Object value = key.valueInObject(obj); if (value != null) { - ERXRestRequestNode toOneRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); - toOneRelationshipNode._fillInWithObjectAndFilter(value, keyFilter._filterForKey(key), visitedObjects); - addChild(toOneRelationshipNode); + ERXRestRequestNode toOneRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); + toOneRelationshipNode._fillInWithObjectAndFilter(value, keyFilter._filterForKey(key), visitedObjects); + addChild(toOneRelationshipNode); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-04-25 22:06:58
|
Revision: 9283 http://wonder.svn.sourceforge.net/wonder/?rev=9283&view=rev Author: mschrag Date: 2009-04-25 22:06:48 +0000 (Sat, 25 Apr 2009) Log Message: ----------- if keys are explicitly included on an object that are not model-backed, flip over to the class proxy entity and attempt to use that to fetch the keys Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 21:39:15 UTC (rev 9282) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-25 22:06:48 UTC (rev 9283) @@ -361,6 +361,100 @@ return obj; } + protected void _addAttributeNodeForKeyInObject(ERXKey<?> key, Object obj, ERXKeyFilter keyFilter) { + ERXRestRequestNode attributeNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); + attributeNode.setValue(key.valueInObject(obj)); + addChild(attributeNode); + } + + protected void _addToManyRelationshipNodeForKeyOfEntityInObject(ERXKey<?> key, IERXEntity destinationEntity, Object obj, ERXKeyFilter keyFilter, Set<Object> visitedObjects) { + ERXRestRequestNode toManyRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); + toManyRelationshipNode.setType(destinationEntity.name()); + toManyRelationshipNode.setArray(true); + + List childrenObjects = (List) key.valueInObject(obj); + ERXKeyFilter childFilter = keyFilter._filterForKey(key); + for (Object childObj : childrenObjects) { + ERXRestRequestNode childNode = new ERXRestRequestNode(null); + childNode._fillInWithObjectAndFilter(childObj, childFilter, visitedObjects); + toManyRelationshipNode.addChild(childNode); + } + + addChild(toManyRelationshipNode); + + } + + protected void _addToOneRelationshipNodeForKeyInObject(ERXKey<?> key, Object obj, ERXKeyFilter keyFilter, Set<Object> visitedObjects) { + Object value = key.valueInObject(obj); + if (value != null) { + ERXRestRequestNode toOneRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); + toOneRelationshipNode._fillInWithObjectAndFilter(value, keyFilter._filterForKey(key), visitedObjects); + addChild(toOneRelationshipNode); + } + } + + protected void _addAttributesAndRelationshipsForObjectOfEntity(Object obj, IERXEntity entity, ERXKeyFilter keyFilter, Set<Object> visitedObjects) { + Set<ERXKey> visitedKeys = new HashSet<ERXKey>(); + for (IERXAttribute attribute : entity.attributes()) { + if (attribute.isClassProperty()) { + ERXKey<Object> key = new ERXKey<Object>(attribute.name()); + if (keyFilter.matches(key, ERXKey.Type.Attribute)) { + _addAttributeNodeForKeyInObject(key, obj, keyFilter); + visitedKeys.add(key); + } + } + } + + for (IERXRelationship relationship : entity.relationships()) { + if (relationship.isClassProperty()) { + ERXKey<Object> key = new ERXKey<Object>(relationship.name()); + if (relationship.isToMany() && keyFilter.matches(key, ERXKey.Type.ToManyRelationship)) { + _addToManyRelationshipNodeForKeyOfEntityInObject(key, relationship.destinationEntity(), obj, keyFilter, visitedObjects); + visitedKeys.add(key); + } + else if (!relationship.isToMany() && keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { + _addToOneRelationshipNodeForKeyInObject(key, obj, keyFilter, visitedObjects); + visitedKeys.add(key); + } + } + } + + Set<ERXKey> includeKeys = keyFilter.includes().keySet(); + if (includeKeys != null && !includeKeys.isEmpty()) { + Set<ERXKey> remainingKeys = new HashSet<ERXKey>(includeKeys); + remainingKeys.removeAll(visitedKeys); + if (!remainingKeys.isEmpty()) { + // this is sort of expensive, but we want to support non-eomodel to-many relationships on EO's, so + // we fallback and lookup the class entity ... + if (entity instanceof EOEntityProxy) { + IERXEntity classEntity = IERXEntity.Factory.entityForObject(obj.getClass()); + for (ERXKey<?> remainingKey : remainingKeys) { + String keyName = remainingKey.key(); + IERXAttribute attribute = classEntity.attributeNamed(keyName); + if (attribute != null) { + _addAttributeNodeForKeyInObject(remainingKey, obj, keyFilter); + } + else { + IERXRelationship relationship = classEntity.relationshipNamed(keyName); + if (relationship != null && relationship.isToMany()) { + _addToManyRelationshipNodeForKeyOfEntityInObject(remainingKey, relationship.destinationEntity(), obj, keyFilter, visitedObjects); + } + else if (relationship != null && !relationship.isToMany()) { + _addToOneRelationshipNodeForKeyInObject(remainingKey, obj, keyFilter, visitedObjects); + } + else { + throw new IllegalArgumentException("This key filter specified that the key '" + keyName + "' should be included on '" + entity.name() + "', but it does not exist."); + } + } + } + } + else { + throw new IllegalArgumentException("This key filter specified that the keys '" + remainingKeys + "' should be included on '" + entity.name() + "', but they do not exist."); + } + } + } + } + protected void _fillInWithObjectAndFilter(Object obj, ERXKeyFilter keyFilter, Set<Object> visitedObjects) { if (obj instanceof List) { setAssociatedObject(obj); @@ -386,46 +480,7 @@ } if (!visitedObjects.contains(obj)) { visitedObjects.add(obj); - - for (IERXAttribute attribute : entity.attributes()) { - if (attribute.isClassProperty()) { - ERXKey<Object> key = new ERXKey<Object>(attribute.name()); - if (keyFilter.matches(key, ERXKey.Type.Attribute)) { - ERXRestRequestNode attributeNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); - attributeNode.setValue(key.valueInObject(obj)); - addChild(attributeNode); - } - } - } - - for (IERXRelationship relationship : entity.relationships()) { - if (relationship.isClassProperty()) { - ERXKey<Object> key = new ERXKey<Object>(relationship.name()); - if (relationship.isToMany() && keyFilter.matches(key, ERXKey.Type.ToManyRelationship)) { - ERXRestRequestNode toManyRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); - toManyRelationshipNode.setType(relationship.destinationEntity().name()); - toManyRelationshipNode.setArray(true); - - List childrenObjects = (List) key.valueInObject(obj); - ERXKeyFilter childFilter = keyFilter._filterForKey(key); - for (Object childObj : childrenObjects) { - ERXRestRequestNode childNode = new ERXRestRequestNode(null); - childNode._fillInWithObjectAndFilter(childObj, childFilter, visitedObjects); - toManyRelationshipNode.addChild(childNode); - } - - addChild(toManyRelationshipNode); - } - else if (!relationship.isToMany() && keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { - Object value = key.valueInObject(obj); - if (value != null) { - ERXRestRequestNode toOneRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); - toOneRelationshipNode._fillInWithObjectAndFilter(value, keyFilter._filterForKey(key), visitedObjects); - addChild(toOneRelationshipNode); - } - } - } - } + _addAttributesAndRelationshipsForObjectOfEntity(obj, entity, keyFilter, visitedObjects); } } } @@ -477,8 +532,6 @@ String keyName = key.key(); if (delegate.isClassProperty(obj, keyName)) { IERXEntity entity = IERXEntity.Factory.entityForObject(obj); - IERXRelationship relationship = entity.relationshipNamed(keyName); - IERXAttribute attribute = entity.attributeNamed(keyName); NSKeyValueCoding._KeyBinding binding = NSKeyValueCoding.DefaultImplementation._keyGetBindingForKey(obj, keyName); Class valueType = binding.valueType(); @@ -486,6 +539,7 @@ if (List.class.isAssignableFrom(valueType) && keyFilter.matches(key, ERXKey.Type.ToManyRelationship)) { // this is sort of expensive, but we want to support non-eomodel to-many relationships on EO's, so // we fallback and lookup the class entity ... + IERXRelationship relationship = entity.relationshipNamed(keyName); if (relationship == null && entity instanceof EOEntityProxy) { IERXEntity classEntity = IERXEntity.Factory.entityForObject(obj.getClass()); relationship = classEntity.relationshipNamed(keyName); @@ -526,6 +580,7 @@ else if (!ERXRestUtils.isPrimitive(valueType) && keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { // this is sort of expensive, but we want to support non-eomodel to-one relationships on EO's, so // we fallback and lookup the class entity ... + IERXRelationship relationship = entity.relationshipNamed(keyName); if (relationship == null && entity instanceof EOEntityProxy) { IERXEntity classEntity = IERXEntity.Factory.entityForObject(obj.getClass()); relationship = classEntity.relationshipNamed(keyName); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-04-26 02:28:40
|
Revision: 9285 http://wonder.svn.sourceforge.net/wonder/?rev=9285&view=rev Author: mschrag Date: 2009-04-26 02:28:39 +0000 (Sun, 26 Apr 2009) Log Message: ----------- pass type across when converting to a collection Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-26 00:40:04 UTC (rev 9284) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-04-26 02:28:39 UTC (rev 9285) @@ -87,7 +87,8 @@ for (Map.Entry<String, String> attribute : _attributes.entrySet()) { String key = attribute.getKey(); String value = attribute.getValue(); - if (value != null && !ERXRestRequestNode.NIL_KEY.equals(key) && !ERXRestRequestNode.TYPE_KEY.equals(key)) { + //if (value != null && !ERXRestRequestNode.NIL_KEY.equals(key) && !ERXRestRequestNode.TYPE_KEY.equals(key)) { + if (value != null) { dict.put(key, value); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-05-06 18:56:52
|
Revision: 9321 http://wonder.svn.sourceforge.net/wonder/?rev=9321&view=rev Author: mschrag Date: 2009-05-06 18:56:49 +0000 (Wed, 06 May 2009) Log Message: ----------- pass in the class description for to-one relationships to support null to-one's Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-05 19:40:14 UTC (rev 9320) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-06 18:56:49 UTC (rev 9321) @@ -570,7 +570,7 @@ ERXKeyFilter childFilter = keyFilter._filterForKey(key); for (Object childObj : childrenObjects) { ERXRestRequestNode childNode = new ERXRestRequestNode(null); - childNode._fillInWithObjectAndFilter(childObj, childFilter, delegate, visitedObjects); + childNode._fillInWithObjectAndFilter(childObj, destinationEntity, childFilter, delegate, visitedObjects); toManyRelationshipNode.addChild(childNode); } @@ -578,13 +578,13 @@ } - protected void _addToOneRelationshipNodeForKeyInObject(ERXKey<?> key, Object obj, ERXKeyFilter keyFilter, IERXRestDelegate delegate, Set<Object> visitedObjects) { + protected void _addToOneRelationshipNodeForKeyInObject(ERXKey<?> key, Object obj, EOClassDescription destinationEntity, ERXKeyFilter keyFilter, IERXRestDelegate delegate, Set<Object> visitedObjects) { Object value = key.valueInObject(obj); - if (value != null) { + //if (value != null) { ERXRestRequestNode toOneRelationshipNode = new ERXRestRequestNode(keyFilter.keyMap(key).key()); - toOneRelationshipNode._fillInWithObjectAndFilter(value, keyFilter._filterForKey(key), delegate, visitedObjects); + toOneRelationshipNode._fillInWithObjectAndFilter(value, destinationEntity, keyFilter._filterForKey(key), delegate, visitedObjects); addChild(toOneRelationshipNode); - } + //} } @SuppressWarnings("unchecked") @@ -604,7 +604,7 @@ // if (relationship.isClassProperty()) { ERXKey<Object> key = new ERXKey<Object>(relationshipName); if (keyFilter.matches(key, ERXKey.Type.ToOneRelationship)) { - _addToOneRelationshipNodeForKeyInObject(key, obj, keyFilter, delegate, visitedObjects); + _addToOneRelationshipNodeForKeyInObject(key, obj, classDescription.classDescriptionForDestinationKey(relationshipName), keyFilter, delegate, visitedObjects); visitedKeys.add(key); } // } @@ -640,7 +640,7 @@ _addToManyRelationshipNodeForKeyOfEntityInObject(remainingKey, nonModelClassDescription.classDescriptionForDestinationKey(keyName), obj, keyFilter, delegate, visitedObjects); } else if (nonModelClassDescription.toOneRelationshipKeys().containsObject(keyName)) { - _addToOneRelationshipNodeForKeyInObject(remainingKey, obj, keyFilter, delegate, visitedObjects); + _addToOneRelationshipNodeForKeyInObject(remainingKey, obj, nonModelClassDescription.classDescriptionForDestinationKey(keyName), keyFilter, delegate, visitedObjects); } else { throw new IllegalArgumentException("This key filter specified that the key '" + keyName + "' should be included on '" + nonModelClassDescription.entityName() + "', but it does not exist."); @@ -655,7 +655,7 @@ } } - protected void _fillInWithObjectAndFilter(Object obj, ERXKeyFilter keyFilter, IERXRestDelegate delegate, Set<Object> visitedObjects) { + protected void _fillInWithObjectAndFilter(Object obj, EOClassDescription classDescription, ERXKeyFilter keyFilter, IERXRestDelegate delegate, Set<Object> visitedObjects) { if (obj instanceof List) { setAssociatedObject(obj); // setAttributeForKey(/* ??? */, ERXRestRequestNode.TYPE_KEY); @@ -663,25 +663,30 @@ for (Object childObj : (List) obj) { ERXRestRequestNode childNode = new ERXRestRequestNode(null); - childNode._fillInWithObjectAndFilter(childObj, keyFilter, delegate, visitedObjects); + childNode._fillInWithObjectAndFilter(childObj, classDescription, keyFilter, delegate, visitedObjects); addChild(childNode); } } else { - EOClassDescription classDescription = ERXRestClassDescriptionFactory.classDescriptionForObject(obj); + // in case we have a superclass class description passed in + if (obj != null) { + classDescription = ERXRestClassDescriptionFactory.classDescriptionForObject(obj); + } if (_name == null) { _name = classDescription.entityName(); } setAssociatedObject(obj); setType(classDescription.entityName()); - Object id = delegate.primaryKeyForObject(obj); - if (id != null) { - setID(id); + if (obj != null) { + Object id = delegate.primaryKeyForObject(obj); + if (id != null) { + setID(id); + } + if (!visitedObjects.contains(obj)) { + visitedObjects.add(obj); + _addAttributesAndRelationshipsForObjectOfEntity(obj, classDescription, keyFilter, delegate, visitedObjects); + } } - if (!visitedObjects.contains(obj)) { - visitedObjects.add(obj); - _addAttributesAndRelationshipsForObjectOfEntity(obj, classDescription, keyFilter, delegate, visitedObjects); - } } } @@ -851,7 +856,7 @@ String entityName = classDescription.entityName(); ERXRestRequestNode requestNode = new ERXRestRequestNode(ERXLocalizer.defaultLocalizer().plurifiedString(entityName, 2)); requestNode.setType(entityName); - requestNode._fillInWithObjectAndFilter(objects, keyFilter, delegate, new HashSet<Object>()); + requestNode._fillInWithObjectAndFilter(objects, classDescription, keyFilter, delegate, new HashSet<Object>()); return requestNode; } @@ -866,8 +871,10 @@ */ public static ERXRestRequestNode requestNodeWithObjectAndFilter(Object obj, ERXKeyFilter keyFilter, IERXRestDelegate delegate) { String shortName = null; + EOClassDescription classDescription = null; if (obj != null) { - shortName = ERXRestClassDescriptionFactory.classDescriptionForObject(obj).entityName(); + classDescription = ERXRestClassDescriptionFactory.classDescriptionForObject(obj); + shortName = classDescription.entityName(); } ERXRestRequestNode requestNode = new ERXRestRequestNode(shortName); if (ERXRestUtils.isPrimitive(obj)) { @@ -877,7 +884,7 @@ if (!(obj instanceof List)) { requestNode.setType(shortName); } - requestNode._fillInWithObjectAndFilter(obj, keyFilter, delegate, new HashSet<Object>()); + requestNode._fillInWithObjectAndFilter(obj, classDescription, keyFilter, delegate, new HashSet<Object>()); } return requestNode; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-05-06 19:00:36
|
Revision: 9322 http://wonder.svn.sourceforge.net/wonder/?rev=9322&view=rev Author: mschrag Date: 2009-05-06 19:00:17 +0000 (Wed, 06 May 2009) Log Message: ----------- updated for Chuck support Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-06 18:56:49 UTC (rev 9321) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-06 19:00:17 UTC (rev 9322) @@ -709,9 +709,9 @@ * @return a string representation of this request node using the given IERXRestWriter */ public String toString(IERXRestWriter writer, ERXRestFormat.Delegate delegate) { - WOResponse response = new WOResponse(); - writer.appendToResponse(this, new ERXWORestResponse(response), delegate); - return response.contentString(); + WOResponse octopusHair = new WOResponse(); + writer.appendToResponse(this, new ERXWORestResponse(octopusHair), delegate); + return octopusHair.contentString(); } protected boolean isClassProperty(EOClassDescription classDescription, String key) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-05-15 11:12:28
|
Revision: 9340 http://wonder.svn.sourceforge.net/wonder/?rev=9340&view=rev Author: mschrag Date: 2009-05-15 11:11:35 +0000 (Fri, 15 May 2009) Log Message: ----------- convert NSKVC.Null back to null before trying to set the value w/ KVC Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-15 10:34:56 UTC (rev 9339) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-15 11:11:35 UTC (rev 9340) @@ -750,6 +750,9 @@ String keyName = key.key(); if (keyFilter.matches(key, ERXKey.Type.Attribute) && isClassProperty(classDescription, keyName)) { Object value = ERXRestUtils.coerceValueToAttributeType(attribute.getValue(), null, obj, keyName); + if (value instanceof NSKeyValueCoding.Null) { + value = null; + } key.takeValueInObject(value, obj); } } @@ -832,6 +835,9 @@ if (value instanceof String) { value = ERXRestUtils.coerceValueToAttributeType(value, null, obj, keyName); } + if (value instanceof NSKeyValueCoding.Null) { + value = null; + } key.takeValueInObject(value, obj); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-05-26 02:57:02
|
Revision: 9378 http://wonder.svn.sourceforge.net/wonder/?rev=9378&view=rev Author: mschrag Date: 2009-05-26 02:57:01 +0000 (Tue, 26 May 2009) Log Message: ----------- * better toString on ERXRestRequestNode * fixed bug where to-one/to-many relationships could end up being processed as attributes (and allowed even though the filter only allowed attributes) Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-25 22:20:50 UTC (rev 9377) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-26 02:57:01 UTC (rev 9378) @@ -496,6 +496,14 @@ } sb.append("["); sb.append(_name); + if (_id != null || _type != null) { + if (_id != null) { + sb.append(" id=" + _id); + } + if (_type != null) { + sb.append(" type=" + _type); + } + } if (!_attributes.isEmpty()) { sb.append(" "); sb.append(_attributes); @@ -830,7 +838,7 @@ key.takeValueInObject(childObj, obj); } } - else if (/* entity.attributeNamed(keyName) != null && */keyFilter.matches(key, ERXKey.Type.Attribute)) { + else if (/* entity.attributeNamed(keyName) != null && */ERXRestUtils.isPrimitive(valueType) && keyFilter.matches(key, ERXKey.Type.Attribute)) { Object value = childNode.value(); if (value instanceof String) { value = ERXRestUtils.coerceValueToAttributeType(value, null, obj, keyName); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-05-30 23:40:09
|
Revision: 9415 http://wonder.svn.sourceforge.net/wonder/?rev=9415&view=rev Author: mschrag Date: 2009-05-30 23:40:08 +0000 (Sat, 30 May 2009) Log Message: ----------- support for null values in to-one relationship updates Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-30 11:15:32 UTC (rev 9414) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-30 23:40:08 UTC (rev 9415) @@ -829,13 +829,27 @@ else { destinationClassDescription = classDescription.classDescriptionForDestinationKey(keyName); } - Object childObj = delegate.objectOfEntityWithID(destinationClassDescription, childNode.id()); - childNode.updateObjectWithFilter(childObj, keyFilter._filterForKey(key), delegate); - if (obj instanceof EOEnterpriseObject && childObj instanceof EOEnterpriseObject) { - ((EOEnterpriseObject) obj).addObjectToBothSidesOfRelationshipWithKey((EOEnterpriseObject) childObj, keyName); + + if (childNode.isNull()) { + Object childObj = NSKeyValueCoding.DefaultImplementation.valueForKey(obj, keyName); + if (childObj != null) { + if (obj instanceof EOEnterpriseObject && childObj instanceof EOEnterpriseObject) { + ((EOEnterpriseObject) obj).removeObjectFromBothSidesOfRelationshipWithKey((EOEnterpriseObject) childObj, keyName); + } + else { + key.takeValueInObject(childObj, obj); + } + } } else { - key.takeValueInObject(childObj, obj); + Object childObj = delegate.objectOfEntityWithID(destinationClassDescription, childNode.id()); + childNode.updateObjectWithFilter(childObj, keyFilter._filterForKey(key), delegate); + if (obj instanceof EOEnterpriseObject && childObj instanceof EOEnterpriseObject) { + ((EOEnterpriseObject) obj).addObjectToBothSidesOfRelationshipWithKey((EOEnterpriseObject) childObj, keyName); + } + else { + key.takeValueInObject(childObj, obj); + } } } else if (/* entity.attributeNamed(keyName) != null && */ERXRestUtils.isPrimitive(valueType) && keyFilter.matches(key, ERXKey.Type.Attribute)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-06-01 00:59:09
|
Revision: 9416 http://wonder.svn.sourceforge.net/wonder/?rev=9416&view=rev Author: mschrag Date: 2009-06-01 00:21:36 +0000 (Mon, 01 Jun 2009) Log Message: ----------- better error message if you try to set a to-one to an array type Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-05-30 23:40:08 UTC (rev 9415) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-06-01 00:21:36 UTC (rev 9416) @@ -830,6 +830,10 @@ destinationClassDescription = classDescription.classDescriptionForDestinationKey(keyName); } + if (childNode.isArray()) { + throw new IllegalArgumentException("You attempted to pass an array of values for the key '" + key + "'."); + } + if (childNode.isNull()) { Object childObj = NSKeyValueCoding.DefaultImplementation.valueForKey(obj, keyName); if (childObj != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-06-24 13:08:52
|
Revision: 9521 http://wonder.svn.sourceforge.net/wonder/?rev=9521&view=rev Author: mschrag Date: 2009-06-24 12:58:18 +0000 (Wed, 24 Jun 2009) Log Message: ----------- use a linked hash map to retain the order of keys Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-06-24 09:46:09 UTC (rev 9520) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-06-24 12:58:18 UTC (rev 9521) @@ -3,6 +3,7 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -152,7 +153,7 @@ result = _value; } else { - Map<Object, Object> dict = new HashMap<Object, Object>(); + Map<Object, Object> dict = new LinkedHashMap<Object, Object>(); for (Map.Entry<String, String> attribute : _attributes.entrySet()) { String key = attribute.getKey(); String value = attribute.getValue(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2009-08-30 22:52:41
|
Revision: 9783 http://wonder.svn.sourceforge.net/wonder/?rev=9783&view=rev Author: mschrag Date: 2009-08-30 22:52:34 +0000 (Sun, 30 Aug 2009) Log Message: ----------- implements NSKeyValueCodingAdditions now Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-08-30 22:48:05 UTC (rev 9782) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2009-08-30 22:52:34 UTC (rev 9783) @@ -16,6 +16,7 @@ import com.webobjects.foundation.NSArray; import com.webobjects.foundation.NSDictionary; import com.webobjects.foundation.NSKeyValueCoding; +import com.webobjects.foundation.NSKeyValueCodingAdditions; import com.webobjects.foundation.NSMutableArray; import com.webobjects.foundation.NSMutableDictionary; @@ -33,7 +34,7 @@ * * @author mschrag */ -public class ERXRestRequestNode implements NSKeyValueCoding { +public class ERXRestRequestNode implements NSKeyValueCoding, NSKeyValueCodingAdditions { private boolean _array; private String _name; private boolean _rootNode; @@ -327,6 +328,14 @@ } return value; } + + public Object valueForKeyPath(String keyPath) { + return NSKeyValueCodingAdditions.DefaultImplementation.valueForKeyPath(this, keyPath); + } + + public void takeValueForKeyPath(Object value, String keyPath) { + NSKeyValueCodingAdditions.DefaultImplementation.takeValueForKeyPath(this, value, keyPath); + } /** * Returns the first child named 'name'. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2010-02-12 22:10:48
|
Revision: 10606 http://wonder.svn.sourceforge.net/wonder/?rev=10606&view=rev Author: mschrag Date: 2010-02-12 22:10:19 +0000 (Fri, 12 Feb 2010) Log Message: ----------- let objectWithFilter support array types ... mostly useful on the client Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-02-12 22:07:26 UTC (rev 10605) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-02-12 22:10:19 UTC (rev 10606) @@ -652,13 +652,26 @@ * @return the object that this request node represents */ public Object objectWithFilter(String entityName, ERXKeyFilter keyFilter, IERXRestDelegate delegate) { - EOClassDescription classDescription = ERXRestClassDescriptionFactory.classDescriptionForEntityName(entityName); - if (classDescription == null) { - throw new IllegalArgumentException("There is no registered entity with the name '" + entityName + "'."); + Object obj; + if (isArray()) { + NSMutableArray<Object> objs = new NSMutableArray<Object>(); + for (ERXRestRequestNode childNode : children()) { + Object child = childNode.objectWithFilter(entityName, ERXKeyFilter.filterWithAllRecursive(), delegate); + if (child != null) { + objs.addObject(child); + } + } + obj = objs; } - Object obj = delegate.objectOfEntityWithID(classDescription, id()); - if (keyFilter != null) { - updateObjectWithFilter(obj, keyFilter, delegate); + else { + EOClassDescription classDescription = ERXRestClassDescriptionFactory.classDescriptionForEntityName(entityName); + if (classDescription == null) { + throw new IllegalArgumentException("There is no registered entity with the name '" + entityName + "'."); + } + obj = delegate.objectOfEntityWithID(classDescription, id()); + if (keyFilter != null) { + updateObjectWithFilter(obj, keyFilter, delegate); + } } return obj; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2010-02-12 22:54:33
|
Revision: 10601 http://wonder.svn.sourceforge.net/wonder/?rev=10601&view=rev Author: mschrag Date: 2010-02-12 20:56:56 +0000 (Fri, 12 Feb 2010) Log Message: ----------- slightly better error handling Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-02-12 20:41:55 UTC (rev 10600) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-02-12 20:56:56 UTC (rev 10601) @@ -653,6 +653,9 @@ */ public Object objectWithFilter(String entityName, ERXKeyFilter keyFilter, IERXRestDelegate delegate) { EOClassDescription classDescription = ERXRestClassDescriptionFactory.classDescriptionForEntityName(entityName); + if (classDescription == null) { + throw new IllegalArgumentException("There is no registered entity with the name '" + entityName + "'."); + } Object obj = delegate.objectOfEntityWithID(classDescription, id()); if (keyFilter != null) { updateObjectWithFilter(obj, keyFilter, delegate); @@ -673,6 +676,9 @@ */ public Object createObjectWithFilter(String entityName, ERXKeyFilter keyFilter, IERXRestDelegate delegate) { EOClassDescription classDescription = ERXRestClassDescriptionFactory.classDescriptionForEntityName(entityName); + if (classDescription == null) { + throw new IllegalArgumentException("There is no registered entity with the name '" + entityName + "'."); + } Object obj = delegate.createObjectOfEntity(classDescription); if (keyFilter != null) { updateObjectWithFilter(obj, keyFilter, delegate); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2010-02-18 18:07:45
|
Revision: 10665 http://wonder.svn.sourceforge.net/wonder/?rev=10665&view=rev Author: mschrag Date: 2010-02-18 18:07:39 +0000 (Thu, 18 Feb 2010) Log Message: ----------- don't NPE when there's no key filter .. just skip it Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-02-18 17:59:14 UTC (rev 10664) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-02-18 18:07:39 UTC (rev 10665) @@ -733,6 +733,11 @@ @SuppressWarnings("unchecked") protected void _addAttributesAndRelationshipsForObjectOfEntity(Object obj, EOClassDescription classDescription, ERXKeyFilter keyFilter, IERXRestDelegate delegate, Set<Object> visitedObjects) { + // just break out ... no key filter = nothing to do + if (keyFilter == null) { + return; + } + Set<ERXKey> visitedKeys = new HashSet<ERXKey>(); for (String attributeName : (NSArray<String>) classDescription.attributeKeys()) { // if (attribute.isClassProperty()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ms...@us...> - 2010-07-04 16:57:49
|
Revision: 10980 http://wonder.svn.sourceforge.net/wonder/?rev=10980&view=rev Author: mschrag Date: 2010-07-04 16:57:43 +0000 (Sun, 04 Jul 2010) Log Message: ----------- don't hardcode pluralization into the root request node Modified Paths: -------------- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java Modified: trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java =================================================================== --- trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-07-03 21:32:17 UTC (rev 10979) +++ trunk/Wonder/Frameworks/EOF/ERRest/Sources/er/rest/ERXRestRequestNode.java 2010-07-04 16:57:43 UTC (rev 10980) @@ -1160,7 +1160,7 @@ */ public static ERXRestRequestNode requestNodeWithObjectAndFilter(EOClassDescription classDescription, List<?> objects, ERXKeyFilter keyFilter, IERXRestDelegate delegate) { String entityName = classDescription.entityName(); - ERXRestRequestNode requestNode = new ERXRestRequestNode(ERXLocalizer.englishLocalizer().plurifiedString(entityName, 2), true); + ERXRestRequestNode requestNode = new ERXRestRequestNode(entityName, true); requestNode.setType(entityName); requestNode._fillInWithObjectAndFilter(objects, classDescription, keyFilter, delegate, new HashSet<Object>()); return requestNode; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |