Revision 468 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
DefaultScriptingManager.java | ||
---|---|---|
1 | 1 |
package org.gvsig.scripting.impl; |
2 | 2 |
|
3 |
import java.io.BufferedReader; |
|
4 | 3 |
import java.io.File; |
5 |
import java.io.FileNotFoundException; |
|
6 |
import java.io.FileReader; |
|
7 |
import java.io.IOException; |
|
8 | 4 |
import java.util.ArrayList; |
5 |
import java.util.Collections; |
|
9 | 6 |
import java.util.HashMap; |
10 | 7 |
import java.util.Iterator; |
11 | 8 |
import java.util.List; |
... | ... | |
19 | 16 |
import javax.swing.ImageIcon; |
20 | 17 |
|
21 | 18 |
import org.apache.commons.io.FileUtils; |
19 |
import org.apache.commons.io.FilenameUtils; |
|
22 | 20 |
import org.gvsig.scripting.ScriptingBaseScript; |
23 | 21 |
import org.gvsig.scripting.ScriptingDialog; |
24 | 22 |
import org.gvsig.scripting.ScriptingFolder; |
25 | 23 |
import org.gvsig.scripting.ScriptingHelpManager; |
26 | 24 |
import org.gvsig.scripting.ScriptingManager; |
27 |
import org.gvsig.scripting.ScriptingProject; |
|
28 | 25 |
import org.gvsig.scripting.ScriptingScript; |
29 | 26 |
import org.gvsig.scripting.ScriptingUnit; |
27 |
import org.gvsig.tools.service.spi.ProviderFactory; |
|
30 | 28 |
import org.slf4j.Logger; |
31 | 29 |
import org.slf4j.LoggerFactory; |
32 | 30 |
|
33 | 31 |
public class DefaultScriptingManager implements ScriptingManager { |
34 | 32 |
|
33 |
public static class RegisterSystemFolder { |
|
34 |
|
|
35 |
public String name; |
|
36 |
public File folder; |
|
37 |
|
|
38 |
public RegisterSystemFolder(String name, File folder) { |
|
39 |
this.name = name; |
|
40 |
this.folder = folder; |
|
41 |
} |
|
42 |
} |
|
43 |
|
|
35 | 44 |
private static final Logger LOG = LoggerFactory |
36 | 45 |
.getLogger(DefaultScriptingManager.class); |
37 | 46 |
|
38 | 47 |
protected Map<String, ImageIcon> icons; |
39 |
protected List<RegisterSystemFolder> systemFolders = new ArrayList<RegisterSystemFolder>();
|
|
48 |
protected List<RegisterSystemFolder> systemFolders = new ArrayList<>(); |
|
40 | 49 |
protected ScriptEngineManager engineManager = null; |
41 | 50 |
private final SimpleBindings bindings = new SimpleBindings(); |
42 | 51 |
private ScriptingHelpManager helpManager = null; |
43 | 52 |
private List<String> unitTypes = null; |
44 | 53 |
private ClassLoader classLoader = null; |
45 |
private List<File> libFolders = new ArrayList<File>();
|
|
54 |
private List<File> libFolders = new ArrayList<>(); |
|
46 | 55 |
private File home = null; |
47 |
private List<ScriptingFolder> alternativeUserFolders = new ArrayList<ScriptingFolder>(); |
|
56 |
private List<ScriptingFolder> alternativeUserFolders = new ArrayList<>(); |
|
57 |
private Map<String, String> extensionOfLanguage = null; |
|
58 |
private Map<String, String> languageOfExtension = null; |
|
59 |
private File packagesFolder; |
|
48 | 60 |
|
49 | 61 |
public DefaultScriptingManager() { |
50 | 62 |
this.classLoader = getClass().getClassLoader(); |
... | ... | |
74 | 86 |
createFolder(new File(home, "lib")); |
75 | 87 |
} |
76 | 88 |
|
89 |
@Override |
|
77 | 90 |
public File getHomeFolder() { |
78 | 91 |
if (!this.home.exists()) { |
79 | 92 |
createFolder(home); |
... | ... | |
82 | 95 |
return this.home; |
83 | 96 |
} |
84 | 97 |
|
98 |
@Override |
|
85 | 99 |
public void setHomeFolder(File home) { |
86 | 100 |
if (home == null) { |
87 | 101 |
this.home = new File(System.getProperty("user.home"), ".gvsig-scripting"); |
... | ... | |
106 | 120 |
private void showEnginesInfo(ScriptEngineManager mgr) { |
107 | 121 |
if (LOG.isInfoEnabled()) { |
108 | 122 |
List<ScriptEngineFactory> factories = mgr.getEngineFactories(); |
109 |
StringBuffer buffer = new StringBuffer();
|
|
110 |
List<Object> values = new ArrayList<Object>();
|
|
123 |
StringBuilder buffer = new StringBuilder();
|
|
124 |
List<Object> values = new ArrayList<>(); |
|
111 | 125 |
buffer.append("Scripting engines available:"); |
112 | 126 |
for (ScriptEngineFactory factory : factories) { |
113 | 127 |
|
... | ... | |
160 | 174 |
} |
161 | 175 |
|
162 | 176 |
protected ScriptEngine getEngine(String langName) { |
163 |
ScriptEngine engine = this.getEngineManager().getEngineByName(langName); |
|
177 |
ScriptEngineManager manager = this.getEngineManager(); |
|
178 |
ScriptEngine engine = manager.getEngineByName(langName); |
|
164 | 179 |
engine.getBindings(ScriptContext.ENGINE_SCOPE).putAll(bindings); |
165 | 180 |
return engine; |
166 | 181 |
} |
... | ... | |
169 | 184 |
return this.icons.get(name); |
170 | 185 |
} |
171 | 186 |
|
172 |
public Map<String, String> getSupportedLanguagesByExtension() { |
|
187 |
@Override |
|
188 |
public String getEngineNameByLanguage(String langName) { |
|
173 | 189 |
List<ScriptEngineFactory> factories |
174 | 190 |
= getEngineManager().getEngineFactories(); |
175 |
Map<String, String> extToLang = new HashMap<String, String>(); |
|
176 | 191 |
|
177 | 192 |
for (ScriptEngineFactory factory : factories) { |
178 |
List<String> extNames = factory.getExtensions(); |
|
179 |
for (String name : extNames) { |
|
180 |
extToLang.put(".".concat(name), factory.getLanguageName()); |
|
193 |
if (factory.getLanguageName().equalsIgnoreCase(langName)) { |
|
194 |
return factory.getEngineName(); |
|
181 | 195 |
} |
182 | 196 |
} |
183 |
|
|
184 |
return extToLang; |
|
197 |
return null; |
|
185 | 198 |
} |
186 | 199 |
|
187 |
public Map<String, String> getExtensionsByLanguages() { |
|
188 |
Map<String, String> l = getSupportedLanguagesByExtension(); |
|
189 |
Map<String, String> result = new HashMap<String, String>(); |
|
190 |
Iterator<Map.Entry<String, String>> it = l.entrySet().iterator(); |
|
191 |
while (it.hasNext()) { |
|
192 |
Map.Entry<String, String> pairs = it.next(); |
|
193 |
result.put(pairs.getValue(), pairs.getKey()); |
|
200 |
public ScriptEngine getEngineByLanguage(String langName) { |
|
201 |
List<ScriptEngineFactory> factories |
|
202 |
= getEngineManager().getEngineFactories(); |
|
203 |
|
|
204 |
for (ScriptEngineFactory factory : factories) { |
|
205 |
if (factory.getLanguageName().equalsIgnoreCase(langName)) { |
|
206 |
return factory.getScriptEngine(); |
|
207 |
} |
|
194 | 208 |
} |
195 |
return result;
|
|
209 |
return null;
|
|
196 | 210 |
} |
197 | 211 |
|
212 |
@Override |
|
198 | 213 |
public boolean validateUnitId(ScriptingFolder folder, String id) { |
199 | 214 |
List<ScriptingUnit> units = folder.getUnits(); |
200 | 215 |
String fileName; |
201 | 216 |
String s[]; |
202 | 217 |
String extension; |
203 |
for (int i = 0; i < units.size(); i++) { |
|
204 |
fileName = (units.get(i)).getId(); |
|
205 |
s = fileName.split("\\."); |
|
206 |
extension = null; |
|
207 |
if (s.length > 1) { |
|
208 |
extension = "." + s[s.length - 1]; |
|
209 |
fileName = fileName.substring(0, fileName.length() - extension.length()); |
|
210 |
} |
|
218 |
for (ScriptingUnit unit : units) { |
|
219 |
fileName = unit.getId(); |
|
220 |
fileName = FilenameUtils.getBaseName(fileName); |
|
211 | 221 |
if (fileName.equals(id)) { |
212 | 222 |
return false; |
213 | 223 |
} |
... | ... | |
215 | 225 |
return true; |
216 | 226 |
} |
217 | 227 |
|
218 |
public static String getStringFromFile(String filename) { |
|
219 |
|
|
220 |
BufferedReader b = null; |
|
221 |
try { |
|
222 |
try { |
|
223 |
b = new BufferedReader(new FileReader(filename)); |
|
224 |
} catch (FileNotFoundException e) { |
|
225 |
LOG.warn("Can't open file '" + filename + "'.", e); |
|
226 |
} |
|
227 |
StringBuffer sb = new StringBuffer(); |
|
228 |
String str; |
|
229 |
try { |
|
230 |
while ((str = b.readLine()) != null) { |
|
231 |
sb.append(str); |
|
232 |
sb.append('\n'); |
|
233 |
} |
|
234 |
} catch (IOException e) { |
|
235 |
LOG.warn("Can't read file '" + filename + "'.", e); |
|
236 |
} |
|
237 |
return sb.toString(); |
|
238 |
} finally { |
|
239 |
if (b != null) { |
|
240 |
try { |
|
241 |
b.close(); |
|
242 |
} catch (IOException e) { |
|
243 |
LOG.warn("Can't close file '" + filename + "'", e); |
|
244 |
} |
|
245 |
b = null; |
|
246 |
} |
|
247 |
} |
|
248 |
} |
|
249 |
|
|
250 | 228 |
public ScriptingScript createScript(ScriptingFolder folder, String id) { |
251 | 229 |
return this.createScript(folder, id, null); |
252 | 230 |
} |
... | ... | |
285 | 263 |
return unit; |
286 | 264 |
} |
287 | 265 |
|
288 |
public ScriptingProject createProject(ScriptingFolder folder, String id) { |
|
289 |
LOG.warn("Projects can't be implementeds"); |
|
290 |
return null; |
|
291 |
} |
|
292 |
|
|
266 |
@Override |
|
293 | 267 |
public ScriptingBaseScript getScript(File file) { |
294 | 268 |
ScriptingBaseScript script = (ScriptingBaseScript) this.getUnit(file); |
295 | 269 |
if (script == null) { |
... | ... | |
298 | 272 |
return script; |
299 | 273 |
} |
300 | 274 |
|
275 |
@Override |
|
301 | 276 |
public ScriptingFolder getFolder(File file) { |
302 | 277 |
ScriptingFolder folder = (ScriptingFolder) this.getUnit(file); |
303 | 278 |
if (folder == null) { |
... | ... | |
307 | 282 |
} |
308 | 283 |
|
309 | 284 |
public ScriptingUnit getUnit(File file) { |
310 |
ScriptingFolder folder = null;
|
|
311 |
ScriptingUnit unit = null;
|
|
285 |
ScriptingFolder folder; |
|
286 |
ScriptingUnit unit; |
|
312 | 287 |
|
313 | 288 |
if (file.isAbsolute()) { |
314 | 289 |
folder = new DefaultScriptingFolder(null, this, file.getParentFile()); |
... | ... | |
330 | 305 |
return null; |
331 | 306 |
} |
332 | 307 |
|
308 |
@Override |
|
333 | 309 |
public ScriptingFolder getSystemFolder() { |
334 | 310 |
return new SystemFolder(this); |
335 | 311 |
} |
336 | 312 |
|
313 |
@Override |
|
337 | 314 |
public ScriptingFolder getUserFolder() { |
338 | 315 |
return new UserFolder(this, this.getRootUserFolder()); |
339 | 316 |
} |
340 | 317 |
|
318 |
@Override |
|
341 | 319 |
public ScriptingBaseScript getScript(String name) { |
342 | 320 |
return (ScriptingBaseScript) findScript(null, name); |
343 | 321 |
} |
... | ... | |
349 | 327 |
if (name.trim().length() == 0) { |
350 | 328 |
return null; |
351 | 329 |
} |
352 |
ScriptingUnit unit = null;
|
|
330 |
ScriptingUnit unit; |
|
353 | 331 |
if (folder == null) { |
354 | 332 |
unit = findScript(this.getUserFolder(), name); |
355 | 333 |
if (unit != null) { |
... | ... | |
376 | 354 |
return null; |
377 | 355 |
} |
378 | 356 |
|
357 |
@Override |
|
379 | 358 |
public File getRootUserFolder() { |
380 | 359 |
return new File(this.getHomeFolder(), "scripts"); |
381 | 360 |
} |
382 | 361 |
|
362 |
@Override |
|
383 | 363 |
public void registerSystemFolder(String name, File folder) { |
384 | 364 |
this.systemFolders.add(new RegisterSystemFolder(name, folder)); |
385 | 365 |
LOG.info("Register system folder name '" + name + "' folder " + folder.getAbsolutePath() + "'"); |
... | ... | |
390 | 370 |
return this.systemFolders; |
391 | 371 |
} |
392 | 372 |
|
373 |
@Override |
|
393 | 374 |
public List<ScriptingFolder> getAlternativeUserFolders() { |
394 | 375 |
return this.alternativeUserFolders; |
395 | 376 |
} |
396 | 377 |
|
378 |
@Override |
|
397 | 379 |
public void addAlternativeUserFolder(File f, String name, String description) { |
398 | 380 |
UserFolder x = new UserFolder(this, f); |
399 |
x.setName(name);
|
|
381 |
x.setName(name); |
|
400 | 382 |
x.setDescription(description); |
401 |
x.setId("UserFolder_"+this.alternativeUserFolders.size()+1);
|
|
383 |
x.setId("UserFolder_" + this.alternativeUserFolders.size() + 1);
|
|
402 | 384 |
this.alternativeUserFolders.add(x); |
403 | 385 |
} |
404 | 386 |
|
405 |
public static class RegisterSystemFolder { |
|
406 |
|
|
407 |
public String name; |
|
408 |
public File folder; |
|
409 |
|
|
410 |
public RegisterSystemFolder(String name, File folder) { |
|
411 |
this.name = name; |
|
412 |
this.folder = folder; |
|
387 |
@Override |
|
388 |
public String getExtensionOfLanguage(String langName) { |
|
389 |
if (this.extensionOfLanguage == null) { |
|
390 |
Map<String, String> extensionOfLanguage = new HashMap<>(); |
|
391 |
List<ScriptEngineFactory> factories = getEngineManager().getEngineFactories(); |
|
392 |
for (ScriptEngineFactory factory : factories) { |
|
393 |
List<String> extensions = factory.getExtensions(); |
|
394 |
if (extensions != null && !extensions.isEmpty()) { |
|
395 |
extensionOfLanguage.put( |
|
396 |
factory.getLanguageName().toLowerCase(), |
|
397 |
extensions.get(0).toLowerCase() |
|
398 |
); |
|
399 |
} |
|
400 |
} |
|
401 |
this.extensionOfLanguage = extensionOfLanguage; |
|
413 | 402 |
} |
403 |
if (langName == null) { |
|
404 |
return null; |
|
405 |
} |
|
406 |
langName = langName.toLowerCase(); |
|
407 |
return this.extensionOfLanguage.get(langName); |
|
414 | 408 |
} |
415 | 409 |
|
416 |
public String getExtensionByLanguage(String langName) { |
|
417 |
Map<String, String> extensions = getSupportedLanguagesByExtension(); |
|
418 |
Iterator<String> iterator = extensions.keySet().iterator(); |
|
419 |
String extension = null; |
|
420 |
String s = null; |
|
410 |
@Override |
|
411 |
public List<String> getSupportedLanguages() { |
|
412 |
List<String> languages = new ArrayList<>(); |
|
421 | 413 |
|
422 |
while (iterator.hasNext()) { |
|
423 |
extension = iterator.next(); |
|
424 |
s = extensions.get(extension); |
|
425 |
if (s.equalsIgnoreCase(langName)) { |
|
426 |
return extension; |
|
427 |
} |
|
414 |
languages.addAll(this.extensionOfLanguage.keySet()); |
|
415 |
Collections.sort(languages); |
|
416 |
return languages; |
|
417 |
} |
|
428 | 418 |
|
419 |
public String getLanguageOfExtension(String extension) { |
|
420 |
if (extension == null) { |
|
421 |
return null; |
|
429 | 422 |
} |
430 |
|
|
431 |
return null; |
|
423 |
extension = extension.toLowerCase(); |
|
424 |
if (extension.startsWith(".")) { |
|
425 |
extension = extension.substring(1); |
|
426 |
} |
|
427 |
if (this.languageOfExtension == null) { |
|
428 |
Map<String, String> languageOfExtension = new HashMap<>(); |
|
429 |
List<ScriptEngineFactory> factories = getEngineManager().getEngineFactories(); |
|
430 |
for (ScriptEngineFactory factory : factories) { |
|
431 |
List<String> extensions = factory.getExtensions(); |
|
432 |
if (extensions != null) { |
|
433 |
for (String extension1 : extensions) { |
|
434 |
languageOfExtension.put( |
|
435 |
extension1.toLowerCase(), |
|
436 |
factory.getLanguageName().toLowerCase() |
|
437 |
); |
|
438 |
} |
|
439 |
} |
|
440 |
} |
|
441 |
this.languageOfExtension = languageOfExtension; |
|
442 |
} |
|
443 |
return this.languageOfExtension.get(extension); |
|
432 | 444 |
} |
433 | 445 |
|
434 | 446 |
public Object get(String key) { |
... | ... | |
440 | 452 |
|
441 | 453 |
} |
442 | 454 |
|
455 |
@Override |
|
443 | 456 |
public ScriptingHelpManager getHelpManager() { |
444 | 457 |
if (this.helpManager == null) { |
445 | 458 |
this.helpManager = new DefaultScriptingHelpManager(this); |
... | ... | |
447 | 460 |
return this.helpManager; |
448 | 461 |
} |
449 | 462 |
|
463 |
@Override |
|
450 | 464 |
public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id) { |
451 | 465 |
return createUnit(unitType, folder, id, null); |
452 | 466 |
} |
453 | 467 |
|
468 |
@Override |
|
454 | 469 |
public ScriptingUnit createUnit(String unitType, ScriptingFolder folder, String id, String language) { |
455 | 470 |
if (unitType.equals(UNIT_SCRIPT)) { |
456 | 471 |
return this.createScript(folder, id, language); |
... | ... | |
461 | 476 |
if (unitType.equals(UNIT_FOLDER)) { |
462 | 477 |
return this.createFolder(folder, id); |
463 | 478 |
} |
464 |
if (unitType.equals(UNIT_PROJECT)) { |
|
465 |
return null; |
|
466 |
} |
|
467 | 479 |
return null; |
468 | 480 |
} |
469 | 481 |
|
482 |
@Override |
|
470 | 483 |
public List<String> getUnitTypes() { |
471 | 484 |
if (this.unitTypes == null) { |
472 |
this.unitTypes = new ArrayList<String>();
|
|
485 |
this.unitTypes = new ArrayList<>(); |
|
473 | 486 |
this.unitTypes.add(UNIT_SCRIPT); |
474 | 487 |
this.unitTypes.add(UNIT_DIALOG); |
475 |
this.unitTypes.add(UNIT_PROJECT); |
|
476 | 488 |
this.unitTypes.add(UNIT_FOLDER); |
477 | 489 |
} |
478 | 490 |
return this.unitTypes; |
479 | 491 |
} |
480 | 492 |
|
493 |
@Override |
|
481 | 494 |
public void addLibFolder(File lib) { |
482 | 495 |
if (lib.exists()) { |
483 | 496 |
LOG.info("Add scripting lib folder '" + lib.getAbsolutePath() + "'"); |
... | ... | |
490 | 503 |
public List<File> getLibFolders() { |
491 | 504 |
return this.libFolders; |
492 | 505 |
} |
506 |
|
|
507 |
public ProviderFactory getInstallerFactory() { |
|
508 |
return new ScriptingInstallerProviderFactory(); |
|
509 |
} |
|
510 |
|
|
511 |
@Override |
|
512 |
public File getPackagesFolder() { |
|
513 |
return this.packagesFolder; |
|
514 |
} |
|
515 |
|
|
516 |
@Override |
|
517 |
public void setPackagesFolder(File folder) { |
|
518 |
this.packagesFolder = folder; |
|
519 |
} |
|
520 |
|
|
493 | 521 |
} |
Also available in: Unified diff