]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.ui/src/org/argeo/cms/script/CmsScriptRwtApplication.java
280213e0570086f257ed6e513b4db162b27a8dd0
[lgpl/argeo-commons.git] / org.argeo.cms.ui / src / org / argeo / cms / script / CmsScriptRwtApplication.java
1 package org.argeo.cms.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.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.argeo.cms.CmsException;
16 import org.eclipse.rap.rwt.application.Application;
17 import org.eclipse.rap.rwt.application.ApplicationConfiguration;
18 import org.osgi.framework.BundleContext;
19 import org.osgi.framework.BundleException;
20 import org.osgi.framework.wiring.BundleWiring;
21
22 public class CmsScriptRwtApplication implements ApplicationConfiguration {
23 public final static String APP = "APP";
24 public final static String BC = "BC";
25
26 private final Log log = LogFactory.getLog(CmsScriptRwtApplication.class);
27
28 BundleContext bundleContext;
29 Repository repository;
30
31 ScriptEngine engine;
32
33 public void init(BundleContext bundleContext) {
34 this.bundleContext = bundleContext;
35 // System.out.println("bundleContext=" + bundleContext);
36 // System.out.println("repository=" + repository);
37 ClassLoader bundleCl = bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader();
38 ClassLoader originalCcl = Thread.currentThread().getContextClassLoader();
39 try {
40 Thread.currentThread().setContextClassLoader(bundleCl);// GrallVM needs it to be before creating manager
41 ScriptEngineManager scriptEngineManager = new ScriptEngineManager(bundleCl);
42 engine = scriptEngineManager.getEngineByName("JavaScript");
43 if (engine == null) {// Nashorn
44 Thread.currentThread().setContextClassLoader(originalCcl);
45 scriptEngineManager = new ScriptEngineManager();
46 Thread.currentThread().setContextClassLoader(bundleCl);
47 engine = scriptEngineManager.getEngineByName("JavaScript");
48 }
49
50 // Load script
51 URL appUrl = bundleContext.getBundle().getEntry("cms/app.js");
52 // System.out.println("Loading " + appUrl);
53 // System.out.println("Loading " + appUrl.getHost());
54 // System.out.println("Loading " + appUrl.getPath());
55
56 CmsScriptApp app = new CmsScriptApp(engine);
57 engine.put(APP, app);
58 engine.put(BC, bundleContext);
59 try (Reader reader = new InputStreamReader(appUrl.openStream())) {
60 engine.eval(reader);
61 } catch (IOException | ScriptException e) {
62 throw new CmsException("Cannot execute " + appUrl, e);
63 }
64
65 if (log.isDebugEnabled())
66 log.debug("CMS script app initialized from " + appUrl);
67
68 } catch (Exception e) {
69 e.printStackTrace();
70 } finally {
71 Thread.currentThread().setContextClassLoader(originalCcl);
72 }
73 }
74
75 public void destroy(BundleContext bundleContext) {
76 engine = null;
77 }
78
79 @Override
80 public void configure(Application application) {
81 load(application);
82 }
83
84 void load(Application application) {
85 CmsScriptApp app = getApp();
86 app.apply(bundleContext, repository, application);
87 if (log.isDebugEnabled())
88 log.debug("CMS script app loaded to " + app.getWebPath());
89 }
90
91 CmsScriptApp getApp() {
92 if (engine == null)
93 throw new IllegalStateException("CMS script app is not initialized");
94 return (CmsScriptApp) engine.get(APP);
95 }
96
97 void update() {
98
99 try {
100 bundleContext.getBundle().update();
101 } catch (BundleException e) {
102 e.printStackTrace();
103 }
104 }
105
106 public void setRepository(Repository repository) {
107 this.repository = repository;
108 }
109
110 }