--- /dev/null
+package com.itmill.toolkit.demo;\r
+\r
+import java.io.IOException;\r
+\r
+/**\r
+ * Class for controlling web browser.\r
+ * \r
+ */\r
+public class BrowserControl {\r
+\r
+ /**\r
+ * Open browser on specified URL.\r
+ * \r
+ * @param url\r
+ */\r
+ public static void openBrowser(String url) {\r
+\r
+ Runtime runtime = Runtime.getRuntime();\r
+ boolean started = false;\r
+\r
+ String os = System.getProperty("os.name", "windows").toLowerCase();\r
+\r
+ // Linux\r
+ if (os.indexOf("linux") >= 0) {\r
+\r
+ // Try x-www-browser\r
+ if (!started) {\r
+ try {\r
+ runtime.exec("x-www-browser " + url);\r
+ started = true;\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+\r
+ // Try firefox\r
+ if (!started) {\r
+ try {\r
+ runtime.exec("firefox " + url);\r
+ started = true;\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+\r
+ // Try mozilla\r
+ if (!started) {\r
+ try {\r
+ runtime.exec("mozilla " + url);\r
+ started = true;\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+\r
+ // Try konqueror\r
+ if (!started) {\r
+ try {\r
+ runtime.exec("konqueror " + url);\r
+ started = true;\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ }\r
+\r
+ // OS X\r
+ if (os.indexOf("mac os x") >= 0) {\r
+\r
+ // Try open\r
+ if (!started) {\r
+ try {\r
+ runtime.exec("open " + url);\r
+ started = true;\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ }\r
+\r
+ // Try cmd /start command on windows\r
+ if (os.indexOf("win") >= 0) {\r
+ if (!started) {\r
+ try {\r
+ runtime.exec("cmd /c start " + url);\r
+ started = true;\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ }\r
+\r
+ if (!started)\r
+ System.out.println("Failed to open browser. Please go to " + url);\r
+ }\r
+\r
+}\r
--- /dev/null
+package com.itmill.toolkit.demo;\r
+\r
+import java.awt.FlowLayout;\r
+import java.awt.Rectangle;\r
+import java.awt.event.ActionEvent;\r
+import java.awt.event.ActionListener;\r
+import java.awt.event.MouseAdapter;\r
+import java.awt.event.MouseEvent;\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
+import java.io.File;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.OutputStream;\r
+import java.util.Map;\r
+\r
+import javax.swing.JButton;\r
+import javax.swing.JFrame;\r
+import javax.swing.JLabel;\r
+import javax.swing.JPanel;\r
+\r
+/**\r
+ * This class starts servlet container and opens a simple control dialog.\r
+ * \r
+ */\r
+public class DesktopServer {\r
+\r
+ public static void main(String[] args) {\r
+\r
+ Map serverArgs = ITMillToolkitServer.parseArguments(args);\r
+ boolean deployed = false;\r
+ try {\r
+ // Default deployment: embedded.war\r
+ deployed = deployEmbeddedWarfile(serverArgs);\r
+ } catch (IOException e1) {\r
+ e1.printStackTrace();\r
+ deployed = false;\r
+ }\r
+\r
+ // Check if deployment was succesful\r
+ if (!deployed && !serverArgs.containsKey("webroot")) {\r
+ // Default deployment failed, try other means\r
+ if (new File("WebContent").exists()) {\r
+ // Using WebContent directory as webroot\r
+ serverArgs.put("webroot", "WebContent");\r
+ } else {\r
+ System.err.print("Failed to deploy Toolkit application. "\r
+ + "Please add --webroot parameter. Exiting.");\r
+ return;\r
+ }\r
+ }\r
+\r
+ // Start the Winstone servlet container\r
+ String url = ITMillToolkitServer.runServer(serverArgs);\r
+\r
+ // Open browser into application URL\r
+ if (url != null) {\r
+ BrowserControl.openBrowser(url);\r
+ }\r
+\r
+ // Open control dialog\r
+ if (url != null) {\r
+ openServerControlDialog(url);\r
+ }\r
+\r
+ }\r
+\r
+ /**\r
+ * Open a control dialog for embedded server.\r
+ * \r
+ * @param applicationUrl\r
+ * Application URL\r
+ */\r
+ private static void openServerControlDialog(final String applicationUrl) {\r
+\r
+ // Main frame\r
+ final String title = "Desktop Server";\r
+ final JFrame frame = new JFrame(title);\r
+ frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);\r
+\r
+ // Create link label and listen mouse click\r
+ final JLabel link = new JLabel("<html>"\r
+ + "<center>Desktop Server is running at: <br>" + "<a href=\""\r
+ + applicationUrl + "\">" + applicationUrl\r
+ + "</a><br>Close this window to shutdown the server.</center>"\r
+ + "</html>");\r
+ link.addMouseListener(new MouseAdapter() {\r
+ public void mouseClicked(MouseEvent e) {\r
+ BrowserControl.openBrowser(applicationUrl);\r
+ }\r
+ });\r
+\r
+ // Create a panel and add components to it.\r
+ final JPanel contentPane = new JPanel(new FlowLayout());\r
+ frame.setContentPane(contentPane);\r
+ contentPane.add(link);\r
+\r
+ // Close confirmation\r
+ final JLabel question = new JLabel(\r
+ "This will stop the server. Are you sure?");\r
+ final JButton okButton = new JButton("OK");\r
+ final JButton cancelButton = new JButton("Cancel");\r
+\r
+ // List for close verify buttons\r
+ ActionListener buttonListener = new ActionListener() {\r
+ public void actionPerformed(ActionEvent e) {\r
+ if (e.getSource() == okButton) {\r
+ System.exit(0);\r
+ } else {\r
+ Rectangle bounds = frame.getBounds();\r
+ frame.setTitle(title);\r
+ contentPane.removeAll();\r
+ contentPane.add(link);\r
+ contentPane.setBounds(bounds);\r
+ frame.setBounds(bounds);\r
+ frame.setVisible(true);\r
+ frame.repaint();\r
+ }\r
+ }\r
+ };\r
+ okButton.addActionListener(buttonListener);\r
+ cancelButton.addActionListener(buttonListener);\r
+\r
+ frame.addWindowListener(new WindowAdapter() {\r
+ public void windowClosing(WindowEvent e) {\r
+ Rectangle bounds = frame.getBounds();\r
+ frame.setTitle("Confirm close");\r
+ contentPane.removeAll();\r
+ contentPane.add(question);\r
+ contentPane.add(okButton);\r
+ contentPane.add(cancelButton);\r
+ frame.setBounds(bounds);\r
+ frame.setVisible(true);\r
+ frame.repaint();\r
+ }\r
+ });\r
+\r
+ // Position the window nicely\r
+ java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit()\r
+ .getScreenSize();\r
+ int w = 270;\r
+ int h = 95;\r
+ int margin = 20;\r
+ frame.setBounds(new Rectangle(screenSize.width - w - margin,\r
+ screenSize.height - h - margin * 2, w, h));\r
+ frame.toFront();\r
+ frame.setVisible(true);\r
+ }\r
+\r
+ /**\r
+ * Deploy file named "embedded.war" from classpath (inside jar file).\r
+ * \r
+ * @param args\r
+ * @return\r
+ * @throws IOException\r
+ */\r
+ protected static boolean deployEmbeddedWarfile(Map args) throws IOException {\r
+ String embeddedWarfileName = "/embedded.war";\r
+ InputStream embeddedWarfile = DesktopServer.class\r
+ .getResourceAsStream(embeddedWarfileName);\r
+ if (embeddedWarfile != null) {\r
+ File tempWarfile = File.createTempFile("embedded", ".war")\r
+ .getAbsoluteFile();\r
+ tempWarfile.getParentFile().mkdirs();\r
+ tempWarfile.deleteOnExit();\r
+\r
+ String embeddedWebroot = "winstoneEmbeddedWAR";\r
+ File tempWebroot = new File(tempWarfile.getParentFile(),\r
+ embeddedWebroot);\r
+ tempWebroot.mkdirs();\r
+\r
+ OutputStream out = new FileOutputStream(tempWarfile, true);\r
+ int read = 0;\r
+ byte buffer[] = new byte[2048];\r
+ while ((read = embeddedWarfile.read(buffer)) != -1) {\r
+ out.write(buffer, 0, read);\r
+ }\r
+ out.close();\r
+ embeddedWarfile.close();\r
+\r
+ args.put("warfile", tempWarfile.getAbsolutePath());\r
+ args.put("webroot", tempWebroot.getAbsolutePath());\r
+ args.remove("webappsDir");\r
+ args.remove("hostsDir");\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+}\r
--- /dev/null
+package com.itmill.toolkit.demo;\r
+\r
+import java.io.IOException;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import winstone.Launcher;\r
+import winstone.Logger;\r
+\r
+/**\r
+ * Class for running Winstone servlet container within Eclipse project.\r
+ * \r
+ */\r
+public class ITMillToolkitServer {\r
+\r
+ private final static String serverPort = "8888";\r
+\r
+ /**\r
+ * Main function for running Winstone Launcher.\r
+ * \r
+ * Any command line Arguments are passed through to Winstone.\r
+ * \r
+ * @param args\r
+ */\r
+ public static void main(String[] args) {\r
+\r
+ // Pass-through of arguments to winstone launcher\r
+ Map serverArgs = parseArguments(args);\r
+\r
+ String url = runServer(serverArgs);\r
+\r
+ // Open browser into application URL\r
+ if (url != null) {\r
+ BrowserControl.openBrowser(url);\r
+ }\r
+\r
+ }\r
+\r
+ /**\r
+ * Run the server with specified arguments.\r
+ * \r
+ * @param serverArgs\r
+ * @return\r
+ */\r
+ protected static String runServer(Map serverArgs) {\r
+\r
+ // Add help for System.out\r
+ System.out\r
+ .println("-------------------------------------------------\n"\r
+ + "Starting IT Mill Toolkit examples.\n"\r
+ + "Please go to http://localhost:"\r
+ + serverPort\r
+ + "\nif your web browser is not automatically started."\r
+ + "\n-------------------------------------------------\n");\r
+\r
+ // Assign default values for some arguments\r
+ assignDefault(serverArgs, "webroot", "WebContent");\r
+ assignDefault(serverArgs, "httpPort", serverPort);\r
+ assignDefault(serverArgs, "ajp13Port", "-1");\r
+ assignDefault(serverArgs, "controlPort", "-1");\r
+ assignDefault(serverArgs, "httpListenAddress", "127.0.0.1");\r
+\r
+ try {\r
+ Launcher.initLogger(serverArgs);\r
+ new Launcher(serverArgs);\r
+ Logger.setCurrentDebugLevel(Logger.ERROR);\r
+ } catch (IOException e) {\r
+ e.printStackTrace();\r
+ }\r
+\r
+ return "http://localhost:" + serverArgs.get("httpPort");\r
+ }\r
+\r
+ /**\r
+ * Assign default value for given key.\r
+ * \r
+ * @param map\r
+ * @param key\r
+ * @param value\r
+ */\r
+ private static void assignDefault(Map map, String key, String value) {\r
+ if (!map.containsKey(key)) {\r
+ map.put(key, value);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Parse all command line arguments into a map.\r
+ * \r
+ * Arguments format "key=value" are put into map.\r
+ * \r
+ * @param args\r
+ * @return map of arguments key value pairs.\r
+ */\r
+ protected static Map parseArguments(String[] args) {\r
+ Map map = new HashMap();\r
+ for (int i = 0; i < args.length; i++) {\r
+ int d = args[i].indexOf("=");\r
+ if (d > 0 && d < args[i].length() && args[i].startsWith("--")) {\r
+ String name = args[i].substring(2, d);\r
+ String value = args[i].substring(d + 1);\r
+ map.put(name, value);\r
+ }\r
+ }\r
+ return map;\r
+ }\r
+\r
+}\r