diff options
Diffstat (limited to 'src/com/vaadin/launcher')
-rw-r--r-- | src/com/vaadin/launcher/ITMillToolkitDesktopMode.java | 211 | ||||
-rw-r--r-- | src/com/vaadin/launcher/ITMillToolkitWebMode.java | 131 | ||||
-rw-r--r-- | src/com/vaadin/launcher/WidgetsetCompiler.java | 55 | ||||
-rw-r--r-- | src/com/vaadin/launcher/util/BrowserLauncher.java | 98 |
4 files changed, 495 insertions, 0 deletions
diff --git a/src/com/vaadin/launcher/ITMillToolkitDesktopMode.java b/src/com/vaadin/launcher/ITMillToolkitDesktopMode.java new file mode 100644 index 0000000000..4feabeae71 --- /dev/null +++ b/src/com/vaadin/launcher/ITMillToolkitDesktopMode.java @@ -0,0 +1,211 @@ +/* +@ITMillApache2LicenseForJavaFiles@ + */ + +package com.vaadin.launcher; + +import java.awt.FlowLayout; +import java.awt.HeadlessException; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Map; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.WindowConstants; + +import com.vaadin.launcher.util.BrowserLauncher; + +/** + * This class starts servlet container and opens a simple control dialog. + * + */ +public class ITMillToolkitDesktopMode { + + public static void main(String[] args) { + + final Map serverArgs = ITMillToolkitWebMode.parseArguments(args); + boolean deployed = false; + try { + // Default deployment: embedded.war + deployed = deployEmbeddedWarfile(serverArgs); + } catch (final IOException e1) { + e1.printStackTrace(); + deployed = false; + } + + // Check if deployment was succesful + if (!deployed && !serverArgs.containsKey("webroot")) { + // Default deployment failed, try other means + if (new File("WebContent").exists()) { + // Using WebContent directory as webroot + serverArgs.put("webroot", "WebContent"); + } else { + System.err.print("Failed to deploy Toolkit application. " + + "Please add --webroot parameter. Exiting."); + return; + } + } + + // Start the Winstone servlet container + final String url = ITMillToolkitWebMode.runServer(serverArgs, + "Desktop Mode"); + + if (!serverArgs.containsKey("nogui") && url != null) { + + // Open browser into application URL + BrowserLauncher.openBrowser(url); + + // Open control dialog + /* + * Swing components should never be manipulated outside the event + * dispatch thread. + */ + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + try { + openServerControlDialog(url); + } catch (HeadlessException e) { + // nop, starting from console + } + } + }); + } + } + + /** + * Open a control dialog for embedded server. + * + * @param applicationUrl + * Application URL + */ + private static void openServerControlDialog(final String applicationUrl) { + + // Main frame + final String title = "Desktop Server"; + final JFrame frame = new JFrame(title); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + + // Create link label and listen mouse click + final JLabel link = new JLabel("<html>" + + "<center>Desktop Server is running at: <br>" + "<a href=\"" + + applicationUrl + "\">" + applicationUrl + + "</a><br>Close this window to shutdown the server.</center>" + + "</html>"); + link.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + BrowserLauncher.openBrowser(applicationUrl); + } + }); + + // Create a panel and add components to it. + final JPanel contentPane = new JPanel(new FlowLayout()); + frame.setContentPane(contentPane); + contentPane.add(link); + + // Close confirmation + final JLabel question = new JLabel( + "This will stop the server. Are you sure?"); + final JButton okButton = new JButton("OK"); + final JButton cancelButton = new JButton("Cancel"); + + // List for close verify buttons + final ActionListener buttonListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (e.getSource() == okButton) { + System.exit(0); + } else { + Rectangle bounds = frame.getBounds(); + frame.setTitle(title); + contentPane.removeAll(); + contentPane.add(link); + contentPane.setBounds(bounds); + frame.setBounds(bounds); + frame.setVisible(true); + frame.repaint(); + } + } + }; + okButton.addActionListener(buttonListener); + cancelButton.addActionListener(buttonListener); + + frame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + final Rectangle bounds = frame.getBounds(); + frame.setTitle("Confirm close"); + contentPane.removeAll(); + contentPane.add(question); + contentPane.add(okButton); + contentPane.add(cancelButton); + frame.setBounds(bounds); + frame.setVisible(true); + frame.repaint(); + } + }); + + // Position the window nicely + final java.awt.Dimension screenSize = java.awt.Toolkit + .getDefaultToolkit().getScreenSize(); + final int w = 270; + final int h = 95; + final int margin = 20; + frame.setBounds(new Rectangle(screenSize.width - w - margin, + screenSize.height - h - margin * 2, w, h)); + frame.toFront(); + frame.setVisible(true); + } + + /** + * Deploy file named "embedded.war" from classpath (inside jar file). + * + * @param args + * @return + * @throws IOException + */ + protected static boolean deployEmbeddedWarfile(Map args) throws IOException { + final String embeddedWarfileName = "/embedded.war"; + final InputStream embeddedWarfile = ITMillToolkitDesktopMode.class + .getResourceAsStream(embeddedWarfileName); + if (embeddedWarfile != null) { + final File tempWarfile = File.createTempFile("embedded", ".war") + .getAbsoluteFile(); + tempWarfile.getParentFile().mkdirs(); + tempWarfile.deleteOnExit(); + + final String embeddedWebroot = "winstoneEmbeddedWAR"; + final File tempWebroot = new File(tempWarfile.getParentFile(), + embeddedWebroot); + tempWebroot.mkdirs(); + + final OutputStream out = new FileOutputStream(tempWarfile, true); + int read = 0; + final byte buffer[] = new byte[2048]; + while ((read = embeddedWarfile.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + out.close(); + embeddedWarfile.close(); + + args.put("warfile", tempWarfile.getAbsolutePath()); + args.put("webroot", tempWebroot.getAbsolutePath()); + args.remove("webappsDir"); + args.remove("hostsDir"); + return true; + } + return false; + } +} diff --git a/src/com/vaadin/launcher/ITMillToolkitWebMode.java b/src/com/vaadin/launcher/ITMillToolkitWebMode.java new file mode 100644 index 0000000000..d7931deb96 --- /dev/null +++ b/src/com/vaadin/launcher/ITMillToolkitWebMode.java @@ -0,0 +1,131 @@ +/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.launcher;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+
+import com.vaadin.launcher.util.BrowserLauncher;
+
+/**
+ * Class for running Jetty servlet container within Eclipse project.
+ *
+ */
+public class ITMillToolkitWebMode {
+
+ private final static String serverPort = "8888";
+
+ /**
+ * Main function for running Jetty.
+ *
+ * Command line Arguments are passed through to Jetty, see runServer method
+ * for options.
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+
+ // Pass-through of arguments for Jetty
+ final Map serverArgs = parseArguments(args);
+
+ // Start Jetty
+ System.out.println("Starting Jetty servlet container.");
+ final String url = runServer(serverArgs, "Web Mode");
+
+ // Start Browser
+ System.out.println("Starting Web Browser.");
+ if (url != null) {
+ BrowserLauncher.openBrowser(url);
+ }
+
+ }
+
+ /**
+ * Run the server with specified arguments.
+ *
+ * @param serverArgs
+ * @return
+ */
+ protected static String runServer(Map serverArgs, String mode) {
+
+ // Add help for System.out
+ System.out
+ .println("-------------------------------------------------\n"
+ + "Starting IT Mill Toolkit in "
+ + mode
+ + ".\n"
+ + "Running in http://localhost:"
+ + serverPort
+ + "\n-------------------------------------------------\n");
+
+ // Assign default values for some arguments
+ assignDefault(serverArgs, "webroot", "WebContent");
+ assignDefault(serverArgs, "httpPort", serverPort);
+ assignDefault(serverArgs, "context", "");
+
+ try {
+ final Server server = new Server();
+
+ final Connector connector = new SelectChannelConnector();
+
+ connector.setPort(8888);
+ server.setConnectors(new Connector[] { connector });
+
+ final WebAppContext webappcontext = new WebAppContext();
+ webappcontext.setContextPath(serverArgs.get("context").toString());
+ webappcontext.setWar(serverArgs.get("webroot").toString());
+
+ server.setHandler(webappcontext);
+
+ server.start();
+ } catch (final Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+
+ return "http://localhost:" + serverArgs.get("httpPort")
+ + serverArgs.get("context");
+ }
+
+ /**
+ * Assign default value for given key.
+ *
+ * @param map
+ * @param key
+ * @param value
+ */
+ private static void assignDefault(Map map, String key, String value) {
+ if (!map.containsKey(key)) {
+ map.put(key, value);
+ }
+ }
+
+ /**
+ * Parse all command line arguments into a map.
+ *
+ * Arguments format "key=value" are put into map.
+ *
+ * @param args
+ * @return map of arguments key value pairs.
+ */
+ protected static Map parseArguments(String[] args) {
+ final Map map = new HashMap();
+ for (int i = 0; i < args.length; i++) {
+ final int d = args[i].indexOf("=");
+ if (d > 0 && d < args[i].length() && args[i].startsWith("--")) {
+ final String name = args[i].substring(2, d);
+ final String value = args[i].substring(d + 1);
+ map.put(name, value);
+ }
+ }
+ return map;
+ }
+
+}
diff --git a/src/com/vaadin/launcher/WidgetsetCompiler.java b/src/com/vaadin/launcher/WidgetsetCompiler.java new file mode 100644 index 0000000000..ecbd270d66 --- /dev/null +++ b/src/com/vaadin/launcher/WidgetsetCompiler.java @@ -0,0 +1,55 @@ +package com.vaadin.launcher;
+
+import com.google.gwt.dev.GWTCompiler;
+
+/**
+ * A wrapper for the GWT 1.6 compiler that runs the compiler in a new thread.
+ *
+ * This allows circumventing a J2SE 5.0 bug (6316197) that prevents setting the
+ * stack size for the main thread. Thus, larger widgetsets can be compiled.
+ *
+ * This class takes the same command line arguments as the
+ * com.google.gwt.dev.GWTCompiler class. The old and deprecated compiler is used
+ * for compatibility with GWT 1.5.
+ *
+ * A typical invocation would use e.g. the following arguments
+ *
+ * "-out WebContent/ITMILL/widgetsets com.vaadin.terminal.gwt.DefaultWidgetSet"
+ *
+ * In addition, larger memory usage settings for the VM should be used, e.g.
+ *
+ * "-Xms256M -Xmx512M -Xss8M"
+ *
+ * The source directory containing widgetset and related classes must be
+ * included in the classpath, as well as the gwt-dev-[platform].jar and other
+ * relevant JARs.
+ */
+public class WidgetsetCompiler {
+
+ /**
+ * @param args
+ * same arguments as for com.google.gwt.dev.Compiler
+ */
+ public static void main(final String[] args) {
+ try {
+ // run the compiler in a different thread to enable using the
+ // user-set stack size
+
+ // on Windows, the default stack size is too small for the main
+ // thread and cannot be changed in JRE 1.5 (see
+ // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6316197)
+
+ Runnable runCompiler = new Runnable() {
+ public void run() {
+ GWTCompiler.main(args);
+ }
+ };
+ Thread runThread = new Thread(runCompiler);
+ runThread.start();
+ runThread.join();
+ System.out.println("Widgetset compilation finished");
+ } catch (Throwable thr) {
+ thr.printStackTrace();
+ }
+ }
+}
diff --git a/src/com/vaadin/launcher/util/BrowserLauncher.java b/src/com/vaadin/launcher/util/BrowserLauncher.java new file mode 100644 index 0000000000..7d8d23f028 --- /dev/null +++ b/src/com/vaadin/launcher/util/BrowserLauncher.java @@ -0,0 +1,98 @@ +/*
+@ITMillApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.launcher.util;
+
+import java.io.IOException;
+
+/**
+ * This class opens default browser for ITMillDesktopLaunch class. Default
+ * browser is detected by the operating system.
+ *
+ */
+public class BrowserLauncher {
+
+ /**
+ * Open browser on specified URL.
+ *
+ * @param url
+ */
+ public static void openBrowser(String url) {
+
+ final Runtime runtime = Runtime.getRuntime();
+ boolean started = false;
+
+ final String os = System.getProperty("os.name", "windows")
+ .toLowerCase();
+
+ // Linux
+ if (os.indexOf("linux") >= 0) {
+
+ // Try x-www-browser
+ if (!started) {
+ try {
+ runtime.exec("x-www-browser " + url);
+ started = true;
+ } catch (final IOException e) {
+ }
+ }
+
+ // Try firefox
+ if (!started) {
+ try {
+ runtime.exec("firefox " + url);
+ started = true;
+ } catch (final IOException e) {
+ }
+ }
+
+ // Try mozilla
+ if (!started) {
+ try {
+ runtime.exec("mozilla " + url);
+ started = true;
+ } catch (final IOException e) {
+ }
+ }
+
+ // Try konqueror
+ if (!started) {
+ try {
+ runtime.exec("konqueror " + url);
+ started = true;
+ } catch (final IOException e) {
+ }
+ }
+ }
+
+ // OS X
+ if (os.indexOf("mac os x") >= 0) {
+
+ // Try open
+ if (!started) {
+ try {
+ runtime.exec("open " + url);
+ started = true;
+ } catch (final IOException e) {
+ }
+ }
+ }
+
+ // Try cmd /start command on windows
+ if (os.indexOf("win") >= 0) {
+ if (!started) {
+ try {
+ runtime.exec("cmd /c start " + url);
+ started = true;
+ } catch (final IOException e) {
+ }
+ }
+ }
+
+ if (!started) {
+ System.out.println("Failed to open browser. Please go to " + url);
+ }
+ }
+
+}
|