Search in sources :

Example 11 with DataMap

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;
}
Also used : DataMap(com.linkedin.data.DataMap)

Example 12 with DataMap

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);
}
Also used : DataMap(com.linkedin.data.DataMap)

Example 13 with DataMap

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);
        }
    }
}
Also used : Mode(com.linkedin.data.transform.patch.validator.PatchFilterValidator.Mode) RequiredMode(com.linkedin.data.schema.validation.RequiredMode) CoercionMode(com.linkedin.data.schema.validation.CoercionMode) TestUtil.dataMapFromString(com.linkedin.data.TestUtil.dataMapFromString) TestUtil.dataSchemaFromString(com.linkedin.data.TestUtil.dataSchemaFromString) ValidationOptions(com.linkedin.data.schema.validation.ValidationOptions) ValidationResult(com.linkedin.data.schema.validation.ValidationResult) DataMap(com.linkedin.data.DataMap) DataSchema(com.linkedin.data.schema.DataSchema) DataElement(com.linkedin.data.element.DataElement) TestUtil.asList(com.linkedin.data.TestUtil.asList) ArrayList(java.util.ArrayList) List(java.util.List) Validator(com.linkedin.data.schema.validator.Validator) Test(org.testng.annotations.Test)

Example 14 with DataMap

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;
}
Also used : Utf8(org.apache.avro.util.Utf8) IOException(java.io.IOException) GenericRecord(org.apache.avro.generic.GenericRecord) DataMap(com.linkedin.data.DataMap)

Example 15 with DataMap

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;
}
Also used : DataMap(com.linkedin.data.DataMap)

Aggregations

DataMap (com.linkedin.data.DataMap)471 Test (org.testng.annotations.Test)238 DataList (com.linkedin.data.DataList)130 ByteString (com.linkedin.data.ByteString)110 HashMap (java.util.HashMap)56 TestUtil.dataMapFromString (com.linkedin.data.TestUtil.dataMapFromString)49 RecordDataSchema (com.linkedin.data.schema.RecordDataSchema)47 TestUtil.dataSchemaFromString (com.linkedin.data.TestUtil.dataSchemaFromString)46 DataSchema (com.linkedin.data.schema.DataSchema)45 Map (java.util.Map)45 ArrayList (java.util.ArrayList)31 MaskTree (com.linkedin.data.transform.filter.request.MaskTree)23 PathSpec (com.linkedin.data.schema.PathSpec)21 RecordTemplate (com.linkedin.data.template.RecordTemplate)21 DataProvider (org.testng.annotations.DataProvider)20 HashSet (java.util.HashSet)19 ArrayDataSchema (com.linkedin.data.schema.ArrayDataSchema)18 PatchTree (com.linkedin.data.transform.patch.request.PatchTree)18 CompoundKey (com.linkedin.restli.common.CompoundKey)18 IOException (java.io.IOException)18