]> source.dussan.org Git - vaadin-framework.git/commitdiff
#8009 Moved DemoLauncher to tests/testbench
authorArtur Signell <artur.signell@itmill.com>
Mon, 28 Nov 2011 09:28:32 +0000 (09:28 +0000)
committerArtur Signell <artur.signell@itmill.com>
Mon, 28 Nov 2011 09:28:32 +0000 (09:28 +0000)
svn changeset:22143/svn branch:6.7

src/com/vaadin/launcher/DevelopmentServerLauncher.java [deleted file]
src/com/vaadin/launcher/jetty-webdefault.xml [deleted file]
src/com/vaadin/launcher/keystore [deleted file]
tests/testbench/com/vaadin/launcher/DemoLauncher.java [new file with mode: 0644]
tests/testbench/com/vaadin/launcher/DevelopmentServerLauncher.java [new file with mode: 0644]
tests/testbench/com/vaadin/launcher/jetty-webdefault.xml [new file with mode: 0644]
tests/testbench/com/vaadin/launcher/keystore [new file with mode: 0644]

diff --git a/src/com/vaadin/launcher/DevelopmentServerLauncher.java b/src/com/vaadin/launcher/DevelopmentServerLauncher.java
deleted file mode 100644 (file)
index 8a4b356..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-/* \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
diff --git a/src/com/vaadin/launcher/jetty-webdefault.xml b/src/com/vaadin/launcher/jetty-webdefault.xml
deleted file mode 100644 (file)
index 5a2465a..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-<?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>
-
diff --git a/src/com/vaadin/launcher/keystore b/src/com/vaadin/launcher/keystore
deleted file mode 100644 (file)
index 1314185..0000000
Binary files a/src/com/vaadin/launcher/keystore and /dev/null differ
diff --git a/tests/testbench/com/vaadin/launcher/DemoLauncher.java b/tests/testbench/com/vaadin/launcher/DemoLauncher.java
new file mode 100644 (file)
index 0000000..f18cdf6
--- /dev/null
@@ -0,0 +1,213 @@
+/* 
+@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;
+    }
+}
diff --git a/tests/testbench/com/vaadin/launcher/DevelopmentServerLauncher.java b/tests/testbench/com/vaadin/launcher/DevelopmentServerLauncher.java
new file mode 100644 (file)
index 0000000..8a4b356
--- /dev/null
@@ -0,0 +1,218 @@
+/* \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
diff --git a/tests/testbench/com/vaadin/launcher/jetty-webdefault.xml b/tests/testbench/com/vaadin/launcher/jetty-webdefault.xml
new file mode 100644 (file)
index 0000000..5a2465a
--- /dev/null
@@ -0,0 +1,281 @@
+<?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>
+
diff --git a/tests/testbench/com/vaadin/launcher/keystore b/tests/testbench/com/vaadin/launcher/keystore
new file mode 100644 (file)
index 0000000..1314185
Binary files /dev/null and b/tests/testbench/com/vaadin/launcher/keystore differ