Statistics
| Revision:

gvsig-scripting / 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 @ 1084

History | View | Annotate | Download (25.8 KB)

1 164 jobacas
package org.gvsig.scripting.impl;
2
3
import java.io.File;
4 669 jjdelcerro
import java.io.IOException;
5 1068 jjdelcerro
import java.net.URI;
6 164 jobacas
import java.util.ArrayList;
7 468 jjdelcerro
import java.util.Collections;
8 164 jobacas
import java.util.HashMap;
9
import java.util.Iterator;
10
import java.util.List;
11
import java.util.Map;
12 799 jjdelcerro
import java.util.Set;
13 164 jobacas
14
import javax.script.ScriptContext;
15
import javax.script.ScriptEngine;
16 220 cordinyana
import javax.script.ScriptEngineFactory;
17 164 jobacas
import javax.script.ScriptEngineManager;
18
import javax.script.SimpleBindings;
19
import javax.swing.ImageIcon;
20
21 799 jjdelcerro
import org.apache.commons.lang3.StringUtils;
22 1084 jjdelcerro
import org.gvsig.scripting.DataFolderFound;
23 164 jobacas
import org.gvsig.scripting.ScriptingBaseScript;
24
import org.gvsig.scripting.ScriptingDialog;
25 702 jjdelcerro
import org.gvsig.scripting.ScriptingExternalFile;
26 164 jobacas
import org.gvsig.scripting.ScriptingFolder;
27
import org.gvsig.scripting.ScriptingManager;
28
import org.gvsig.scripting.ScriptingScript;
29
import org.gvsig.scripting.ScriptingUnit;
30 1084 jjdelcerro
import org.gvsig.tools.packageutils.Version;
31 630 jjdelcerro
import org.gvsig.tools.script.Script;
32 468 jjdelcerro
import org.gvsig.tools.service.spi.ProviderFactory;
33 1084 jjdelcerro
import org.gvsig.tools.util.FolderSet;
34 679 jjdelcerro
import org.python.jsr223.MyPyScriptEngine;
35 301 jjdelcerro
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37 164 jobacas
38 630 jjdelcerro
39 1084 jjdelcerro
@SuppressWarnings("UseSpecificCatch")
40 464 jjdelcerro
public class DefaultScriptingManager implements ScriptingManager {
41 164 jobacas
42 468 jjdelcerro
    public static class RegisterSystemFolder {
43
44
        public String name;
45
        public File folder;
46
47
        public RegisterSystemFolder(String name, File folder) {
48
            this.name = name;
49
            this.folder = folder;
50
        }
51
    }
52
53 814 jjdelcerro
    static final Logger LOG = LoggerFactory
54 464 jjdelcerro
            .getLogger(DefaultScriptingManager.class);
55 799 jjdelcerro
56 212 cordinyana
    protected Map<String, ImageIcon> icons;
57 468 jjdelcerro
    protected List<RegisterSystemFolder> systemFolders = new ArrayList<>();
58 464 jjdelcerro
    protected ScriptEngineManager engineManager = null;
59
    private final SimpleBindings bindings = new SimpleBindings();
60
    private List<String> unitTypes = null;
61 220 cordinyana
    private ClassLoader classLoader = null;
62 799 jjdelcerro
    private final List<File> libFolders = new ArrayList<>();
63 301 jjdelcerro
    private File home = null;
64 799 jjdelcerro
    private final List<ScriptingFolder> alternativeUserFolders = new ArrayList<>();
65 468 jjdelcerro
    private Map<String, String> extensionOfLanguage = null;
66
    private Map<String, String> languageOfExtension = null;
67
    private File packagesFolder;
68 724 jjdelcerro
    private final Map properties = new HashMap();
69 799 jjdelcerro
    private final Map<String,ScriptEngine> engineGroups = new HashMap<>();
70 1084 jjdelcerro
    private DataFolderManager dataFolderManager = null;
71
    private ScriptingFolder userFolder = null;
72
    private ScriptingFolder systemFolder = null;
73 799 jjdelcerro
74 1020 jjdelcerro
    @SuppressWarnings({"OverridableMethodCallInConstructor", "LeakingThisInConstructor"})
75 220 cordinyana
    public DefaultScriptingManager() {
76 301 jjdelcerro
        this.classLoader = getClass().getClassLoader();
77
        this.setHomeFolder(null);
78
        this.bindings.put("ScriptingManager", this);
79 220 cordinyana
    }
80 164 jobacas
81 220 cordinyana
    public DefaultScriptingManager(ClassLoader classLoader) {
82
        this();
83
        this.classLoader = classLoader;
84
    }
85
86 724 jjdelcerro
    @Override
87
    public Object getProperty(Object key) {
88
        return properties.get(key);
89
    }
90
91
    @Override
92
    public void setProperty(Object key, Object val) {
93
        properties.put(key, val);
94
    }
95
96
    @Override
97
    public Map getExtendedProperties() {
98
        return properties;
99
    }
100
101 464 jjdelcerro
    private void createFolder(File f) {
102
        if (!f.exists()) {
103
            try {
104
                FileUtils.forceMkdir(f);
105
                LOG.info("Created scripting folder '" + f.getAbsolutePath() + "'");
106
            } catch (Throwable e) {
107
                LOG.warn("Can't Create scripting folder '" + f.getAbsolutePath() + "'");
108
            }
109
        }
110 301 jjdelcerro
    }
111 220 cordinyana
112 301 jjdelcerro
    private void createDefaultFolders(File home) {
113 464 jjdelcerro
        createFolder(new File(home, "scripts"));
114
        createFolder(new File(home, "lib"));
115 975 jjdelcerro
        createFolder(new File(home, "data"));
116 220 cordinyana
    }
117 464 jjdelcerro
118 468 jjdelcerro
    @Override
119 301 jjdelcerro
    public File getHomeFolder() {
120 464 jjdelcerro
        if (!this.home.exists()) {
121
            createFolder(home);
122
            createDefaultFolders(home);
123
        }
124
        return this.home;
125 301 jjdelcerro
    }
126 464 jjdelcerro
127 468 jjdelcerro
    @Override
128 301 jjdelcerro
    public void setHomeFolder(File home) {
129 464 jjdelcerro
        if (home == null) {
130
            this.home = new File(System.getProperty("user.home"), ".gvsig-scripting");
131
        } else {
132
            this.home = home;
133
        }
134
        createDefaultFolders(this.home);
135
        LOG.info("Set scripting home to '" + this.home.getAbsolutePath() + "'");
136
        this.addLibFolder(new File(this.home, "lib"));
137 301 jjdelcerro
    }
138 975 jjdelcerro
139 1084 jjdelcerro
    private DataFolderManager getDataFolderManager() {
140
        if( this.dataFolderManager==null ) {
141
            this.dataFolderManager = new DataFolderManager(this);
142
        }
143
        return this.dataFolderManager;
144
    }
145
146 986 jjdelcerro
    @Override
147 975 jjdelcerro
    public File getDataFolder(String id) {
148 1084 jjdelcerro
        return this.getDataFolderManager().getDataFolder(id);
149 975 jjdelcerro
    }
150 464 jjdelcerro
151 1084 jjdelcerro
    public void registerDataFolder(ScriptingFolder folderScript, String id ) {
152
        this.getDataFolderManager().registerDataFolder(folderScript, id);
153
    }
154
155
    @Override
156
    public List<DataFolderFound> searchOldVersions(Version currentVersion, FolderSet folder) {
157
        return this.getDataFolderManager().searchOldVersions(currentVersion, folder);
158
    }
159
160 799 jjdelcerro
    protected synchronized ScriptEngineManager getEngineManager() {
161 464 jjdelcerro
        if (this.engineManager == null) {
162
            this.engineManager
163
                    = classLoader == null ? new ScriptEngineManager()
164
                            : new ScriptEngineManager(classLoader);
165 220 cordinyana
            showEnginesInfo(engineManager);
166 464 jjdelcerro
        }
167
        return this.engineManager;
168
    }
169
170 220 cordinyana
    private void showEnginesInfo(ScriptEngineManager mgr) {
171
        if (LOG.isInfoEnabled()) {
172
            List<ScriptEngineFactory> factories = mgr.getEngineFactories();
173 468 jjdelcerro
            StringBuilder buffer = new StringBuilder();
174
            List<Object> values = new ArrayList<>();
175 220 cordinyana
            buffer.append("Scripting engines available:");
176
            for (ScriptEngineFactory factory : factories) {
177
178
                // Main engine info
179
                buffer
180 464 jjdelcerro
                        .append("\n- {}: version = {}, language = {}, langVersion = {}");
181 220 cordinyana
                values.add(factory.getEngineName());
182
                values.add(factory.getEngineVersion());
183
                values.add(factory.getLanguageName());
184
                values.add(factory.getLanguageVersion());
185
186
                // Aliases
187
                buffer.append("\n\t- Aliases: ");
188
                List<String> engNames = factory.getNames();
189
                int size = engNames.size();
190
                for (String name : engNames) {
191
                    size--;
192
                    buffer.append("{}");
193
                    if (size > 0) {
194
                        buffer.append(", ");
195
                    }
196
                    values.add(name);
197
                }
198
                buffer.append("\n\t- File extensions: ");
199
                List<String> extNames = factory.getExtensions();
200
                size = extNames.size();
201
                for (String name : extNames) {
202
                    size--;
203
                    buffer.append("{}");
204
                    if (size > 0) {
205
                        buffer.append(", ");
206
                    }
207
                    values.add(name);
208
                }
209
                buffer.append("\n\t- Mime types: ");
210
                List<String> mimeNames = factory.getMimeTypes();
211
                size = mimeNames.size();
212
                for (String name : mimeNames) {
213
                    size--;
214
                    buffer.append("{}");
215
                    if (size > 0) {
216
                        buffer.append(", ");
217
                    }
218
                    values.add(name);
219
                }
220
221
            }
222
            LOG.info(buffer.toString(), values.toArray());
223
        }
224
    }
225
226 799 jjdelcerro
    @Override
227
    public synchronized void loadEngines() {
228 583 jjdelcerro
        this.getEngineManager();
229
    }
230
231 799 jjdelcerro
    private ScriptEngine createJythonEngine() {
232
        ScriptEngineFactory factory = this.getEngineFactoryByLanguage(PYTHON_LANGUAGE_NAME);
233 679 jjdelcerro
        ScriptEngine engine = new MyPyScriptEngine(factory);
234 464 jjdelcerro
        return engine;
235
    }
236 679 jjdelcerro
237 464 jjdelcerro
    public ImageIcon getIcon(String name) {
238
        return this.icons.get(name);
239
    }
240
241 468 jjdelcerro
    @Override
242
    public String getEngineNameByLanguage(String langName) {
243 679 jjdelcerro
        ScriptEngineFactory factory = this.getEngineFactoryByLanguage(langName);
244
        if( factory == null ) {
245
            return null;
246
        }
247
        return factory.getEngineName();
248
    }
249 799 jjdelcerro
250
    public ScriptEngine getEngineByLanguage(String langName) {
251
        return this.getEngineByLanguage(langName, null);
252 724 jjdelcerro
    }
253 799 jjdelcerro
254
    public synchronized ScriptEngine getEngineByLanguage(String langName, String isolationGroup) {
255
        ScriptEngine engine = null;
256
        if( !StringUtils.isEmpty(isolationGroup) ) {
257
            isolationGroup += "-" + langName;
258
            engine = this.engineGroups.get(isolationGroup.toLowerCase());
259
        }
260
        if( engine == null ) {
261
            if( PYTHON_LANGUAGE_NAME.equalsIgnoreCase(langName) ) {
262
                engine = createJythonEngine();
263
            } else {
264
                ScriptEngineFactory factory = this.getEngineFactoryByLanguage(langName);
265
                if( factory == null ) {
266
                    return null;
267
                }
268
                engine = factory.getScriptEngine();
269 226 cordinyana
            }
270 1020 jjdelcerro
//            if( SCALA_LANGUAGE_NAME.equalsIgnoreCase(langName) ) {
271
//                try {
272
//                    // https://gist.github.com/takawitter/5479445
273
//                    Object settings = engine.getClass().getMethod("settings", new Class[0]).invoke(engine, new Object[0]);
274
//                    settings.getClass().getMethod("processArgumentString", new Class[] { String.class }).invoke(settings, new String[] { "-usejavacp"});
275
//                } catch(Throwable th) {
276
//                    LOG.warn("Can't initialice scala setting -usejavacp",th);
277
//                }
278
//            }
279 799 jjdelcerro
            if( !StringUtils.isEmpty(isolationGroup) ) {
280
                this.engineGroups.put(isolationGroup.toLowerCase(), engine);
281
            }
282 226 cordinyana
        }
283 679 jjdelcerro
        engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(bindings);
284
        return engine;
285 464 jjdelcerro
    }
286
287 799 jjdelcerro
    @Override
288
    public synchronized Set<String> getEnginesIsolationGroups() {
289
        return this.engineGroups.keySet();
290
    }
291
292 679 jjdelcerro
    public ScriptEngineFactory getEngineFactoryByLanguage(String langName) {
293 468 jjdelcerro
        List<ScriptEngineFactory> factories
294
                = getEngineManager().getEngineFactories();
295
296
        for (ScriptEngineFactory factory : factories) {
297
            if (factory.getLanguageName().equalsIgnoreCase(langName)) {
298 679 jjdelcerro
                return factory;
299 468 jjdelcerro
            }
300 464 jjdelcerro
        }
301 468 jjdelcerro
        return null;
302 464 jjdelcerro
    }
303
304 468 jjdelcerro
    @Override
305 464 jjdelcerro
    public boolean validateUnitId(ScriptingFolder folder, String id) {
306 724 jjdelcerro
        File f = new File(folder.getFile(),id+".inf");
307 1020 jjdelcerro
        return !f.exists();
308 464 jjdelcerro
    }
309 164 jobacas
310 464 jjdelcerro
    public ScriptingScript createScript(ScriptingFolder folder, String id) {
311
        return this.createScript(folder, id, null);
312
    }
313 630 jjdelcerro
314 799 jjdelcerro
    @Override
315 630 jjdelcerro
    public Script createScript(String name, String code, String languaje) {
316
        ScriptingScript script = new DefaultScriptingScript(this.getUserFolder(), this, name);
317
        script.setCode(code);
318
        script.setSaved(true);
319
        return script;
320
    }
321 164 jobacas
322 464 jjdelcerro
    private ScriptingScript createScript(ScriptingFolder folder, String id, String language) {
323
        DefaultScriptingScript script = new DefaultScriptingScript(folder, this, id);
324
        if (!script.getFile().exists()) {
325
            script.create(folder, id, language);
326
        } else {
327
            script.load(folder, id);
328
        }
329
        return script;
330
    }
331 164 jobacas
332 464 jjdelcerro
    public ScriptingDialog createDialog(ScriptingFolder folder, String id) {
333
        return this.createDialog(folder, id, null);
334
    }
335 164 jobacas
336 464 jjdelcerro
    private ScriptingDialog createDialog(ScriptingFolder folder, String id, String language) {
337
        DefaultScriptingDialog dialog = new DefaultScriptingDialog(folder, this, id);
338
        if (!dialog.getFile().exists()) {
339
            dialog.create(folder, id, language);
340
        } else {
341
            dialog.load(folder, id);
342
        }
343
        return dialog;
344
    }
345 164 jobacas
346 464 jjdelcerro
    public ScriptingFolder createFolder(ScriptingFolder folder, String id) {
347
        DefaultScriptingFolder unit = new DefaultScriptingFolder(folder, this, new File(folder.getFile(), id));
348 471 jjdelcerro
        unit.load(folder, id);
349 585 jjdelcerro
        if (!unit.getFile().exists()) {
350
            unit.create(folder, id);
351
        }
352 464 jjdelcerro
        return unit;
353
    }
354 164 jobacas
355 702 jjdelcerro
    public ScriptingExternalFile createExternalFile(ScriptingFolder folder, String id) {
356
        DefaultScriptingExternalFile unit = new DefaultScriptingExternalFile(folder, this, id);
357 952 jjdelcerro
        if( unit.getExternalFile()!=null && !unit.getExternalFile().exists() ) {
358
            unit.create(folder, id);
359
        }
360 702 jjdelcerro
        return unit;
361
    }
362
363 468 jjdelcerro
    @Override
364 464 jjdelcerro
    public ScriptingBaseScript getScript(File file) {
365
        ScriptingBaseScript script = (ScriptingBaseScript) this.getUnit(file);
366
        if (script == null) {
367
            throw new ScriptNotFoundException(file);
368
        }
369
        return script;
370
    }
371 1068 jjdelcerro
372
    @Override
373
    public Script loadScript(URI uri) {
374
        File f = new File(uri);
375
        try {
376
            return (Script) this.getScript(f);
377
        } catch(ScriptNotFoundException ex) {
378
            throw ex;
379
        } catch(Throwable th) {
380
            throw new ScriptNotFoundException(f);
381
        }
382
    }
383 164 jobacas
384 1068 jjdelcerro
385 989 jjdelcerro
386 468 jjdelcerro
    @Override
387 464 jjdelcerro
    public ScriptingFolder getFolder(File file) {
388 989 jjdelcerro
        if( file == null ) {
389
            throw new IllegalArgumentException("file argument can't be null");
390
        }
391
        file = this.getLinkSource(file);
392
        if( FileUtils.isSameFile(this.getRootUserFolder(),file) ) {
393
            return this.getUserFolder();
394
        }
395
396 464 jjdelcerro
        ScriptingFolder folder = (ScriptingFolder) this.getUnit(file);
397
        if (folder == null) {
398 989 jjdelcerro
            throw new IllegalArgumentException("Can't get ScriptFolder from '"+file.getAbsolutePath()+"'.");
399 464 jjdelcerro
        }
400
        return folder;
401
    }
402 301 jjdelcerro
403 1084 jjdelcerro
    public ScriptingUnit getUnit(String pathName) {
404
        ScriptingUnit unit = null;
405
        String[] parts = StringUtils.split(pathName, '/');
406
        if( pathName.equals(this.getUserFolder().getName()) ) {
407
            unit = this.getUserFolder().getUnit(
408
                    StringUtils.join(parts, "/", 1, parts.length)
409
            );
410
        } else if( pathName.equals(this.getSystemFolder().getName()) ) {
411
            unit = this.getSystemFolder().getUnit(
412
                    StringUtils.join(parts, "/", 1, parts.length)
413
            );
414
        }
415
        return unit;
416
    }
417
418 464 jjdelcerro
    public ScriptingUnit getUnit(File file) {
419 468 jjdelcerro
        ScriptingFolder folder;
420
        ScriptingUnit unit;
421 164 jobacas
422 464 jjdelcerro
        if (file.isAbsolute()) {
423 1084 jjdelcerro
            if( FileUtils.isSameFile(this.getRootUserFolder(), file.getParentFile()) ) {
424
                folder = this.getUserFolder();
425
                // FIXME: que pasa si esta en SystemFolder ???
426
            } else {
427
                folder = new DefaultScriptingFolder(null, this, file.getParentFile());
428
            }
429 464 jjdelcerro
            unit = folder.getUnit(file);
430
            return unit;
431
        } else {
432
            folder = this.getUserFolder();
433
            unit = folder.getUnit(file);
434
            if (unit != null) {
435
                return unit;
436
            }
437 164 jobacas
438 464 jjdelcerro
            folder = this.getSystemFolder();
439
            unit = folder.getUnit(file);
440
            if (unit != null) {
441
                return unit;
442
            }
443
        }
444
        return null;
445
    }
446
447 468 jjdelcerro
    @Override
448 464 jjdelcerro
    public ScriptingFolder getSystemFolder() {
449 1084 jjdelcerro
        if( this.systemFolder == null ) {
450
            this.systemFolder = new SystemFolder(this);
451
        }
452
        return  this.systemFolder;
453 464 jjdelcerro
    }
454
455 468 jjdelcerro
    @Override
456 464 jjdelcerro
    public ScriptingFolder getUserFolder() {
457 1084 jjdelcerro
        if( this.userFolder == null ) {
458
            this.userFolder = new UserFolder(this, this.getRootUserFolder());
459
        }
460
        return  this.userFolder;
461 464 jjdelcerro
    }
462
463 468 jjdelcerro
    @Override
464 464 jjdelcerro
    public ScriptingBaseScript getScript(String name) {
465
        return (ScriptingBaseScript) findScript(null, name);
466
    }
467
468 986 jjdelcerro
    @Override
469 814 jjdelcerro
    public Script locateScript(String name) {
470
        ScriptingUnit script = findScript(null, name);
471
        if( script instanceof Script ) {
472
            return (Script) script;
473
        }
474
        return null;
475
    }
476
477 464 jjdelcerro
    private ScriptingUnit findScript(ScriptingFolder folder, String name) {
478
        if (name == null) {
479
            return null;
480
        }
481
        if (name.trim().length() == 0) {
482
            return null;
483
        }
484 468 jjdelcerro
        ScriptingUnit unit;
485 464 jjdelcerro
        if (folder == null) {
486
            unit = findScript(this.getUserFolder(), name);
487
            if (unit != null) {
488
                return unit;
489
            }
490
            unit = findScript(this.getSystemFolder(), name);
491
            return unit;
492
        }
493
        List<ScriptingUnit> units = folder.getUnits();
494
        Iterator<ScriptingUnit> it = units.iterator();
495
        while (it.hasNext()) {
496
            unit = it.next();
497
            if (unit instanceof ScriptingFolder) {
498
                unit = findScript((ScriptingFolder) unit, name);
499
                if (unit != null) {
500
                    return unit;
501
                }
502
            } else if (unit instanceof ScriptingBaseScript) {
503
                if (name.equalsIgnoreCase(unit.getId())) {
504
                    return unit;
505
                }
506
            }
507
        }
508
        return null;
509
    }
510
511 468 jjdelcerro
    @Override
512 464 jjdelcerro
    public File getRootUserFolder() {
513
        return new File(this.getHomeFolder(), "scripts");
514
    }
515
516 468 jjdelcerro
    @Override
517 464 jjdelcerro
    public void registerSystemFolder(String name, File folder) {
518
        this.systemFolders.add(new RegisterSystemFolder(name, folder));
519
        LOG.info("Register system folder name '" + name + "' folder " + folder.getAbsolutePath() + "'");
520
521
    }
522
523
    public List<RegisterSystemFolder> getSystemFolders() {
524
        return this.systemFolders;
525
    }
526
527 468 jjdelcerro
    @Override
528 465 jjdelcerro
    public List<ScriptingFolder> getAlternativeUserFolders() {
529
        return this.alternativeUserFolders;
530
    }
531
532 468 jjdelcerro
    @Override
533 465 jjdelcerro
    public void addAlternativeUserFolder(File f, String name, String description) {
534
        UserFolder x = new UserFolder(this, f);
535 468 jjdelcerro
        x.setName(name);
536 465 jjdelcerro
        x.setDescription(description);
537 468 jjdelcerro
        x.setId("UserFolder_" + this.alternativeUserFolders.size() + 1);
538 465 jjdelcerro
        this.alternativeUserFolders.add(x);
539
    }
540 478 jjdelcerro
541
    private void initLanguages() {
542 468 jjdelcerro
        if (this.extensionOfLanguage == null) {
543 1020 jjdelcerro
            Map<String, String> theExtensionOfLanguage = new HashMap<>();
544 468 jjdelcerro
            List<ScriptEngineFactory> factories = getEngineManager().getEngineFactories();
545
            for (ScriptEngineFactory factory : factories) {
546 597 jjdelcerro
                if( "ognl".equals(factory.getLanguageName()) ) {
547
                    continue;
548
                }
549 468 jjdelcerro
                List<String> extensions = factory.getExtensions();
550
                if (extensions != null && !extensions.isEmpty()) {
551 1020 jjdelcerro
                    theExtensionOfLanguage.put(
552 468 jjdelcerro
                            factory.getLanguageName().toLowerCase(),
553
                            extensions.get(0).toLowerCase()
554
                    );
555
                }
556
            }
557 1020 jjdelcerro
            this.extensionOfLanguage = theExtensionOfLanguage;
558 464 jjdelcerro
        }
559 478 jjdelcerro
        if (this.languageOfExtension == null) {
560 1020 jjdelcerro
            Map<String, String> theLanguageOfExtension = new HashMap<>();
561 478 jjdelcerro
            List<ScriptEngineFactory> factories = getEngineManager().getEngineFactories();
562
            for (ScriptEngineFactory factory : factories) {
563 597 jjdelcerro
                if( "ognl".equals(factory.getLanguageName()) ) {
564
                    continue;
565
                }
566 478 jjdelcerro
                List<String> extensions = factory.getExtensions();
567
                if (extensions != null) {
568
                    for (String extension1 : extensions) {
569 1020 jjdelcerro
                        theLanguageOfExtension.put(
570 478 jjdelcerro
                                extension1.toLowerCase(),
571
                                factory.getLanguageName().toLowerCase()
572
                        );
573
                    }
574
                }
575
            }
576 1020 jjdelcerro
            this.languageOfExtension = theLanguageOfExtension;
577 478 jjdelcerro
        }
578
    }
579
580
    @Override
581
    public String getExtensionOfLanguage(String langName) {
582 468 jjdelcerro
        if (langName == null) {
583
            return null;
584
        }
585
        langName = langName.toLowerCase();
586 478 jjdelcerro
        initLanguages();
587 468 jjdelcerro
        return this.extensionOfLanguage.get(langName);
588 464 jjdelcerro
    }
589
590 468 jjdelcerro
    @Override
591
    public List<String> getSupportedLanguages() {
592
        List<String> languages = new ArrayList<>();
593 464 jjdelcerro
594 478 jjdelcerro
        initLanguages();
595 468 jjdelcerro
        languages.addAll(this.extensionOfLanguage.keySet());
596
        Collections.sort(languages);
597
        return languages;
598
    }
599 164 jobacas
600 468 jjdelcerro
    public String getLanguageOfExtension(String extension) {
601
        if (extension == null) {
602
            return null;
603 464 jjdelcerro
        }
604 468 jjdelcerro
        extension = extension.toLowerCase();
605
        if (extension.startsWith(".")) {
606
            extension = extension.substring(1);
607
        }
608 478 jjdelcerro
        initLanguages();
609 468 jjdelcerro
        return this.languageOfExtension.get(extension);
610 464 jjdelcerro
    }
611 175 jobacas
612 799 jjdelcerro
    @Override
613 464 jjdelcerro
    public Object get(String key) {
614
        return this.bindings.get(key);
615
    }
616 441 jjdelcerro
617 799 jjdelcerro
    @Override
618 464 jjdelcerro
    public void put(String key, Object value) {
619
        this.bindings.put(key, value);
620 175 jobacas
621 464 jjdelcerro
    }
622 301 jjdelcerro
623 468 jjdelcerro
    @Override
624 464 jjdelcerro
    public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id) {
625
        return createUnit(unitType, folder, id, null);
626
    }
627
628 468 jjdelcerro
    @Override
629 464 jjdelcerro
    public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id, String language) {
630
        if (unitType.equals(UNIT_SCRIPT)) {
631
            return this.createScript(folder, id, language);
632
        }
633
        if (unitType.equals(UNIT_DIALOG)) {
634
            return this.createDialog(folder, id, language);
635
        }
636
        if (unitType.equals(UNIT_FOLDER)) {
637
            return this.createFolder(folder, id);
638
        }
639 702 jjdelcerro
        if (unitType.equals(UNIT_EXTERNALFILE)) {
640
            return this.createExternalFile(folder, id);
641
        }
642 464 jjdelcerro
        return null;
643
    }
644
645 468 jjdelcerro
    @Override
646 464 jjdelcerro
    public List<String> getUnitTypes() {
647
        if (this.unitTypes == null) {
648 468 jjdelcerro
            this.unitTypes = new ArrayList<>();
649 464 jjdelcerro
            this.unitTypes.add(UNIT_SCRIPT);
650
            this.unitTypes.add(UNIT_DIALOG);
651
            this.unitTypes.add(UNIT_FOLDER);
652 702 jjdelcerro
            this.unitTypes.add(UNIT_EXTERNALFILE);
653 464 jjdelcerro
        }
654
        return this.unitTypes;
655
    }
656
657 468 jjdelcerro
    @Override
658 464 jjdelcerro
    public void addLibFolder(File lib) {
659
        if (lib.exists()) {
660
            LOG.info("Add scripting lib folder '" + lib.getAbsolutePath() + "'");
661
            this.libFolders.add(lib);
662
        } else {
663
            LOG.info("Skip add scripting lib folder '" + lib.getAbsolutePath() + "', folder don't exist");
664
        }
665
    }
666
667 669 jjdelcerro
    @Override
668 464 jjdelcerro
    public List<File> getLibFolders() {
669 669 jjdelcerro
        return new ArrayList(this.libFolders);
670 464 jjdelcerro
    }
671 468 jjdelcerro
672 669 jjdelcerro
    @Override
673
    public Map<String, String> getLibFoldersVersions() {
674
        Map<String, String>versions = new HashMap<>();
675
        List<File> folders = this.getLibFolders();
676
        for (File folder : folders) {
677
            File parent = folder.getParentFile();
678
            File libVersions = new File(parent,folder.getName()+".versions");
679
            if( libVersions.exists() ) {
680
                this.loadLibVersions(versions, libVersions);
681
            }
682
        }
683
        if( versions.isEmpty() ) {
684
            return null;
685
        }
686
        return versions;
687
    }
688
689
    private void loadLibVersions(Map<String,String>versions, File file) {
690
        List<String> lines;
691
        try {
692
            lines = FileUtils.readLines(file);
693
        } catch (IOException ex) {
694
            LOG.warn("Can't load lib versions from '"+file+".",ex);
695
            return;
696
        }
697
        for (String line : lines) {
698
            String[] x = line.split("=");
699
            if( x.length==2 ) {
700
                versions.put(x[0], x[1]);
701
            }
702
        }
703
    }
704
705
    @Override
706 468 jjdelcerro
    public ProviderFactory getInstallerFactory() {
707
        return new ScriptingInstallerProviderFactory();
708
    }
709
710 799 jjdelcerro
    @Override
711 468 jjdelcerro
    public File getPackagesFolder() {
712
        return this.packagesFolder;
713
    }
714
715
    @Override
716
    public void setPackagesFolder(File folder) {
717
        this.packagesFolder = folder;
718
    }
719
720 989 jjdelcerro
    @Override
721
    public ScriptingFolder createLink(String name, File link, String targetPathName) {
722
        StringBuilder contents = new StringBuilder();
723
        contents.append("[Unit]\n")
724
            .append("type = Folder\n")
725
            .append("name = ").append(name).append("\n")
726
            .append("description =\n")
727
            .append("createdBy =\n")
728
            .append("version =\n")
729
            .append("\n")
730
            .append("[Folder]\n")
731
            .append("path =").append(targetPathName).append("\n")
732
            .append("\n\n");
733
734
        if( link.isDirectory() ) {
735
            link = new File(link,name+".inf");
736
        } else if( !link.getName().endsWith(".inf") ) {
737
            link = new File( link.getPath() + ".inf");
738
        }
739
        if( !link.exists() ) {
740
            try {
741
                FileUtils.writeStringToFile(link, contents.toString());
742
            } catch (IOException ex) {
743
                LOG.warn("Can't create ScriptingFolder file in '" + link.getAbsolutePath() + "'.", ex);
744
            }
745
        }
746
        ScriptingFolder folder = this.getFolder(link);
747
        return folder;
748
    }
749
750
    @Override
751
    public ScriptingFolder createLink(String name, ScriptingFolder link, String targetPathName) {
752
        return this.createLink(name, link.getFile(), targetPathName);
753
    }
754
755 1020 jjdelcerro
    private final Map<File,File> links = new HashMap<>();
756 989 jjdelcerro
757
    public void addLink(File source, File target) {
758
        this.links.put(FileUtils.getRealFile(target), source);
759
    }
760
761
    public File getLinkSource(File target) {
762
        File source = this.links.get(FileUtils.getRealFile(target));
763
        if( source == null ) {
764
            return target;
765
        }
766
        if( source.exists() ) {
767
            return source;
768
        }
769
        return target;
770
    }
771
772
    public boolean isInUserFolder(File f) {
773
        if( FileUtils.isSubfolder(this.getRootUserFolder(), f) ) {
774
            return true;
775
        }
776
        for( File file : this.links.keySet()) {
777
            if( FileUtils.isSubfolder(file, f) ) {
778
                return true;
779
            }
780
        }
781
        return false;
782
    }
783 164 jobacas
}