Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

ITMillToolkitDesktopMode.java 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /*
  2. @ITMillApache2LicenseForJavaFiles@
  3. */
  4. package com.itmill.toolkit.launcher;
  5. import java.awt.FlowLayout;
  6. import java.awt.Rectangle;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.MouseAdapter;
  10. import java.awt.event.MouseEvent;
  11. import java.awt.event.WindowAdapter;
  12. import java.awt.event.WindowEvent;
  13. import java.io.File;
  14. import java.io.FileOutputStream;
  15. import java.io.IOException;
  16. import java.io.InputStream;
  17. import java.io.OutputStream;
  18. import java.util.Map;
  19. import javax.swing.JButton;
  20. import javax.swing.JFrame;
  21. import javax.swing.JLabel;
  22. import javax.swing.JPanel;
  23. import javax.swing.WindowConstants;
  24. import com.itmill.toolkit.launcher.util.BrowserLauncher;
  25. /**
  26. * This class starts servlet container and opens a simple control dialog.
  27. *
  28. */
  29. public class ITMillToolkitDesktopMode {
  30. public static void main(String[] args) {
  31. final Map serverArgs = ITMillToolkitWebMode.parseArguments(args);
  32. boolean deployed = false;
  33. try {
  34. // Default deployment: embedded.war
  35. deployed = deployEmbeddedWarfile(serverArgs);
  36. } catch (final IOException e1) {
  37. e1.printStackTrace();
  38. deployed = false;
  39. }
  40. // Check if deployment was succesful
  41. if (!deployed && !serverArgs.containsKey("webroot")) {
  42. // Default deployment failed, try other means
  43. if (new File("WebContent").exists()) {
  44. // Using WebContent directory as webroot
  45. serverArgs.put("webroot", "WebContent");
  46. } else {
  47. System.err.print("Failed to deploy Toolkit application. "
  48. + "Please add --webroot parameter. Exiting.");
  49. return;
  50. }
  51. }
  52. // Start the Winstone servlet container
  53. final String url = ITMillToolkitWebMode.runServer(serverArgs,
  54. "Desktop Mode");
  55. // Open browser into application URL
  56. if (url != null) {
  57. BrowserLauncher.openBrowser(url);
  58. }
  59. // Open control dialog
  60. if (url != null) {
  61. openServerControlDialog(url);
  62. }
  63. }
  64. /**
  65. * Open a control dialog for embedded server.
  66. *
  67. * @param applicationUrl
  68. * Application URL
  69. */
  70. private static void openServerControlDialog(final String applicationUrl) {
  71. // Main frame
  72. final String title = "Desktop Server";
  73. final JFrame frame = new JFrame(title);
  74. frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
  75. // Create link label and listen mouse click
  76. final JLabel link = new JLabel("<html>"
  77. + "<center>Desktop Server is running at: <br>" + "<a href=\""
  78. + applicationUrl + "\">" + applicationUrl
  79. + "</a><br>Close this window to shutdown the server.</center>"
  80. + "</html>");
  81. link.addMouseListener(new MouseAdapter() {
  82. public void mouseClicked(MouseEvent e) {
  83. BrowserLauncher.openBrowser(applicationUrl);
  84. }
  85. });
  86. // Create a panel and add components to it.
  87. final JPanel contentPane = new JPanel(new FlowLayout());
  88. frame.setContentPane(contentPane);
  89. contentPane.add(link);
  90. // Close confirmation
  91. final JLabel question = new JLabel(
  92. "This will stop the server. Are you sure?");
  93. final JButton okButton = new JButton("OK");
  94. final JButton cancelButton = new JButton("Cancel");
  95. // List for close verify buttons
  96. final ActionListener buttonListener = new ActionListener() {
  97. public void actionPerformed(ActionEvent e) {
  98. if (e.getSource() == okButton) {
  99. System.exit(0);
  100. } else {
  101. Rectangle bounds = frame.getBounds();
  102. frame.setTitle(title);
  103. contentPane.removeAll();
  104. contentPane.add(link);
  105. contentPane.setBounds(bounds);
  106. frame.setBounds(bounds);
  107. frame.setVisible(true);
  108. frame.repaint();
  109. }
  110. }
  111. };
  112. okButton.addActionListener(buttonListener);
  113. cancelButton.addActionListener(buttonListener);
  114. frame.addWindowListener(new WindowAdapter() {
  115. public void windowClosing(WindowEvent e) {
  116. final Rectangle bounds = frame.getBounds();
  117. frame.setTitle("Confirm close");
  118. contentPane.removeAll();
  119. contentPane.add(question);
  120. contentPane.add(okButton);
  121. contentPane.add(cancelButton);
  122. frame.setBounds(bounds);
  123. frame.setVisible(true);
  124. frame.repaint();
  125. }
  126. });
  127. // Position the window nicely
  128. final java.awt.Dimension screenSize = java.awt.Toolkit
  129. .getDefaultToolkit().getScreenSize();
  130. final int w = 270;
  131. final int h = 95;
  132. final int margin = 20;
  133. frame.setBounds(new Rectangle(screenSize.width - w - margin,
  134. screenSize.height - h - margin * 2, w, h));
  135. frame.toFront();
  136. frame.setVisible(true);
  137. }
  138. /**
  139. * Deploy file named "embedded.war" from classpath (inside jar file).
  140. *
  141. * @param args
  142. * @return
  143. * @throws IOException
  144. */
  145. protected static boolean deployEmbeddedWarfile(Map args) throws IOException {
  146. final String embeddedWarfileName = "/embedded.war";
  147. final InputStream embeddedWarfile = ITMillToolkitDesktopMode.class
  148. .getResourceAsStream(embeddedWarfileName);
  149. if (embeddedWarfile != null) {
  150. final File tempWarfile = File.createTempFile("embedded", ".war")
  151. .getAbsoluteFile();
  152. tempWarfile.getParentFile().mkdirs();
  153. tempWarfile.deleteOnExit();
  154. final String embeddedWebroot = "winstoneEmbeddedWAR";
  155. final File tempWebroot = new File(tempWarfile.getParentFile(),
  156. embeddedWebroot);
  157. tempWebroot.mkdirs();
  158. final OutputStream out = new FileOutputStream(tempWarfile, true);
  159. int read = 0;
  160. final byte buffer[] = new byte[2048];
  161. while ((read = embeddedWarfile.read(buffer)) != -1) {
  162. out.write(buffer, 0, read);
  163. }
  164. out.close();
  165. embeddedWarfile.close();
  166. args.put("warfile", tempWarfile.getAbsolutePath());
  167. args.put("webroot", tempWebroot.getAbsolutePath());
  168. args.remove("webappsDir");
  169. args.remove("hostsDir");
  170. return true;
  171. }
  172. return false;
  173. }
  174. }