package jj.engine; import java.util.Map; import javax.inject.Inject; import javax.inject.Singleton; import jj.http.server.websocket.CurrentWebSocketConnection; import org.mozilla.javascript.Scriptable; /** * a simple object to cache info against a given connection * * for now, only available in the event phase * * would be a great api for localStorage but you * can't do continuations in an assignment context :( * * @author jason * */ @Singleton class ClientStorage implements HostObject { private Map<String,Object> data() { return connection.current().clientStorage(); } private final CurrentWebSocketConnection connection; @Inject ClientStorage(final CurrentWebSocketConnection connection) { this.connection = connection; } @Override public String name() { return "clientStorage"; } @Override public boolean constant() { return true; } @Override public boolean readonly() { return true; } @Override public boolean permanent() { return true; } @Override public boolean dontenum() { return true; } @Override public String getClassName() { return name(); } @Override public Object get(String name, Scriptable start) { return has(name, start) ? data().get(name) : NOT_FOUND; } @Override public Object get(int index, Scriptable start) { String key = String.valueOf(index); return has(key, start) ? data().get(key) : NOT_FOUND; } @Override public boolean has(String name, Scriptable start) { return data().containsKey(name); } @Override public boolean has(int index, Scriptable start) { return has(String.valueOf(index), start); } @Override public void put(String name, Scriptable start, Object value) { data().put(name, value); } @Override public void put(int index, Scriptable start, Object value) { data().put(String.valueOf(index), value); } @Override public void delete(String name) { data().remove(name); } @Override public void delete(int index) { data().remove(String.valueOf(index)); } @Override public Scriptable getPrototype() { return null; } @Override public void setPrototype(Scriptable prototype) { // no. asshole. } @Override public Scriptable getParentScope() { return null; } @Override public void setParentScope(Scriptable parent) { // no. asshole } @Override public Object[] getIds() { return data().keySet().toArray(); } @Override public Object getDefaultValue(Class<?> hint) { System.err.println("getDefaultValue"); return this; } @Override public boolean hasInstance(Scriptable instance) { return instance instanceof ClientStorage; } }