package com.greenaddress.greenapi; import com.blockstream.libwally.Wally; import org.bitcoinj.core.Coin; import org.bitcoinj.core.Sha256Hash; import org.codehaus.jackson.map.MappingJsonFactory; import java.io.Serializable; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.math.BigInteger; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; public class JSONMap implements Serializable { private static final SimpleDateFormat DATE_FORMAT = getDateFormat(); private static SimpleDateFormat getDateFormat() { final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("UTC")); return df; } public final Map<String, Object> mData; // Public for setting only public JSONMap() { mData = new HashMap(); } public JSONMap(final Map<String, Object> jsonMap) { mData = jsonMap; } public static List<JSONMap> fromList(final List list) { final List<JSONMap> result = new ArrayList<>(list.size()); for (final Object o : list) result.add(new JSONMap((Map<String, Object>) o)); return result; } public boolean containsKey(final String k) { return mData.containsKey(k); } public String getKey(final String k, final String altKey) { return containsKey(k) ? k : altKey; } public <T> T get(final String k, final T def) { return containsKey(k) ? (T) mData.get(k) : def; } public <T> T get(final String k) { return (T) mData.get(k); } public JSONMap getMap(final String k) { try { final String v = get(k, null); if (v == null) return null; return new JSONMap(new MappingJsonFactory().getCodec().readValue(v, Map.class)); } catch (final IOException e) { return null; } } public boolean getBool(final String k) { // Not present, present but null or false are false, otherwise true if (!containsKey(k)) return false; return Boolean.TRUE.equals(get(k)); } public String getString(final String k) { final Object o = containsKey(k) ? get(k) : null; return o == null ? null : o.toString(); } public Integer getInt(final String k) { return getInt(k, null); } public Integer getInt(final String k, final Integer def) { final String v = getString(k); return v == null ? def : Integer.valueOf(v); } public Date getDate(final String k) throws ParseException { final String v = getString(k); return v == null ? null : DATE_FORMAT.parse(v); } public Sha256Hash getHash(final String k) { final String v = getString(k); return v == null ? null : Sha256Hash.wrap(v); } public Long getLong(final String k) { final String v = getString(k); return v == null ? null : Long.valueOf(v); } public float getFloat(final String k) { final String v = getString(k); return v == null ? null : Float.valueOf(v); } public Coin getCoin(final String k) { final Long v = getLong(k); return v == null ? null : Coin.valueOf(v); } public BigInteger getBigInteger(final String k) { final String v = getString(k); return v == null ? null : new BigInteger(v); } public byte[] getBytes(final String k) { final String v = getString(k); return v == null ? null : Wally.hex_to_bytes(v); } public String toString() { return mData.toString(); } public void putBytes(final String k, final byte[] v) { mData.put(k, Wally.hex_from_bytes(v)); } }