package com.socrata.datasync.deltaimporter2; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.JsonToken; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.map.DeserializationContext; import org.codehaus.jackson.map.JsonDeserializer; import org.codehaus.jackson.map.annotate.JsonDeserialize; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; @JsonIgnoreProperties(ignoreUnknown=true) public class DI2Error { public ErrorType type; public Map<String, Object> data; @JsonDeserialize(using=ErrorTypeDeserializer.class) public enum ErrorType { NOT_A_COMMIT_DESCRIPTION("not-a-commit-description"), FILENAME_BAD_CHARACTERS("filename-bad-characters"), FILENAME_TOO_LONG("filename-too-long"), IMPOSSIBLE_RELATIVE_TO("impossible-relative-to"), UNDECODABLE_CONTROL("undecodable-control"), NON_UNIFORM_CHUNK("non-uniform-chunk"), NONEXISTANT_CHUNK("non-existant-chunk"), SIZE_MISMATCH("size-mismatch"); public final String tag; ErrorType(String tag) { this.tag = tag; } } public static class ErrorTypeDeserializer extends JsonDeserializer<ErrorType> { private static final Map<String, ErrorType> errorTypes; static { Map<String, ErrorType> map = new HashMap<>(); for(ErrorType e : ErrorType.values()) { map.put(e.tag, e); } errorTypes = Collections.unmodifiableMap(map); } @Override public ErrorType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { if(jsonParser.getCurrentToken() != JsonToken.VALUE_STRING) throw deserializationContext.wrongTokenException(jsonParser, JsonToken.VALUE_STRING, "Expected string"); String code = jsonParser.getText(); ErrorType result = errorTypes.get(code); if(result == null) throw deserializationContext.weirdStringException(ErrorType.class, "Unknown error code " + code); return result; } } }