diff --git a/crud/src/main/java/com/redhat/lightblue/eval/SetExpressionEvaluator.java b/crud/src/main/java/com/redhat/lightblue/eval/SetExpressionEvaluator.java index d398f2ee..fd72f570 100644 --- a/crud/src/main/java/com/redhat/lightblue/eval/SetExpressionEvaluator.java +++ b/crud/src/main/java/com/redhat/lightblue/eval/SetExpressionEvaluator.java @@ -26,14 +26,15 @@ import org.slf4j.LoggerFactory; 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.ObjectNode; -import com.fasterxml.jackson.databind.node.ArrayNode; import com.redhat.lightblue.crud.CrudConstants; import com.redhat.lightblue.metadata.ArrayField; import com.redhat.lightblue.metadata.FieldTreeNode; import com.redhat.lightblue.metadata.ObjectArrayElement; import com.redhat.lightblue.metadata.ObjectField; +import com.redhat.lightblue.metadata.ReferenceField; import com.redhat.lightblue.metadata.SimpleArrayElement; import com.redhat.lightblue.metadata.SimpleField; import com.redhat.lightblue.metadata.Type; @@ -134,14 +135,23 @@ public SetExpressionEvaluator(JsonNodeFactory factory, FieldTreeNode context, Se if (mdNode instanceof SimpleField || mdNode instanceof SimpleArrayElement) { data = initializeSimple(rvalue, refMdNode, mdNode, field, refPath); + setValues.add(data); + } else if (mdNode instanceof ReferenceField) { + if (rvalue.getValue() != null) { + throw new EvaluationError(CrudConstants.ERR_ASSIGNMENT + field +" can't assign values to referenced fields"); + } else { + // ignore if null + } } else if (mdNode instanceof ObjectField || mdNode instanceof ObjectArrayElement) { data = initializeObject(rvalue, refMdNode, mdNode, field, refPath); + setValues.add(data); } else if (mdNode instanceof ArrayField) { data = initializeArray(rvalue, refMdNode, mdNode, field, refPath); - } - if (data != null) { setValues.add(data); + } else { + throw new EvaluationError(CrudConstants.ERR_ASSIGNMENT + field + " field type "+mdNode.getClass()+" is not recognized!"); } + } } diff --git a/crud/src/test/java/com/redhat/lightblue/eval/SetExpressionEvaluatorTest.java b/crud/src/test/java/com/redhat/lightblue/eval/SetExpressionEvaluatorTest.java index 3cd5e099..d1cb88cb 100644 --- a/crud/src/test/java/com/redhat/lightblue/eval/SetExpressionEvaluatorTest.java +++ b/crud/src/test/java/com/redhat/lightblue/eval/SetExpressionEvaluatorTest.java @@ -100,4 +100,20 @@ public void assign_arr_to_field() throws Exception { Assert.assertEquals("[1,2]", jsonDoc.get(new Path("field6.nf10")).toString()); } + + @Test + public void setting_reference_to_null_is_ignored() throws Exception { + UpdateExpression expr = EvalTestContext.updateExpressionFromJson("{'$set': {'ref': null } }"); + Updater updater = Updater.getInstance(JSON_NODE_FACTORY, md, expr); + Assert.assertFalse(updater.update(jsonDoc, md.getFieldTreeRoot(), new Path())); + + } + + @Test(expected=EvaluationError.class) + public void setting_reference_to_non_null_throws_exception() throws Exception { + UpdateExpression expr = EvalTestContext.updateExpressionFromJson("{'$set': {'ref': 'foo' } }"); + Updater updater = Updater.getInstance(JSON_NODE_FACTORY, md, expr); + Assert.assertFalse(updater.update(jsonDoc, md.getFieldTreeRoot(), new Path())); + + } } diff --git a/crud/src/test/resources/testMetadata.json b/crud/src/test/resources/testMetadata.json index 95b45365..d626a5e7 100644 --- a/crud/src/test/resources/testMetadata.json +++ b/crud/src/test/resources/testMetadata.json @@ -270,6 +270,11 @@ } } } + }, + "ref" : { + "type":"reference", + "entity":"referenced_entity", + "query": { "field":"field1","op":"=","rfield":"$parent.field1"} } } }