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 @ 441

History | View | Annotate | Download (13.4 KB)

1
package org.gvsig.scripting.impl;
2

    
3
import java.io.BufferedReader;
4
import java.io.File;
5
import java.io.FileNotFoundException;
6
import java.io.FileReader;
7
import java.io.IOException;
8
import java.util.ArrayList;
9
import java.util.HashMap;
10
import java.util.Iterator;
11
import java.util.List;
12
import java.util.Map;
13

    
14
import javax.script.ScriptContext;
15
import javax.script.ScriptEngine;
16
import javax.script.ScriptEngineFactory;
17
import javax.script.ScriptEngineManager;
18
import javax.script.SimpleBindings;
19
import javax.swing.ImageIcon;
20

    
21
import org.apache.commons.io.FileUtils;
22
import org.gvsig.scripting.ScriptingBaseScript;
23
import org.gvsig.scripting.ScriptingDialog;
24
import org.gvsig.scripting.ScriptingFolder;
25
import org.gvsig.scripting.ScriptingHelpManager;
26
import org.gvsig.scripting.ScriptingManager;
27
import org.gvsig.scripting.ScriptingProject;
28
import org.gvsig.scripting.ScriptingScript;
29
import org.gvsig.scripting.ScriptingUnit;
30
import org.slf4j.Logger;
31
import org.slf4j.LoggerFactory;
32

    
33
public class DefaultScriptingManager implements ScriptingManager{
34

    
35
    private static final Logger LOG = LoggerFactory
36
        .getLogger(DefaultScriptingManager.class);
37

    
38
    protected Map<String, ImageIcon> icons;
39
        protected List<RegisterSystemFolder> systemFolders = new ArrayList<RegisterSystemFolder>();
40
        protected ScriptEngineManager engineManager = null;
41
        private final SimpleBindings bindings = new SimpleBindings();
42
        private ScriptingHelpManager helpManager = null;
43
        private List<String> unitTypes = null;
44
    private ClassLoader classLoader = null;
45
    private List<File> libFolders = new ArrayList<File>();
46
    private File home = null;
47
        
48
    public DefaultScriptingManager() {
49
        this.classLoader = getClass().getClassLoader();
50
        this.setHomeFolder(null);
51
        this.bindings.put("ScriptingManager", this);
52
    }
53

    
54
    public DefaultScriptingManager(ClassLoader classLoader) {
55
        this();
56
        this.classLoader = classLoader;
57
    }
58

    
59
    private void createFolder(File f){
60
            if( !f.exists() ) {
61
                        try {
62
                                FileUtils.forceMkdir(f);
63
                                LOG.info("Created scripting folder '"+f.getAbsolutePath()+"'");
64
                        } catch (Throwable e) {
65
                                LOG.warn("Can't Create scripting folder '"+f.getAbsolutePath()+"'");
66
                        }
67
            }
68
    }
69

    
70
    private void createDefaultFolders(File home) {
71
            createFolder(new File(home,"scripts"));
72
            createFolder(new File(home,"help"));
73
            createFolder(new File(home,"lib"));
74
    }
75
    
76
    public File getHomeFolder() {
77
            if( !this.home.exists() ) {
78
                    createFolder(home);
79
                    createDefaultFolders(home);
80
            }
81
            return this.home;
82
    }
83
    
84
    public void setHomeFolder(File home) {
85
            if( home == null ) {
86
                    this.home = new File(System.getProperty("user.home"), ".gvsig-scripting");
87
            } else {
88
                    this.home = home;
89
            }
90
            createDefaultFolders(this.home);
91
                LOG.info("Set scripting home to '"+this.home.getAbsolutePath()+"'");
92
                this.addLibFolder(new File(this.home,"lib"));
93
    }
94
    
95
        protected ScriptEngineManager getEngineManager(){
96
                if(this.engineManager == null){
97
            this.engineManager =
98
                classLoader == null ? new ScriptEngineManager()
99
                    : new ScriptEngineManager(classLoader);
100
            showEnginesInfo(engineManager);
101
                }
102
                return this.engineManager;
103
        }
104
        
105
    private void showEnginesInfo(ScriptEngineManager mgr) {
106
        if (LOG.isInfoEnabled()) {
107
            List<ScriptEngineFactory> factories = mgr.getEngineFactories();
108
            StringBuffer buffer = new StringBuffer();
109
            List<Object> values = new ArrayList<Object>();
110
            buffer.append("Scripting engines available:");
111
            for (ScriptEngineFactory factory : factories) {
112

    
113
                // Main engine info
114
                buffer
115
                    .append("\n- {}: version = {}, language = {}, langVersion = {}");
116
                values.add(factory.getEngineName());
117
                values.add(factory.getEngineVersion());
118
                values.add(factory.getLanguageName());
119
                values.add(factory.getLanguageVersion());
120

    
121
                // Aliases
122
                buffer.append("\n\t- Aliases: ");
123
                List<String> engNames = factory.getNames();
124
                int size = engNames.size();
125
                for (String name : engNames) {
126
                    size--;
127
                    buffer.append("{}");
128
                    if (size > 0) {
129
                        buffer.append(", ");
130
                    }
131
                    values.add(name);
132
                }
133
                buffer.append("\n\t- File extensions: ");
134
                List<String> extNames = factory.getExtensions();
135
                size = extNames.size();
136
                for (String name : extNames) {
137
                    size--;
138
                    buffer.append("{}");
139
                    if (size > 0) {
140
                        buffer.append(", ");
141
                    }
142
                    values.add(name);
143
                }
144
                buffer.append("\n\t- Mime types: ");
145
                List<String> mimeNames = factory.getMimeTypes();
146
                size = mimeNames.size();
147
                for (String name : mimeNames) {
148
                    size--;
149
                    buffer.append("{}");
150
                    if (size > 0) {
151
                        buffer.append(", ");
152
                    }
153
                    values.add(name);
154
                }
155

    
156
            }
157
            LOG.info(buffer.toString(), values.toArray());
158
        }
159
    }
160

    
161
    protected ScriptEngine getEngine(String langName) {
162
                ScriptEngine engine = this.getEngineManager().getEngineByName(langName);
163
                engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(bindings);
164
                return engine;
165
        }
166
        
167
        public ImageIcon getIcon(String name){
168
                return this.icons.get(name);
169
        }
170

    
171
        public Map<String,String> getSupportedLanguagesByExtension(){
172
        List<ScriptEngineFactory> factories =
173
            getEngineManager().getEngineFactories();
174
        Map<String, String> extToLang = new HashMap<String, String>();
175

    
176
        for (ScriptEngineFactory factory : factories) {
177
            List<String> extNames = factory.getExtensions();
178
            for (String name : extNames) {
179
                extToLang.put(".".concat(name), factory.getLanguageName());
180
            }
181
        }
182

    
183
        return extToLang;
184
        }
185
        
186
        public Map<String, String> getExtensionsByLanguages(){
187
        Map<String, String> l = getSupportedLanguagesByExtension();
188
                Map<String,String> result = new HashMap<String,String>();
189
        Iterator<Map.Entry<String, String>> it = l.entrySet().iterator();
190
            while (it.hasNext()) {
191
            Map.Entry<String, String> pairs = it.next();
192
            result.put(pairs.getValue(), pairs.getKey());
193
            }
194
                return result;
195
        }
196
        
197
        public boolean validateUnitId(ScriptingFolder folder, String id){
198
        List<ScriptingUnit> units = folder.getUnits();
199
                String fileName;
200
                String s[];
201
                String extension;
202
                for(int i=0; i<units.size();i++){
203
                        fileName = (units.get(i)).getId();
204
                        s = fileName.split("\\.");
205
                        extension = null;
206
                        if (s.length>1){
207
                                extension ="." +  s[s.length-1];
208
                                fileName = fileName.substring(0,fileName.length()-extension.length());
209
                        }
210
                        if(fileName.equals(id)){
211
                                return false;
212
                        }
213
                }
214
                return true;
215
        }
216
        
217
        public static String getStringFromFile(String filename){
218

    
219
                BufferedReader b = null;
220
                try {
221
                        try {
222
                                b = new BufferedReader(new FileReader(filename));
223
                        } catch (FileNotFoundException e) {
224
                                LOG.warn("Can't open file '"+filename+"'.",e);
225
                        }
226
                        StringBuffer sb=new StringBuffer();
227
                        String str;
228
                        try {
229
                                while((str=b.readLine())!=null) {
230
                                        sb.append(str);
231
                                        sb.append('\n');
232
                                }
233
                        } catch (IOException e) {
234
                                LOG.warn("Can't read file '"+filename+"'.",e);
235
                        }
236
                        return sb.toString();
237
                } finally {
238
                        if( b!=null ) {
239
                                try {
240
                                        b.close();
241
                                } catch (IOException e) {
242
                                        LOG.warn("Can't close file '"+filename+"'", e);
243
                                }
244
                                b = null;
245
                        }
246
                }
247
        }
248
        
249
        public ScriptingScript createScript(ScriptingFolder folder, String id) {
250
                return this.createScript(folder, id, null);
251
        }
252

    
253
        private ScriptingScript createScript(ScriptingFolder folder, String id, String language) {
254
                DefaultScriptingScript script = new DefaultScriptingScript(folder, this, id);
255
                if( !script.getFile().exists() ) {
256
                        script.create(folder, id, language);
257
                } else {
258
                        script.load(folder, id);
259
                }
260
                return script;
261
        }
262

    
263
        public ScriptingDialog createDialog(ScriptingFolder folder, String id) {
264
                return this.createDialog(folder, id, null);
265
        }
266
        
267
        private ScriptingDialog createDialog(ScriptingFolder folder, String id, String language) {
268
                DefaultScriptingDialog dialog = new DefaultScriptingDialog(folder, this, id);
269
                if( !dialog.getFile().exists() ) {
270
                        dialog.create(folder, id, language);
271
                } else {
272
                        dialog.load(folder, id);
273
                }
274
                return dialog;
275
        }
276

    
277
        public ScriptingFolder createFolder(ScriptingFolder folder, String id) {
278
                DefaultScriptingFolder unit = new DefaultScriptingFolder(folder, this);
279
                if( !unit.getFile().exists() ) {
280
                        unit.create(folder, id);
281
                } else {
282
                        unit.load(folder,id);
283
                }
284
                return folder;
285
        }
286

    
287
        public ScriptingProject createProject(ScriptingFolder folder, String id) {
288
                LOG.warn("Projects can't be implementeds");
289
                return null;
290
        }
291

    
292
        public ScriptingBaseScript getScript(File file) {
293
                ScriptingBaseScript script = (ScriptingBaseScript) this.getUnit(file);
294
                if (script == null){
295
                        throw new RuntimeException(file.getPath());
296
                }
297
                return script;
298
        }
299
        
300
        public ScriptingFolder getFolder(File file) {
301
                ScriptingFolder folder = (ScriptingFolder) this.getUnit(file);
302
                if (folder == null){
303
                        throw new RuntimeException(file.getAbsolutePath());
304
                }
305
                return folder;
306
        }
307
        
308
        public ScriptingUnit getUnit(File file) {
309
                ScriptingFolder folder = null;
310
                ScriptingUnit unit = null;
311

    
312
                folder = this.getUserFolder();
313
                unit = folder.getUnit(file);
314
                if( unit != null ) {
315
                        return unit;
316
                }
317
                
318
                folder = this.getSystemFolder();
319
                unit = folder.getUnit(file);
320
                if( unit != null ) {
321
                        return unit;
322
                }
323

    
324
                return null;
325
        }
326

    
327
        public ScriptingFolder getSystemFolder() {
328
                return new SystemFolder(this);
329
        }
330

    
331
        public ScriptingFolder getUserFolder() {
332
                return new UserFolder(this,this.getRootUserFolder());
333
        }
334
        
335
        public ScriptingBaseScript getScript(String name) {
336
                return (ScriptingBaseScript)findScript(null, name);
337
        }
338

    
339
        private ScriptingUnit findScript(ScriptingFolder folder, String name) {
340
                if( name==null ) {
341
                        return null;
342
                }
343
                if( name.trim().length()==0 ) {
344
                        return  null;
345
                }
346
                ScriptingUnit unit = null;
347
                if( folder == null ) {
348
                        unit = findScript(this.getUserFolder(), name);
349
                        if( unit != null ) {
350
                                return unit;
351
                        }
352
                        unit = findScript(this.getSystemFolder(), name);
353
                        return unit;
354
                }
355
                List<ScriptingUnit> units = folder.getUnits();
356
                Iterator<ScriptingUnit> it = units.iterator();
357
                while( it.hasNext() ) {
358
                        unit = it.next();
359
                        if( unit instanceof ScriptingFolder ) {
360
                                unit = findScript((ScriptingFolder) unit, name);
361
                                if( unit!= null ) {
362
                                        return unit;
363
                                }
364
                        } else if( unit instanceof ScriptingBaseScript ) {
365
                                if( name.equalsIgnoreCase(unit.getId()))  {
366
                                        return unit;
367
                                }
368
                        }
369
                }
370
                return null;
371
        }
372
        
373
        public File getRootUserFolder() {
374
                return new File(this.getHomeFolder(),"scripts");
375
        }
376
        
377
        public void registerSystemFolder(String name, File folder) {
378
                this.systemFolders.add(new RegisterSystemFolder(name, folder));
379
            LOG.info("Register system folder name '"+name+"' folder "+folder.getAbsolutePath()+"'");
380

    
381
        }
382
        
383
        public List<RegisterSystemFolder> getSystemFolders(){
384
                return this.systemFolders;
385
        }
386
        
387
        
388
        public static class RegisterSystemFolder {
389
                public String name;
390
                public File folder;
391
                
392
                public RegisterSystemFolder(String name, File folder) {
393
                        this.name = name;
394
                        this.folder = folder;
395
                }
396
        }
397

    
398

    
399
        public String getExtensionByLanguage(String langName) {
400
        Map<String, String> extensions = getSupportedLanguagesByExtension();
401
        Iterator<String> iterator = extensions.keySet().iterator();
402
                String extension = null;
403
                String s = null;
404
                
405
                while (iterator. hasNext()){
406
                        extension = iterator.next();
407
                        s = extensions.get(extension);
408
            if (s.equalsIgnoreCase(langName)) {
409
                                return extension;
410
                        }
411
                        
412
                }
413
                
414
                return null;
415
        }
416
        
417
        public Object get(String key) {
418
                return this.bindings.get(key);
419
        }
420

    
421
        public void put(String key, Object value) {
422
                this.bindings.put(key,value); 
423
                
424
        }
425

    
426
        public ScriptingHelpManager getHelpManager() {
427
                if( this.helpManager == null ) {
428
                        this.helpManager = new DefaultScriptingHelpManager(this);
429
                }
430
                return this.helpManager;
431
        }
432

    
433
        public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id) {
434
                return createUnit(unitType, folder, id, null);
435
        }
436

    
437
        public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id, String language) {
438
                if(unitType.equals(UNIT_SCRIPT)){
439
                        return this.createScript(folder, id, language);
440
                }
441
                if(unitType.equals(UNIT_DIALOG)){
442
                        return this.createDialog(folder, id, language);
443
                }
444
                if(unitType.equals(UNIT_FOLDER)){
445
                        return this.createFolder(folder, id);
446
                }
447
                if(unitType.equals(UNIT_PROJECT)){
448
                        return null;
449
                }
450
                return null;
451
        }
452

    
453
        public List<String> getUnitTypes() {
454
                if(this.unitTypes==null){
455
                        this.unitTypes=new ArrayList<String>();
456
                        this.unitTypes.add(UNIT_SCRIPT);
457
                        this.unitTypes.add(UNIT_DIALOG);
458
                        this.unitTypes.add(UNIT_PROJECT);
459
                        this.unitTypes.add(UNIT_FOLDER);
460
                }
461
                return this.unitTypes;
462
        }
463

    
464
        public void addLibFolder(File lib) {
465
                if( lib.exists() ) {
466
                        LOG.info("Add scripting lib folder '"+lib.getAbsolutePath()+"'");
467
                        this.libFolders.add(lib);
468
                } else {
469
                        LOG.info("Skip add scripting lib folder '"+lib.getAbsolutePath()+"', folder don't exist");
470
                }
471
        }
472
        
473
        public List<File> getLibFolders() {
474
                return this.libFolders;
475
        }
476
}