package com.flexmls.flexmls_api.models; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.DeserializationContext; import org.codehaus.jackson.map.DeserializerProvider; import org.codehaus.jackson.map.JsonDeserializer; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.type.TypeFactory; import org.codehaus.jackson.type.JavaType; @JsonDeserialize(using=StandardField.MapperDeserializer.class) public class StandardField extends Base { @JsonProperty private Map<String, Field> fieldMap = new HashMap<String, StandardField.Field>(); /** * The design of the base class didn't anticipate results that are a loose map of results. In * this deserializer I work around jackson to explicitly create the mapping and bind it to a * class instance. * * TODO I'm probably doing some of this wrong, but haven't looked much into deserializer * examples to clean up. */ public static class MapperDeserializer extends JsonDeserializer<StandardField> { @Override public StandardField deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { JavaType jt = TypeFactory.mapType(Map.class, String.class, Field.class); DeserializerProvider deserializerProvider = ctxt.getDeserializerProvider(); JsonDeserializer<Object> z = deserializerProvider.findTypedValueDeserializer(ctxt.getConfig(), jt); @SuppressWarnings("unchecked") Map<String, Field>o = (Map<String, Field>)z.deserialize(jp, ctxt); if(o == null) { throw new JsonMappingException("StandardField entity doesn't support the format presented", jp.getTokenLocation()); } return new StandardField(o); } } public enum Type { Integer(Integer.class), Decimal(Double.class), Boolean(Boolean.class), Character(String.class); private Class<?> klass; private Type(Class<?> c){ this.klass = c; } public Class<?> getKlass() { return klass; } } public static class Field extends Base { @JsonProperty("Searchable") private boolean searchable; @JsonProperty("Type") private Type type; @JsonProperty("ResourceUri") private String resourceUri; @JsonProperty("HasList") private boolean hasList; public boolean isSearchable() { return searchable; } public void setSearchable(boolean searchable) { this.searchable = searchable; } public Type getType() { return type; } public void setType(Type type) { this.type = type; } public String getResourceUri() { return resourceUri; } public void setResourceUri(String resourceUri) { this.resourceUri = resourceUri; } public boolean isHasList() { return hasList; } public void setHasList(boolean hasList) { this.hasList = hasList; } } public StandardField(Map<String, Field> fieldMap) { super(); this.fieldMap = fieldMap; } public StandardField() { super(); // Default } public void setField(String key, Field value){ fieldMap.put(key, value); } public StandardField.Field getField(String key){ return fieldMap.get(key); } @Override @JsonIgnore public void setAttribute(String key, Object value) { super.setAttribute(key, value); } }