]> git.argeo.org Git - lgpl/argeo-commons.git/blob - rap/org.argeo.cms.ui.rap/src/org/argeo/cms/ui/script/CmsScriptRwtApplication.java
Introduce static CMS.
[lgpl/argeo-commons.git] / rap / org.argeo.cms.ui.rap / src / org / argeo / cms / ui / script / CmsScriptRwtApplication.java
1 package org.argeo.cms.ui.script;
2
3 import java.io.IOException;
4 import java.io.InputStreamReader;
5 import java.io.Reader;
6 import java.net.URL;
7
8 import javax.jcr.Repository;
9 import javax.script.ScriptEngine;
10 import javax.script.ScriptEngineManager;
11 import javax.script.ScriptException;
12
13 import org.argeo.api.cms.CmsLog;
14 import org.argeo.cms.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;
20
21 public class CmsScriptRwtApplication implements ApplicationConfiguration {
22 public final static String APP = "APP";
23 public final static String BC = "BC";
24
25 private final CmsLog log = CmsLog.getLog(CmsScriptRwtApplication.class);
26
27 BundleContext bundleContext;
28 Repository repository;
29
30 ScriptEngine engine;
31
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();
36 try {
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");
45 // }
46 engine = loadScriptEngine(originalCcl, bundleCl);
47
48 // Load script
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());
53
54 CmsScriptApp app = new CmsScriptApp(engine);
55 engine.put(APP, app);
56 engine.put(BC, bundleContext);
57 try (Reader reader = new InputStreamReader(appUrl.openStream())) {
58 engine.eval(reader);
59 } catch (IOException | ScriptException e) {
60 throw new CmsException("Cannot execute " + appUrl, e);
61 }
62
63 if (log.isDebugEnabled())
64 log.debug("CMS script app initialized from " + appUrl);
65
66 } catch (Exception e) {
67 e.printStackTrace();
68 } finally {
69 Thread.currentThread().setContextClassLoader(originalCcl);
70 }
71 }
72
73 public void destroy(BundleContext bundleContext) {
74 engine = null;
75 }
76
77 @Override
78 public void configure(Application application) {
79 load(application);
80 }
81
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());
87 }
88
89 CmsScriptApp getApp() {
90 if (engine == null)
91 throw new IllegalStateException("CMS script app is not initialized");
92 return (CmsScriptApp) engine.get(APP);
93 }
94
95 void update() {
96
97 try {
98 bundleContext.getBundle().update();
99 } catch (BundleException e) {
100 e.printStackTrace();
101 }
102 }
103
104 public void setRepository(Repository repository) {
105 this.repository = repository;
106 }
107
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");
117 }
118 return engine;
119 }
120 }