Skip to content

Commit

Permalink
Make the API to obtain a JsonObject from a MessageExtras instance pub…
Browse files Browse the repository at this point in the history
…lic.

Also:
- some renaming for clarity
- add code to the DeltaExtras constructor to ensure that a JsonObject is always available, making the asJsonObject method easier to reason about
  • Loading branch information
Quintin Willison committed Jun 12, 2020
1 parent db2a17f commit e41c806
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 21 deletions.
44 changes: 25 additions & 19 deletions lib/src/main/java/io/ably/lib/types/MessageExtras.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ public final class MessageExtras {

private static final String DELTA = "delta";

private final DeltaExtras delta;
private final JsonObject raw;
private final DeltaExtras delta; // may be null
private final JsonObject jsonObject; // never null

/**
* Creates a MessageExtras instance to be sent as extra with a Message to Ably's servers.
Expand All @@ -32,41 +32,43 @@ public final class MessageExtras {
*
* @since 1.2.1
*/
public MessageExtras(final JsonObject raw) {
this.raw = raw;
delta = null;
public MessageExtras(final JsonObject jsonObject) {
this(jsonObject, null);
}

/**
* @since 1.2.0
*/
public MessageExtras(final DeltaExtras delta) {
this.delta = delta;
raw = null;
this(Serializer.wrapDelta(delta), delta);
}

private MessageExtras(final JsonObject raw, final DeltaExtras delta) {
this.raw = raw;
private MessageExtras(final JsonObject jsonObject, final DeltaExtras delta) {
if (null == jsonObject) {
throw new NullPointerException("jsonObject cannot be null.");
}

this.jsonObject = jsonObject;
this.delta = delta;
}

public DeltaExtras getDelta() {
return delta;
}

/* package private */ JsonObject getRaw() {
return raw;
public JsonObject asJsonObject() {
return jsonObject;
}

/* package private */ void write(MessagePacker packer) throws IOException {
if (null == raw) {
if (null == jsonObject) {
// raw is null, so delta is not null
packer.packMapHeader(1);
packer.packString(DELTA);
delta.write(packer);
} else {
// raw is not null, so delta can be ignored
Serialisation.gsonToMsgpack(raw, packer);
Serialisation.gsonToMsgpack(jsonObject, packer);
}
}

Expand Down Expand Up @@ -117,31 +119,35 @@ public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MessageExtras that = (MessageExtras) o;
return (null == raw) ?
return (null == jsonObject) ?
Objects.equals(delta, that.delta) :
Objects.equals(raw, that.raw);
Objects.equals(jsonObject, that.jsonObject);
}

@Override
public int hashCode() {
return (null == raw) ? Objects.hashCode(delta) : Objects.hashCode(raw);
return (null == jsonObject) ? Objects.hashCode(delta) : Objects.hashCode(jsonObject);
}

@Override
public String toString() {
return "MessageExtras{" +
DELTA + "=" + delta +
", raw=" + raw +
", raw=" + jsonObject +
'}';
}

public static class Serializer implements JsonSerializer<MessageExtras> {
@Override
public JsonElement serialize(final MessageExtras src, final Type typeOfSrc, final JsonSerializationContext context) {
return (null != src.raw) ? src.raw : wrapDelta(src.getDelta());
return (null != src.jsonObject) ? src.jsonObject : wrapDelta(src.getDelta());
}

private JsonObject wrapDelta(final DeltaExtras delta) {
public static JsonObject wrapDelta(final DeltaExtras delta) {
if (null == delta) {
throw new NullPointerException("delta cannot be null.");
}

final JsonObject json = new JsonObject();
json.add(DELTA, Serialisation.gson.toJsonTree(delta));
return json;
Expand Down
5 changes: 3 additions & 2 deletions lib/src/test/java/io/ably/lib/types/MessageExtrasTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ public void delta() {
public void deltaViaMessagePack() throws IOException {
final DeltaExtras deltaExtras = new DeltaExtras("tamrof", "morf");
final MessageExtras messageExtras = new MessageExtras(deltaExtras);
final JsonObject expectedMessageExtrasJsonObject = deltaExtrasJsonObject("tamrof", "morf");
assertEquals(expectedMessageExtrasJsonObject, messageExtras.asJsonObject());

// Encode to MessagePack
final ByteArrayOutputStream out = new ByteArrayOutputStream();
Expand All @@ -103,8 +105,7 @@ public void deltaViaMessagePack() throws IOException {

assertEquals(messageExtras.getDelta(), unpacked.getDelta());
assertEquals(messageExtras, unpacked);
assertNull(messageExtras.getRaw());
assertEquals(deltaExtrasJsonObject("tamrof", "morf"), unpacked.getRaw());
assertEquals(expectedMessageExtrasJsonObject, unpacked.asJsonObject());
}

private static JsonObject deltaExtrasJsonObject(final String format, final String from) {
Expand Down

0 comments on commit e41c806

Please sign in to comment.