@Test
  public void testRecordAttributes() throws Exception {
    Record record = repository.newRecord();
    record.getAttributes().put("one", "onevalue");

    ObjectNode recordNode = RecordWriter.INSTANCE.toJson(record, null, repositoryManager);
    ObjectNode attributes = (ObjectNode) recordNode.get("attributes");
    for (String key : record.getAttributes().keySet()) {
      Assert.assertEquals(record.getAttributes().get(key), attributes.get(key).asText());
    }

    attributes.put("write", "something new");

    record = RecordReader.INSTANCE.fromJson(recordNode, repositoryManager);
    Iterator<Entry<String, JsonNode>> it = attributes.getFields();
    while (it.hasNext()) {
      Entry<String, JsonNode> attr = it.next();
      Assert.assertEquals(attr.getValue().asText(), record.getAttributes().get(attr.getKey()));
    }
  }
  @Test
  public void testMetadataToDelete() throws Exception {
    Record record = repository.newRecord();
    record.setMetadata(
        new QName("ns", "field1"),
        new MetadataBuilder()
            .value("mfield1", "value1")
            .delete("mfield2")
            .delete("mfield3")
            .build());

    record.setMetadata(new QName("ns", "field2"), new MetadataBuilder().delete("mfield4").build());

    WriteOptions options = new WriteOptions();
    options.setUseNamespacePrefixes(false);
    ObjectNode recordNode = RecordWriter.INSTANCE.toJson(record, options, repositoryManager);

    // Go through ser/deser
    String recordJson = JsonFormat.serializeAsString(recordNode);
    recordNode = (ObjectNode) JsonFormat.deserializeNonStd(recordJson);

    assertNotNull(recordNode.get("metadataToDelete"));
    assertEquals(2, recordNode.get("metadataToDelete").size());

    assertEquals(2, recordNode.get("metadataToDelete").get("{ns}field1").size());
    assertEquals(1, recordNode.get("metadataToDelete").get("{ns}field2").size());

    // Now parse json again to API objects
    record = RecordReader.INSTANCE.fromJson(recordNode, repositoryManager);
    assertEquals(2, record.getMetadataMap().size());

    Metadata metadata = record.getMetadata(new QName("ns", "field1"));
    assertTrue(metadata.getFieldsToDelete().contains("mfield2"));
    assertTrue(metadata.getFieldsToDelete().contains("mfield3"));
    assertEquals("value1", metadata.get("mfield1"));

    metadata = record.getMetadata(new QName("ns", "field2"));
    assertTrue(metadata.getFieldsToDelete().contains("mfield4"));
    assertEquals(1, metadata.getFieldsToDelete().size());
  }
  @Test
  public void testMetadata() throws Exception {
    Record record = repository.newRecord();
    record.setMetadata(
        new QName("ns", "field1"),
        new MetadataBuilder()
            .value("stringfield", "string")
            .value("intfield", 55)
            .value("longfield", 999999999999L)
            .value("booleanfield", Boolean.TRUE)
            .value("floatfield", 33.33f)
            .value("doublefield", 66.66d)
            .value("binaryfield", new ByteArray("foo".getBytes()))
            .build());

    record.setMetadata(
        new QName("ns", "field2"),
        new MetadataBuilder().value("stringfield", "another_string").build());

    ObjectNode recordNode = RecordWriter.INSTANCE.toJson(record, null, repositoryManager);

    // go through ser/deser
    String recordJson = JsonFormat.serializeAsString(recordNode);
    recordNode = (ObjectNode) JsonFormat.deserializeNonStd(recordJson);

    // Do some structural validations of the json
    ObjectNode metadataNode = (ObjectNode) recordNode.get("metadata");
    assertNotNull(metadataNode);
    assertNull(recordNode.get("metadataToDelete"));

    String prefix = recordNode.get("namespaces").get("ns").getTextValue();

    assertEquals(2, metadataNode.size());

    assertTrue(metadataNode.get(prefix + "$field1").get("stringfield").isTextual());
    assertEquals("string", metadataNode.get(prefix + "$field1").get("stringfield").getTextValue());

    assertTrue(metadataNode.get(prefix + "$field1").get("intfield").isInt());
    assertEquals(55, metadataNode.get(prefix + "$field1").get("intfield").getIntValue());

    assertTrue(metadataNode.get(prefix + "$field1").get("longfield").isLong());
    assertEquals(
        999999999999L, metadataNode.get(prefix + "$field1").get("longfield").getLongValue());

    assertTrue(metadataNode.get(prefix + "$field1").get("booleanfield").isBoolean());
    assertEquals(
        Boolean.TRUE, metadataNode.get(prefix + "$field1").get("booleanfield").getBooleanValue());

    // in JSON, no distinction between floats & doubles
    assertTrue(metadataNode.get(prefix + "$field1").get("floatfield").isFloatingPointNumber());
    assertEquals(
        33.33d, metadataNode.get(prefix + "$field1").get("floatfield").getDoubleValue(), 0.001);

    assertTrue(metadataNode.get(prefix + "$field1").get("doublefield").isFloatingPointNumber());
    assertEquals(
        33.33d, metadataNode.get(prefix + "$field1").get("floatfield").getDoubleValue(), 0.001);

    assertTrue(metadataNode.get(prefix + "$field1").get("binaryfield").isObject());
    ObjectNode binaryNode = (ObjectNode) metadataNode.get(prefix + "$field1").get("binaryfield");
    assertEquals("binary", binaryNode.get("type").getTextValue());
    assertArrayEquals("foo".getBytes(), binaryNode.get("value").getBinaryValue());

    assertTrue(metadataNode.get(prefix + "$field2").get("stringfield").isTextual());
    assertEquals(
        "another_string", metadataNode.get(prefix + "$field2").get("stringfield").getTextValue());

    // Now parse json again to API objects
    record = RecordReader.INSTANCE.fromJson(recordNode, repositoryManager);
    assertEquals(2, record.getMetadataMap().size());

    Metadata metadata = record.getMetadata(new QName("ns", "field1"));
    assertEquals("string", metadata.get("stringfield"));
    assertEquals(55, metadata.getInt("intfield", null).intValue());
    assertEquals(999999999999L, metadata.getLong("longfield", null).longValue());
    assertEquals(Boolean.TRUE, metadata.getBoolean("booleanfield", null).booleanValue());
    assertEquals(33.33f, metadata.getFloat("floatfield", null).floatValue(), 0.001);
    assertEquals(66.66d, metadata.getDouble("doublefield", null).doubleValue(), 0.001);
    assertEquals(new ByteArray("foo".getBytes()), metadata.getBytes("binaryfield"));

    metadata = record.getMetadata(new QName("ns", "field2"));
    assertEquals(1, metadata.getMap().size());
    assertEquals(0, metadata.getFieldsToDelete().size());
  }