]> git.argeo.org Git - lgpl/argeo-commons.git/blob - swt/rap/org.argeo.cms.swt.rap.cli/src/org/argeo/cms/swt/rap/cli/RwtRunner.java
6b678a83c3e8b666712054b25920c8c95e136ce2
[lgpl/argeo-commons.git] / swt / rap / org.argeo.cms.swt.rap.cli / src / org / argeo / cms / swt / rap / cli / RwtRunner.java
1 package org.argeo.cms.swt.rap.cli;
2
3 import java.io.IOException;
4 import java.lang.management.ManagementFactory;
5 import java.nio.file.Files;
6 import java.nio.file.Path;
7 import java.util.Objects;
8
9 import javax.servlet.ServletContextEvent;
10 import javax.servlet.ServletContextListener;
11
12 import org.eclipse.jetty.server.Connector;
13 import org.eclipse.jetty.server.Server;
14 import org.eclipse.jetty.server.ServerConnector;
15 import org.eclipse.jetty.servlet.DefaultServlet;
16 import org.eclipse.jetty.servlet.ServletContextHandler;
17 import org.eclipse.jetty.servlet.ServletHolder;
18 import org.eclipse.jetty.util.resource.Resource;
19 import org.eclipse.jetty.util.thread.QueuedThreadPool;
20 import org.eclipse.rap.rwt.application.AbstractEntryPoint;
21 import org.eclipse.rap.rwt.application.ApplicationConfiguration;
22 import org.eclipse.rap.rwt.application.ApplicationRunner;
23 import org.eclipse.rap.rwt.engine.RWTServlet;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Control;
26 import org.eclipse.swt.widgets.Label;
27
28 /** A minimal RWT runner based on embedded Jetty. */
29 public class RwtRunner {
30
31 private final Server server;
32 private final ServerConnector serverConnector;
33 private Path tempDir;
34
35 private ApplicationConfiguration applicationConfiguration;
36
37 public RwtRunner() {
38 server = new Server(new QueuedThreadPool(10, 1));
39 serverConnector = new ServerConnector(server);
40 serverConnector.setPort(0);
41 server.setConnectors(new Connector[] { serverConnector });
42 }
43
44 protected Control createUi(Composite parent, Object context) {
45 return new Label(parent, 0);
46 }
47
48 public void init() {
49 Objects.requireNonNull(applicationConfiguration);
50
51 ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
52 context.setContextPath("/");
53 server.setHandler(context);
54
55 String entryPoint = "data";
56
57 // rwt-resources requires a file system
58 try {
59 tempDir = Files.createTempDirectory("argeo-rwtRunner");
60 context.setBaseResource(Resource.newResource(tempDir.resolve("www").toString()));
61 } catch (IOException e) {
62 throw new IllegalStateException("Cannot create temporary directory", e);
63 }
64 context.addEventListener(new ServletContextListener() {
65 ApplicationRunner applicationRunner;
66
67 @Override
68 public void contextInitialized(ServletContextEvent sce) {
69 applicationRunner = new ApplicationRunner(applicationConfiguration, sce.getServletContext());
70 applicationRunner.start();
71 }
72
73 @Override
74 public void contextDestroyed(ServletContextEvent sce) {
75 applicationRunner.stop();
76 }
77 });
78
79 context.addServlet(new ServletHolder(new RWTServlet()), "/" + entryPoint);
80
81 // Required to serve rwt-resources. It is important that this is last.
82 ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
83 context.addServlet(holderPwd, "/");
84
85 try {
86 server.start();
87 } catch (Exception e) {
88 throw new IllegalStateException("Cannot start Jetty server", e);
89 }
90 Runtime.getRuntime().addShutdownHook(new Thread(() -> destroy(), "Jetty shutdown"));
91
92 long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
93 System.out.println("RWT App available in " + jvmUptime + " ms, on port " + getEffectivePort());
94 }
95
96 public void destroy() {
97 try {
98 serverConnector.close();
99 server.stop();
100 // TODO delete temp dir
101 } catch (Exception e) {
102 e.printStackTrace();
103 }
104 }
105
106 public Integer getEffectivePort() {
107 return serverConnector.getLocalPort();
108 }
109
110 public void waitFor() throws InterruptedException {
111 server.join();
112 }
113
114 public void setApplicationConfiguration(ApplicationConfiguration applicationConfiguration) {
115 this.applicationConfiguration = applicationConfiguration;
116 }
117
118 public static void main(String[] args) throws Exception {
119 RwtRunner rwtRunner = new RwtRunner();
120
121 String entryPoint = "app";
122 ApplicationConfiguration applicationConfiguration = (application) -> application.addEntryPoint("/" + entryPoint,
123 () -> new AbstractEntryPoint() {
124 private static final long serialVersionUID = 5678385921969090733L;
125
126 @Override
127 protected void createContents(Composite parent) {
128 Label label = new Label(parent, 0);
129 label.setText("Hello world!");
130 }
131 }, null);
132
133 rwtRunner.setApplicationConfiguration(applicationConfiguration);
134 rwtRunner.init();
135
136 // open browser in app mode
137 Thread.sleep(2000);// wait for RWT to be ready
138 Runtime.getRuntime().exec("google-chrome --app=http://localhost:" + rwtRunner.getEffectivePort() + "/app");
139
140 rwtRunner.waitFor();
141 }
142 }