From: Jani Laakso Date: Wed, 7 Nov 2007 17:09:22 +0000 (+0000) Subject: Brought back desktopmode launch for demos. X-Git-Tag: 6.7.0.beta1~5644 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=30e4afaaed1bd0f737f87dc2794e427a91782fd4;p=vaadin-framework.git Brought back desktopmode launch for demos. svn changeset:2740/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/launcher/ITMillToolkitDesktopMode.java b/src/com/itmill/toolkit/launcher/ITMillToolkitDesktopMode.java new file mode 100644 index 0000000000..9636e36acc --- /dev/null +++ b/src/com/itmill/toolkit/launcher/ITMillToolkitDesktopMode.java @@ -0,0 +1,192 @@ +package com.itmill.toolkit.launcher; + +import java.awt.FlowLayout; +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 com.itmill.toolkit.launcher.util.BrowserLauncher; + +/** + * This class starts servlet container and opens a simple control dialog. + * + */ +public class ITMillToolkitDesktopMode { + + public static void main(String[] args) { + + Map serverArgs = ITMillToolkitWebMode.parseArguments(args); + boolean deployed = false; + try { + // Default deployment: embedded.war + deployed = deployEmbeddedWarfile(serverArgs); + } catch (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 + String url = ITMillToolkitWebMode.runServer(serverArgs); + + // Open browser into application URL + if (url != null) { + BrowserLauncher.openBrowser(url); + } + + // Open control dialog + if (url != null) { + openServerControlDialog(url); + } + + } + + /** + * 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(JFrame.DO_NOTHING_ON_CLOSE); + + // Create link label and listen mouse click + final JLabel link = new JLabel("" + + "
Desktop Server is running at:
" + "" + applicationUrl + + "
Close this window to shutdown the server.
" + + ""); + link.addMouseListener(new MouseAdapter() { + 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 + 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() { + public void windowClosing(WindowEvent e) { + 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 + java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit() + .getScreenSize(); + int w = 270; + int h = 95; + 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 { + String embeddedWarfileName = "/embedded.war"; + InputStream embeddedWarfile = ITMillToolkitDesktopMode.class + .getResourceAsStream(embeddedWarfileName); + if (embeddedWarfile != null) { + File tempWarfile = File.createTempFile("embedded", ".war") + .getAbsoluteFile(); + tempWarfile.getParentFile().mkdirs(); + tempWarfile.deleteOnExit(); + + String embeddedWebroot = "winstoneEmbeddedWAR"; + File tempWebroot = new File(tempWarfile.getParentFile(), + embeddedWebroot); + tempWebroot.mkdirs(); + + OutputStream out = new FileOutputStream(tempWarfile, true); + int read = 0; + 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; + } +}