@Override public PatchMessage<JsonPatchEdit> createPatchMessage(final String documentId, final String clientId, final Queue<JsonPatchEdit> edits) { return new JsonPatchMessage(documentId, clientId, edits); }
@Override public JsonPatchMessage fromJson(final String json) { return JsonMapper.fromJson(json, JsonPatchMessage.class); }
public Builder patch(final JsonPatch patch) { diff = new JsonPatchDiff(patch); return this; }
@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 JsonPatchEdit deserialize(final JsonParser jp, final DeserializationContext ctxt) throws IOException { final ObjectCodec oc = jp.getCodec(); final JsonNode edit = oc.readTree(jp); final Builder eb = JsonPatchEdit.withChecksum(edit.get("checksum").asText()); eb.clientVersion(edit.get("clientVersion").asLong()); eb.serverVersion(edit.get("serverVersion").asLong()); eb.checksum(edit.get("checksum").asText()); final JsonNode diffsNode = edit.get("diffs"); if (!diffsNode.isNull()) { eb.patch(JsonPatch.fromJson(diffsNode)); } return eb.build(); } }
@Override public JsonPatchEdit serverDiff(final Document<JsonNode> document, final ShadowDocument<JsonNode> shadowDocument) { final JsonNode shadowObject = shadowDocument.document().content(); return JsonPatchEdit.withPatch(JsonDiff.asJsonPatch(shadowObject, document.content())) .serverVersion(shadowDocument.serverVersion()) .clientVersion(shadowDocument.clientVersion()) .checksum(checksum(shadowObject)) .build(); }
@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); } }
@Override public void serialize(final JsonPatchEdit edit, final JsonGenerator jgen, final SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeStringField("msgType", "patch"); 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()); } } }
@Override public JsonPatchEdit clientDiff(final Document<JsonNode> document, final ShadowDocument<JsonNode> shadowDocument) { final JsonNode shadowObject = shadowDocument.document().content(); return JsonPatchEdit.withPatch(JsonDiff.asJsonPatch(document.content(), shadowObject)) .checksum(checksum(shadowObject)) .build(); }
private static ObjectMapper createObjectMapper() { om = new ObjectMapper(); final SimpleModule module = new SimpleModule("JsonMergePatch", new Version(1, 0, 0, null, "aerogear", "sync")); module.addDeserializer(JsonPatchEdit.class, new EditDeserializer()); module.addSerializer(JsonPatchEdit.class, new EditSerializer()); module.addDeserializer(JsonPatchMessage.class, new PatchMessageDeserializer()); module.addSerializer(JsonPatchMessage.class, new PatchMessageSerializer()); om.registerModule(module); return om; }
public static Builder withPatch(final JsonPatch patch) { return new Builder(patch); }
public JsonPatchEdit build() { return new JsonPatchEdit(this); } }
@Override public String asJson() { return JsonMapper.toJson(this); }
@Override public int hashCode() { int result = checksum.hashCode(); result = 31 * result + (int) (clientVersion ^ clientVersion >>> 32); result = 31 * result + (int) (serverVersion ^ serverVersion >>> 32); result = 31 * result + diff.hashCode(); return result; }
@Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } final JsonPatchEdit that = (JsonPatchEdit) o; if (clientVersion != that.clientVersion) { return false; } if (serverVersion != that.serverVersion) { return false; } if (!diff.equals(that.diff)) { return false; } return checksum.equals(that.checksum); }
@Override public PatchMessage<JsonPatchEdit> patchMessageFromJson(String json) { return JsonMapper.fromJson(json, JsonPatchMessage.class); }
private Builder(final JsonPatch patch) { diff = new JsonPatchDiff(patch); }
public static Builder withChecksum(final String checksum) { return new Builder(checksum); }