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;
+
+ }
+}