package org.qrone.r7.script;
import java.io.InputStream;
import java.net.URI;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Map;
import java.util.Set;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.qrone.r7.Extendable;
import org.qrone.r7.handler.URIHandler;
import org.qrone.r7.parser.HTML5Deck;
import org.qrone.r7.resolver.URIResolver;
import org.qrone.r7.script.window.WindowPrototype;
import org.qrone.util.XDeck;
public class ServerJSDeck extends XDeck<ServerJSOM> implements Extendable{
private HTML5Deck deck;
private Map<Thread, Context> map = new Hashtable<Thread, Context>();
private Scriptable globalScope;
private SugarWrapFactory wrapFactory;
private Set<Class> set = new HashSet<Class>();
public ServerJSDeck(URIResolver resolver, HTML5Deck deck){
super(resolver);
this.deck = deck;
wrapFactory = new SugarWrapFactory();
}
public HTML5Deck getHTML5Deck(){
return deck;
}
@Override
public ServerJSOM compile(URI uri, InputStream in, String encoding)
throws Exception {
ServerJSOM om = new ServerJSOM(this);
om.parser(uri);
return om;
}
public Set<Class> getWindowPrototypes(){
return set;
}
public Scriptable createScope(){
Context cx = getContext();
Scriptable global = getGlobalScope();
return cx.newObject(global);
}
public Scriptable getGlobalScope(){
if(globalScope == null){
globalScope = getContext().initStandardObjects();
}
return globalScope;
}
public Context getContext(){
Thread t = Thread.currentThread();
Context cx = map.get(t);
if(cx == null){
cx = Context.enter();
cx.setOptimizationLevel(9);
cx.setWrapFactory(wrapFactory);
map.put(t, cx);
}
return cx;
}
public void addExtension(Class wrapper) {
wrapFactory.addExtension(wrapper);
if(WindowPrototype.class.isAssignableFrom(wrapper)){
set.add(wrapper);
}
}
}