Statistics
| Revision:

gvsig-scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.lib / org.gvsig.scripting.lib.impl / src / main / java / org / gvsig / scripting / impl / DefaultScriptingManager.java @ 226

History | View | Annotate | Download (12.3 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.net.MalformedURLException;
12
import java.util.ArrayList;
13
import java.util.HashMap;
14
import java.util.Iterator;
15
import java.util.List;
16
import java.util.Map;
17

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

    
25
import org.slf4j.Logger;
26
import org.slf4j.LoggerFactory;
27

    
28
import org.gvsig.scripting.ScriptingBaseScript;
29
import org.gvsig.scripting.ScriptingDialog;
30
import org.gvsig.scripting.ScriptingFolder;
31
import org.gvsig.scripting.ScriptingHelpManager;
32
import org.gvsig.scripting.ScriptingManager;
33
import org.gvsig.scripting.ScriptingProject;
34
import org.gvsig.scripting.ScriptingScript;
35
import org.gvsig.scripting.ScriptingUnit;
36

    
37
public class DefaultScriptingManager implements ScriptingManager{
38

    
39
    private static final Logger LOG = LoggerFactory
40
        .getLogger(DefaultScriptingManager.class);
41

    
42
        protected String rootUserFolder;
43
    protected Map<String, ImageIcon> icons;
44
        protected List<RegisterSystemFolder> systemFolders = new ArrayList<RegisterSystemFolder>();
45
        protected ScriptEngineManager engineManager = null;
46
        private final SimpleBindings bindings = new SimpleBindings();
47
        private final ScriptingHelpManager helpManager;
48
        private List<String> unitTypes = null;
49
    private ClassLoader classLoader = null;
50
        
51
    public DefaultScriptingManager() {
52
        this.helpManager = new DefaultScriptingHelpManager(this);
53
        initialize();
54
        this.classLoader = getClass().getClassLoader();
55
    }
56

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

    
62
    private void initialize() {
63
        this.rootUserFolder =
64
            System.getProperty("user.home") + File.separator + "scripts";
65

    
66
        File f =
67
            new File(System.getProperty("user.dir") + File.separator + ".."
68
                + File.separator + "org.gvsig.scripting.lib" + File.separator
69
                + "org.gvsig.scripting.lib.api" + File.separator + "target"
70
                + File.separator + "site" + File.separator + "apidoc");
71
        if (f.exists()) {
72
            try {
73
                this.helpManager.importHelp("ScriptingFrameworkHelp", f.toURI()
74
                    .toURL());
75
            } catch (MalformedURLException e) {
76
                // TODO Auto-generated catch block
77
                e.printStackTrace();
78
            }
79
        }
80
        this.bindings.put("ScriptingManager", this);
81
    }
82

    
83

    
84
        protected ScriptEngineManager getEngineManager(){
85
                if(this.engineManager == null){
86
            this.engineManager =
87
                classLoader == null ? new ScriptEngineManager()
88
                    : new ScriptEngineManager(classLoader);
89
            showEnginesInfo(engineManager);
90
                }
91
                return this.engineManager;
92
        }
93
        
94
    private void showEnginesInfo(ScriptEngineManager mgr) {
95
        if (LOG.isInfoEnabled()) {
96
            List<ScriptEngineFactory> factories = mgr.getEngineFactories();
97
            StringBuffer buffer = new StringBuffer();
98
            List<Object> values = new ArrayList<Object>();
99
            buffer.append("Scripting engines available:");
100
            for (ScriptEngineFactory factory : factories) {
101

    
102
                // Main engine info
103
                buffer
104
                    .append("\n- {}: version = {}, language = {}, langVersion = {}");
105
                values.add(factory.getEngineName());
106
                values.add(factory.getEngineVersion());
107
                values.add(factory.getLanguageName());
108
                values.add(factory.getLanguageVersion());
109

    
110
                // Aliases
111
                buffer.append("\n\t- Aliases: ");
112
                List<String> engNames = factory.getNames();
113
                int size = engNames.size();
114
                for (String name : engNames) {
115
                    size--;
116
                    buffer.append("{}");
117
                    if (size > 0) {
118
                        buffer.append(", ");
119
                    }
120
                    values.add(name);
121
                }
122
                buffer.append("\n\t- File extensions: ");
123
                List<String> extNames = factory.getExtensions();
124
                size = extNames.size();
125
                for (String name : extNames) {
126
                    size--;
127
                    buffer.append("{}");
128
                    if (size > 0) {
129
                        buffer.append(", ");
130
                    }
131
                    values.add(name);
132
                }
133
                buffer.append("\n\t- Mime types: ");
134
                List<String> mimeNames = factory.getMimeTypes();
135
                size = mimeNames.size();
136
                for (String name : mimeNames) {
137
                    size--;
138
                    buffer.append("{}");
139
                    if (size > 0) {
140
                        buffer.append(", ");
141
                    }
142
                    values.add(name);
143
                }
144

    
145
            }
146
            LOG.info(buffer.toString(), values.toArray());
147
        }
148
    }
149

    
150
    protected ScriptEngine getEngine(String langName) {
151
                ScriptEngine engine = this.getEngineManager().getEngineByName(langName);
152
                engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(bindings);
153
                return engine;
154
        }
155
        
156
        public ImageIcon getIcon(String name){
157
                return this.icons.get(name);
158
        }
159

    
160
        public Map<String,String> getSupportedLanguagesByExtension(){
161
        List<ScriptEngineFactory> factories =
162
            getEngineManager().getEngineFactories();
163
        Map<String, String> extToLang = new HashMap<String, String>();
164

    
165
        for (ScriptEngineFactory factory : factories) {
166
            List<String> extNames = factory.getExtensions();
167
            for (String name : extNames) {
168
                extToLang.put(".".concat(name), factory.getLanguageName());
169
            }
170
        }
171

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

    
208
                BufferedReader b = null;
209
                try {
210
                        b = new BufferedReader(new FileReader(filename));
211
                } catch (FileNotFoundException e) {
212
                        // TODO Auto-generated catch block
213
                        e.printStackTrace();
214
                }
215
                StringBuffer sb=new StringBuffer();
216
                String str;
217
                try {
218
                        while((str=b.readLine())!=null) {
219
                                sb.append(str);
220
                                sb.append('\n');
221
                        }
222
                } catch (IOException e) {
223
                        // TODO Auto-generated catch block
224
                        e.printStackTrace();
225
                }
226
                return sb.toString();
227

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

    
273
        public ScriptingFolder createFolder(ScriptingFolder folder, String id) {
274
                DefaultScriptingFolder fd = new DefaultScriptingFolder(this);
275
                File dir = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
276
                dir.mkdir();
277
                fd.load(folder,id);
278
                return fd;
279
        }
280

    
281
        public ScriptingProject createProject(ScriptingFolder folder, String id) {
282
                // TODO Auto-generated method stub
283
                return null;
284
        }
285

    
286
        public ScriptingScript createScript(ScriptingFolder folder, String id) {
287
                DefaultScriptingScript sc = new DefaultScriptingScript(this);
288
                sc.setId(id);
289
                File file = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
290
                try {
291
                        file.createNewFile();
292
                } catch (IOException e) {
293
                        // TODO Auto-generated catch block
294
                        e.printStackTrace();
295
                        return null;
296
                }
297
                sc.load(folder, id);
298
                return sc;
299
        }
300

    
301
        public ScriptingBaseScript getScript(File file) {
302
                ScriptingBaseScript script = (ScriptingBaseScript) this.getUnit(file);
303

    
304
                if (script == null){
305
                        throw new RuntimeException(file.getPath());
306
                }
307
                return script;
308
        }
309
        
310
        public ScriptingFolder getFolder(File file) {
311
                ScriptingFolder folder = (ScriptingFolder) this.getUnit(file);
312
                if (folder == null){
313
                        throw new RuntimeException(file.getAbsolutePath());
314
                }
315
                return folder;
316
        }
317
        
318
        public ScriptingUnit getUnit(File file) {
319
                ScriptingFolder folder = null;
320
                ScriptingUnit unit = null;
321

    
322
                folder = this.getUserFolder();
323
                unit = folder.getUnit(file);
324
                if( unit != null ) {
325
                        return unit;
326
                }
327
                
328
                folder = this.getSystemFolder();
329
                unit = folder.getUnit(file);
330
                if( unit != null ) {
331
                        return unit;
332
                }
333

    
334
                return null;
335
        }
336

    
337
        public ScriptingFolder getSystemFolder() {
338
                return new SystemFolder(this);
339
        }
340

    
341
        public ScriptingFolder getUserFolder() {
342
                return new UserFolder(this,new File(this.getRootUserFolder()));
343
        }
344

    
345
        public String getRootUserFolder() {
346
                return this.rootUserFolder;
347
        }
348
        
349
        public void setRootUserFolder(String path){
350
                this.rootUserFolder = path;
351
        }
352

    
353
        public void registerSystemFolder(String name, File folder) {
354
                this.systemFolders.add(new RegisterSystemFolder(name, folder));
355
        }
356
        
357
        public List<RegisterSystemFolder> getSystemFolders(){
358
                return this.systemFolders;
359
        }
360
        
361
        
362
        public static class RegisterSystemFolder {
363
                public String name;
364
                public File folder;
365
                
366
                public RegisterSystemFolder(String name, File folder) {
367
                        this.name = name;
368
                        this.folder = folder;
369
                }
370
        }
371

    
372

    
373
        public String getExtensionByLanguage(String langName) {
374
        Map<String, String> extensions = getSupportedLanguagesByExtension();
375
        Iterator<String> iterator = extensions.keySet().iterator();
376
                String extension = null;
377
                String s = null;
378
                
379
                while (iterator. hasNext()){
380
                        extension = iterator.next();
381
                        s = extensions.get(extension);
382
            if (s.equalsIgnoreCase(langName)) {
383
                                return extension;
384
                        }
385
                        
386
                }
387
                
388
                return null;
389
        }
390
        
391
        public Object get(String key) {
392
                return this.bindings.get(key);
393
        }
394

    
395
        public void put(String key, Object value) {
396
                this.bindings.put(key,value); 
397
                
398
        }
399

    
400
        public ScriptingHelpManager getHelpManager() {
401
                return this.helpManager;
402
        }
403

    
404
        public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id) {
405
                if(unitType.equals(UNIT_SCRIPT)){
406
                        return this.createScript(folder, id);
407
                }
408
                if(unitType.equals(UNIT_DIALOG)){
409
                        return this.createDialog(folder, id);
410
                }
411
                if(unitType.equals(UNIT_FOLDER)){
412
                        return this.createFolder(folder, id);
413
                }
414
                if(unitType.equals(UNIT_PROJECT)){
415
                        return null;
416
                }
417
                return null;
418
        }
419

    
420
        public List<String> getUnitTypes() {
421
                if(this.unitTypes==null){
422
                        this.unitTypes=new ArrayList<String>();
423
                        this.unitTypes.add(UNIT_SCRIPT);
424
                        this.unitTypes.add(UNIT_DIALOG);
425
                        this.unitTypes.add(UNIT_PROJECT);
426
                        this.unitTypes.add(UNIT_FOLDER);
427
                }
428
                return this.unitTypes;
429
        }
430
        
431
}