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

History | View | Annotate | Download (9.08 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.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

    
33
public class DefaultScriptingManager implements ScriptingManager{
34

    
35
        protected String rootUserFolder;
36
    protected Map<String, ImageIcon> icons;
37
        protected List<RegisterSystemFolder> systemFolders = new ArrayList<RegisterSystemFolder>();
38
        protected ScriptEngineManager engineManager = null;
39
        private final SimpleBindings bindings = new SimpleBindings();
40
        private final ScriptingHelpManager helpManager;
41
        private List<String> unitTypes = null;
42
        
43
        public DefaultScriptingManager(){
44
                this.rootUserFolder = System.getProperty("user.home") + File.separator + "scripts";
45
                this.helpManager = new DefaultScriptingHelpManager(this);
46

    
47
                File f = new File (System.getProperty("user.dir")+File.separator+".."+File.separator+"org.gvsig.scripting.lib"+File.separator+"org.gvsig.scripting.lib.api"+File.separator+"target"+File.separator+"site"+File.separator+"apidoc");
48
                if(f.exists()){
49
                        try {
50
                this.helpManager.importHelp("ScriptingFrameworkHelp", f.toURI()
51
                    .toURL());
52
                        } catch (MalformedURLException e) {
53
                                // TODO Auto-generated catch block
54
                                e.printStackTrace();
55
                        }
56
                }
57
                this.bindings.put("ScriptingManager", this);
58
        }
59
        
60
        protected ScriptEngineManager getEngineManager(){
61
                if(this.engineManager == null){
62
                        this.engineManager = new ScriptEngineManager();
63
                }
64
                return this.engineManager;
65
        }
66
        
67
        public ScriptEngine getEngine(String langName){
68
                ScriptEngine engine = this.getEngineManager().getEngineByName(langName);
69
                engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(bindings);
70
                return engine;
71
        }
72
        
73
        public ImageIcon getIcon(String name){
74
                return this.icons.get(name);
75
        }
76

    
77
        public Map<String,String> getSupportedLanguagesByExtension(){
78
                Map<String,String> l = new HashMap<String,String>();
79
                l.put(".py", "python");
80
                l.put(".js", "javascript");
81
                l.put(".bsh", "beanshell");
82
                l.put(".gvy", "groovy");
83
                return l;
84
        }
85
        
86
        public Map<String, String> getExtensionsByLanguages(){
87
        Map<String, String> l = getSupportedLanguagesByExtension();
88
                Map<String,String> result = new HashMap<String,String>();
89
        Iterator<Map.Entry<String, String>> it = l.entrySet().iterator();
90
            while (it.hasNext()) {
91
            Map.Entry<String, String> pairs = it.next();
92
            result.put(pairs.getValue(), pairs.getKey());
93
            }
94
                return result;
95
        }
96
        
97
        public boolean validateUnitId(ScriptingFolder folder, String id){
98
        List<ScriptingUnit> units = folder.getUnits();
99
                String fileName;
100
                String s[];
101
                String extension;
102
                for(int i=0; i<units.size();i++){
103
                        fileName = (units.get(i)).getId();
104
                        s = fileName.split("\\.");
105
                        extension = null;
106
                        if (s.length>1){
107
                                extension ="." +  s[s.length-1];
108
                                fileName = fileName.substring(0,fileName.length()-extension.length());
109
                        }
110
                        if(fileName.equals(id)){
111
                                return false;
112
                        }
113
                }
114
                return true;
115
        }
116
        
117
        public static String getStringFromFile(String filename){
118

    
119
                BufferedReader b = null;
120
                try {
121
                        b = new BufferedReader(new FileReader(filename));
122
                } catch (FileNotFoundException e) {
123
                        // TODO Auto-generated catch block
124
                        e.printStackTrace();
125
                }
126
                StringBuffer sb=new StringBuffer();
127
                String str;
128
                try {
129
                        while((str=b.readLine())!=null) {
130
                                sb.append(str);
131
                                sb.append('\n');
132
                        }
133
                } catch (IOException e) {
134
                        // TODO Auto-generated catch block
135
                        e.printStackTrace();
136
                }
137
                return sb.toString();
138

    
139
        }
140
        
141
        public ScriptingDialog createDialog(ScriptingFolder folder, String id) {
142
                DefaultScriptingDialog sd = new DefaultScriptingDialog(this);
143
                sd.setId(id);
144
                File file = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
145
                try {
146
                        file.createNewFile();
147
                } catch (IOException e) {
148
                        // TODO Auto-generated catch block
149
                        e.printStackTrace();
150
                }
151
                
152
                // Eliminamos la extensión, para crear el '.dlg'
153
                String s[] = id.split("\\.");
154
                String newId;
155
                if (s.length>=2){
156
                        String extension ="." +  s[s.length-1];
157
                        newId = id.substring(0,id.length()-extension.length());
158
                }else{
159
                        newId = id;
160
                }
161
                File fileDlg = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+newId+".dlg");
162
                try {
163
                        fileDlg.createNewFile();
164
                } catch (IOException e) {
165
                        // TODO Auto-generated catch block
166
                        e.printStackTrace();
167
                }
168
                
169
                // Escribimos en el fichero '.dlg' lo mínimo para que pueda ejecutarse
170
            Writer output = null; 
171
            try {
172
                        output = new BufferedWriter(new FileWriter(fileDlg));
173
                        output.write("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<panel/>");
174
                        output.close();
175
                } catch (IOException e) {
176
                        // TODO Auto-generated catch block
177
                        e.printStackTrace();
178
                }
179
            
180
                sd.load(folder, id);
181
                return sd;
182
        }
183

    
184
        public ScriptingFolder createFolder(ScriptingFolder folder, String id) {
185
                DefaultScriptingFolder fd = new DefaultScriptingFolder(this);
186
                File dir = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
187
                dir.mkdir();
188
                fd.load(folder,id);
189
                return fd;
190
        }
191

    
192
        public ScriptingProject createProject(ScriptingFolder folder, String id) {
193
                // TODO Auto-generated method stub
194
                return null;
195
        }
196

    
197
        public ScriptingScript createScript(ScriptingFolder folder, String id) {
198
                DefaultScriptingScript sc = new DefaultScriptingScript(this);
199
                sc.setId(id);
200
                File file = new File(((DefaultScriptingFolder)folder).getPath()+File.separator+id);
201
                try {
202
                        file.createNewFile();
203
                } catch (IOException e) {
204
                        // TODO Auto-generated catch block
205
                        e.printStackTrace();
206
                        return null;
207
                }
208
                sc.load(folder, id);
209
                return sc;
210
        }
211

    
212
        public ScriptingBaseScript getScript(File file) {
213
                ScriptingBaseScript script = (ScriptingBaseScript) this.getUnit(file);
214

    
215
                if (script == null){
216
                        throw new RuntimeException(file.getPath());
217
                }
218
                return script;
219
        }
220
        
221
        public ScriptingFolder getFolder(File file) {
222
                ScriptingFolder folder = (ScriptingFolder) this.getUnit(file);
223
                if (folder == null){
224
                        throw new RuntimeException(file.getAbsolutePath());
225
                }
226
                return folder;
227
        }
228
        
229
        public ScriptingUnit getUnit(File file) {
230
                ScriptingFolder folder = null;
231
                ScriptingUnit unit = null;
232

    
233
                folder = this.getUserFolder();
234
                unit = folder.getUnit(file);
235
                if( unit != null ) {
236
                        return unit;
237
                }
238
                
239
                folder = this.getSystemFolder();
240
                unit = folder.getUnit(file);
241
                if( unit != null ) {
242
                        return unit;
243
                }
244

    
245
                return null;
246
        }
247

    
248
        public ScriptingFolder getSystemFolder() {
249
                return new SystemFolder(this);
250
        }
251

    
252
        public ScriptingFolder getUserFolder() {
253
                return new UserFolder(this,new File(this.getRootUserFolder()));
254
        }
255

    
256
        public String getRootUserFolder() {
257
                return this.rootUserFolder;
258
        }
259
        
260
        public void setRootUserFolder(String path){
261
                this.rootUserFolder = path;
262
        }
263

    
264
        public void registerSystemFolder(String name, File folder) {
265
                this.systemFolders.add(new RegisterSystemFolder(name, folder));
266
        }
267
        
268
        public List<RegisterSystemFolder> getSystemFolders(){
269
                return this.systemFolders;
270
        }
271
        
272
        
273
        public static class RegisterSystemFolder {
274
                public String name;
275
                public File folder;
276
                
277
                public RegisterSystemFolder(String name, File folder) {
278
                        this.name = name;
279
                        this.folder = folder;
280
                }
281
        }
282

    
283

    
284
        public String getExtensionByLanguage(String langName) {
285
        Map<String, String> extensions = getSupportedLanguagesByExtension();
286
        Iterator<String> iterator = extensions.keySet().iterator();
287
                String extension = null;
288
                String s = null;
289
                
290
                while (iterator. hasNext()){
291
                        extension = iterator.next();
292
                        s = extensions.get(extension);
293
                        if(s.equals(langName)){
294
                                return extension;
295
                        }
296
                        
297
                }
298
                
299
                return null;
300
        }
301
        
302
        public Object get(String key) {
303
                return this.bindings.get(key);
304
        }
305

    
306
        public void put(String key, Object value) {
307
                this.bindings.put(key,value); 
308
                
309
        }
310

    
311
        public ScriptingHelpManager getHelpManager() {
312
                return this.helpManager;
313
        }
314

    
315
        public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id) {
316
                if(unitType.equals(UNIT_SCRIPT)){
317
                        return this.createScript(folder, id);
318
                }
319
                if(unitType.equals(UNIT_DIALOG)){
320
                        return this.createDialog(folder, id);
321
                }
322
                if(unitType.equals(UNIT_FOLDER)){
323
                        return this.createFolder(folder, id);
324
                }
325
                if(unitType.equals(UNIT_PROJECT)){
326
                        return null;
327
                }
328
                return null;
329
        }
330

    
331
        public List<String> getUnitTypes() {
332
                if(this.unitTypes==null){
333
                        this.unitTypes=new ArrayList<String>();
334
                        this.unitTypes.add(UNIT_SCRIPT);
335
                        this.unitTypes.add(UNIT_DIALOG);
336
                        this.unitTypes.add(UNIT_PROJECT);
337
                        this.unitTypes.add(UNIT_FOLDER);
338
                }
339
                return this.unitTypes;
340
        }
341
        
342
}