Revision 799 org.gvsig.scripting/trunk/org.gvsig.scripting/org.gvsig.scripting.lib/org.gvsig.scripting.lib.impl/src/main/java/org/gvsig/scripting/impl/DefaultScriptingManager.java
DefaultScriptingManager.java | ||
---|---|---|
8 | 8 |
import java.util.Iterator; |
9 | 9 |
import java.util.List; |
10 | 10 |
import java.util.Map; |
11 |
import java.util.ResourceBundle; |
|
12 |
import java.util.Set; |
|
11 | 13 |
|
12 | 14 |
import javax.script.ScriptContext; |
13 | 15 |
import javax.script.ScriptEngine; |
... | ... | |
17 | 19 |
import javax.swing.ImageIcon; |
18 | 20 |
|
19 | 21 |
import org.apache.commons.io.FileUtils; |
20 |
import org.apache.commons.io.FilenameUtils;
|
|
22 |
import org.apache.commons.lang3.StringUtils;
|
|
21 | 23 |
import org.gvsig.scripting.ScriptingBaseScript; |
22 | 24 |
import org.gvsig.scripting.ScriptingDialog; |
23 | 25 |
import org.gvsig.scripting.ScriptingExternalFile; |
... | ... | |
49 | 51 |
private static final Logger LOG = LoggerFactory |
50 | 52 |
.getLogger(DefaultScriptingManager.class); |
51 | 53 |
|
54 |
private static final String PYTHON_LANGUAGE_NAME = "python"; |
|
55 |
private static final String SCALA_LANGUAGE_NAME = "scala"; |
|
56 |
private static final String DEFAULT_ISOLATION_GROUP = "default"; |
|
57 |
|
|
52 | 58 |
protected Map<String, ImageIcon> icons; |
53 | 59 |
protected List<RegisterSystemFolder> systemFolders = new ArrayList<>(); |
54 | 60 |
protected ScriptEngineManager engineManager = null; |
... | ... | |
56 | 62 |
private ScriptingHelpManager helpManager = null; |
57 | 63 |
private List<String> unitTypes = null; |
58 | 64 |
private ClassLoader classLoader = null; |
59 |
private List<File> libFolders = new ArrayList<>(); |
|
65 |
private final List<File> libFolders = new ArrayList<>();
|
|
60 | 66 |
private File home = null; |
61 |
private List<ScriptingFolder> alternativeUserFolders = new ArrayList<>(); |
|
67 |
private final List<ScriptingFolder> alternativeUserFolders = new ArrayList<>();
|
|
62 | 68 |
private Map<String, String> extensionOfLanguage = null; |
63 | 69 |
private Map<String, String> languageOfExtension = null; |
64 | 70 |
private File packagesFolder; |
65 | 71 |
private final Map properties = new HashMap(); |
66 |
|
|
72 |
private final Map<String,ScriptEngine> engineGroups = new HashMap<>(); |
|
73 |
|
|
67 | 74 |
public DefaultScriptingManager() { |
68 | 75 |
this.classLoader = getClass().getClassLoader(); |
69 | 76 |
this.setHomeFolder(null); |
... | ... | |
128 | 135 |
this.addLibFolder(new File(this.home, "lib")); |
129 | 136 |
} |
130 | 137 |
|
131 |
protected ScriptEngineManager getEngineManager() { |
|
138 |
protected synchronized ScriptEngineManager getEngineManager() {
|
|
132 | 139 |
if (this.engineManager == null) { |
133 | 140 |
this.engineManager |
134 | 141 |
= classLoader == null ? new ScriptEngineManager() |
... | ... | |
194 | 201 |
} |
195 | 202 |
} |
196 | 203 |
|
197 |
public void loadEngines() { |
|
204 |
@Override |
|
205 |
public synchronized void loadEngines() { |
|
198 | 206 |
this.getEngineManager(); |
199 | 207 |
} |
200 | 208 |
|
201 |
private ScriptEngine getJythonEngine() {
|
|
202 |
ScriptEngineFactory factory = this.getEngineFactoryByLanguage("python");
|
|
209 |
private ScriptEngine createJythonEngine() {
|
|
210 |
ScriptEngineFactory factory = this.getEngineFactoryByLanguage(PYTHON_LANGUAGE_NAME);
|
|
203 | 211 |
ScriptEngine engine = new MyPyScriptEngine(factory); |
204 | 212 |
return engine; |
205 | 213 |
} |
... | ... | |
216 | 224 |
} |
217 | 225 |
return factory.getEngineName(); |
218 | 226 |
} |
219 |
|
|
220 |
public ScriptEngine createEngineByLanguage(String langName) {
|
|
221 |
return this.getEngineByLanguage(langName); |
|
227 |
|
|
228 |
public ScriptEngine getEngineByLanguage(String langName) {
|
|
229 |
return this.getEngineByLanguage(langName, null);
|
|
222 | 230 |
} |
223 |
|
|
224 |
public ScriptEngine getEngineByLanguage(String langName) { |
|
225 |
ScriptEngine engine; |
|
226 |
if( "python".equalsIgnoreCase(langName) ) { |
|
227 |
engine = getJythonEngine(); |
|
228 |
} else { |
|
229 |
ScriptEngineFactory factory = this.getEngineFactoryByLanguage(langName); |
|
230 |
if( factory == null ) { |
|
231 |
return null; |
|
231 |
|
|
232 |
public synchronized ScriptEngine getEngineByLanguage(String langName, String isolationGroup) { |
|
233 |
ScriptEngine engine = null; |
|
234 |
if( !StringUtils.isEmpty(isolationGroup) ) { |
|
235 |
isolationGroup += "-" + langName; |
|
236 |
engine = this.engineGroups.get(isolationGroup.toLowerCase()); |
|
237 |
} |
|
238 |
if( engine == null ) { |
|
239 |
if( PYTHON_LANGUAGE_NAME.equalsIgnoreCase(langName) ) { |
|
240 |
engine = createJythonEngine(); |
|
241 |
} else { |
|
242 |
ScriptEngineFactory factory = this.getEngineFactoryByLanguage(langName); |
|
243 |
if( factory == null ) { |
|
244 |
return null; |
|
245 |
} |
|
246 |
engine = factory.getScriptEngine(); |
|
232 | 247 |
} |
233 |
engine = factory.getScriptEngine(); |
|
248 |
if( SCALA_LANGUAGE_NAME.equalsIgnoreCase(langName) ) { |
|
249 |
try { |
|
250 |
// https://gist.github.com/takawitter/5479445 |
|
251 |
Object settings = engine.getClass().getMethod("settings", new Class[0]).invoke(engine, new Object[0]); |
|
252 |
settings.getClass().getMethod("processArgumentString", new Class[] { String.class }).invoke(settings, new String[] { "-usejavacp"}); |
|
253 |
} catch(Throwable th) { |
|
254 |
LOG.warn("Can't initialice scala setting -usejavacp",th); |
|
255 |
} |
|
256 |
} |
|
257 |
if( !StringUtils.isEmpty(isolationGroup) ) { |
|
258 |
this.engineGroups.put(isolationGroup.toLowerCase(), engine); |
|
259 |
} |
|
234 | 260 |
} |
235 | 261 |
engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(bindings); |
236 | 262 |
return engine; |
237 | 263 |
} |
238 | 264 |
|
265 |
@Override |
|
266 |
public synchronized Set<String> getEnginesIsolationGroups() { |
|
267 |
return this.engineGroups.keySet(); |
|
268 |
} |
|
269 |
|
|
239 | 270 |
public ScriptEngineFactory getEngineFactoryByLanguage(String langName) { |
240 | 271 |
List<ScriptEngineFactory> factories |
241 | 272 |
= getEngineManager().getEngineFactories(); |
... | ... | |
271 | 302 |
return this.createScript(folder, id, null); |
272 | 303 |
} |
273 | 304 |
|
305 |
@Override |
|
274 | 306 |
public Script createScript(String name, String code, String languaje) { |
275 | 307 |
ScriptingScript script = new DefaultScriptingScript(this.getUserFolder(), this, name); |
276 | 308 |
script.setCode(code); |
... | ... | |
508 | 540 |
return this.languageOfExtension.get(extension); |
509 | 541 |
} |
510 | 542 |
|
543 |
@Override |
|
511 | 544 |
public Object get(String key) { |
512 | 545 |
return this.bindings.get(key); |
513 | 546 |
} |
514 | 547 |
|
548 |
@Override |
|
515 | 549 |
public void put(String key, Object value) { |
516 | 550 |
this.bindings.put(key, value); |
517 | 551 |
|
... | ... | |
612 | 646 |
return new ScriptingInstallerProviderFactory(); |
613 | 647 |
} |
614 | 648 |
|
649 |
@Override |
|
615 | 650 |
public ProviderFactory getHelpInstallerFactory() { |
616 | 651 |
return new ScriptingHelpInstallerProviderFactory(); |
617 | 652 |
} |
Also available in: Unified diff