package org.pyneo.tabulae.fawlty; import android.support.annotation.NonNull; import android.util.Log; import java.io.IOException; import java.io.Writer; import java.util.Collection; import java.util.Map; import java.util.Set; import org.json.simple.JSONAware; import org.json.simple.JSONObject; import org.json.simple.JSONStreamAware; import static org.pyneo.tabulae.fawlty.Constants.*; public class TheDictionary implements JSONStreamAware, JSONAware, Map<String, Object> { private Map<String, Object> map = new JSONObject(); public TheDictionary() { } public TheDictionary(JSONObject map) { this.map = map; } @Override public void clear() { this.map.clear(); } @Override public boolean containsKey(Object o) { return this.map.containsKey(o); } @Override public boolean containsValue(Object o) { return this.map.containsValue(o); } @NonNull @Override public Set<Entry<String, Object>> entrySet() { return this.map.entrySet(); } public Object pop(String o) { Object r = this.map.get(o); this.map.remove(o); return r; } @Override public Object get(Object o) { return this.map.get(o); } @Override public boolean isEmpty() { return this.map.isEmpty(); } @NonNull @Override public Set<String> keySet() { return this.map.keySet(); } public Object put(String key, Object value) { return this.map.put(key, value); } @Override public void putAll(@NonNull Map<? extends String, ?> map) { if (map != null) { this.map.putAll(map); } } public void putAll(TheDictionary map) { if (map != null) { this.map.putAll(map.map); } } @Override public Object remove(Object o) { return this.map.remove(o); } @Override public int size() { return this.map.size(); } @NonNull public Collection<Object> values() { return this.map.values(); } public boolean getBoolean(String key) { if (!this.map.containsKey(key)) return false; return (Boolean) this.map.get(key); } public long getLong(String key) { if (!this.map.containsKey(key)) return 0; return (Long) this.map.get(key); } public double getDouble(String key) { if (!this.map.containsKey(key)) return Double.NaN; Object o = this.map.get(key); if (o instanceof Double) { return (Double) o; } return Double.NaN; } public String getString(String key) { if (!this.map.containsKey(key)) return ""; Object obj = this.map.get(key); return obj == null ? null : obj.toString(); } public String getIdent() { String ident = null; if (containsKey("ident")) { ident = getString("ident"); } else { char type = getString("type").charAt(0); switch (type) { case '\0': // dummy null value, no ident break; case '1': case '2': if (containsKey("mcc") && containsKey("mnc") && containsKey("lac") && containsKey("cid")) { ident = getString("type") + ":" + getString("mcc") + "." + getString("mnc") + "." + getString("lac") + "." + getString("cid"); } break; case '3': if (containsKey("mcc") && containsKey("mnc") && containsKey("lac") && containsKey("rncid") && containsKey("cid")) { ident = getString("type") + ":" + getString("mcc") + "." + getString("mnc") + "." + getString("lac") + "." + getString("rncid") + "." + getString("cid"); } break; case '4': if (containsKey("mcc") && containsKey("mnc") && containsKey("tac") && containsKey("cid")) { ident = getString("type") + ":" + getString("mcc") + "." + getString("mnc") + "." + getString("tac") + "." + getString("cid"); } break; case 'w': if (containsKey("bssid")) { ident = getString("type") + ":" + getString("bssid"); } break; case 'm': ident = getString("type") + ":"; break; default: Log.e(TAG, "getIdent: type=" + type); break; } put("ident", ident); } return ident; } public int getStatus() { // TODO if (DEBUG) Log.d(TAG, "getStatus:"); double distance = getDouble("distance"); double radius = getDouble("radius"); if (Double.isNaN(distance)) { this.map.put("status", "unknown"); return -1; } double accuracy = getDouble("accuracy"); if (distance < accuracy) { this.map.put("status", "excelent"); return 2; } if (radius != Double.NaN && distance < radius) { this.map.put("status", "good"); return 1; } this.map.put("status", "bad"); return 0; } public String getDescription() { if (DEBUG) Log.d(TAG, "getDescription:"); if (Double.isNaN(getDouble("radius"))) { return "No location for this id available."; } if (Double.isNaN(getDouble("accuracy"))) { return "No accurate location to compare with."; } if (Double.isNaN(getDouble("distance"))) { return "No data."; } return "The id-position is " + (int) getDouble("distance") + "m away from your position (which is accurate by " + (int) getDouble("accuracy") + "m) while the radius is " + (int) getDouble("radius") + "m."; } public String toJSONString() { return ((JSONObject) this.map).toJSONString(); } public String toString() { return this.map == null ? null : this.map.toString(); } public void writeJSONString(Writer out) throws IOException { ((JSONObject) this.map).writeJSONString(out); } }