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