+++ /dev/null
-/* \r
-@ITMillApache2LicenseForJavaFiles@\r
- */\r
-\r
-package com.vaadin.launcher;\r
-\r
-import java.io.File;\r
-import java.io.IOException;\r
-import java.io.OutputStream;\r
-import java.net.InetAddress;\r
-import java.net.ServerSocket;\r
-import java.net.Socket;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-\r
-import org.mortbay.jetty.Connector;\r
-import org.mortbay.jetty.Server;\r
-import org.mortbay.jetty.nio.SelectChannelConnector;\r
-import org.mortbay.jetty.security.SslSocketConnector;\r
-import org.mortbay.jetty.webapp.WebAppContext;\r
-\r
-import com.vaadin.launcher.util.BrowserLauncher;\r
-\r
-/**\r
- * Class for running Jetty servlet container within Eclipse project.\r
- * \r
- */\r
-public class DevelopmentServerLauncher {\r
-\r
- private static final String KEYSTORE = "src/com/vaadin/launcher/keystore";\r
- private final static int serverPort = 8888;\r
-\r
- /**\r
- * Main function for running Jetty.\r
- * \r
- * Command line Arguments are passed through to Jetty, see runServer method\r
- * for options.\r
- * \r
- * @param args\r
- * @throws Exception\r
- */\r
- public static void main(String[] args) {\r
-\r
- // Pass-through of arguments for Jetty\r
- final Map<String, String> serverArgs = parseArguments(args);\r
-\r
- if (serverArgs.containsKey("shutdownPort")) {\r
- int port = Integer.parseInt(serverArgs.get("shutdownPort"));\r
- try {\r
- // Try to notify another instance that it's time to close\r
- Socket socket = new Socket((String) null, port);\r
- // Wait until the other instance says it has closed\r
- socket.getInputStream().read();\r
- // Then tidy up\r
- socket.close();\r
- } catch (IOException e) {\r
- // Ignore if port is not open\r
- }\r
- }\r
-\r
- // Start Jetty\r
- System.out.println("Starting Jetty servlet container.");\r
- String url;\r
- try {\r
- url = runServer(serverArgs, "Development Server Mode");\r
- // Start Browser\r
- if (!serverArgs.containsKey("nogui") && url != null) {\r
- System.out.println("Starting Web Browser.");\r
-\r
- // Open browser into application URL\r
- BrowserLauncher.openBrowser(url);\r
- }\r
- } catch (Exception e) {\r
- // NOP exception already on console by jetty\r
- }\r
- }\r
-\r
- /**\r
- * Run the server with specified arguments.\r
- * \r
- * @param serverArgs\r
- * @return\r
- * @throws Exception\r
- * @throws Exception\r
- */\r
- protected static String runServer(Map<String, String> serverArgs,\r
- String mode) throws Exception {\r
-\r
- // Assign default values for some arguments\r
- assignDefault(serverArgs, "webroot", "WebContent");\r
- assignDefault(serverArgs, "httpPort", "" + serverPort);\r
- assignDefault(serverArgs, "context", "");\r
-\r
- int port = serverPort;\r
- try {\r
- port = Integer.parseInt(serverArgs.get("httpPort"));\r
- } catch (NumberFormatException e) {\r
- // keep default value for port\r
- }\r
-\r
- // Add help for System.out\r
- System.out\r
- .println("-------------------------------------------------\n"\r
- + "Starting Vaadin in "\r
- + mode\r
- + ".\n"\r
- + "Running in http://localhost:"\r
- + serverPort\r
- + "\n-------------------------------------------------\n");\r
-\r
- final Server server = new Server();\r
-\r
- final Connector connector = new SelectChannelConnector();\r
-\r
- connector.setPort(port);\r
- if (serverArgs.containsKey("withssl")) {\r
- final SslSocketConnector sslConnector = new SslSocketConnector();\r
- sslConnector.setPort(8444);\r
- sslConnector.setTruststore(KEYSTORE);\r
- sslConnector.setTrustPassword("password");\r
- sslConnector.setKeystore(KEYSTORE);\r
- sslConnector.setKeyPassword("password");\r
- sslConnector.setPassword("password");\r
- server.setConnectors(new Connector[] { connector, sslConnector });\r
- } else {\r
- server.setConnectors(new Connector[] { connector });\r
- }\r
-\r
- final WebAppContext webappcontext = new WebAppContext();\r
- String path = DevelopmentServerLauncher.class.getPackage().getName()\r
- .replace(".", File.separator);\r
- webappcontext.setDefaultsDescriptor(path + File.separator\r
- + "jetty-webdefault.xml");\r
- webappcontext.setContextPath(serverArgs.get("context"));\r
- webappcontext.setWar(serverArgs.get("webroot"));\r
- server.setHandler(webappcontext);\r
-\r
- try {\r
- server.start();\r
-\r
- if (serverArgs.containsKey("shutdownPort")) {\r
- int shutdownPort = Integer.parseInt(serverArgs\r
- .get("shutdownPort"));\r
- final ServerSocket serverSocket = new ServerSocket(\r
- shutdownPort, 1, InetAddress.getByName("127.0.0.1"));\r
- new Thread() {\r
- @Override\r
- public void run() {\r
- try {\r
- System.out\r
- .println("Waiting for shutdown signal on port "\r
- + serverSocket.getLocalPort());\r
- // Start waiting for a close signal\r
- Socket accept = serverSocket.accept();\r
- // First stop listening to the port\r
- serverSocket.close();\r
- // Then stop the jetty server\r
- server.stop();\r
- // Send a byte to tell the other process that it can\r
- // start jetty\r
- OutputStream outputStream = accept\r
- .getOutputStream();\r
- outputStream.write(0);\r
- outputStream.flush();\r
- // Finally close the socket\r
- accept.close();\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- }\r
- };\r
-\r
- }.start();\r
-\r
- }\r
- } catch (Exception e) {\r
- server.stop();\r
- throw e;\r
- }\r
-\r
- return "http://localhost:" + port + serverArgs.get("context");\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<String, String> map, String key,\r
- 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<String, String> parseArguments(String[] args) {\r
- final Map<String, String> map = new HashMap<String, String>();\r
- for (int i = 0; i < args.length; i++) {\r
- final int d = args[i].indexOf("=");\r
- if (d > 0 && d < args[i].length() && args[i].startsWith("--")) {\r
- final String name = args[i].substring(2, d);\r
- final String value = args[i].substring(d + 1);\r
- map.put(name, value);\r
- }\r
- }\r
- return map;\r
- }\r
-\r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="ISO-8859-1"?>
-
-<!-- ===================================================================== -->
-<!-- This file contains the default descriptor for web applications. -->
-<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<!-- The intent of this descriptor is to include jetty specific or common -->
-<!-- configuration for all webapps. If a context has a webdefault.xml -->
-<!-- descriptor, it is applied before the contexts own web.xml file -->
-<!-- -->
-<!-- A context may be assigned a default descriptor by: -->
-<!-- + Calling WebApplicationContext.setDefaultsDescriptor -->
-<!-- + Passed an arg to addWebApplications -->
-<!-- -->
-<!-- This file is used both as the resource within the jetty.jar (which is -->
-<!-- used as the default if no explicit defaults descriptor is set) and it -->
-<!-- is copied to the etc directory of the Jetty distro and explicitly -->
-<!-- by the jetty.xml file. -->
-<!-- -->
-<!-- ===================================================================== -->
-<web-app
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- metadata-complete="true"
- version="2.5">
-
- <description>
- Default web.xml file.
- This file is applied to a Web application before it's own WEB_INF/web.xml file
- </description>
-
-
- <!-- ==================================================================== -->
- <!-- Context params to control Session Cookies -->
- <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
- <!-- UNCOMMENT TO ACTIVATE
- <context-param>
- <param-name>org.mortbay.jetty.servlet.SessionDomain</param-name>
- <param-value>127.0.0.1</param-value>
- </context-param>
-
- <context-param>
- <param-name>org.mortbay.jetty.servlet.SessionPath</param-name>
- <param-value>/</param-value>
- </context-param>
-
- <context-param>
- <param-name>org.mortbay.jetty.servlet.MaxAge</param-name>
- <param-value>-1</param-value>
- </context-param>
- -->
-
- <context-param>
- <param-name>org.mortbay.jetty.webapp.NoTLDJarPattern</param-name>
- <param-value>start.jar|ant-.*\.jar|dojo-.*\.jar|jetty-.*\.jar|jsp-api-.*\.jar|junit-.*\.jar|servlet-api-.*\.jar|dnsns\.jar|rt\.jar|jsse\.jar|tools\.jar|sunpkcs11\.jar|sunjce_provider\.jar|xerces.*\.jar</param-value>
- </context-param>
-
-
-
- <!-- ==================================================================== -->
- <!-- The default servlet. -->
- <!-- This servlet, normally mapped to /, provides the handling for static -->
- <!-- content, OPTIONS and TRACE methods for the context. -->
- <!-- The following initParameters are supported: -->
- <!-- -->
- <!-- acceptRanges If true, range requests and responses are -->
- <!-- supported -->
- <!-- -->
- <!-- dirAllowed If true, directory listings are returned if no -->
- <!-- welcome file is found. Else 403 Forbidden. -->
- <!-- -->
- <!-- redirectWelcome If true, redirect welcome file requests -->
- <!-- else use request dispatcher forwards -->
- <!-- -->
- <!-- gzip If set to true, then static content will be served-->
- <!-- as gzip content encoded if a matching resource is -->
- <!-- found ending with ".gz" -->
- <!-- -->
- <!-- resoureBase Can be set to replace the context resource base -->
- <!-- -->
- <!-- relativeResourceBase -->
- <!-- Set with a pathname relative to the base of the -->
- <!-- servlet context root. Useful for only serving -->
- <!-- static content from only specific subdirectories. -->
- <!-- -->
- <!-- useFileMappedBuffer -->
- <!-- If set to true (the default), a memory mapped -->
- <!-- file buffer will be used to serve static content -->
- <!-- when using an NIO connector. Setting this value -->
- <!-- to false means that a direct buffer will be used -->
- <!-- instead. If you are having trouble with Windows -->
- <!-- file locking, set this to false. -->
- <!-- -->
- <!-- cacheControl If set, all static content will have this value -->
- <!-- set as the cache-control header. -->
- <!-- -->
- <!-- maxCacheSize Maximum size of the static resource cache -->
- <!-- -->
- <!-- maxCachedFileSize Maximum size of any single file in the cache -->
- <!-- -->
- <!-- maxCachedFiles Maximum number of files in the cache -->
- <!-- -->
- <!-- cacheType "nio", "bio" or "both" to determine the type(s) -->
- <!-- of resource cache. A bio cached buffer may be used-->
- <!-- by nio but is not as efficient as a nio buffer. -->
- <!-- An nio cached buffer may not be used by bio. -->
- <!-- -->
- <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
- <servlet>
- <servlet-name>default</servlet-name>
- <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class>
- <init-param>
- <param-name>acceptRanges</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>dirAllowed</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>redirectWelcome</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>maxCacheSize</param-name>
- <param-value>256000000</param-value>
- </init-param>
- <init-param>
- <param-name>maxCachedFileSize</param-name>
- <param-value>10000000</param-value>
- </init-param>
- <init-param>
- <param-name>maxCachedFiles</param-name>
- <param-value>1000</param-value>
- </init-param>
- <init-param>
- <param-name>cacheType</param-name>
- <param-value>both</param-value>
- </init-param>
- <init-param>
- <param-name>gzip</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>useFileMappedBuffer</param-name>
- <param-value>false</param-value>
- </init-param>
- <!--
- <init-param>
- <param-name>cacheControl</param-name>
- <param-value>max-age=3600,public</param-value>
- </init-param>
- -->
- <load-on-startup>0</load-on-startup>
- </servlet>
-
- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
-
- <!-- ==================================================================== -->
- <!-- Dynamic Servlet Invoker. -->
- <!-- This servlet invokes anonymous servlets that have not been defined -->
- <!-- in the web.xml or by other means. The first element of the pathInfo -->
- <!-- of a request passed to the envoker is treated as a servlet name for -->
- <!-- an existing servlet, or as a class name of a new servlet. -->
- <!-- This servlet is normally mapped to /servlet/* -->
- <!-- This servlet support the following initParams: -->
- <!-- -->
- <!-- nonContextServlets If false, the invoker can only load -->
- <!-- servlets from the contexts classloader. -->
- <!-- This is false by default and setting this -->
- <!-- to true may have security implications. -->
- <!-- -->
- <!-- verbose If true, log dynamic loads -->
- <!-- -->
- <!-- * All other parameters are copied to the -->
- <!-- each dynamic servlet as init parameters -->
- <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
- <!-- Uncomment for dynamic invocation
- <servlet>
- <servlet-name>invoker</servlet-name>
- <servlet-class>org.mortbay.jetty.servlet.Invoker</servlet-class>
- <init-param>
- <param-name>verbose</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>nonContextServlets</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>dynamicParam</param-name>
- <param-value>anyValue</param-value>
- </init-param>
- <load-on-startup>0</load-on-startup>
- </servlet>
-
- <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
- -->
-
-
-
- <!-- ==================================================================== -->
- <session-config>
- <session-timeout>30</session-timeout>
- </session-config>
-
- <!-- ==================================================================== -->
- <!-- Default MIME mappings -->
- <!-- The default MIME mappings are provided by the mime.properties -->
- <!-- resource in the org.mortbay.jetty.jar file. Additional or modified -->
- <!-- mappings may be specified here -->
- <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
- <!-- UNCOMMENT TO ACTIVATE
- <mime-mapping>
- <extension>mysuffix</extension>
- <mime-type>mymime/type</mime-type>
- </mime-mapping>
- -->
-
- <!-- ==================================================================== -->
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- <welcome-file>index.htm</welcome-file>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
-
- <!-- ==================================================================== -->
- <locale-encoding-mapping-list>
- <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
- <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>
- </locale-encoding-mapping-list>
-
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>Disable TRACE</web-resource-name>
- <url-pattern>/</url-pattern>
- <http-method>TRACE</http-method>
- </web-resource-collection>
- <auth-constraint/>
- </security-constraint>
-
-</web-app>
-
--- /dev/null
+/*
+@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 DemoLauncher {
+
+ public static void main(String[] args) throws Exception {
+
+ final Map<String, String> serverArgs = DevelopmentServerLauncher
+ .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 Vaadin application. "
+ + "Please add --webroot parameter. Exiting.");
+ return;
+ }
+ }
+
+ // Start the Jetty servlet container
+ final String url = DevelopmentServerLauncher.runServer(serverArgs,
+ "Demo Server");
+
+ 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<String, String> args)
+ throws IOException {
+ final String embeddedWarfileName = "/embedded.war";
+ final InputStream embeddedWarfile = DemoLauncher.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;
+ }
+}
--- /dev/null
+/* \r
+@ITMillApache2LicenseForJavaFiles@\r
+ */\r
+\r
+package com.vaadin.launcher;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.OutputStream;\r
+import java.net.InetAddress;\r
+import java.net.ServerSocket;\r
+import java.net.Socket;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.mortbay.jetty.Connector;\r
+import org.mortbay.jetty.Server;\r
+import org.mortbay.jetty.nio.SelectChannelConnector;\r
+import org.mortbay.jetty.security.SslSocketConnector;\r
+import org.mortbay.jetty.webapp.WebAppContext;\r
+\r
+import com.vaadin.launcher.util.BrowserLauncher;\r
+\r
+/**\r
+ * Class for running Jetty servlet container within Eclipse project.\r
+ * \r
+ */\r
+public class DevelopmentServerLauncher {\r
+\r
+ private static final String KEYSTORE = "src/com/vaadin/launcher/keystore";\r
+ private final static int serverPort = 8888;\r
+\r
+ /**\r
+ * Main function for running Jetty.\r
+ * \r
+ * Command line Arguments are passed through to Jetty, see runServer method\r
+ * for options.\r
+ * \r
+ * @param args\r
+ * @throws Exception\r
+ */\r
+ public static void main(String[] args) {\r
+\r
+ // Pass-through of arguments for Jetty\r
+ final Map<String, String> serverArgs = parseArguments(args);\r
+\r
+ if (serverArgs.containsKey("shutdownPort")) {\r
+ int port = Integer.parseInt(serverArgs.get("shutdownPort"));\r
+ try {\r
+ // Try to notify another instance that it's time to close\r
+ Socket socket = new Socket((String) null, port);\r
+ // Wait until the other instance says it has closed\r
+ socket.getInputStream().read();\r
+ // Then tidy up\r
+ socket.close();\r
+ } catch (IOException e) {\r
+ // Ignore if port is not open\r
+ }\r
+ }\r
+\r
+ // Start Jetty\r
+ System.out.println("Starting Jetty servlet container.");\r
+ String url;\r
+ try {\r
+ url = runServer(serverArgs, "Development Server Mode");\r
+ // Start Browser\r
+ if (!serverArgs.containsKey("nogui") && url != null) {\r
+ System.out.println("Starting Web Browser.");\r
+\r
+ // Open browser into application URL\r
+ BrowserLauncher.openBrowser(url);\r
+ }\r
+ } catch (Exception e) {\r
+ // NOP exception already on console by jetty\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Run the server with specified arguments.\r
+ * \r
+ * @param serverArgs\r
+ * @return\r
+ * @throws Exception\r
+ * @throws Exception\r
+ */\r
+ protected static String runServer(Map<String, String> serverArgs,\r
+ String mode) throws Exception {\r
+\r
+ // Assign default values for some arguments\r
+ assignDefault(serverArgs, "webroot", "WebContent");\r
+ assignDefault(serverArgs, "httpPort", "" + serverPort);\r
+ assignDefault(serverArgs, "context", "");\r
+\r
+ int port = serverPort;\r
+ try {\r
+ port = Integer.parseInt(serverArgs.get("httpPort"));\r
+ } catch (NumberFormatException e) {\r
+ // keep default value for port\r
+ }\r
+\r
+ // Add help for System.out\r
+ System.out\r
+ .println("-------------------------------------------------\n"\r
+ + "Starting Vaadin in "\r
+ + mode\r
+ + ".\n"\r
+ + "Running in http://localhost:"\r
+ + serverPort\r
+ + "\n-------------------------------------------------\n");\r
+\r
+ final Server server = new Server();\r
+\r
+ final Connector connector = new SelectChannelConnector();\r
+\r
+ connector.setPort(port);\r
+ if (serverArgs.containsKey("withssl")) {\r
+ final SslSocketConnector sslConnector = new SslSocketConnector();\r
+ sslConnector.setPort(8444);\r
+ sslConnector.setTruststore(KEYSTORE);\r
+ sslConnector.setTrustPassword("password");\r
+ sslConnector.setKeystore(KEYSTORE);\r
+ sslConnector.setKeyPassword("password");\r
+ sslConnector.setPassword("password");\r
+ server.setConnectors(new Connector[] { connector, sslConnector });\r
+ } else {\r
+ server.setConnectors(new Connector[] { connector });\r
+ }\r
+\r
+ final WebAppContext webappcontext = new WebAppContext();\r
+ String path = DevelopmentServerLauncher.class.getPackage().getName()\r
+ .replace(".", File.separator);\r
+ webappcontext.setDefaultsDescriptor(path + File.separator\r
+ + "jetty-webdefault.xml");\r
+ webappcontext.setContextPath(serverArgs.get("context"));\r
+ webappcontext.setWar(serverArgs.get("webroot"));\r
+ server.setHandler(webappcontext);\r
+\r
+ try {\r
+ server.start();\r
+\r
+ if (serverArgs.containsKey("shutdownPort")) {\r
+ int shutdownPort = Integer.parseInt(serverArgs\r
+ .get("shutdownPort"));\r
+ final ServerSocket serverSocket = new ServerSocket(\r
+ shutdownPort, 1, InetAddress.getByName("127.0.0.1"));\r
+ new Thread() {\r
+ @Override\r
+ public void run() {\r
+ try {\r
+ System.out\r
+ .println("Waiting for shutdown signal on port "\r
+ + serverSocket.getLocalPort());\r
+ // Start waiting for a close signal\r
+ Socket accept = serverSocket.accept();\r
+ // First stop listening to the port\r
+ serverSocket.close();\r
+ // Then stop the jetty server\r
+ server.stop();\r
+ // Send a byte to tell the other process that it can\r
+ // start jetty\r
+ OutputStream outputStream = accept\r
+ .getOutputStream();\r
+ outputStream.write(0);\r
+ outputStream.flush();\r
+ // Finally close the socket\r
+ accept.close();\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ };\r
+\r
+ }.start();\r
+\r
+ }\r
+ } catch (Exception e) {\r
+ server.stop();\r
+ throw e;\r
+ }\r
+\r
+ return "http://localhost:" + port + serverArgs.get("context");\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<String, String> map, String key,\r
+ 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<String, String> parseArguments(String[] args) {\r
+ final Map<String, String> map = new HashMap<String, String>();\r
+ for (int i = 0; i < args.length; i++) {\r
+ final int d = args[i].indexOf("=");\r
+ if (d > 0 && d < args[i].length() && args[i].startsWith("--")) {\r
+ final String name = args[i].substring(2, d);\r
+ final String value = args[i].substring(d + 1);\r
+ map.put(name, value);\r
+ }\r
+ }\r
+ return map;\r
+ }\r
+\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!-- ===================================================================== -->
+<!-- This file contains the default descriptor for web applications. -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+<!-- The intent of this descriptor is to include jetty specific or common -->
+<!-- configuration for all webapps. If a context has a webdefault.xml -->
+<!-- descriptor, it is applied before the contexts own web.xml file -->
+<!-- -->
+<!-- A context may be assigned a default descriptor by: -->
+<!-- + Calling WebApplicationContext.setDefaultsDescriptor -->
+<!-- + Passed an arg to addWebApplications -->
+<!-- -->
+<!-- This file is used both as the resource within the jetty.jar (which is -->
+<!-- used as the default if no explicit defaults descriptor is set) and it -->
+<!-- is copied to the etc directory of the Jetty distro and explicitly -->
+<!-- by the jetty.xml file. -->
+<!-- -->
+<!-- ===================================================================== -->
+<web-app
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ metadata-complete="true"
+ version="2.5">
+
+ <description>
+ Default web.xml file.
+ This file is applied to a Web application before it's own WEB_INF/web.xml file
+ </description>
+
+
+ <!-- ==================================================================== -->
+ <!-- Context params to control Session Cookies -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- UNCOMMENT TO ACTIVATE
+ <context-param>
+ <param-name>org.mortbay.jetty.servlet.SessionDomain</param-name>
+ <param-value>127.0.0.1</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>org.mortbay.jetty.servlet.SessionPath</param-name>
+ <param-value>/</param-value>
+ </context-param>
+
+ <context-param>
+ <param-name>org.mortbay.jetty.servlet.MaxAge</param-name>
+ <param-value>-1</param-value>
+ </context-param>
+ -->
+
+ <context-param>
+ <param-name>org.mortbay.jetty.webapp.NoTLDJarPattern</param-name>
+ <param-value>start.jar|ant-.*\.jar|dojo-.*\.jar|jetty-.*\.jar|jsp-api-.*\.jar|junit-.*\.jar|servlet-api-.*\.jar|dnsns\.jar|rt\.jar|jsse\.jar|tools\.jar|sunpkcs11\.jar|sunjce_provider\.jar|xerces.*\.jar</param-value>
+ </context-param>
+
+
+
+ <!-- ==================================================================== -->
+ <!-- The default servlet. -->
+ <!-- This servlet, normally mapped to /, provides the handling for static -->
+ <!-- content, OPTIONS and TRACE methods for the context. -->
+ <!-- The following initParameters are supported: -->
+ <!-- -->
+ <!-- acceptRanges If true, range requests and responses are -->
+ <!-- supported -->
+ <!-- -->
+ <!-- dirAllowed If true, directory listings are returned if no -->
+ <!-- welcome file is found. Else 403 Forbidden. -->
+ <!-- -->
+ <!-- redirectWelcome If true, redirect welcome file requests -->
+ <!-- else use request dispatcher forwards -->
+ <!-- -->
+ <!-- gzip If set to true, then static content will be served-->
+ <!-- as gzip content encoded if a matching resource is -->
+ <!-- found ending with ".gz" -->
+ <!-- -->
+ <!-- resoureBase Can be set to replace the context resource base -->
+ <!-- -->
+ <!-- relativeResourceBase -->
+ <!-- Set with a pathname relative to the base of the -->
+ <!-- servlet context root. Useful for only serving -->
+ <!-- static content from only specific subdirectories. -->
+ <!-- -->
+ <!-- useFileMappedBuffer -->
+ <!-- If set to true (the default), a memory mapped -->
+ <!-- file buffer will be used to serve static content -->
+ <!-- when using an NIO connector. Setting this value -->
+ <!-- to false means that a direct buffer will be used -->
+ <!-- instead. If you are having trouble with Windows -->
+ <!-- file locking, set this to false. -->
+ <!-- -->
+ <!-- cacheControl If set, all static content will have this value -->
+ <!-- set as the cache-control header. -->
+ <!-- -->
+ <!-- maxCacheSize Maximum size of the static resource cache -->
+ <!-- -->
+ <!-- maxCachedFileSize Maximum size of any single file in the cache -->
+ <!-- -->
+ <!-- maxCachedFiles Maximum number of files in the cache -->
+ <!-- -->
+ <!-- cacheType "nio", "bio" or "both" to determine the type(s) -->
+ <!-- of resource cache. A bio cached buffer may be used-->
+ <!-- by nio but is not as efficient as a nio buffer. -->
+ <!-- An nio cached buffer may not be used by bio. -->
+ <!-- -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <servlet>
+ <servlet-name>default</servlet-name>
+ <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class>
+ <init-param>
+ <param-name>acceptRanges</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
+ <param-name>dirAllowed</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
+ <param-name>redirectWelcome</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
+ <param-name>maxCacheSize</param-name>
+ <param-value>256000000</param-value>
+ </init-param>
+ <init-param>
+ <param-name>maxCachedFileSize</param-name>
+ <param-value>10000000</param-value>
+ </init-param>
+ <init-param>
+ <param-name>maxCachedFiles</param-name>
+ <param-value>1000</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cacheType</param-name>
+ <param-value>both</param-value>
+ </init-param>
+ <init-param>
+ <param-name>gzip</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
+ <param-name>useFileMappedBuffer</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <!--
+ <init-param>
+ <param-name>cacheControl</param-name>
+ <param-value>max-age=3600,public</param-value>
+ </init-param>
+ -->
+ <load-on-startup>0</load-on-startup>
+ </servlet>
+
+ <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
+
+
+ <!-- ==================================================================== -->
+ <!-- Dynamic Servlet Invoker. -->
+ <!-- This servlet invokes anonymous servlets that have not been defined -->
+ <!-- in the web.xml or by other means. The first element of the pathInfo -->
+ <!-- of a request passed to the envoker is treated as a servlet name for -->
+ <!-- an existing servlet, or as a class name of a new servlet. -->
+ <!-- This servlet is normally mapped to /servlet/* -->
+ <!-- This servlet support the following initParams: -->
+ <!-- -->
+ <!-- nonContextServlets If false, the invoker can only load -->
+ <!-- servlets from the contexts classloader. -->
+ <!-- This is false by default and setting this -->
+ <!-- to true may have security implications. -->
+ <!-- -->
+ <!-- verbose If true, log dynamic loads -->
+ <!-- -->
+ <!-- * All other parameters are copied to the -->
+ <!-- each dynamic servlet as init parameters -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- Uncomment for dynamic invocation
+ <servlet>
+ <servlet-name>invoker</servlet-name>
+ <servlet-class>org.mortbay.jetty.servlet.Invoker</servlet-class>
+ <init-param>
+ <param-name>verbose</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
+ <param-name>nonContextServlets</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
+ <param-name>dynamicParam</param-name>
+ <param-value>anyValue</param-value>
+ </init-param>
+ <load-on-startup>0</load-on-startup>
+ </servlet>
+
+ <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
+ -->
+
+
+
+ <!-- ==================================================================== -->
+ <session-config>
+ <session-timeout>30</session-timeout>
+ </session-config>
+
+ <!-- ==================================================================== -->
+ <!-- Default MIME mappings -->
+ <!-- The default MIME mappings are provided by the mime.properties -->
+ <!-- resource in the org.mortbay.jetty.jar file. Additional or modified -->
+ <!-- mappings may be specified here -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- UNCOMMENT TO ACTIVATE
+ <mime-mapping>
+ <extension>mysuffix</extension>
+ <mime-type>mymime/type</mime-type>
+ </mime-mapping>
+ -->
+
+ <!-- ==================================================================== -->
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.htm</welcome-file>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+ <!-- ==================================================================== -->
+ <locale-encoding-mapping-list>
+ <locale-encoding-mapping><locale>ar</locale><encoding>ISO-8859-6</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>be</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>bg</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>ca</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>cs</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>da</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>de</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>el</locale><encoding>ISO-8859-7</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>en</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>es</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>et</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>fi</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>fr</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>hr</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>hu</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>is</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>it</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>iw</locale><encoding>ISO-8859-8</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>ja</locale><encoding>Shift_JIS</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>ko</locale><encoding>EUC-KR</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>lt</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>lv</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>mk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>nl</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>no</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>pl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>pt</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>ro</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>ru</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>sh</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>sk</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>sl</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>sq</locale><encoding>ISO-8859-2</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>sr</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>sv</locale><encoding>ISO-8859-1</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>tr</locale><encoding>ISO-8859-9</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>uk</locale><encoding>ISO-8859-5</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>zh</locale><encoding>GB2312</encoding></locale-encoding-mapping>
+ <locale-encoding-mapping><locale>zh_TW</locale><encoding>Big5</encoding></locale-encoding-mapping>
+ </locale-encoding-mapping-list>
+
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>Disable TRACE</web-resource-name>
+ <url-pattern>/</url-pattern>
+ <http-method>TRACE</http-method>
+ </web-resource-collection>
+ <auth-constraint/>
+ </security-constraint>
+
+</web-app>
+