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

View differences:

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