Author: berndf
Date: Mon Sep 13 14:27:05 2010
New Revision: 996553

URL: http://svn.apache.org/viewvc?rev=996553&view=rev
Log:
VYSPER-250, VYSPER-251: 
greatly simplify spring xml configuration + add optional BOSH configuration to 
spring config
improve sample app to connect to specific web app context path, default is '/'
make bosh endpoint easy to subclass, add a subclass for adding parallel web 
apps besides BOSH 

Added:
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleXMPPServer.java
      - copied, changed from r995252, 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
    
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/SharedBoshEndpoint.java
Modified:
    mina/vysper/trunk/server/core/src/main/config/spring-config.xml
    
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.html
    
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.js
    
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
    
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/ServerMain.java

Modified: mina/vysper/trunk/server/core/src/main/config/spring-config.xml
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/config/spring-config.xml?rev=996553&r1=996552&r2=996553&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/config/spring-config.xml (original)
+++ mina/vysper/trunk/server/core/src/main/config/spring-config.xml Mon Sep 13 
14:27:05 2010
@@ -21,49 +21,14 @@
 
 <beans>
 
-    <!-- Domain -->
-    <bean id="domain" class="org.apache.vysper.xmpp.addressing.EntityImpl" >
-        <constructor-arg value=""/>
-        <constructor-arg value="vysper.org"/>
-        <constructor-arg value=""/>
-    </bean>
-    
-    <!-- The SSL configuration -->
-
-     <bean id="bogusTrustManagerFactory" 
class="org.apache.vysper.xmpp.cryptography.BogusTrustManagerFactory"/>
-    
-    <bean id="tlsContextFactory" 
class="org.apache.vysper.spring.ResourceBasedTLSContextFactory">
-        <constructor-arg value="classpath:bogus_mina_tls.cert"/>
-        <property name="password" value="boguspw" />
-        <property name="trustManagerFactory"><bean 
class="org.apache.vysper.xmpp.cryptography.BogusTrustManagerFactory" 
/></property>
-    </bean>
-
-    <!--
-        Vysper Server singletons
-    -->
-
     <bean id="inmemoryStorageRegistry" 
class="org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry" />
 
     <bean id="jcrStorageRegistry" 
class="org.apache.vysper.storage.jcr.JcrStorageProviderRegistry" />
 
     <!-- choose one of the storage registries -->
     <alias name="inmemoryStorageRegistry" alias="storageRegistry" />
-    
-    <bean id="internalOutboundRelay" 
class="org.apache.vysper.xmpp.delivery.inbound.DeliveringInboundStanzaRelay" >
-        <constructor-arg ref="domain" />
-        <constructor-arg ref="resourceRegistry"/>
-        <constructor-arg ref="storageRegistry"/>
-        <property name="serverRuntimeContext" ref="server" />
-    </bean>
 
-    <bean id="stanzaRelay" 
class="org.apache.vysper.xmpp.delivery.StanzaRelayBroker" >
-        <property name="internalRelay" ref="internalOutboundRelay" />
-        <property name="externalRelay"><bean 
class="org.apache.vysper.xmpp.delivery.RecordingStanzaRelay"/></property>
-        <property name="serverRuntimeContext" ref="server" />
-    </bean>
-    
-    <bean name="resourceRegistry" 
class="org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry" />
-    
+    <!-- default users; remove if you have persistently stored users -->
     <bean id="addUsers" class="org.apache.vysper.spring.AddUserHelper">
         <constructor-arg index="0">
             <map>
@@ -75,94 +40,54 @@
         <property name="storageProviderRegistry" ref="storageRegistry" />
     </bean>
     
-    <bean id="serverFeatures" 
class="org.apache.vysper.xmpp.server.ServerFeatures">
-        <property name="authenticationMethods">
+    <bean id="tcpEndpoint" class="org.apache.vysper.mina.TCPEndpoint">
+    </bean>
+    
+    <!-- for making the server available over HTTP transport, configure the 
BOSH endpoint
+         BOSH requires extension xep0124-xep0206-bosh to be on the classpath.
+    -->
+    <!--
+    <bean id="boshEndpoint" 
class="org.apache.vysper.xmpp.extension.xep0124.BoshEndpoint">
+        <property name="handlers">
             <list>
-                <bean class="org.apache.vysper.xmpp.authorization.Anonymous" />
-                <bean class="org.apache.vysper.xmpp.authorization.Plain" />
+                <ref bean="chatApplicationContextHandler" />
             </list>
         </property>
-        <property name="startTLSRequired" value="true"/>
+        <property name="accessControlAllowOrigin">
+            <list><value>*</value></list>
+        </property>
+        <property name="port" value="8080" />
+        <property name="contextPath" value="/bosh" />
     </bean>
+    -->
     
-    <bean id="server" 
class="org.apache.vysper.spring.SpringCompatibleDefaultServerRuntimeContext" >
-        <constructor-arg ref="domain" />
-        <constructor-arg ref="serverFeatures"/>
-        <constructor-arg>
+    <bean id="server" 
class="org.apache.vysper.spring.SpringCompatibleXMPPServer"
+          init-method="init" destroy-method="destroy">
+        <!-- TODO change domain name to your domain -->
+        <constructor-arg value="vysper.org"/>
+        <property name="endpoints">
             <list>
-                <bean 
class="org.apache.vysper.xmpp.modules.core.base.BaseStreamStanzaDictionary"/>
-                <bean 
class="org.apache.vysper.xmpp.modules.core.starttls.StartTLSStanzaDictionary"/>
-                <bean 
class="org.apache.vysper.xmpp.modules.core.sasl.SASLStanzaDictionary"/>
-                <bean 
class="org.apache.vysper.xmpp.modules.core.bind.BindResourceDictionary"/>
-                <bean 
class="org.apache.vysper.xmpp.modules.core.session.SessionStanzaDictionary"/>
-                <bean 
class="org.apache.vysper.xmpp.modules.core.compatibility.jabber_iq_auth.JabberIQAuthDictionary"/>
+                <ref bean="tcpEndpoint"/>
+                <!--<ref bean="boshEndpoint"/>-->
             </list>
-        </constructor-arg>
-        <constructor-arg ref="resourceRegistry"/>
-        <property name="stanzaRelay" ref="stanzaRelay" />
-        <property name="tlsContextFactory" ref="tlsContextFactory" />
+        </property>
         <property name="storageProviderRegistry" ref="storageRegistry" />
-        <property name="modules">
+        <property name="certificateFile" 
value="src/main/config/bogus_mina_tls.cert" />
+        <property name="certificatePassword" value="boguspw" />
+        <property name="modules" >
             <list>
-                <bean 
class="org.apache.vysper.xmpp.modules.servicediscovery.ServiceDiscoveryModule" 
/>
-                <bean 
class="org.apache.vysper.xmpp.modules.roster.RosterModule" />
-                <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule"
 />
+                <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule"/>
                 <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule"
 />
                 <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule"
 />
+                <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule"
 />
+                <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule"
 />
                 <!-- below some more modules which are available as 
separately-built jars. 
-                     make sure they are on the classpath when enabling them -->
-                <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PublishSubscribeModule"
 />
-                <bean 
class="org.apache.vysper.xmpp.modules.extension.xep0045_muc.MUCModule" />
+                     make sure they are on the classpath when enabling them or 
remove the beans below, 
+                     depending on the features your server should expose -->
+                <!--<bean 
class="org.apache.vysper.xmpp.modules.extension.xep0060_pubsub.PublishSubscribeModule"
 />-->
+                <!--<bean 
class="org.apache.vysper.xmpp.modules.extension.xep0045_muc.MUCModule" />-->
             </list>
         </property>
     </bean>
     
-    <!--
-        MINA configuration: XMPP/TCP endpoint
-    -->
-    <bean 
class="org.springframework.beans.factory.config.CustomEditorConfigurer">
-        <property name="customEditors">
-            <map>
-                <entry key="java.net.SocketAddress">
-                    <bean 
class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
-                </entry>
-            </map>
-        </property>
-    </bean>
-
-    <bean id="xmppHandler" class="org.apache.vysper.mina.XmppIoHandlerAdapter">
-        <property name="serverRuntimeContext" ref="server"/>
-    </bean>
-
-    <bean id="xmppCodec" 
class="org.apache.vysper.mina.codec.XMPPProtocolCodecFactory">
-    </bean>
-
-    <bean id="filterChainBuilder" 
class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
-      <property name="filters">
-        <map>
-               <entry key="executor">
-                       <bean 
class="org.apache.mina.filter.executor.ExecutorFilter" />
-               </entry>
-            <entry key="codec">  
-              <bean class="org.apache.mina.filter.codec.ProtocolCodecFilter">
-                  <constructor-arg>
-                       <bean 
class="org.apache.vysper.mina.codec.XMPPProtocolCodecFactory" />
-                  </constructor-arg>
-              </bean>
-            </entry>
-            <entry key="logging">
-              <bean class="org.apache.mina.filter.logging.LoggingFilter" />
-            </entry>
-        </map>
-      </property>
-    </bean>
-
-    <!-- socket based xmpp: IoAcceptor binding to xmpp port 5222 -->
-    <bean id="ioAcceptor" 
class="org.apache.mina.transport.socket.nio.NioSocketAcceptor" 
init-method="bind" destroy-method="unbind">
-       <property name="defaultLocalAddress" value=":5222" />
-       <property name="handler" ref="xmppHandler" />
-       <property name="filterChainBuilder" ref="filterChainBuilder" />
-       <property name="reuseAddress" value="true" />
-       </bean>
-
 </beans>

Copied: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleXMPPServer.java
 (from r995252, 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java)
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleXMPPServer.java?p2=mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleXMPPServer.java&p1=mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java&r1=995252&r2=996553&rev=996553&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
 (original)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleXMPPServer.java
 Mon Sep 13 14:27:05 2010
@@ -17,144 +17,62 @@
  *  under the License.
  *
  */
-package org.apache.vysper.xmpp.server;
+package org.apache.vysper.spring;
+
+import org.apache.vysper.xmpp.modules.Module;
+import org.apache.vysper.xmpp.server.Endpoint;
+import org.apache.vysper.xmpp.server.XMPPServer;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
-import org.apache.vysper.storage.StorageProviderRegistry;
-import org.apache.vysper.xmpp.addressing.EntityImpl;
-import org.apache.vysper.xmpp.authorization.AccountManagement;
-import org.apache.vysper.xmpp.authorization.Plain;
-import org.apache.vysper.xmpp.authorization.SASLMechanism;
-import org.apache.vysper.xmpp.cryptography.BogusTrustManagerFactory;
-import org.apache.vysper.xmpp.cryptography.FileBasedTLSContextFactory;
-import org.apache.vysper.xmpp.delivery.RecordingStanzaRelay;
-import org.apache.vysper.xmpp.delivery.StanzaRelayBroker;
-import org.apache.vysper.xmpp.delivery.inbound.DeliveringInboundStanzaRelay;
-import org.apache.vysper.xmpp.modules.Module;
-import org.apache.vysper.xmpp.modules.roster.RosterModule;
-import org.apache.vysper.xmpp.modules.servicediscovery.ServiceDiscoveryModule;
-import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
-import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
-
 /**
- * this class is able to boot a standalone XMPP server.
- * <code>
- * XMPPServer server = new XMPPServer("vysper.org");
- *
- * server.setUserAuthorization(...); // add user authorization class
- * server.addEndpoint(...); // add endpoints, at least one
- * server.setTLSCertificateInfo(...); //
- *
- * server.start(); // inits all endpoints and default internals
- * </code>
+ * this class is able to boot a standalone XMPP server in a spring context.
+ * See the example spring-context.xml for details
  *
  * @author The Apache MINA Project ([email protected])
  */
-public class XMPPServer {
-
-    private final List<SASLMechanism> saslMechanisms = new 
ArrayList<SASLMechanism>();
-
-    private String serverDomain;
-
-    private DefaultServerRuntimeContext serverRuntimeContext;
-
-    private StorageProviderRegistry storageProviderRegistry;
-
-    private File tlsCertificateFile;
-
-    private String tlsCertificatePassword;
-
-    private final List<Endpoint> endpoints = new ArrayList<Endpoint>();
-
-    public XMPPServer(String domain) {
-        this.serverDomain = domain;
-
-        // default list of SASL mechanisms
-        saslMechanisms.add(new Plain());
-    }
+public class SpringCompatibleXMPPServer extends XMPPServer {
 
-    public void setSASLMechanisms(List<SASLMechanism> validMechanisms) {
-        saslMechanisms.addAll(validMechanisms);
-    }
+    protected final List<Module> listOfModules = new ArrayList<Module>();
+    protected String certificateFile = null;
+    protected String certificatePassword = null;
 
-    public void setStorageProviderRegistry(StorageProviderRegistry 
storageProviderRegistry) {
-        this.storageProviderRegistry = storageProviderRegistry;
+    public SpringCompatibleXMPPServer(String domain) {
+        super(domain);
     }
 
-    public void setTLSCertificateInfo(File certificate, String password) {
-        tlsCertificateFile = certificate;
-        tlsCertificatePassword = password;
+    public void setCertificateFile(String certificateFile) {
+        this.certificateFile = certificateFile;
     }
 
-    public void addEndpoint(Endpoint endpoint) {
-        endpoints.add(endpoint);
+    public void setCertificatePassword(String certificatePassword) {
+        this.certificatePassword = certificatePassword;
     }
 
-    public void start() throws Exception {
-
-        BogusTrustManagerFactory bogusTrustManagerFactory = new 
BogusTrustManagerFactory();
-        FileBasedTLSContextFactory tlsContextFactory = new 
FileBasedTLSContextFactory(tlsCertificateFile);
-        tlsContextFactory.setPassword(tlsCertificatePassword);
-        tlsContextFactory.setTrustManagerFactory(bogusTrustManagerFactory);
-
-        List<NamespaceHandlerDictionary> dictionaries = new 
ArrayList<NamespaceHandlerDictionary>();
-        addCoreDictionaries(dictionaries);
-
-        ResourceRegistry resourceRegistry = new ResourceRegistry();
-
-        EntityImpl serverEntity = new EntityImpl(null, serverDomain, null);
-
-        AccountManagement accountManagement = (AccountManagement) 
storageProviderRegistry
-                .retrieve(AccountManagement.class);
-        DeliveringInboundStanzaRelay internalStanzaRelay = new 
DeliveringInboundStanzaRelay(serverEntity,
-                resourceRegistry, accountManagement);
-        RecordingStanzaRelay externalStanzaRelay = new RecordingStanzaRelay();
-
-        StanzaRelayBroker stanzaRelayBroker = new StanzaRelayBroker();
-        stanzaRelayBroker.setInternalRelay(internalStanzaRelay);
-        stanzaRelayBroker.setExternalRelay(externalStanzaRelay);
-
-        ServerFeatures serverFeatures = new ServerFeatures();
-        serverFeatures.setAuthenticationMethods(saslMechanisms);
-
-        serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity, 
stanzaRelayBroker, serverFeatures,
-                dictionaries, resourceRegistry);
-        
serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
-        serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
-
-        serverRuntimeContext.addModule(new ServiceDiscoveryModule());
-        serverRuntimeContext.addModule(new RosterModule());
-
-        stanzaRelayBroker.setServerRuntimeContext(serverRuntimeContext);
-        internalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
-
-        if (endpoints.size() == 0)
-            throw new IllegalStateException("server must have at least one 
endpoint");
+    public void setEndpoints(Collection<Endpoint> endpoints) {
         for (Endpoint endpoint : endpoints) {
-            endpoint.setServerRuntimeContext(serverRuntimeContext);
-            endpoint.start();
+            addEndpoint(endpoint);
         }
     }
 
-    public void stop() {
-        for (Endpoint endpoint : endpoints) {
-            endpoint.stop();
-        }
+    public void setModules(Collection<Module> modules) {
+        listOfModules.addAll(modules);
     }
-
-    public void addModule(Module module) {
-        serverRuntimeContext.addModule(module);
+    
+    public void init() throws Exception {
+        setTLSCertificateInfo(new File(certificateFile), certificatePassword);
+        start();
+        if (listOfModules != null) {
+            for (Module module : listOfModules) {
+                addModule(module);
+            }
+        }
     }
 
-    private void addCoreDictionaries(List<NamespaceHandlerDictionary> 
dictionaries) {
-        dictionaries.add(new 
org.apache.vysper.xmpp.modules.core.base.BaseStreamStanzaDictionary());
-        dictionaries.add(new 
org.apache.vysper.xmpp.modules.core.starttls.StartTLSStanzaDictionary());
-        dictionaries.add(new 
org.apache.vysper.xmpp.modules.core.sasl.SASLStanzaDictionary());
-        dictionaries.add(new 
org.apache.vysper.xmpp.modules.core.bind.BindResourceDictionary());
-        dictionaries.add(new 
org.apache.vysper.xmpp.modules.core.session.SessionStanzaDictionary());
-        dictionaries.add(new 
org.apache.vysper.xmpp.modules.core.compatibility.jabber_iq_auth.JabberIQAuthDictionary());
+    public void destroy() {
+        stop();
     }
 }

Modified: 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.html
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.html?rev=996553&r1=996552&r2=996553&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.html
 (original)
+++ 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.html
 Mon Sep 13 14:27:05 2010
@@ -36,6 +36,10 @@
                <td><input type="text" id="port" value="8080" /></td>
        </tr>
        <tr>
+               <td>Context path</td>
+               <td><input type="text" id="contextPath" value="/" /></td>
+       </tr>
+       <tr>
                <td>JID</td>
                <td><input type="text" id="jid" value="[email protected]" /></td>
        </tr>

Modified: 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.js
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.js?rev=996553&r1=996552&r2=996553&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.js
 (original)
+++ 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/examples/client/client.js
 Mon Sep 13 14:27:05 2010
@@ -86,11 +86,12 @@ Strophe.log = function (level, msg) {
 function connect() {
        server = $("#server").val();
        port = $("#port").val();
+       contextPath = $("#contextPath").val();
        jid = $("#jid").val();
        password = $("#password").val();
-       log("Connecting to <b>" + server + ":" + port + "</b> as <b>" + jid + 
"</b>...");
+       log("Connecting to <b>" + server + ":" + port + "/" + contextPath + 
"</b> as <b>" + jid + "</b>...");
        
-       connection = new Strophe.Connection("http://"; + server + ":" + port + 
"/");
+       connection = new Strophe.Connection("http://"; + server + ":" + port + 
"/" + contextPath);
 
        connection.connect(jid, password, function(status) {
                log("Connection status: " + connectionStatuses[status]);

Modified: 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java?rev=996553&r1=996552&r2=996553&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
 (original)
+++ 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshEndpoint.java
 Mon Sep 13 14:27:05 2010
@@ -25,7 +25,11 @@ import java.util.List;
 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.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.server.handler.ResourceHandler;
 import org.eclipse.jetty.server.nio.SelectChannelConnector;
 import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
 import org.eclipse.jetty.servlet.ServletContextHandler;
@@ -43,21 +47,23 @@ import org.slf4j.LoggerFactory;
  */
 public class BoshEndpoint implements Endpoint {
 
-    private final Logger logger = LoggerFactory.getLogger(BoshEndpoint.class);
+    protected final static Logger logger = 
LoggerFactory.getLogger(BoshEndpoint.class);
 
-    private ServerRuntimeContext serverRuntimeContext;
+    protected ServerRuntimeContext serverRuntimeContext;
 
-    private int port = 8080;
+    protected int port = 8080;
 
-    private Server server;
+    protected Server server;
 
-    private boolean isSSLEnabled;
+    protected boolean isSSLEnabled;
 
-    private String sslKeystorePath;
+    protected String sslKeystorePath;
 
-    private String sslKeystorePassword;
+    protected String sslKeystorePassword;
 
-    private List<String> accessControlAllowOrigin;
+    protected List<String> accessControlAllowOrigin;
+    
+    protected String contextPath = "/";
 
     public void setServerRuntimeContext(ServerRuntimeContext 
serverRuntimeContext) {
         this.serverRuntimeContext = serverRuntimeContext;
@@ -72,19 +78,30 @@ public class BoshEndpoint implements End
     }
 
     /**
-     * Configures the SSL keystore and the keystore password.
+     * Configures the SSL keystore
      * <p>
-     * These parameters are required if SSL is enabled.
+     * 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) {
+        sslKeystorePath = keystorePath;
+    }
+
+    /**
+     * Configures the SSL keystore password.
+     * <p>
+     * Required if SSL is enabled. Also, the keystore must be set using
+     * {...@link #setSSLCertificateKeystore(String)}  }
      * The password is used both for accessing the keystore and for recovering
      * the key from the keystore. The unique password is a limitation, you
      * cannot use different passwords for the keystore and for the key.
      * 
-     * @param keystorePath the path to the Java keystore
      * @param password the password used as the keystore password and also used
      * when recovering the key from the keystore
      */
-    public void setSSLCertificateInfo(String keystorePath, String password) {
-        sslKeystorePath = keystorePath;
+    public void setSSLCertificateKeystorePassword(String password) {
         sslKeystorePassword = password;
     }
 
@@ -116,12 +133,22 @@ public class BoshEndpoint implements End
     }
 
     /**
-     * @throws IOException 
-     * @throws RuntimeException a wrapper of the possible
-     * {...@link java.lang.Exception} that Jetty can throw at start-up
+     * Determines the context URI where the BOSH transport will be accessible.
+     * The default is as 'root context' under '/'. 
+     * @param contextPath
      */
-    public void start() throws IOException {
-        server = new Server();
+    public void setContextPath(String contextPath) {
+        if (contextPath == null) contextPath = "/";
+        this.contextPath = contextPath;
+    }
+
+    /**
+     * 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) {
@@ -135,16 +162,39 @@ public class BoshEndpoint implements End
         }
         connector.setPort(port);
         server.setConnectors(new Connector[] { connector });
+        return server;
+    }
 
-        ServletContextHandler context = new 
ServletContextHandler(ServletContextHandler.SESSIONS);
-        context.setContextPath("/");
-        server.setHandler(context);
+    /**
+     * 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);
 
         BoshServlet boshServlet = new BoshServlet();
         boshServlet.setServerRuntimeContext(serverRuntimeContext);
         boshServlet.setAccessControlAllowOrigin(accessControlAllowOrigin);
-        context.addServlet(new ServletHolder(boshServlet), "/");
+        boshContext.addServlet(new ServletHolder(boshServlet), "/");
+
+        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 {
 
+        Server server = createJettyServer();
+        Handler handler = createHandler();
+        server.setHandler(handler);
+        
         try {
             server.start();
         } catch (Exception e) {

Modified: 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/ServerMain.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/ServerMain.java?rev=996553&r1=996552&r2=996553&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/ServerMain.java
 (original)
+++ 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/ServerMain.java
 Mon Sep 13 14:27:05 2010
@@ -90,6 +90,7 @@ public class ServerMain {
         //        boshEndpoint.setSSLEnabled(true);
         //        
boshEndpoint.setSSLCertificateInfo("src/main/resources/keystore",
         //                "password");
+        boshEndpoint.setContextPath("/bosh");
         server.addEndpoint(boshEndpoint);
 
         //server.addEndpoint(new StanzaSessionFactory());

Added: 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/SharedBoshEndpoint.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/SharedBoshEndpoint.java?rev=996553&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/SharedBoshEndpoint.java
 (added)
+++ 
mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/SharedBoshEndpoint.java
 Mon Sep 13 14:27:05 2010
@@ -0,0 +1,62 @@
+/*
+ *  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.xep0124;
+
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * for having deploying only the BOSH context, but potentially other context
+ * within the same server, for example for colocating BOSH with a chat webapp,
+ * use a shared BOSH endpoint.
+ */
+public class SharedBoshEndpoint extends BoshEndpoint {
+
+    protected final List<Handler> handlers = new ArrayList<Handler>();
+
+    public void addHandler(Handler handler) {
+        handlers.add(handler);
+    }
+
+    public void setHandlers(Collection<? extends Handler> moreHandlers) {
+        handlers.addAll(moreHandlers);
+    }
+    
+    @Override
+    protected Handler createHandler() {
+
+        final Handler boshHandler = super.createHandler();
+
+        Handler[] handlerArray = new Handler[handlers.size()+1];
+        handlerArray[0] = boshHandler;
+        for (int i = 0; i < handlers.size(); i++) {
+            handlerArray[i+1] = handlers.get(i);
+        }
+        
+        final ContextHandlerCollection handlerCollection = new 
ContextHandlerCollection();
+        handlerCollection.setHandlers(handlerArray);
+        return handlerCollection;
+        
+    }
+}


Reply via email to