Skip to content

Commit

Permalink
Addresses cognitect/transit-clj#47 by interposing a transformer on ta…
Browse files Browse the repository at this point in the history
…g resolution when present. This handles the case where a transformer may convert an object into a form that the marhsaling phase may not be able to handle. This bifurcation between the classifying tag and the marshaled form was specifically causing issues where symbol map keys with metadata did not marshal into a stringable form but was classified as stringable earlier in the write phase.
  • Loading branch information
fogus committed Dec 14, 2021
1 parent 8fdb4d6 commit dcdda8c
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ protected AbstractEmitter(WriteHandlerMap writeHandlerMap, WriteHandler defaultW

protected AbstractEmitter(WriteHandlerMap writeHandlerMap, WriteHandler defaultWriteHandler, Function<Object,Object> transform) {
this.writeHandlerMap = writeHandlerMap;
this.writeHandlerMap.transform = transform;
this.defaultWriteHandler = defaultWriteHandler;
this.transform = transform;
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/cognitect/transit/impl/TagProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@

public interface TagProvider {
public String getTag(Object o);
public String getTagAfterPossibleTransform(Object o);
}
10 changes: 10 additions & 0 deletions src/main/java/com/cognitect/transit/impl/WriteHandlerMap.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.function.Function;

public class WriteHandlerMap implements TagProvider, Map<Class, WriteHandler<?, ?>> {

Expand Down Expand Up @@ -71,6 +72,7 @@ private static Map<Class, WriteHandler<?,?>> defaultHandlers() {

private final Map<Class, WriteHandler<?, ?>> handlers;
private WriteHandlerMap verboseHandlerMap;
Function<Object, Object> transform = null;

public WriteHandlerMap() {
this(null);
Expand Down Expand Up @@ -233,4 +235,12 @@ public String getTag(Object o) {
if (h == null) return null;
return h.tag(o);
}

@Override
public String getTagAfterPossibleTransform(Object o) {
if (transform != null)
return this.getTag(transform.apply(o));
else
return this.getTag(o);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private boolean stringableKeys(Map<Object, Object> m) {
Iterator<Object> i = m.keySet().iterator();
while(i.hasNext()) {
Object key = i.next();
String tag = tagProvider.getTag(key);
String tag = tagProvider.getTagAfterPossibleTransform(key);

if(tag != null && tag.length() > 1)
return false;
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/com/cognitect/transit/impl/WriterFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class WriterFactory {

private static final Map<Map<Class, WriteHandler<?,?>>, WriteHandlerMap> handlerCache = new Cache<Map<Class, WriteHandler<?,?>>, WriteHandlerMap>();

private static WriteHandlerMap handlerMap(Map<Class, WriteHandler<?, ?>> customHandlers) {
private static WriteHandlerMap buildWriteHandlerMap(Map<Class, WriteHandler<?, ?>> customHandlers) {
if (customHandlers instanceof WriteHandlerMap)
return new WriteHandlerMap(customHandlers);

Expand All @@ -35,7 +35,7 @@ private static WriteHandlerMap handlerMap(Map<Class, WriteHandler<?, ?>> customH
}

private static WriteHandlerMap verboseHandlerMap(Map<Class, WriteHandler<?, ?>> customHandlers) {
return handlerMap(customHandlers).verboseWriteHandlerMap();
return buildWriteHandlerMap(customHandlers).verboseWriteHandlerMap();
}

public static <T> Writer<T> getJsonInstance(final OutputStream out, Map<Class, WriteHandler<?,?>> customHandlers, WriteHandler<?, ?> defaultWriteHandler, boolean verboseMode) throws IOException {
Expand All @@ -50,7 +50,7 @@ public static <T> Writer<T> getJsonInstance(final OutputStream out, Map<Class, W
if (verboseMode) {
emitter = new JsonVerboseEmitter(gen, verboseHandlerMap(customHandlers), defaultWriteHandler, transform);
} else {
emitter = new JsonEmitter(gen, handlerMap(customHandlers), defaultWriteHandler, transform);
emitter = new JsonEmitter(gen, buildWriteHandlerMap(customHandlers), defaultWriteHandler, transform);
}

final WriteCache writeCache = new WriteCache(!verboseMode);
Expand All @@ -76,7 +76,7 @@ public static <T> Writer<T> getMsgpackInstance(final OutputStream out, Map<Class

Packer packer = new MessagePack().createPacker(out);

final MsgpackEmitter emitter = new MsgpackEmitter(packer, handlerMap(customHandlers), defaultWriteHandler, transform);
final MsgpackEmitter emitter = new MsgpackEmitter(packer, buildWriteHandlerMap(customHandlers), defaultWriteHandler, transform);

final WriteCache writeCache = new WriteCache(true);

Expand Down

0 comments on commit dcdda8c

Please sign in to comment.