Skip to content

Commit

Permalink
Merge pull request #453 from bserdar/452
Browse files Browse the repository at this point in the history
Fix #452: don't initialize array length if it is not in md
  • Loading branch information
dcrissman committed Sep 11, 2015
2 parents a9d9f0f + 18bab68 commit af46e09
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,7 @@ private void runBulkConstraintValidation(OperationContext ctx) {

private void updatePredefinedFields(OperationContext ctx,CRUDController controller, String entity) {
for (JsonDoc doc : ctx.getDocuments()) {
PredefinedFields.updateArraySizes(factory.getNodeFactory(), doc);
PredefinedFields.updateArraySizes(ctx.getTopLevelEntityMetadata(),factory.getNodeFactory(), doc);
JsonNode node = doc.get(OBJECT_TYPE_PATH);
if (node == null) {
doc.modify(OBJECT_TYPE_PATH, factory.getNodeFactory().textNode(entity), false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.NullNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.redhat.lightblue.metadata.constraints.RequiredConstraint;
import com.redhat.lightblue.metadata.constraints.StringLengthConstraint;
Expand Down Expand Up @@ -79,43 +80,24 @@ public static void ensurePredefinedFields(EntityMetadata md) {
/**
* Updates all array size values in the given document
*/
public static void updateArraySizes(JsonNodeFactory factory, JsonDoc doc) {
updateArraySizes(factory, (ObjectNode) doc.getRoot());
}

/**
* Updates all array size values at the subtree rooted at the given object
* node
*
* @param factory Node factory
* @param node All array size fields under this subtree will be updated
*/
public static void updateArraySizes(JsonNodeFactory factory, ObjectNode node) {
Map<String, JsonNode> sizes = new HashMap<>();
for (Iterator<Map.Entry<String, JsonNode>> itr = node.fields(); itr.hasNext();) {
Map.Entry<String, JsonNode> field = itr.next();
JsonNode value = field.getValue();
if (value instanceof ArrayNode) {
sizes.put(field.getKey() + "#", factory.numberNode(((ArrayNode) value).size()));
public static void updateArraySizes(EntityMetadata md,JsonNodeFactory factory, JsonDoc doc) {
FieldCursor cursor=md.getFieldCursor();
while(cursor.next()) {
FieldTreeNode f=cursor.getCurrentNode();
if(f.getName().endsWith("#")) {
Path lengthField=cursor.getCurrentPath();
String ls=lengthField.toString();
Path arrField=new Path(ls.substring(0,ls.length()-1));
try {
if(md.resolve(arrField)!=null) {
JsonNode arrNode=doc.get(arrField);
if(arrNode==null||arrNode instanceof NullNode)
doc.modify(lengthField,null,false);
else
doc.modify(lengthField,factory.numberNode(arrNode.size()),false);
}
} catch(Exception e) {}
}
updateArraySizes(factory, value);
}
for (Map.Entry<String, JsonNode> entry : sizes.entrySet()) {
node.set(entry.getKey(), entry.getValue());
}
}

public static void updateArraySizes(JsonNodeFactory factory, ArrayNode node) {
for (Iterator<JsonNode> itr = node.elements(); itr.hasNext();) {
updateArraySizes(factory, itr.next());
}
}

public static void updateArraySizes(JsonNodeFactory factory, JsonNode node) {
if (node instanceof ArrayNode) {
updateArraySizes(factory, (ArrayNode) node);
} else if (node instanceof ObjectNode) {
updateArraySizes(factory, (ObjectNode) node);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.redhat.lightblue.metadata.parser.Extensions;
import com.redhat.lightblue.metadata.parser.JSONMetadataParser;
import com.redhat.lightblue.metadata.types.DefaultTypes;
Expand Down Expand Up @@ -168,22 +169,55 @@ public void testInvalidArr() throws Exception {
@Test
public void testDocModify() throws Exception {
JsonNodeFactory factory = JsonNodeFactory.withExactBigDecimals(false);
ObjectNode node = factory.objectNode();
ObjectNode node = factory.objectNode();
JsonDoc doc = new JsonDoc(node);
node.
put("fld1", "value").
put("arr#", 1);
node.set("arr", factory.arrayNode().add(1).add(2));
node.set("arr2", factory.arrayNode().add(1).add(2).add(3));
ObjectNode obj = factory.objectNode();
obj.put("fld3", "val");
obj.set("arr3", factory.arrayNode().add(1).add(2).add(3).add(4));
node.set("obj", obj);

PredefinedFields.updateArraySizes(factory, node);

Assert.assertEquals(2, doc.get(new Path("arr#")).intValue());
Assert.assertEquals(3, doc.get(new Path("arr2#")).intValue());
Assert.assertEquals(4, doc.get(new Path("obj.arr3#")).intValue());

ObjectNode obj1;
node.put("obj1",obj1=factory.objectNode());
node.put("simpleString",factory.textNode("str"));
ArrayNode a1;
obj1.put("simpleArr",a1=factory.arrayNode());
a1.add(factory.textNode("a"));
ObjectNode o;
obj1.put("nested",o=factory.objectNode());

ArrayNode a2;
o.put("objArr",a2=factory.arrayNode());
a2.add(factory.objectNode());

PredefinedFields.updateArraySizes(getMD2(),factory, doc);
System.out.println(doc);

Assert.assertNotNull(doc.get(new Path("obj1.simpleArr")));
Assert.assertNull(doc.get(new Path("obj1.simpleArr#")));
Assert.assertEquals(1,doc.get(new Path("obj1.nested.objArr#")).intValue());
}

@Test
public void testDocModify_ovrLength() throws Exception {
JsonNodeFactory factory = JsonNodeFactory.withExactBigDecimals(false);
ObjectNode node = factory.objectNode();
JsonDoc doc = new JsonDoc(node);

ObjectNode obj1;
node.put("obj1",obj1=factory.objectNode());
node.put("simpleString",factory.textNode("str"));
ArrayNode a1;
obj1.put("simpleArr",a1=factory.arrayNode());
a1.add(factory.textNode("a"));
ObjectNode o;
obj1.put("nested",o=factory.objectNode());

ArrayNode a2;
o.put("objArr",a2=factory.arrayNode());
o.put("objArr#",factory.numberNode(100));
a2.add(factory.objectNode());

PredefinedFields.updateArraySizes(getMD2(),factory, doc);
System.out.println(doc);

Assert.assertNotNull(doc.get(new Path("obj1.simpleArr")));
Assert.assertNull(doc.get(new Path("obj1.simpleArr#")));
Assert.assertEquals(1,doc.get(new Path("obj1.nested.objArr#")).intValue());
}
}

0 comments on commit af46e09

Please sign in to comment.