@Override public PatchMessage<JsonPatchEdit> createPatchMessage(final String documentId, final String clientId, final Queue<JsonPatchEdit> edits) { return new JsonPatchMessage(documentId, clientId, edits); }
@Override public void serialize(final JsonPatchMessage patchMessage, final JsonGenerator jgen, final SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeStringField("msgType", "patch"); jgen.writeStringField("id", patchMessage.documentId()); jgen.writeStringField("clientId", patchMessage.clientId()); jgen.writeArrayFieldStart("edits"); for (JsonPatchEdit edit : patchMessage.edits()) { if (edit == null) { continue; } jgen.writeStartObject(); jgen.writeNumberField("clientVersion", edit.clientVersion()); jgen.writeNumberField("serverVersion", edit.serverVersion()); jgen.writeStringField("checksum", edit.checksum()); if (edit.diff() != null) { jgen.writeObjectField("diffs", edit.diff().jsonPatch()); } jgen.writeEndObject(); } jgen.writeEndArray(); jgen.writeEndObject(); } }
@Override public JsonPatchMessage deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException { final ObjectCodec oc = jp.getCodec(); final JsonNode node = oc.readTree(jp); final String documentId = node.get("id").asText(); final String clientId = node.get("clientId").asText(); final JsonNode jsonEdits = node.get("edits"); final Queue<JsonPatchEdit> edits = new ConcurrentLinkedQueue<JsonPatchEdit>(); if (jsonEdits.isArray()) { for (JsonNode edit : jsonEdits) { if (edit.isNull()) { continue; } final Builder eb = JsonPatchEdit.withChecksum(edit.get("checksum").asText()); eb.clientVersion(edit.get("clientVersion").asLong()); eb.serverVersion(edit.get("serverVersion").asLong()); final JsonNode diffsNode = edit.get("diffs"); if (!diffsNode.isNull()) { eb.patch(JsonPatch.fromJson(diffsNode)); } edits.add(eb.build()); } } return new JsonPatchMessage(documentId, clientId, edits); } }