1 package org
.argeo
.cms
.swt
.rap
.cli
;
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
;
9 import javax
.servlet
.ServletContextEvent
;
10 import javax
.servlet
.ServletContextListener
;
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
;
28 /** A minimal RWT runner based on embedded Jetty. */
29 public class RwtRunner
{
31 private final Server server
;
32 private final ServerConnector serverConnector
;
35 private ApplicationConfiguration applicationConfiguration
;
38 server
= new Server(new QueuedThreadPool(10, 1));
39 serverConnector
= new ServerConnector(server
);
40 serverConnector
.setPort(0);
41 server
.setConnectors(new Connector
[] { serverConnector
});
44 protected Control
createUi(Composite parent
, Object context
) {
45 return new Label(parent
, 0);
49 Objects
.requireNonNull(applicationConfiguration
);
51 ServletContextHandler context
= new ServletContextHandler(ServletContextHandler
.SESSIONS
);
52 context
.setContextPath("/");
53 server
.setHandler(context
);
55 String entryPoint
= "data";
57 // rwt-resources requires a file system
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
);
64 context
.addEventListener(new ServletContextListener() {
65 ApplicationRunner applicationRunner
;
68 public void contextInitialized(ServletContextEvent sce
) {
69 applicationRunner
= new ApplicationRunner(applicationConfiguration
, sce
.getServletContext());
70 applicationRunner
.start();
74 public void contextDestroyed(ServletContextEvent sce
) {
75 applicationRunner
.stop();
79 context
.addServlet(new ServletHolder(new RWTServlet()), "/" + entryPoint
);
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
, "/");
87 } catch (Exception e
) {
88 throw new IllegalStateException("Cannot start Jetty server", e
);
90 Runtime
.getRuntime().addShutdownHook(new Thread(() -> destroy(), "Jetty shutdown"));
92 long jvmUptime
= ManagementFactory
.getRuntimeMXBean().getUptime();
93 System
.out
.println("RWT App available in " + jvmUptime
+ " ms, on port " + getEffectivePort());
96 public void destroy() {
98 serverConnector
.close();
100 // TODO delete temp dir
101 } catch (Exception e
) {
106 public Integer
getEffectivePort() {
107 return serverConnector
.getLocalPort();
110 public void waitFor() throws InterruptedException
{
114 public void setApplicationConfiguration(ApplicationConfiguration applicationConfiguration
) {
115 this.applicationConfiguration
= applicationConfiguration
;
118 public static void main(String
[] args
) throws Exception
{
119 RwtRunner rwtRunner
= new RwtRunner();
121 String entryPoint
= "app";
122 ApplicationConfiguration applicationConfiguration
= (application
) -> application
.addEntryPoint("/" + entryPoint
,
123 () -> new AbstractEntryPoint() {
124 private static final long serialVersionUID
= 5678385921969090733L;
127 protected void createContents(Composite parent
) {
128 Label label
= new Label(parent
, 0);
129 label
.setText("Hello world!");
133 rwtRunner
.setApplicationConfiguration(applicationConfiguration
);
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");