1 package org
.argeo
.cms
.ui
.script
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStreamReader
;
8 import javax
.jcr
.Repository
;
9 import javax
.script
.ScriptEngine
;
10 import javax
.script
.ScriptEngineManager
;
11 import javax
.script
.ScriptException
;
13 import org
.argeo
.api
.cms
.CmsLog
;
14 import org
.argeo
.cms
.swt
.CmsException
;
15 import org
.eclipse
.rap
.rwt
.application
.Application
;
16 import org
.eclipse
.rap
.rwt
.application
.ApplicationConfiguration
;
17 import org
.osgi
.framework
.BundleContext
;
18 import org
.osgi
.framework
.BundleException
;
19 import org
.osgi
.framework
.wiring
.BundleWiring
;
21 public class CmsScriptRwtApplication
implements ApplicationConfiguration
{
22 public final static String APP
= "APP";
23 public final static String BC
= "BC";
25 private final CmsLog log
= CmsLog
.getLog(CmsScriptRwtApplication
.class);
27 BundleContext bundleContext
;
28 Repository repository
;
32 public void init(BundleContext bundleContext
) {
33 this.bundleContext
= bundleContext
;
34 ClassLoader bundleCl
= bundleContext
.getBundle().adapt(BundleWiring
.class).getClassLoader();
35 ClassLoader originalCcl
= Thread
.currentThread().getContextClassLoader();
37 // Thread.currentThread().setContextClassLoader(bundleCl);// GraalVM needs it to be before creating manager
38 // ScriptEngineManager scriptEngineManager = new ScriptEngineManager(bundleCl);
39 // engine = scriptEngineManager.getEngineByName("JavaScript");
40 // if (engine == null) {// Nashorn
41 // Thread.currentThread().setContextClassLoader(originalCcl);
42 // scriptEngineManager = new ScriptEngineManager();
43 // Thread.currentThread().setContextClassLoader(bundleCl);
44 // engine = scriptEngineManager.getEngineByName("JavaScript");
46 engine
= loadScriptEngine(originalCcl
, bundleCl
);
49 URL appUrl
= bundleContext
.getBundle().getEntry("cms/app.js");
50 // System.out.println("Loading " + appUrl);
51 // System.out.println("Loading " + appUrl.getHost());
52 // System.out.println("Loading " + appUrl.getPath());
54 CmsScriptApp app
= new CmsScriptApp(engine
);
56 engine
.put(BC
, bundleContext
);
57 try (Reader reader
= new InputStreamReader(appUrl
.openStream())) {
59 } catch (IOException
| ScriptException e
) {
60 throw new CmsException("Cannot execute " + appUrl
, e
);
63 if (log
.isDebugEnabled())
64 log
.debug("CMS script app initialized from " + appUrl
);
66 } catch (Exception e
) {
69 Thread
.currentThread().setContextClassLoader(originalCcl
);
73 public void destroy(BundleContext bundleContext
) {
78 public void configure(Application application
) {
82 void load(Application application
) {
83 CmsScriptApp app
= getApp();
84 app
.apply(bundleContext
, repository
, application
);
85 if (log
.isDebugEnabled())
86 log
.debug("CMS script app loaded to " + app
.getWebPath());
89 CmsScriptApp
getApp() {
91 throw new IllegalStateException("CMS script app is not initialized");
92 return (CmsScriptApp
) engine
.get(APP
);
98 bundleContext
.getBundle().update();
99 } catch (BundleException e
) {
104 public void setRepository(Repository repository
) {
105 this.repository
= repository
;
108 private static ScriptEngine
loadScriptEngine(ClassLoader originalCcl
, ClassLoader bundleCl
) {
109 Thread
.currentThread().setContextClassLoader(bundleCl
);// GraalVM needs it to be before creating manager
110 ScriptEngineManager scriptEngineManager
= new ScriptEngineManager(bundleCl
);
111 ScriptEngine engine
= scriptEngineManager
.getEngineByName("JavaScript");
112 if (engine
== null) {// Nashorn
113 Thread
.currentThread().setContextClassLoader(originalCcl
);
114 scriptEngineManager
= new ScriptEngineManager();
115 Thread
.currentThread().setContextClassLoader(bundleCl
);
116 engine
= scriptEngineManager
.getEngineByName("JavaScript");