package org.deviceconnect.message; import java.util.List; import java.util.Map; import java.util.Set; abstract class AbstractMessageParser { void parse(final DConnectMessage message) { if (message == null) { throw new NullPointerException("message is null"); } startParse(); parseObject(message); endParse(); } /** * パース開始. */ abstract void startParse(); /** * キー. * * @param key キー */ abstract void onKey(String key); /** * 値. * * @param value 値 */ abstract void onValue(Object value); /** * 配列開始. */ abstract void startArray(); /** * 配列終了. */ abstract void endArray(); /** * マップ開始. */ abstract void startMap(); /** * マップ終了. */ abstract void endMap(); /** * パース終了. */ abstract void endParse(); @SuppressWarnings("unchecked") private Set<String> getKeySet(final Object message) { Set<String> keySet = null; if (message instanceof Map) { keySet = ((Map<String, Object>) message).keySet(); } return keySet; } @SuppressWarnings("unchecked") private Object getValue(final Object message, final String key) { return ((Map<String, Object>) message).get(key); } private boolean isArray(final Object value) { return (value instanceof List); } private boolean isMap(final Object value) { return (value instanceof Map); } private List<?> toArray(final Object value) { return (List<?>) value; } /** * オブジェクトをパースする. * * @param object オブジェクト */ private void parseObject(final Object object) { if (isMap(object)) { startMap(); for (String key : getKeySet(object)) { onKey(key); parseObject(getValue(object, key)); } endMap(); } else if (isArray(object)) { startArray(); for (Object obj : toArray(object)) { parseObject(obj); } endArray(); } else { onValue(object); } } }