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

History | View | Annotate | Download (13.8 KB)

1
package org.gvsig.scripting.impl;
2

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

    
17
import javax.script.ScriptContext;
18
import javax.script.ScriptEngine;
19
import javax.script.ScriptEngineFactory;
20
import javax.script.ScriptEngineManager;
21
import javax.script.SimpleBindings;
22
import javax.swing.ImageIcon;
23

    
24
import org.gvsig.scripting.ScriptingBaseScript;
25
import org.gvsig.scripting.ScriptingDialog;
26
import org.gvsig.scripting.ScriptingFolder;
27
import org.gvsig.scripting.ScriptingHelpManager;
28
import org.gvsig.scripting.ScriptingManager;
29
import org.gvsig.scripting.ScriptingProject;
30
import org.gvsig.scripting.ScriptingScript;
31
import org.gvsig.scripting.ScriptingUnit;
32
import org.slf4j.Logger;
33
import org.slf4j.LoggerFactory;
34

    
35
public class DefaultScriptingManager implements ScriptingManager{
36

    
37
    private static final Logger LOG = LoggerFactory
38
        .getLogger(DefaultScriptingManager.class);
39

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

    
56
    public DefaultScriptingManager(ClassLoader classLoader) {
57
        this();
58
        this.classLoader = classLoader;
59
    }
60

    
61
    private void createFolder(File f){
62
            if( !f.exists() ) {
63
                        try {
64
                                if( f.mkdir() ) {
65
                                        LOG.info("Created scripting folder '"+f.getAbsolutePath()+"'");
66
                                }
67
                        } catch (Throwable e) {
68
                                // Ignore it.
69
                        }
70
            }
71
    }
72

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

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

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

    
159
            }
160
            LOG.info(buffer.toString(), values.toArray());
161
        }
162
    }
163

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

    
174
        public Map<String,String> getSupportedLanguagesByExtension(){
175
        List<ScriptEngineFactory> factories =
176
            getEngineManager().getEngineFactories();
177
        Map<String, String> extToLang = new HashMap<String, String>();
178

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

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

    
222
                BufferedReader b = null;
223
                try {
224
                        b = new BufferedReader(new FileReader(filename));
225
                } catch (FileNotFoundException e) {
226
                        // TODO Auto-generated catch block
227
                        e.printStackTrace();
228
                }
229
                StringBuffer sb=new StringBuffer();
230
                String str;
231
                try {
232
                        while((str=b.readLine())!=null) {
233
                                sb.append(str);
234
                                sb.append('\n');
235
                        }
236
                } catch (IOException e) {
237
                        // TODO Auto-generated catch block
238
                        e.printStackTrace();
239
                }
240
                return sb.toString();
241

    
242
        }
243
        
244
        public ScriptingDialog createDialog(ScriptingFolder folder, String id) {
245
                DefaultScriptingDialog sd = new DefaultScriptingDialog(this);
246
                sd.setId(id);
247
                File file = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
248
                try {
249
                        file.createNewFile();
250
                } catch (IOException e) {
251
                        // TODO Auto-generated catch block
252
                        e.printStackTrace();
253
                }
254
                
255
                // Eliminamos la extensión, para crear el '.dlg'
256
                String s[] = id.split("\\.");
257
                String newId;
258
                if (s.length>=2){
259
                        String extension ="." +  s[s.length-1];
260
                        newId = id.substring(0,id.length()-extension.length());
261
                }else{
262
                        newId = id;
263
                }
264
                File fileDlg = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+newId+".dlg");
265
                try {
266
                        fileDlg.createNewFile();
267
                } catch (IOException e) {
268
                        // TODO Auto-generated catch block
269
                        e.printStackTrace();
270
                }
271
                
272
                // Escribimos en el fichero '.dlg' lo mínimo para que pueda ejecutarse
273
            Writer output = null; 
274
            try {
275
                        output = new BufferedWriter(new FileWriter(fileDlg));
276
                        output.write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<panel/>");
277
                        output.close();
278
                } catch (IOException e) {
279
                        // TODO Auto-generated catch block
280
                        e.printStackTrace();
281
                }
282
            
283
                sd.load(folder, id);
284
                return sd;
285
        }
286

    
287
        public ScriptingFolder createFolder(ScriptingFolder folder, String id) {
288
                DefaultScriptingFolder fd = new DefaultScriptingFolder(this);
289
                File dir = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
290
                dir.mkdir();
291
                fd.load(folder,id);
292
                return fd;
293
        }
294

    
295
        public ScriptingProject createProject(ScriptingFolder folder, String id) {
296
                // TODO Auto-generated method stub
297
                return null;
298
        }
299

    
300
        public ScriptingScript createScript(ScriptingFolder folder, String id) {
301
                DefaultScriptingScript sc = new DefaultScriptingScript(this);
302
                sc.setId(id);
303
                File file = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
304
                try {
305
                        file.createNewFile();
306
                } catch (IOException e) {
307
                        // TODO Auto-generated catch block
308
                        e.printStackTrace();
309
                        return null;
310
                }
311
                sc.load(folder, id);
312
                return sc;
313
        }
314

    
315
        public ScriptingBaseScript getScript(File file) {
316
                ScriptingBaseScript script = (ScriptingBaseScript) this.getUnit(file);
317

    
318
                if (script == null){
319
                        throw new RuntimeException(file.getPath());
320
                }
321
                return script;
322
        }
323
        
324
        public ScriptingFolder getFolder(File file) {
325
                ScriptingFolder folder = (ScriptingFolder) this.getUnit(file);
326
                if (folder == null){
327
                        throw new RuntimeException(file.getAbsolutePath());
328
                }
329
                return folder;
330
        }
331
        
332
        public ScriptingUnit getUnit(File file) {
333
                ScriptingFolder folder = null;
334
                ScriptingUnit unit = null;
335

    
336
                folder = this.getUserFolder();
337
                unit = folder.getUnit(file);
338
                if( unit != null ) {
339
                        return unit;
340
                }
341
                
342
                folder = this.getSystemFolder();
343
                unit = folder.getUnit(file);
344
                if( unit != null ) {
345
                        return unit;
346
                }
347

    
348
                return null;
349
        }
350

    
351
        public ScriptingFolder getSystemFolder() {
352
                return new SystemFolder(this);
353
        }
354

    
355
        public ScriptingFolder getUserFolder() {
356
                return new UserFolder(this,this.getRootUserFolder());
357
        }
358
        
359
        public ScriptingBaseScript getScript(String name) {
360
                return (ScriptingBaseScript)findScript(null, name);
361
        }
362

    
363
        private ScriptingUnit findScript(ScriptingFolder folder, String name) {
364
                if( name==null ) {
365
                        return null;
366
                }
367
                if( name.trim().length()==0 ) {
368
                        return  null;
369
                }
370
                ScriptingUnit unit = null;
371
                if( folder == null ) {
372
                        unit = findScript(this.getUserFolder(), name);
373
                        if( unit != null ) {
374
                                return unit;
375
                        }
376
                        unit = findScript(this.getSystemFolder(), name);
377
                        return unit;
378
                }
379
                List<ScriptingUnit> units = folder.getUnits();
380
                Iterator it = units.iterator();
381
                while( it.hasNext() ) {
382
                        unit =  (ScriptingUnit) it.next();
383
                        if( unit instanceof ScriptingFolder ) {
384
                                unit = findScript((ScriptingFolder) unit, name);
385
                                if( unit!= null ) {
386
                                        return unit;
387
                                }
388
                        } else if( unit instanceof ScriptingBaseScript ) {
389
                                if( name.equalsIgnoreCase(unit.getId()))  {
390
                                        return unit;
391
                                }
392
                        }
393
                }
394
                return null;
395
        }
396
        
397
        public File getRootUserFolder() {
398
                return new File(this.getHomeFolder(),"scripts");
399
        }
400
        
401
        public void registerSystemFolder(String name, File folder) {
402
                this.systemFolders.add(new RegisterSystemFolder(name, folder));
403
            LOG.info("Register system folder name '"+name+"' folder "+folder.getAbsolutePath()+"'");
404

    
405
        }
406
        
407
        public List<RegisterSystemFolder> getSystemFolders(){
408
                return this.systemFolders;
409
        }
410
        
411
        
412
        public static class RegisterSystemFolder {
413
                public String name;
414
                public File folder;
415
                
416
                public RegisterSystemFolder(String name, File folder) {
417
                        this.name = name;
418
                        this.folder = folder;
419
                }
420
        }
421

    
422

    
423
        public String getExtensionByLanguage(String langName) {
424
        Map<String, String> extensions = getSupportedLanguagesByExtension();
425
        Iterator<String> iterator = extensions.keySet().iterator();
426
                String extension = null;
427
                String s = null;
428
                
429
                while (iterator. hasNext()){
430
                        extension = iterator.next();
431
                        s = extensions.get(extension);
432
            if (s.equalsIgnoreCase(langName)) {
433
                                return extension;
434
                        }
435
                        
436
                }
437
                
438
                return null;
439
        }
440
        
441
        public Object get(String key) {
442
                return this.bindings.get(key);
443
        }
444

    
445
        public void put(String key, Object value) {
446
                this.bindings.put(key,value); 
447
                
448
        }
449

    
450
        public ScriptingHelpManager getHelpManager() {
451
                if( this.helpManager == null ) {
452
                        this.helpManager = new DefaultScriptingHelpManager(this);
453
                }
454
                return this.helpManager;
455
        }
456

    
457
        public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id) {
458
                if(unitType.equals(UNIT_SCRIPT)){
459
                        return this.createScript(folder, id);
460
                }
461
                if(unitType.equals(UNIT_DIALOG)){
462
                        return this.createDialog(folder, id);
463
                }
464
                if(unitType.equals(UNIT_FOLDER)){
465
                        return this.createFolder(folder, id);
466
                }
467
                if(unitType.equals(UNIT_PROJECT)){
468
                        return null;
469
                }
470
                return null;
471
        }
472

    
473
        public List<String> getUnitTypes() {
474
                if(this.unitTypes==null){
475
                        this.unitTypes=new ArrayList<String>();
476
                        this.unitTypes.add(UNIT_SCRIPT);
477
                        this.unitTypes.add(UNIT_DIALOG);
478
                        this.unitTypes.add(UNIT_PROJECT);
479
                        this.unitTypes.add(UNIT_FOLDER);
480
                }
481
                return this.unitTypes;
482
        }
483

    
484
        public void addLibFolder(File lib) {
485
                if( lib.exists() ) {
486
                        LOG.info("Add scripting lib folder '"+lib.getAbsolutePath()+"'");
487
                        this.libFolders.add(lib);
488
                } else {
489
                        LOG.info("Skip add scripting lib folder '"+lib.getAbsolutePath()+"', folder don't exist");
490
                }
491
        }
492
        
493
        public List<File> getLibFolders() {
494
                return this.libFolders;
495
        }
496
}