package org.qrone.r7.script.ext; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.Wrapper; public class ScriptableMap implements Map{ private Scriptable scr; private Set keys; private List values; public ScriptableMap(Scriptable scr){ this.scr = scr; Object[] ids = scr.getIds(); keys = new HashSet(); for (int i = 0; i < ids.length; i++) { keys.add(ids[i]); } } public static Map from(Object obj){ if(obj instanceof Scriptable){ if( obj instanceof Wrapper){ Object unwrapped = ((Wrapper)obj).unwrap(); if(unwrapped instanceof Map) return (Map)unwrapped; } return new ScriptableMap((Scriptable)obj); }else if(obj instanceof Map){ return (Map)obj; } throw new IllegalArgumentException(); } @Override public int size() { return keys.size(); } @Override public boolean isEmpty() { return keys.isEmpty(); } @Override public boolean containsKey(Object key) { return keys.contains(key); } @Override public boolean containsValue(Object value) { return values.contains(value); } @Override public Object get(Object key) { return scr.get(key.toString(), scr); } @Override public Object put(Object key, Object value) { throw new UnsupportedOperationException(); } @Override public Object remove(Object key) { throw new UnsupportedOperationException(); } @Override public void putAll(Map m) { throw new UnsupportedOperationException(); } @Override public void clear() { throw new UnsupportedOperationException(); } @Override public Set keySet() { return keys; } @Override public Collection values() { if(values != null) return values; values = new ArrayList(); for (Object key : keys) { values.add(scr.get(key.toString(), scr)); } return values; } @Override public Set entrySet() { Set l = new HashSet(); for (final Object key : l) { l.add(new Map.Entry() { @Override public Object getKey() { return key; } @Override public Object getValue() { return scr.get(key.toString(), scr); } @Override public Object setValue(Object value) { throw new UnsupportedOperationException(); } }); } return l; } }