]> git.argeo.org Git - lgpl/argeo-commons.git/blob - CmsScriptRwtApplication.java
1bc2b0b5a18e9f9b7043363bcc17ee996b680ca3
[lgpl/argeo-commons.git] / 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 ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
38 ClassLoader bundleCl = bundleContext.getBundle().adapt(BundleWiring.class).getClassLoader();
39 ClassLoader currentCcl = Thread.currentThread().getContextClassLoader();
40 try {
41 Thread.currentThread().setContextClassLoader(bundleCl);
42 engine = scriptEngineManager.getEngineByName("JavaScript");
43 } catch (Exception e) {
44 e.printStackTrace();
45 } finally {
46 Thread.currentThread().setContextClassLoader(currentCcl);
47 }
48
49 // Load script
50 URL appUrl = bundleContext.getBundle().getEntry("cms/app.js");
51 // System.out.println("Loading " + appUrl);
52 // System.out.println("Loading " + appUrl.getHost());
53 // System.out.println("Loading " + appUrl.getPath());
54
55 CmsScriptApp app = new CmsScriptApp(engine);
56 engine.put(APP, app);
57 engine.put(BC, bundleContext);
58 try (Reader reader = new InputStreamReader(appUrl.openStream())) {
59 engine.eval(reader);
60 } catch (IOException | ScriptException e) {
61 throw new CmsException("Cannot execute " + appUrl, e);
62 }
63
64 if (log.isDebugEnabled())
65 log.debug("CMS script app initialized from " + appUrl);
66
67 }
68
69 public void destroy(BundleContext bundleContext) {
70 engine = null;
71 }
72
73 @Override
74 public void configure(Application application) {
75 load(application);
76 }
77
78 void load(Application application) {
79 CmsScriptApp app = getApp();
80 app.apply(bundleContext, repository, application);
81 if (log.isDebugEnabled())
82 log.debug("CMS script app loaded to " + app.getWebPath());
83 }
84
85 CmsScriptApp getApp() {
86 if (engine == null)
87 throw new IllegalStateException("CMS script app is not initialized");
88 return (CmsScriptApp) engine.get(APP);
89 }
90
91 void update() {
92
93 try {
94 bundleContext.getBundle().update();
95 } catch (BundleException e) {
96 e.printStackTrace();
97 }
98 }
99
100 public void setRepository(Repository repository) {
101 this.repository = repository;
102 }
103
104 }