]> git.argeo.org Git - lgpl/argeo-commons.git/blob - ScriptUi.java
a15c6c98bd986a82a85b0b56eab218c9e79ddef4
[lgpl/argeo-commons.git] / ScriptUi.java
1 package org.argeo.cms.script;
2
3 import java.net.URL;
4
5 import javax.jcr.Node;
6 import javax.jcr.RepositoryException;
7 import javax.script.Invocable;
8 import javax.script.ScriptEngine;
9 import javax.script.ScriptEngineManager;
10 import javax.script.ScriptException;
11
12 import org.apache.commons.logging.Log;
13 import org.apache.commons.logging.LogFactory;
14 import org.argeo.cms.ui.CmsUiProvider;
15 import org.eclipse.swt.widgets.Composite;
16 import org.eclipse.swt.widgets.Control;
17 import org.osgi.framework.BundleContext;
18 import org.osgi.framework.wiring.BundleWiring;
19
20 public class ScriptUi implements CmsUiProvider {
21 private final static Log log = LogFactory.getLog(ScriptUi.class);
22
23 private boolean development = true;
24 private ScriptEngine scriptEngine;
25
26 private URL appUrl;
27 // private BundleContext bundleContext;
28 // private String path;
29
30 // private Bindings bindings;
31 // private String script;
32
33 public ScriptUi(BundleContext bundleContext, String path) {
34 ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
35 ClassLoader bundleCl = bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader();
36 ClassLoader currentCcl = Thread.currentThread().getContextClassLoader();
37 try {
38 Thread.currentThread().setContextClassLoader(bundleCl);
39 scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
40 scriptEngine.put(CmsScriptRwtApplication.BC, bundleContext);
41 } catch (Exception e) {
42 e.printStackTrace();
43 } finally {
44 Thread.currentThread().setContextClassLoader(currentCcl);
45 }
46 this.appUrl = bundleContext.getBundle().getEntry(path);
47 load();
48 }
49
50 private void load() {
51 // try (Reader reader = new InputStreamReader(appUrl.openStream())) {
52 // scriptEngine.eval(reader);
53 // } catch (IOException | ScriptException e) {
54 // log.warn("Cannot execute " + appUrl, e);
55 // }
56
57 try {
58 scriptEngine.eval("load('" + appUrl + "')");
59 } catch (ScriptException e) {
60 log.warn("Cannot execute " + appUrl, e);
61 }
62
63 }
64
65 // public ScriptUiProvider(ScriptEngine scriptEngine, String script) throws
66 // ScriptException {
67 // super();
68 // this.scriptEngine = scriptEngine;
69 // this.script = script;
70 // bindings = scriptEngine.createBindings();
71 // scriptEngine.eval(script, bindings);
72 // }
73
74 @Override
75 public Control createUi(Composite parent, Node context) throws RepositoryException {
76 long begin = System.currentTimeMillis();
77 // if (bindings == null) {
78 // bindings = scriptEngine.createBindings();
79 // try {
80 // scriptEngine.eval(script, bindings);
81 // } catch (ScriptException e) {
82 // log.warn("Cannot evaluate script", e);
83 // }
84 // }
85 // Bindings bindings = scriptEngine.createBindings();
86 // bindings.put("parent", parent);
87 // bindings.put("context", context);
88 // URL appUrl = bundleContext.getBundle().getEntry(path);
89 // try (Reader reader = new InputStreamReader(appUrl.openStream())) {
90 // scriptEngine.eval(reader,bindings);
91 // } catch (IOException | ScriptException e) {
92 // log.warn("Cannot execute " + appUrl, e);
93 // }
94
95 if (development)
96 load();
97
98 Invocable invocable = (Invocable) scriptEngine;
99 try {
100 invocable.invokeFunction("createUi", parent, context);
101 } catch (NoSuchMethodException e) {
102 // TODO Auto-generated catch block
103 e.printStackTrace();
104 } catch (ScriptException e) {
105 // TODO Auto-generated catch block
106 e.printStackTrace();
107 }
108
109 long duration = System.currentTimeMillis() - begin;
110 if (log.isTraceEnabled())
111 log.trace(appUrl + " UI in " + duration + " ms");
112 return null;
113 }
114
115 }