use of com.linkedin.data.DataMap in project rest.li by linkedin.
the class Patch method executeSetCommand.
/**
* Executes $set command and returns true is it was successful and false otherwise.
*/
private boolean executeSetCommand(Object setCommand, Object data, Map<String, String> usedFields, final InterpreterContext instrCtx) {
instrCtx.setCurrentField(SET_COMMAND);
if (setCommand != null) {
// deleteCommand value is of DataMap type
assert setCommand.getClass() == DataMap.class : setCommand.getClass();
// data is of DataMap type
assert data.getClass() == DataMap.class : data.getClass();
DataMap setDataMap = (DataMap) setCommand;
DataMap dataDataMap = (DataMap) data;
for (Entry<String, Object> entry : setDataMap.entrySet()) {
String key = entry.getKey();
if (usedFields.containsKey(key)) {
instrCtx.addErrorMessage("field %1$s can not be used in both %2$s operation and " + SET_COMMAND + " operation at the same time", key, usedFields.get(key));
return false;
} else {
usedFields.put(key.toString(), SET_COMMAND);
dataDataMap.put(key, entry.getValue());
if (_logOperations) {
instrCtx.addInfoMessage(key);
}
}
}
}
return true;
}
use of com.linkedin.data.DataMap in project rest.li by linkedin.
the class PatchTree method addOperation.
/**
* Adds the operation op to the key path.
*
* @param path the path to a field in the object
* @param op the operation to apply to the path
*/
public void addOperation(PathSpec path, PatchOperation op) {
List<String> segments = path.getPathComponents();
DataMap map = _representation;
for (int ii = 0; ii < segments.size() - 1; ++ii) {
String segment = Escaper.escapePathSegment(segments.get(ii));
Object o = map.get(segment);
if (o == null) {
DataMap childMap = new DataMap();
map.put(segment, childMap);
map = childMap;
} else {
map = (DataMap) o;
}
}
String lastSegment = Escaper.escapePathSegment(segments.get(segments.size() - 1));
op.store(map, lastSegment);
}
use of com.linkedin.data.DataMap in project rest.li by linkedin.
the class TestPatchFilterValidator method testPatchFilterValidator.
@Test
public void testPatchFilterValidator() throws IOException {
String schemaText = "{\n" + " \"type\" : \"record\",\n" + " \"name\" : \"Foo\",\n" + " \"fields\" : [\n" + " { \"name\" : \"fooInt\", \"type\" : \"int\", \"optional\" : true },\n" + " { \"name\" : \"fooString\", \"type\" : \"string\", \"optional\" : true },\n" + " {\n" + " \"name\" : \"bar\",\n" + " \"type\" : {\n" + " \"type\" : \"record\",\n" + " \"name\" : \"Bar\",\n" + " \"fields\" : [\n" + " { \"name\" : \"barInt\", \"type\" : \"int\", \"optional\" : true },\n" + " { \"name\" : \"barString\", \"type\" : \"string\", \"optional\" : true },\n" + " {\n" + " \"name\" : \"baz\",\n" + " \"type\" : {\n" + " \"type\" : \"record\",\n" + " \"name\" : \"Baz\",\n" + " \"fields\" : [\n" + " { \"name\" : \"bazInt\", \"type\" : \"int\", \"optional\" : true },\n" + " { \"name\" : \"bazString\", \"type\" : \"string\", \"optional\" : true }\n" + " ]\n" + " },\n" + " \"optional\" : true\n" + " }\n" + " ]\n" + " },\n" + " \"optional\" : true\n" + " }\n" + " ]\n" + "}\n";
Object[][] inputs = { // }
{ // deleted /fooInt
"{ }", "{ \"$delete\" : [ \"fooInt\" ] }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, ""), asList(Mode.ANCESTOR_AND_SET, "") }, { // must not call validator for parents and ancestors not modified
"{ \"fooString\" : \"excluded\", \"bar\" : { \"barInt\" : -1 } }", "{ \"$delete\" : [ \"fooInt\" ] }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, ""), asList(Mode.ANCESTOR_AND_SET, "") }, { // deleted /bar/barInt
"{ \"bar\" : { } }", "{ \"bar\" : { \"$delete\" : [ \"barInt\" ] } }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, "/bar"), asList(Mode.ANCESTOR_AND_SET, "", "/bar") }, { // must not call validator for parents and ancestors not modified
"{ \"fooInt\" : -1, \"fooString\" : \"excluded\", \"bar\" : { } }", "{ \"bar\" : { \"$delete\" : [ \"barInt\" ] } }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, "/bar"), asList(Mode.ANCESTOR_AND_SET, "", "/bar") }, { // deleted /bar/baz/bazInt
"{ \"bar\" : { \"baz\" : { } } }", "{ \"bar\" : { \"baz\" : { \"$delete\" : [ \"bazInt\" ] } } }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, "/bar/baz"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz") }, { // must not call validator for parents and ancestors not modified
"{ \"fooInt\" : -1, \"fooString\" : \"excluded\", \"bar\" : { \"barInt\" : -1, \"baz\" : { } } }", "{ \"bar\" : { \"baz\" : { \"$delete\" : [ \"bazInt\" ] } } }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, "/bar/baz"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz") }, { // deleted /bar/baz
"{ \"bar\" : { } }", "{ \"bar\" : { \"$delete\" : [ \"baz\" ] } }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, "/bar"), asList(Mode.ANCESTOR_AND_SET, "", "/bar") }, { // must not call validator for parents and ancestors not modified
"{ \"fooInt\" : -1, \"fooString\" : \"excluded\", \"bar\" : { \"barInt\" : -1 } }", "{ \"bar\" : { \"$delete\" : [ \"baz\" ] } }", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET, "/bar"), asList(Mode.ANCESTOR_AND_SET, "", "/bar") }, { // set /fooInt (set field in root record)
"{ \"fooInt\" : 2 }", "{ \"$set\" : { \"fooInt\" : 2 } }", "", asList(Mode.SET_ONLY, "/fooInt"), asList(Mode.PARENT_AND_SET, "", "/fooInt"), asList(Mode.ANCESTOR_AND_SET, "", "/fooInt") }, { // must not call validator for parents and ancestors not modified
"{ \"fooInt\" : 2, \"fooString\" : \"excluded\", \"bar\" : { \"baz\" : { } } }", "{ \"$set\" : { \"fooInt\" : 2 } }", "", asList(Mode.SET_ONLY, "/fooInt"), asList(Mode.PARENT_AND_SET, "", "/fooInt"), asList(Mode.ANCESTOR_AND_SET, "", "/fooInt") }, { // must not call validator for parents and ancestors not modified
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excluded\",\n" + " \"bar\" : {\n" + " \"barInt\" : 2,\n" + " \"barString\" : \"excluded\",\n" + " \"baz\" : {}\n" + " }\n" + "}", "{ \"bar\" : { \"$set\" : { \"barInt\" : 2 } } }", "", asList(Mode.SET_ONLY, "/bar/barInt"), asList(Mode.PARENT_AND_SET, "/bar", "/bar/barInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/barInt") }, { // must not call validator for parents and ancestors not modified
"{\n" + " \"fooInt\" : -1,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"barString\" : \"x\",\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"excludes\"\n" + " }\n" + " }\n" + "}", "{ \"bar\" : { \"$set\" : { \"barString\" : \"x\" } } }", "", asList(Mode.SET_ONLY, "/bar/barString"), asList(Mode.PARENT_AND_SET, "/bar", "/bar/barString"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/barString") }, { // set /bar/baz/bazInt (set field in nested grandchild record)
"{ \"bar\" : { \"baz\" : { \"bazInt\" : 2 } } }", "{ \"bar\" : { \"baz\" : { \"$set\" : { \"bazInt\" : 2 } } } }", "", asList(Mode.SET_ONLY, "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // must not call validator for parents and ancestors not modified
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excluded\",\n" + " \"bar\" : {\n" + " \"barInt\" : 2,\n" + " \"barString\" : \"excluded\",\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"excluded\"\n" + " }\n" + " }\n" + "}", "{ \"bar\" : { \"baz\" : { \"$set\" : { \"bazInt\" : 2 } } } }", "", asList(Mode.SET_ONLY, "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // must not call validator for parents and ancestors not modified
"{\n" + " \"fooInt\" : -1,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"excludes\"\n" + " }\n" + " }\n" + "}", "{ \"bar\" : { \"baz\" : { \"$set\" : { \"bazInt\" : 2 } } } }", "", asList(Mode.SET_ONLY, "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // set /bar (set record in root record)
"{ \"bar\" : { \"baz\" : { \"bazInt\" : 2 } } }", "{ \"$set\" : { \"bar\" : { \"baz\" : { \"bazInt\" : 2 } } } }", "", asList(Mode.SET_ONLY, "/bar", "/bar/baz", "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // must not call validator for parents and ancestors not modified
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excluded\",\n" + " \"bar\" : {\n" + " \"baz\" : {\n" + " \"bazInt\" : 2\n" + " }\n" + " }\n" + "}", "{ \"bar\" : { \"baz\" : { \"$set\" : { \"bazInt\" : 2 } } } }", "", asList(Mode.SET_ONLY, "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // set /bar/baz (set record in nested child record)
"{ \"bar\" : { \"baz\" : { \"bazInt\" : 2 } } }", "{ \"bar\" : { \"$set\" : { \"baz\" : { \"bazInt\" : 2 } } } }", "", asList(Mode.SET_ONLY, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar", "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // must not call validator for parents and ancestors not modified
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excluded\",\n" + " \"bar\" : {\n" + " \"barInt\" : 2,\n" + " \"barString\" : \"excluded\",\n" + " \"baz\" : {\n" + " \"bazInt\" : 2\n" + " }\n" + " }\n" + "}", "{ \"bar\" : { \"$set\" : { \"baz\" : { \"bazInt\" : 2 } } } }", "", asList(Mode.SET_ONLY, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar", "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // must not call validator for parents and ancestors not modified
"{\n" + " \"fooInt\" : -1,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"barString\" : \"excludes\",\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"x\"\n" + " }\n" + " }\n" + "}", "{ \"bar\" : { \"$set\" : { \"baz\" : { \"bazInt\" : 2, \"bazString\" : \"x\" } } } }", "", asList(Mode.SET_ONLY, "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.PARENT_AND_SET, "/bar", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString") }, { // set /fooInt, /fooString (set multiple fields in root record)
"{ \"fooInt\" : 2, \"fooString\" : \"x\" }", "{ \"$set\" : { \"fooInt\" : 2, \"fooString\" : \"x\" } }", "", asList(Mode.SET_ONLY, "/fooInt", "/fooString"), asList(Mode.PARENT_AND_SET, "", "/fooInt", "/fooString"), asList(Mode.ANCESTOR_AND_SET, "", "/fooInt", "/fooString") }, { // set /bar/barInt, /bar/barString (set multiple fields in nested child record)
"{ \"bar\" : { \"barInt\" : 2, \"barString\" : \"x\" } }", "{ \"bar\" : { \"$set\" : { \"barInt\" : 2, \"barString\" : \"x\" } } }", "", asList(Mode.SET_ONLY, "/bar/barInt", "/bar/barString"), asList(Mode.PARENT_AND_SET, "/bar", "/bar/barInt", "/bar/barString"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/barInt", "/bar/barString") }, { // set /bar/baz/bazInt, /bar/baz/bazString (set multiple fields in nested grandchild record)
"{ \"bar\" : { \"baz\" : { \"bazInt\" : 2, \"bazString\" : \"x\" } } }", "{ \"bar\" : { \"baz\" : { \"$set\" : { \"bazInt\" : 2, \"bazString\" : \"x\" } } } }", "", asList(Mode.SET_ONLY, "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.PARENT_AND_SET, "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString") }, { // set /fooInt, /bar/barInt, /bar/baz/bazInt
"{\n" + " \"fooInt\" : 2,\n" + " \"bar\" : {\n" + " \"barInt\" : 2,\n" + " \"baz\" : {\n" + " \"bazInt\" : 2\n" + " }\n" + " }\n" + "}", "{\n" + " \"$set\" : { \"fooInt\" : 2 },\n" + " \"bar\" : {\n" + " \"$set\" : { \"barInt\" : 2 },\n" + " \"baz\" : {\n" + " \"$set\" : { \"bazInt\" : 2 }\n" + " }\n" + " }\n" + "}", "", asList(Mode.SET_ONLY, "/fooInt", "/bar/barInt", "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "", "/fooInt", "/bar", "/bar/barInt", "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/fooInt", "/bar", "/bar/barInt", "/bar/baz", "/bar/baz/bazInt") }, { // nothing set
"{\n" + " \"fooInt\" : -1,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"baz\" : {\n" + " \"bazInt\" : -1,\n" + " \"bazString\" : \"excludes\"\n" + " }\n" + " }\n" + "}", "{}", "", asList(Mode.SET_ONLY), asList(Mode.PARENT_AND_SET), asList(Mode.ANCESTOR_AND_SET) }, { // must not call next validator for /fooString, /bar/barInt
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"x\"\n" + " }\n" + " }\n" + "}", "{\n" + " \"$set\" : { \"fooInt\" : 2 },\n" + " \"bar\" : {\n" + " \"$set\" : {\n" + " \"baz\" : { \"bazInt\" : 2, \"bazString\" : \"x\" }\n" + " }\n" + " }\n" + "}", "", asList(Mode.SET_ONLY, "/fooInt", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.PARENT_AND_SET, "", "/fooInt", "/bar", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.ANCESTOR_AND_SET, "", "/fooInt", "/bar", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString") }, { // must not call next validator for /fooInt, /fooString, /bar/barInt
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"x\"\n" + " }\n" + " }\n" + "}", "{\n" + " \"$set\" : {\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"x\"\n" + " }\n" + " }\n" + "}", "/bar", asList(Mode.SET_ONLY, "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.PARENT_AND_SET, "/bar", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt", "/bar/baz/bazString") }, { // must not call next validator for /fooInt, /fooString, /bar/barInt
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"x\"\n" + " }\n" + " }\n" + "}", "{\n" + " \"baz\" : {\n" + " \"$set\" : {\n" + " \"bazInt\" : 2\n" + " }\n" + " }\n" + "}", "/bar", asList(Mode.SET_ONLY, "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") }, { // must not call next validator for /fooInt, /fooString, /bar/barInt
"{\n" + " \"fooInt\" : 2,\n" + " \"fooString\" : \"excludes\",\n" + " \"bar\" : {\n" + " \"barInt\" : -1,\n" + " \"baz\" : {\n" + " \"bazInt\" : 2,\n" + " \"bazString\" : \"x\"\n" + " }\n" + " }\n" + "}", "{\n" + " \"$set\" : { \"bazInt\" : 2 }\n" + "}", "/bar/baz", asList(Mode.SET_ONLY, "/bar/baz/bazInt"), asList(Mode.PARENT_AND_SET, "/bar/baz", "/bar/baz/bazInt"), asList(Mode.ANCESTOR_AND_SET, "", "/bar", "/bar/baz", "/bar/baz/bazInt") } };
DataSchema schema = dataSchemaFromString(schemaText);
ValidationOptions options = new ValidationOptions(RequiredMode.CAN_BE_ABSENT_IF_HAS_DEFAULT, CoercionMode.NORMAL);
for (Object[] row : inputs) {
String value = (String) row[0];
String patch = (String) row[1];
String patchPath = (String) row[2];
DataMap valueMap = dataMapFromString(value);
DataMap opMap = dataMapFromString(patch);
if (debug) {
out.println("Value: " + value);
out.println("Patch: " + patch);
if (patchPath.isEmpty() == false)
out.println("PatchPath: " + patchPath);
}
for (int i = 3; i < row.length; i++) {
VisitedValidator visitedValidator = new VisitedValidator();
@SuppressWarnings("unchecked") List<Object> check = (List<Object>) row[i];
Mode mode = (Mode) check.get(0);
Validator validator;
if (patchPath.isEmpty()) {
validator = new PatchFilterValidator(visitedValidator, opMap, mode);
} else {
DataElement patchElement = DataElementUtil.element(valueMap, schema, patchPath);
assertNotSame(patchElement, null);
validator = new PatchFilterValidator(visitedValidator, opMap, mode, patchElement);
}
ValidationResult result = ValidateDataAgainstSchema.validate(valueMap, schema, options, validator);
if (debug) {
out.println("Mode: " + mode);
out.print("Result: " + result);
out.println("VisitedPaths: " + visitedValidator._visitedPaths);
}
assertTrue(result.isValid());
for (int j = 1; j < check.size(); j++) {
assertTrue(visitedValidator._visitedPaths.contains(check.get(j)));
}
assertEquals(visitedValidator._visitedPaths.size(), check.size() - 1);
}
}
}
use of com.linkedin.data.DataMap in project rest.li by linkedin.
the class AnyRecordTranslator method avroGenericToData.
@Override
public Object avroGenericToData(DataTranslatorContext context, Object avroData, Schema avroSchema, DataSchema schema) {
boolean error = false;
Object result = null;
GenericRecord genericRecord = null;
try {
genericRecord = (GenericRecord) avroData;
} catch (ClassCastException e) {
context.appendMessage("Error translating %1$s, it is not a GenericRecord", avroData);
error = true;
}
if (error == false) {
Utf8 type = null;
Utf8 value = null;
try {
type = (Utf8) genericRecord.get(TYPE);
value = (Utf8) genericRecord.get(VALUE);
} catch (ClassCastException e) {
context.appendMessage("Error translating %1$s, \"type\" or \"value\" is not a %2$s", avroData, Utf8.class.getSimpleName());
error = true;
}
if (error == false) {
if (type == null || value == null) {
context.appendMessage("Error translating %1$s, \"type\" or \"value\" is null", avroData);
} else {
try {
DataMap valueDataMap = _codec.bytesToMap(value.getBytes());
DataMap anyDataMap = new DataMap(2);
anyDataMap.put(type.toString(), valueDataMap);
result = anyDataMap;
} catch (IOException e) {
context.appendMessage("Error translating %1$s, %2$s", avroData, e);
}
}
}
}
return result;
}
use of com.linkedin.data.DataMap in project rest.li by linkedin.
the class PatchFilterValidator method determineStatus.
protected Status determineStatus(DataElement element) {
Status status = null;
element.pathAsList(_path);
DataMap currentOpMap = _opMap;
int i;
for (i = 0; i < _path.size(); i++) {
Object pathComponent = _path.get(i);
if (i < _patchedPath.length) {
if (_patchedPath[i].equals(pathComponent) == false) {
status = Status.NONE;
break;
}
status = Status.IS_DESCENDANT_MODIFIED;
continue;
}
Object nextValue = currentOpMap.get(pathComponent);
if (nextValue == null || nextValue.getClass() != DataMap.class) {
Object setValue = currentOpMap.get(PatchConstants.SET_COMMAND);
if (setValue != null && setValue.getClass() == DataMap.class && ((DataMap) setValue).get(pathComponent) != null) {
status = Status.IS_SET_VALUE;
break;
}
status = Status.NONE;
break;
}
status = Status.IS_DESCENDANT_MODIFIED;
currentOpMap = (DataMap) nextValue;
}
if (i == _path.size()) {
if (i >= _patchedPath.length) {
for (String keys : currentOpMap.keySet()) {
if (keys.startsWith(PatchConstants.COMMAND_PREFIX)) {
status = Status.IS_CHILD_MODIFIED;
break;
}
}
}
if (status != Status.IS_CHILD_MODIFIED && i <= _patchedPath.length && !currentOpMap.isEmpty()) {
status = Status.IS_DESCENDANT_MODIFIED;
}
} else if (status == null) {
status = Status.NONE;
}
return status;
}
Aggregations