Statistics
| Revision:

root / trunk / extensions / extScripting / src / org / gvsig / scripting / ScriptingExtension.java @ 6877

History | View | Annotate | Download (7.09 KB)

1
package org.gvsig.scripting;
2

    
3
import java.io.IOException;
4
import java.net.URLDecoder;
5
import java.util.Hashtable;
6
import java.util.Map;
7

    
8
import org.apache.bsf.BSFEngine;
9
import org.apache.bsf.BSFException;
10
import org.apache.bsf.BSFManager;
11

    
12
import thinlet.script.ScriptableThinlet;
13

    
14
import com.iver.andami.PluginServices;
15
import com.iver.andami.plugins.Extension;
16
import com.iver.andami.ui.mdiManager.IWindow;
17

    
18
public class ScriptingExtension extends Extension {
19
        private static BSFManager bsfManager;
20
        
21
    public static final String JAVASCRIPT = ScriptableThinlet.JAVASCRIPT;
22
    public static final String BEANSHELL = ScriptableThinlet.BEANSHELL;
23
    public static final String JYTHON = ScriptableThinlet.JYTHON;
24
    public static final String GROOVY = ScriptableThinlet.GROOVY;
25
    
26
    private static ScriptingAppAccesor scriptingAppAccesor = null;
27
    
28
    
29
    public static ScriptingAppAccesor getScriptingAppAccesor() {
30
            if (scriptingAppAccesor == null) {
31
                    scriptingAppAccesor =new ScriptingAppAccesor();
32
            }
33
            
34
            return scriptingAppAccesor;
35
    }
36

    
37
                
38

    
39
        public static BSFManager getBSFManager() {
40
        if(bsfManager == null){
41
                bsfManager = new BSFManager(){
42
                public BSFEngine loadScriptingEngine(String lang) throws BSFException {
43
                    // if its already loaded return that
44
                    BSFEngine eng = (BSFEngine) loadedEngines.get(lang);
45
                    if (eng != null) {
46
                        return eng;
47
                    }
48
                    
49
                    // is it a registered language?
50
                    String engineClassName = (String) registeredEngines.get(lang);
51
                    if (engineClassName == null) {
52
                        throw new BSFException(BSFException.REASON_UNKNOWN_LANGUAGE,
53
                                               "unsupported language: " + lang);
54
                    }
55
                    
56
                    // create the engine and initialize it. if anything goes wrong
57
                    try {
58
                        Class engineClass = (classLoader == null)
59
                                ? Class.forName(engineClassName)
60
                                : classLoader.loadClass(engineClassName);
61
                        eng = (BSFEngine) engineClass.newInstance();
62
                        eng.initialize(this, lang, declaredBeans);
63
                        loadedEngines.put(lang, eng); 
64
                        pcs.addPropertyChangeListener(eng);
65
                        return eng;
66
                    } 
67
                    catch (Throwable t) {
68
                        throw new BSFException(BSFException.REASON_OTHER_ERROR,
69
                                               "unable to load language: " + lang, t);
70
                    }
71
                }
72
            };
73
        }
74
        try {
75
                        bsfManager.declareBean("gvSIG", getScriptingAppAccesor(), ScriptingAppAccesor.class);
76
                } catch (BSFException e) {
77
                        // TODO Auto-generated catch block
78
                        e.printStackTrace();
79
                }
80

    
81
        return bsfManager;
82
        }
83

    
84
        public void initialize() {
85
                // TODO Recivirlo como paramentro
86
                //this.scriptFileName = "./centerToPoint.xml";
87
                
88
                
89
        }
90

    
91
        public void execute(String actionCommand) {
92
                ScriptParams params = new ScriptParams(actionCommand);
93
                
94
                if (params.action() == null) {
95
                        // FIXME: FALTA mostara error
96
                        return;
97
                }
98
                if (params.action().toLowerCase().equals("show") ) {
99
                        show(params.getParams());
100
                } else if (params.action().toLowerCase().equals("run") ){
101
                        run(params.getParams());
102
                }
103

    
104
        }
105

    
106
        public static void run(Map params) {
107
                Script script;
108
                try {
109
                        script = new Script(params);
110
                        script.run();
111
                } catch (BSFException e) {
112
                        // TODO Auto-generated catch block
113
                        e.printStackTrace();
114
                        return;
115
                } catch (IOException e) {
116
                        // TODO Auto-generated catch block
117
                        e.printStackTrace();
118
                        return;
119
                } catch (Throwable e) {
120
                        // TODO Auto-generated catch block
121
                        e.printStackTrace();
122
                }                
123
        }
124
        
125
        public static Object show(Map params) {
126
                DefaultThinlet.setBSFManager(getBSFManager());                
127
                ScriptPanel panel;
128
                try {
129
                        panel = new ScriptPanel(params);
130
                } catch (BSFException e) {
131
                        // TODO Auto-generated catch block
132
                        e.printStackTrace();
133
                        return null;
134
                } catch (IOException e) {
135
                        // TODO Auto-generated catch block
136
                        e.printStackTrace();
137
                        return null;
138
                }
139
                IWindow v = PluginServices.getMDIManager().addView(panel);
140
                v.getViewInfo().setWidth(v.getViewInfo().getWidth()+1);                
141
                return panel;
142
        }
143
        
144
        private ScriptingAppAccesor newAppAccesor() {                
145
                return new ScriptingAppAccesor();
146
        }
147

    
148
        public boolean isEnabled() {                
149
                return true;
150
        }
151

    
152
        public boolean isVisible() {
153
                return true;
154
        }
155

    
156
        public class ScriptParams {
157
                private String paramString;
158
                private String action = null;
159
                private Hashtable params = null;                 
160
                
161
                public ScriptParams(String paramString) {
162
                        this.paramString = paramString.trim();
163
                }
164
                
165
                public Map getParams() {
166
                        if (this.params == null) {
167
                                if (!this.parse()) {
168
                                        return null;
169
                                }
170
                        }
171
                        return this.params;
172
                }
173
                
174
                public String action() {
175
                        if (this.action == null) {
176
                                if (!this.parse()) {
177
                                        return null;
178
                                }                                
179
                        }                        
180
                        return this.action;
181
                }
182
                
183
                private boolean parse() {
184
                        //transformar este formato: 'show(fileName='./pepe.xml',language='jython',top=11,left=10,width=300,height=300)'
185
                        int primerParentesis = this.paramString.indexOf("(");
186
                        if (primerParentesis < 1) {
187
                                // TODO Informar error
188
                                return false;
189
                        }
190
                        if (!this.paramString.endsWith(")")) {
191
                                // TODO Informar error
192
                                return false;
193
                        }
194
                        this.action = this.paramString.substring(0,primerParentesis);
195
                        
196
                        // Dividimos en 'clave=valor'
197
                        
198
                        this.params = new Hashtable();
199
                        if (primerParentesis+1 == this.paramString.length()-1) {
200
                                return true;
201
                        }
202
                        
203
                        String[] listaParametros = this.paramString.substring(primerParentesis+1,this.paramString.length()-1).trim().split(",");
204
                        
205
                        
206
                        
207

    
208
                        for (int i=0;i < listaParametros.length; i++) {
209
                                // Dividimos en clave y valor
210
                                String[] parametroConjunto = listaParametros[i].trim().split("=");
211
                                if (parametroConjunto.length != 2) {
212
                                        // TODO Informar error
213
                                        return false;
214
                                }
215
                                String clave = parametroConjunto[0].trim();
216
                                String cadenaValor = parametroConjunto[1].trim();
217
                                
218
                                //Intentamos identificar y transformar el valor en un Objeto Java
219
                                Object valor;                                
220
                                if (cadenaValor.startsWith("'")) {
221
                                        if (cadenaValor.endsWith("'")) {
222
                                                // Recortamos las comillas y descodificamos por si tiene algun caracter escapado
223
                                                // FIXME arreglar el deprecated                                                
224
                                                valor = URLDecoder.decode(cadenaValor.substring(1,cadenaValor.length()-1));
225
                                        } else {
226
                                                // TODO Informar error
227
                                                return false;
228
                                        }
229
                                } else{
230
                                        try {
231
                                                // Si contiene el punto decimal intentamos con un Double
232
                                                if (cadenaValor.indexOf('.') >= 0) {
233
                                                        valor = new Double(cadenaValor);
234
                                                } else {
235
                                                        // Si no debe ser un Entero
236
                                                        valor = new Integer(cadenaValor);                                                        
237
                                                }
238
                                                
239
                                        } catch (NumberFormatException e) {
240
                                                // No se ha podido transformar
241
                                                // TODO Informar error
242
                                                return false;
243
                                        }
244
                                        
245
                                }
246
                                // A?adimos al Map
247
                                this.params.put(clave,valor);
248
                                
249
                                
250
                        }
251
                        
252
                        return true;
253
                
254
                }
255
                
256
                
257
        }
258
}