/*
* AZ: this version facilitates spring instantiation
*/
package org.mozilla.javascript;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.nominanuda.rhino.host.HostObjectFactory;
import com.nominanuda.rhino.host.JavaObjectFactory;
import com.nominanuda.rhino.host.ModuleFactory;
import com.nominanuda.rhino.host.ModuleRegistry;
import com.nominanuda.rhino.host.Require;
import com.nominanuda.rhino.host.SourceModuleFactory;
public class SpringScopeFactory extends ScopeFactory {
private RhinoEmbedding embedding;
private Map<String, Object> requireJavaObjs;
private boolean cache = true;
public RhinoEmbedding getEmbedding() { // for RhinoHandler
return embedding;
}
public boolean getCache() { // for RhinoHandler
return cache;
}
public SpringScopeFactory() {
setJavaObjects(new LinkedHashMap<String, Object>()); // override ScopeFactory's immutable empty map
}
public void init() {
Map<String, Object> javaObjs = getJavaObjects();
if (javaObjs.isEmpty() || requireJavaObjs != null) {
List<ModuleFactory> factories = new LinkedList<>();
factories.add(new SourceModuleFactory());
HostObjectFactory hoFactory = new HostObjectFactory();
hoFactory.addObject("CONSOLE", "com.nominanuda.rhino.host.Console");
factories.add(hoFactory);
if (requireJavaObjs != null) {
factories.add(new JavaObjectFactory(requireJavaObjs));
}
ModuleRegistry moduleRegistry = new ModuleRegistry();
moduleRegistry.setModuleFactories(factories);
moduleRegistry.setCache(getCache());
Require require = new Require();
require.setRegistry(moduleRegistry);
javaObjs.put("require", require);
setJavaObjects(javaObjs);
}
}
/* setters */
@Override
public void setEmbedding(RhinoEmbedding embedding) {
this.embedding = embedding;
super.setEmbedding(embedding);
}
/**
* Call this method to have the scope automatically filled with a require
* module capable of loading those java objects by their map name
* @param requireJavaObjs
*/
public void setRequireJavaObjects(Map<String, Object> requireJavaObjs) {
this.requireJavaObjs = requireJavaObjs;
}
public void setRequireJavaObjectsMaps(List<Map<String, Object>> requireJavaObjsMaps) {
requireJavaObjs = new LinkedHashMap<String, Object>();
for (Map<String, Object> map : requireJavaObjsMaps) {
requireJavaObjs.putAll(map);
}
}
public void setCache(boolean cache) {
this.cache = cache;
}
}