package com.team254.lib.util;
import org.json.simple.JSONObject;
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;
import java.util.regex.Pattern;
/**
* @author bg Manages a set of serializable objects
*/
public class SystemManager {
private static SystemManager inst = null;
private class TappableHolder {
Tappable m_tappable;
StateHolder m_state_holder = new StateHolder();
public TappableHolder(Tappable t) {
m_tappable = t;
}
public StateHolder getStateHolder() {
return m_state_holder;
}
public void update() {
m_tappable.getState(m_state_holder);
}
}
private HashMap<String, TappableHolder> m_tappables;
public static SystemManager getInstance() {
if (inst == null) {
inst = new SystemManager();
}
return inst;
}
public SystemManager() {
this.m_tappables = new HashMap<String, TappableHolder>();
}
public void add(Tappable v) {
TappableHolder th = new TappableHolder(v);
m_tappables.put(v.getName(), th);
}
public void add(Collection<Tappable> values) {
for (Tappable v : values) {
TappableHolder th = new TappableHolder(v);
m_tappables.put(v.getName(), th);
}
}
private void updateStates(String system_key) {
m_tappables.get(system_key).update();
}
private void updateAllStates() {
Set<String> keys = m_tappables.keySet();
for (String key : keys) {
updateStates(key);
}
}
// Returns a map of all states
public JSONObject get() {
JSONObject states = new JSONObject();
Collection<String> system_keys = this.m_tappables.keySet();
updateAllStates();
for (String system_key : system_keys) {
TappableHolder th = m_tappables.get(system_key);
StateHolder sh = th.getStateHolder();
Set<String> th_keys = sh.keySet();
for (String th_key : th_keys) {
states.put(system_key + "." + th_key, sh.get(th_key));
}
}
return states;
}
private Object getValueForKey(String k) {
String[] pieces = k.split(Pattern.quote("."));
if (pieces.length != 2) {
return null;
}
String base = pieces[0];
String key = pieces[1];
TappableHolder th = m_tappables.get(base);
if (th == null) {
return null;
}
StateHolder sh = th.getStateHolder();
if (sh == null) {
return null;
}
return sh.get(key);
}
public JSONObject get(String k) {
return get(new String[]{k});
}
// Returns a map of states for the devices specified in args
public JSONObject get(String[] args) {
updateAllStates();
JSONObject states = new JSONObject();
for (String k : args) {
states.put(k, getValueForKey(k));
}
return states;
}
}