You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2011/01/05 00:19:38 UTC

svn commit: r1055240 - in /mina/vysper/trunk/server: core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/ core/src/main/java/org/apache/vysper/xmpp/protocol/ core/src/main/java/org/apache/vysper/xmpp/server/ core/src/tes...

Author: ngn
Date: Tue Jan  4 23:19:37 2011
New Revision: 1055240

URL: http://svn.apache.org/viewvc?rev=1055240&view=rev
Log:
Adding support for XMPP over web sockets (VYSPER-258)

Added:
    mina/vysper/trunk/server/extensions/websockets/
    mina/vysper/trunk/server/extensions/websockets/pom.xml
    mina/vysper/trunk/server/extensions/websockets/src/
    mina/vysper/trunk/server/extensions/websockets/src/examples/
    mina/vysper/trunk/server/extensions/websockets/src/examples/client/
    mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/
    mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java
    mina/vysper/trunk/server/extensions/websockets/src/main/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java
    mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java
    mina/vysper/trunk/server/extensions/websockets/src/main/resources/
    mina/vysper/trunk/server/extensions/websockets/src/test/
    mina/vysper/trunk/server/extensions/websockets/src/test/java/
    mina/vysper/trunk/server/extensions/websockets/src/test/resources/
    mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert   (with props)
    mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore   (with props)
    mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt
    mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties
Modified:
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java
    mina/vysper/trunk/server/extensions/pom.xml

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java Tue Jan  4 23:19:37 2011
@@ -30,6 +30,7 @@ import org.apache.vysper.xmpp.protocol.S
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.SessionContext.SessionTerminationCause;
 import org.apache.vysper.xmpp.server.s2s.XMPPServerConnector;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -111,11 +112,11 @@ public class DbVerifyHandler implements 
                 builder.addAttribute("to", otherServer.getDomain());
                 builder.addAttribute("type", resultType);
     
-                dialbackSessionContext.write(builder.build());
+                dialbackSessionContext.getResponseWriter().write(builder.build());
 //            }
             
             // close this session as we are now done checking dialback
-            sessionContext.close();
+            sessionContext.endSession(SessionTerminationCause.CLIENT_BYEBYE);
             return null;
         }
     }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java Tue Jan  4 23:19:37 2011
@@ -89,7 +89,7 @@ public class ProtocolWorker implements S
             throw new RuntimeException("cannot process NULL stanzas");
 
         StanzaHandler stanzaHandler = serverRuntimeContext.getHandler(stanza);
-
+System.out.println(stanzaHandler);
         if (stanzaHandler == null) {
             responseWriter.handleUnsupportedStanzaType(sessionContext, stanza);
             return;

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/AbstractSessionContext.java Tue Jan  4 23:19:37 2011
@@ -158,7 +158,6 @@ public abstract class AbstractSessionCon
 
         // unbind session and remove from registry
         serverRuntimeContext.getResourceRegistry().unbindSession(this);
-
         sessionStateHolder.setState(SessionState.CLOSED); // no more traffic
 
         // TODO close underlying transport (TCP socket)

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java Tue Jan  4 23:19:37 2011
@@ -29,7 +29,7 @@ import org.apache.vysper.xmpp.writer.Sta
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
-public interface SessionContext extends StanzaWriter {
+public interface SessionContext {
 
     static final String SESSION_ATTRIBUTE_MESSAGE_STANZA_NO_RECEIVE = "stanza.message.no_receive";
 

Modified: mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java (original)
+++ mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/authorization/PlainTestCase.java Tue Jan  4 23:19:37 2011
@@ -93,6 +93,11 @@ public class PlainTestCase extends TestC
         assertNotNull(response.getSingleInnerElementsNamed(failureType));
         assert stateHolder.getState() != SessionState.AUTHENTICATED;
     }
+    
+    public static void main(String[] args) {
+        PlainTestCase plain = new PlainTestCase();
+        System.out.println(plain.encode("user1@vysper.org", "password1"));
+    }
 
     private String encode(String username, String password) {
         return new String(Base64.encodeBase64(('\0' + username + '\0' + password).getBytes()));

Modified: mina/vysper/trunk/server/extensions/pom.xml
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/pom.xml?rev=1055240&r1=1055239&r2=1055240&view=diff
==============================================================================
--- mina/vysper/trunk/server/extensions/pom.xml (original)
+++ mina/vysper/trunk/server/extensions/pom.xml Tue Jan  4 23:19:37 2011
@@ -34,6 +34,7 @@
     <module>xep0060-pubsub</module>
     <module>xep0045-muc</module>
     <module>xep0124-xep0206-bosh</module>
+    <module>websockets</module>
   </modules>
 
   <profiles>
@@ -44,6 +45,7 @@
 	    <module>xep0045-muc</module>
 	    <module>xep0045-muc-inttest</module>
 	    <module>xep0124-xep0206-bosh</module>
+	    <module>websockets</module>
       </modules>
     </profile>
   </profiles>

Added: mina/vysper/trunk/server/extensions/websockets/pom.xml
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/pom.xml?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/pom.xml (added)
+++ mina/vysper/trunk/server/extensions/websockets/pom.xml Tue Jan  4 23:19:37 2011
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+	<!--
+		Licensed to the Apache Software Foundation (ASF) under one or more
+		contributor license agreements. See the NOTICE file distributed with
+		this work for additional information regarding copyright ownership.
+		The ASF licenses this file to you under the Apache License, Version
+		2.0 (the "License"); you may not use this file except in compliance
+		with the License. You may obtain a copy of the License at
+
+		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+		applicable law or agreed to in writing, software distributed under the
+		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+		CONDITIONS OF ANY KIND, either express or implied. See the License for
+		the specific language governing permissions and limitations under the
+		License.
+	-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<parent>
+		<artifactId>vysper-extensions</artifactId>
+		<groupId>org.apache.vysper</groupId>
+		<version>0.7-SNAPSHOT</version>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>org.apache.vysper.extensions</groupId>
+	<artifactId>websockets</artifactId>
+	<name>Apache Vysper Websockets support</name>
+	<version>0.7-SNAPSHOT</version>
+
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.vysper</groupId>
+			<artifactId>spec-compliance</artifactId>
+			<optional>true</optional>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.vysper</groupId>
+			<artifactId>vysper-core</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.eclipse.jetty</groupId>
+			<artifactId>jetty-websocket</artifactId>
+			<version>7.2.1.v20101111</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.eclipse.jetty</groupId>
+			<artifactId>jetty-servlet</artifactId>
+			<version>7.2.1.v20101111</version>
+		</dependency>
+
+		<!-- Runtime dependencies -->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<scope>runtime</scope>
+		</dependency>
+
+		<!-- Test dependencies -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.8.1</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.0.1</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-codec</groupId>
+			<artifactId>commons-codec</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+	</dependencies>
+
+</project>

Added: mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/examples/client/client.html Tue Jan  4 23:19:37 2011
@@ -0,0 +1,43 @@
+<html>
+	<head>
+	<script>
+		// This is a very simple client just to demo the technology
+	
+		String.prototype.contains = function(it) { return this.indexOf(it) != -1; };
+	
+		var streamStart = "<stream:stream from='user1@vysper.org' to='user2@vysper.org' version='1.0' xml:lang='en' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>"
+	
+		var socket = new WebSocket("ws://localhost:8080/ws/ws", "xmpp");
+		socket.onopen = function(){
+			socket.send(streamStart)
+			
+		}  
+		socket.onmessage = function(msg){
+			var stanza = msg.data
+			
+			console.log(stanza)
+			if(stanza.contains("<stream:features")) {
+				if(stanza.contains("<mechanism>PLAIN</mechanism>")) {
+					// SASL
+					socket.send("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AHVzZXIxQHZ5c3Blci5vcmcAcGFzc3dvcmQx</auth>")
+				} else if(stanza.contains("<bind")) {
+					// resource binding
+					socket.send("<iq id='tn281v37' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>")
+				}
+			} else if(stanza.contains("<success")) {
+				// SASL success, restart stream
+				socket.send(streamStart)
+			} else if(stanza.contains("<iq")) {
+				if(stanza.contains("<bind")) {
+					// resource binding complete, off we go
+					// socket.send("<message to='protocol7@jabber.org'><body>Hello world</body></message>")
+					socket.close();
+				}
+			}
+		}  
+	
+	</script>
+	</head>
+<body>
+</body>
+</html>

Added: mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/examples/java/org/apache/vysper/xmpp/extension/websockets/DemoServer.java Tue Jan  4 23:19:37 2011
@@ -0,0 +1,112 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import org.apache.vysper.mina.TCPEndpoint;
+import org.apache.vysper.storage.StorageProviderRegistry;
+import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+import org.apache.vysper.xmpp.authorization.AccountManagement;
+import org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule;
+import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
+import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
+import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
+import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.server.XMPPServer;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
+
+/**
+ * starts the server as a standalone application
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class DemoServer {
+
+    /**
+     * 
+     * @param args
+     */
+    public static void main(String[] args) throws AccountCreationException, EntityFormatException, FileNotFoundException {
+
+        // choose the storage you want to use
+        //StorageProviderRegistry providerRegistry = new JcrStorageProviderRegistry();
+        StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
+
+        final AccountManagement accountManagement = (AccountManagement) providerRegistry
+                .retrieve(AccountManagement.class);
+
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) {
+            accountManagement.addUser("user1@vysper.org", "password1");
+        }
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) {
+            accountManagement.addUser("user2@vysper.org", "password1");
+        }
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user3@vysper.org"))) {
+            accountManagement.addUser("user3@vysper.org", "password1");
+        }
+
+        Server jetty = new Server();
+        Connector connector = new SelectChannelConnector();
+        connector.setPort(8080);
+        jetty.addConnector(connector);
+        
+        XMPPServer server = new XMPPServer("vysper.org");
+      // example of how you can combine Vysper with other resources 
+        ResourceHandler resourceHandler = new ResourceHandler();
+        resourceHandler.setResourceBase("src/examples/client");
+        jetty.setHandler(resourceHandler);
+
+        server.addEndpoint(new TCPEndpoint());
+
+        WebsocketsEndpoint wsEndpoint = new WebsocketsEndpoint();
+        
+        // provide our custom server to have the ResourceHandler added
+        wsEndpoint.setServer(jetty);
+        // wsEndpoint.setSSLEnabled(true);
+        // wsEndpoint.setSSLCertificateKeystore("src/test/resources/keystore.jks", "password");
+        wsEndpoint.setContextPath("/ws");
+        server.addEndpoint(wsEndpoint);
+
+        server.setStorageProviderRegistry(providerRegistry);
+
+        server.setTLSCertificateInfo(new File("src/test/resources/bogus_mina_tls.cert"), "boguspw");
+
+        try {
+            server.start();
+            System.out.println("vysper server is running...");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        server.addModule(new SoftwareVersionModule());
+        server.addModule(new EntityTimeModule());
+        server.addModule(new VcardTempModule());
+        server.addModule(new XmppPingModule());
+        server.addModule(new PrivateDataModule());
+    }
+}

Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/ServerMain.java Tue Jan  4 23:19:37 2011
@@ -0,0 +1,143 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.vysper.mina.TCPEndpoint;
+import org.apache.vysper.storage.StorageProviderRegistry;
+import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
+import org.apache.vysper.xmpp.authorization.AccountCreationException;
+import org.apache.vysper.xmpp.authorization.AccountManagement;
+import org.apache.vysper.xmpp.modules.Module;
+import org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule;
+import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
+import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
+import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
+import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
+import org.apache.vysper.xmpp.server.XMPPServer;
+
+/**
+ * starts the server as a standalone application
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class ServerMain {
+
+    /**
+     * boots the server as a standalone application
+     * 
+     * adding a module from the command line:
+     * using a runtime property, one or more modules can be specified, like this:
+     * -Dvysper.add.module=org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PublishSubscribeModule,... more ...
+     * 
+     * @param args
+     */
+    public static void main(String[] args) throws AccountCreationException, EntityFormatException, FileNotFoundException {
+
+        String addedModuleProperty = System.getProperty("vysper.add.module");
+        List<Module> listOfModules = null;
+        if (addedModuleProperty != null) {
+            String[] moduleClassNames = addedModuleProperty.split(",");
+            listOfModules = createModuleInstances(moduleClassNames);
+        }
+
+        // choose the storage you want to use
+        //StorageProviderRegistry providerRegistry = new JcrStorageProviderRegistry();
+        StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
+
+        final AccountManagement accountManagement = (AccountManagement) providerRegistry
+                .retrieve(AccountManagement.class);
+
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) {
+            accountManagement.addUser("user1@vysper.org", "password1");
+        }
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) {
+            accountManagement.addUser("user2@vysper.org", "password1");
+        }
+        if (!accountManagement.verifyAccountExists(EntityImpl.parse("user3@vysper.org"))) {
+            accountManagement.addUser("user3@vysper.org", "password1");
+        }
+
+        XMPPServer server = new XMPPServer("vysper.org");
+
+        server.addEndpoint(new TCPEndpoint());
+
+        WebsocketsEndpoint wsEndpoint = new WebsocketsEndpoint();
+//        wsEndpoint.setSSLEnabled(true);
+//        wsEndpoint.setSSLCertificateKeystore("src/test/resources/keystore.jks", "password");
+        wsEndpoint.setContextPath("/ws");
+        server.addEndpoint(wsEndpoint);
+
+        server.setStorageProviderRegistry(providerRegistry);
+
+        server.setTLSCertificateInfo(new File("src/test/resources/bogus_mina_tls.cert"), "boguspw");
+
+        try {
+            server.start();
+            System.out.println("vysper server is running...");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        server.addModule(new SoftwareVersionModule());
+        server.addModule(new EntityTimeModule());
+        server.addModule(new VcardTempModule());
+        server.addModule(new XmppPingModule());
+        server.addModule(new PrivateDataModule());
+
+        if (listOfModules != null) {
+            for (Module module : listOfModules) {
+                server.addModule(module);
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private static List<Module> createModuleInstances(String[] moduleClassNames) {
+        List<Module> modules = new ArrayList<Module>();
+
+        for (String moduleClassName : moduleClassNames) {
+            Class<Module> moduleClass;
+            try {
+                moduleClass = (Class<Module>) Class.forName(moduleClassName);
+            } catch (ClassCastException e) {
+                System.err.println("not a Vysper module class: " + moduleClassName);
+                continue;
+            } catch (ClassNotFoundException e) {
+                System.err.println("could not load module class " + moduleClassName);
+                continue;
+            }
+            try {
+                Module module = moduleClass.newInstance();
+                modules.add(module);
+            } catch (Exception e) {
+                System.err.println("failed to instantiate module class " + moduleClassName);
+                continue;
+            }
+        }
+        return modules;
+    }
+}

Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsBackedSessionContext.java Tue Jan  4 23:19:37 2011
@@ -0,0 +1,158 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.apache.vysper.mina.codec.StanzaBuilderFactory;
+import org.apache.vysper.xml.decoder.XMPPContentHandler;
+import org.apache.vysper.xml.decoder.XMPPContentHandler.StanzaListener;
+import org.apache.vysper.xml.fragment.Renderer;
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.sax.NonBlockingXMLReader;
+import org.apache.vysper.xml.sax.impl.DefaultNonBlockingXMLReader;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
+import org.apache.vysper.xmpp.server.AbstractSessionContext;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.writer.StanzaWriter;
+import org.eclipse.jetty.websocket.WebSocket;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.SAXException;
+
+/**
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class WebsocketsBackedSessionContext extends AbstractSessionContext implements WebSocket, StanzaListener, StanzaWriter {
+
+    private final static Charset CHARSET = Charset.forName("UTF-8");
+    private final static CharsetDecoder CHARSET_DECODER = CHARSET.newDecoder();
+    
+    private final static Logger LOG = LoggerFactory.getLogger(WebsocketsBackedSessionContext.class);
+
+    private Outbound outbound;
+    private NonBlockingXMLReader xmlReader = new DefaultNonBlockingXMLReader();
+    
+    public WebsocketsBackedSessionContext(ServerRuntimeContext serverRuntimeContext,
+            SessionStateHolder sessionStateHolder) {
+        super(serverRuntimeContext, sessionStateHolder);
+        
+        XMPPContentHandler contentHandler = new XMPPContentHandler(new StanzaBuilderFactory());
+        contentHandler.setListener(this);
+        
+        try {
+            // we need to check the jabber:client/jabber:server NS declarations
+            xmlReader.setFeature(DefaultNonBlockingXMLReader.FEATURE_NAMESPACE_PREFIXES, true);
+            // allow parser to restart XML stream
+            xmlReader.setFeature(DefaultNonBlockingXMLReader.FEATURE_RESTART_ALLOWED, true);
+            xmlReader.setProperty(DefaultNonBlockingXMLReader.PROPERTY_RESTART_QNAME, "stream:stream");
+        } catch (SAXException e) {
+            // should never happen
+            throw new RuntimeException(e);
+        }
+
+        xmlReader.setContentHandler(contentHandler);
+    }
+
+    public StanzaWriter getResponseWriter() {
+        return this;
+    }
+
+    public void switchToTLS(boolean delayed, boolean clientTls) {
+        // n/a
+    }
+
+    public void setIsReopeningXMLStream() {
+        // n/a
+    }
+
+    public void onConnect(Outbound outbound) {
+        LOG.info("WebSocket client connected");
+        this.outbound = outbound;
+        
+        // set to encrypted to skip TLS
+        sessionStateHolder.setState(SessionState.ENCRYPTED);
+    }
+
+    public void onMessage(byte frame, String data) {
+        LOG.info("< " + data);
+        try {
+            xmlReader.parse(IoBuffer.wrap(data.getBytes(CHARSET)), CHARSET_DECODER);
+        } catch (IOException e) {
+            // should never happen since we read from a string
+            throw new RuntimeException(e);
+        } catch (SAXException e) {
+            Stanza errorStanza = ServerErrorResponses.getInstance().getStreamError(StreamErrorCondition.XML_NOT_WELL_FORMED,
+                    getXMLLang(), "Stanza not well-formed", null);
+            write(errorStanza);
+            endSession(SessionTerminationCause.STREAM_ERROR);
+        }
+    }
+
+
+    public void onDisconnect() {
+        LOG.info("WebSocket client disconnected");
+        endSession(SessionTerminationCause.CONNECTION_ABORT);
+    }
+
+    public void stanza(XMLElement element) {
+        // on parsed stanzas
+        serverRuntimeContext.getStanzaProcessor().processStanza(serverRuntimeContext, this, (Stanza) element, sessionStateHolder);
+    }
+
+    public void write(Stanza stanza) {
+        // handle stream open
+        Renderer renderer = new Renderer(stanza);
+        String xml;
+        if("stream".equals(stanza.getName()) && NamespaceURIs.HTTP_ETHERX_JABBER_ORG_STREAMS.equals(stanza.getNamespaceURI())) {
+            xml = renderer.getOpeningElement() + renderer.getElementContent();
+        } else {
+            xml = renderer.getComplete();
+        }
+        try {
+            LOG.info("> " + xml);
+            outbound.sendMessage(xml);
+        } catch (IOException e) {
+            // communication with client broken, close session
+            endSession(SessionTerminationCause.CONNECTION_ABORT);
+        }
+    }
+
+    public void close() {
+        // TODO how to handle?
+    }
+
+    public void onMessage(byte frame, byte[] data, int offset, int length) {
+        // binary data, should not happen, ignore
+    }
+
+    public void onFragment(boolean more, byte opcode, byte[] data, int offset, int length) {
+        System.out.println("onFragment");
+    }
+}

Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/WebsocketsEndpoint.java Tue Jan  4 23:19:37 2011
@@ -0,0 +1,190 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import java.io.IOException;
+
+import org.apache.vysper.xmpp.server.Endpoint;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.eclipse.jetty.server.Connector;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
+import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Allows HTTP clients to communicate via the WebSocket protocol with Vysper.
+ * <p>
+ * See http://tools.ietf.org/html/draft-moffitt-xmpp-over-websocket-00
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class WebsocketsEndpoint implements Endpoint {
+
+    protected final static Logger logger = LoggerFactory.getLogger(WebsocketsEndpoint.class);
+
+    protected ServerRuntimeContext serverRuntimeContext;
+
+    protected int port = 8080;
+
+    protected Server server;
+
+    protected boolean isSSLEnabled;
+
+    protected String sslKeystorePath;
+
+    protected String sslKeystorePassword;
+
+    protected String contextPath = "/";
+
+    public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
+        this.serverRuntimeContext = serverRuntimeContext;
+    }
+
+    /**
+     * Setter for the listen port
+     * @param port
+     */
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    /**
+     * Configures the SSL keystore
+     * <p>
+     * Required if SSL is enabled. Also, setting the keystore password is 
+     * required.
+     * @see #setSSLCertificateKeystorePassword 
+     * @param keystorePath the path to the Java keystore
+     */
+    public void setSSLCertificateKeystore(String keystorePath, String password) {
+        sslKeystorePath = keystorePath;
+        sslKeystorePassword = password;
+    }
+
+    /**
+     * Enables/disables SSL for this endpoint.
+     * <p>
+     * If SSL is enabled it requires SSL certificate information that can be
+     * configured with {@link #setSSLCertificateInfo(String, String)}
+     * @param value
+     */
+    public void setSSLEnabled(boolean value) {
+        isSSLEnabled = value;
+    }
+
+    /**
+     * Determines the context URI where the BOSH transport will be accessible.
+     * The default is as 'root context' under '/'. 
+     * @param contextPath
+     */
+    public void setContextPath(String contextPath) {
+        if (contextPath == null) contextPath = "/";
+        this.contextPath = contextPath;
+    }
+    
+    /**
+     * Provide a custom Jetty Server
+     * @param server
+     */
+    public void setServer(Server server) {
+        this.server = server;
+    }
+
+    /**
+     * create a basic Jetty server including a connector on the configured port
+     * override in subclass to create a different kind of setup or to reuse an existing instance
+     * @return
+     */
+    protected Server createJettyServer() {
+        Server server = new Server();
+
+        Connector connector;
+        if (isSSLEnabled) {
+            SslSelectChannelConnector sslConnector = new SslSelectChannelConnector();
+            sslConnector.setKeystore(sslKeystorePath);
+            sslConnector.setPassword(sslKeystorePassword);
+            sslConnector.setKeyPassword(sslKeystorePassword);
+            connector = sslConnector;
+        } else {
+            connector = new SelectChannelConnector();
+        }
+        connector.setPort(port);
+        server.setConnectors(new Connector[] { connector });
+        return server;
+    }
+
+    /**
+     * create handler for BOSH. 
+     * for a different handler setup, override in a subclass.
+     * for more than one handler, add them to a org.eclipse.jetty.server.handler.ContextHandlerCollection
+     * and return the collection 
+     * @return
+     */
+    protected Handler createHandler() {
+        ServletContextHandler boshContext = new ServletContextHandler(ServletContextHandler.SESSIONS);
+        boshContext.setContextPath(contextPath);
+
+        XmppWebsocketsServlet boshServlet = new XmppWebsocketsServlet(serverRuntimeContext);
+        boshContext.addServlet(new ServletHolder(boshServlet), "/ws");
+        
+        return boshContext;
+    }
+    
+    /**
+     * @throws IOException 
+     * @throws RuntimeException a wrapper of the possible
+     * {@link java.lang.Exception} that Jetty can throw at start-up
+     */
+    public void start() throws IOException {
+        HandlerCollection handlers = new HandlerCollection();
+        if(server != null) {
+            Handler handler = server.getHandler();
+            if(handler != null) {
+                handlers.addHandler(handler);
+            }
+        } else {
+            server = createJettyServer();
+        }
+        Handler handler = createHandler();
+        handlers.addHandler(handler);
+
+        server.setHandler(handlers);
+        try {
+            server.start();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void stop() {
+        try {
+            server.stop();
+        } catch (Exception e) {
+            logger.warn("Could not stop the Jetty server", e);
+        }
+    }
+
+}

Added: mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/main/java/org/apache/vysper/xmpp/extension/websockets/XmppWebsocketsServlet.java Tue Jan  4 23:19:37 2011
@@ -0,0 +1,59 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.vysper.xmpp.extension.websockets;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.eclipse.jetty.websocket.WebSocket;
+import org.eclipse.jetty.websocket.WebSocketServlet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author The Apache MINA Project (dev@mina.apache.org)
+ */
+public class XmppWebsocketsServlet extends WebSocketServlet {
+    
+    private final static Logger LOG = LoggerFactory.getLogger(XmppWebsocketsServlet.class);
+    
+    private static final long serialVersionUID = 197413099255392883L;
+    private static final String SUB_PROTOCOL = "xmpp";
+
+    private final ServerRuntimeContext serverRuntimeContext;
+    
+    public XmppWebsocketsServlet(ServerRuntimeContext serverRuntimeContext) {
+        this.serverRuntimeContext = serverRuntimeContext;
+    }
+
+    
+    protected WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
+        if(SUB_PROTOCOL.equals(protocol)) {
+            SessionStateHolder sessionStateHolder = new SessionStateHolder();
+            WebsocketsBackedSessionContext sessionContext = new WebsocketsBackedSessionContext(serverRuntimeContext, sessionStateHolder);
+            return sessionContext;
+        } else {
+            LOG.warn("Unsupported WebSocket sub protocol, must be \"xmpp\"");
+            return null;
+        }
+    }
+}

Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert?rev=1055240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: mina/vysper/trunk/server/extensions/websockets/src/test/resources/bogus_mina_tls.cert
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore?rev=1055240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/test/resources/keystore-README.txt Tue Jan  4 23:19:37 2011
@@ -0,0 +1,34 @@
+The keystore contains a private key and its associated self-signed certificate
+that can be used by SSL. This keystore is provided to be used only for testing this software.
+In non-test environments it is highly recommended to use real certificates signed by a Certification Authority (CA).
+
+The keystore was generated with the following command:
+
+	$ keytool -keystore keystore -alias jetty -genkey -keyalg RSA
+	Enter keystore password: password
+	Re-enter new password: password
+	What is your first and last name?
+	  [Unknown]: vysper.org
+	What is the name of your organizational unit?
+	  [Unknown]:
+	What is the name of your organization?
+	  [Unknown]:  Vysper
+	What is the name of your City or Locality?
+	  [Unknown]:
+	What is the name of your State or Province?
+	  [Unknown]:
+	What is the two-letter country code for this unit?
+	  [Unknown]:
+	Is CN=vysper.org, OU=Unknown, O=Vysper, L=Unknown, ST=Unknown, C=Unknown correct?
+	  [no]: yes
+	Enter key password for <jetty>
+		(RETURN if same as keystore password):
+
+The password for the keystore and for the key is "password" and the Common Name (CN) is "vysper.org".
+The CN must be the domain name used by the clients to connect to the Vysper server (otherwise
+the browser will warn the user that the certificate is issued for another domain name)
+
+Using the self-signed certificate (from the keystore) will make the web browser warn you that the certificate is self-signed,
+but for testing purposes you can add an exception for the browser to accept it.
+
+More information about keytool: http://java.sun.com/javase/6/docs/technotes/tools/windows/keytool.html
\ No newline at end of file

Added: mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties?rev=1055240&view=auto
==============================================================================
--- mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties (added)
+++ mina/vysper/trunk/server/extensions/websockets/src/test/resources/log4j.properties Tue Jan  4 23:19:37 2011
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+log4j.rootLogger=debug, C
+
+log4j.logger.org.apache.vysper.mina.XmppIoHandlerAdapter=WARN,C
+log4j.logger.org.apache.mina.filter.executor.ExecutorFilter=WARN,C
+log4j.logger.org.apache.http=DEBUG
+
+
+log4j.appender.C=org.apache.log4j.ConsoleAppender 
+log4j.appender.C.layout=org.apache.log4j.PatternLayout 
+log4j.appender.C.layout.ConversionPattern=%m%n
+