package com.ctriposs.baiji.schema; import com.ctriposs.baiji.exception.BaijiTypeException; import com.ctriposs.baiji.util.ObjectUtils; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonNode; import java.io.IOException; public class MapSchema extends UnnamedSchema { private final Schema _valueSchema; /** * Static function to return new instance of map schema * * @param jtok JSON object for the map schema * @param props list of named schemas already read * @param names enclosing namespace of the map schema * @param encSpace * @return */ static MapSchema newInstance(JsonNode jtok, PropertyMap props, SchemaNames names, String encSpace) { JsonNode valuesNode = jtok.get("values"); if (valuesNode == null) { throw new BaijiTypeException("Map does not have 'values'"); } return new MapSchema(parseJson(valuesNode, names, encSpace), props); } /** * Constructor for map schema class * * @param valueSchema schema for map values type * @param props */ public MapSchema(Schema valueSchema, PropertyMap props) { super(SchemaType.MAP, props); if (null == valueSchema) { throw new IllegalArgumentException("valueSchema cannot be null."); } _valueSchema = valueSchema; } /** * @return Schema for map values type */ public Schema getValueSchema() { return _valueSchema; } /** * Writes map schema in JSON format * * @param gen JSON generator * @param names list of named schemas already written * @param encSpace enclosing namespace of the map schema */ @Override protected void writeJsonFields(JsonGenerator gen, SchemaNames names, String encSpace) throws IOException { gen.writeFieldName("values"); _valueSchema.writeJson(gen, names, encSpace); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof MapSchema)) { return false; } MapSchema that = (MapSchema) obj; if (that == null) { return false; } return _valueSchema.equals(that._valueSchema) && ObjectUtils.equals(that.getProps(), getProps()); } @Override public int hashCode() { return 29 * _valueSchema.hashCode() + ObjectUtils.hashCode(getProps()); } }