package com.ctriposs.baiji.schema; import com.ctriposs.baiji.exception.BaijiRuntimeException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ObjectNode; import java.io.IOException; import java.util.*; /** * Base class for objects that have Json-valued properties. */ public class PropertyMap extends HashMap<String, String> { private static final Set<String> reserved; static { reserved = new HashSet<String>(); reserved.add("type"); reserved.add("name"); reserved.add("namespace"); reserved.add("fields"); reserved.add("items"); reserved.add("size"); reserved.add("symbols"); reserved.add("values"); reserved.add("aliases"); reserved.add("order"); reserved.add("doc"); reserved.add("default"); } public void parse(JsonNode node) { if (!(node instanceof ObjectNode)) { return; } ObjectNode objNode = (ObjectNode) node; Iterator<Map.Entry<String, JsonNode>> fields = objNode.getFields(); while (fields.hasNext()) { Map.Entry<String, JsonNode> entry = fields.next(); if (reserved.contains(entry.getKey())) { continue; } String key = entry.getKey(); JsonNode value = entry.getValue(); if (!containsKey(key)) { put(key, value.isTextual() ? value.getTextValue() : value.asText()); } } } @Override public synchronized String put(String key, String value) { if (reserved.contains(key)) { throw new BaijiRuntimeException("Can't set reserved property: " + key); } String oldValue = get(key); if (oldValue == null) { return super.put(key, value); } else if (!oldValue.equals(value)) { throw new BaijiRuntimeException("Property cannot be overwritten: " + key); } return value; } void writeJson(JsonGenerator gen) throws IOException { for (Map.Entry<String, String> e : entrySet()) gen.writeObjectField(e.getKey(), e.getValue()); } }