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 |
} |