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 }