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/04 00:06:39 UTC

svn commit: r1054817 [1/2] - in /mina/vysper/trunk: ./ server/core-inttest/ server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/ server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/ server/core-inttest/src/test/resources/ se...

Author: ngn
Date: Mon Jan  3 23:06:37 2011
New Revision: 1054817

URL: http://svn.apache.org/viewvc?rev=1054817&view=rev
Log:
Merge in s2s branch, all fingers crossed

Added:
    mina/vysper/trunk/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/
      - copied from r1054813, mina/vysper/branches/s2s/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/
    mina/vysper/trunk/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/
      - copied from r1054813, mina/vysper/branches/s2s/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/
    mina/vysper/trunk/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/RunS2SServers.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core-inttest/src/test/java/org/apache/vysper/xmpp/server/s2s/RunS2SServers.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelay.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/StanzaRelay.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/RemoteServerNotFoundException.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/RemoteServerNotFoundException.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/RemoteServerTimeoutException.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/RemoteServerTimeoutException.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/SmartDeliveryException.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/SmartDeliveryException.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java   (props changed)
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/RelayResult.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/RelayResult.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingListener.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingListener.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPinger.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPinger.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/
      - copied from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbResultHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandler.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/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/modules/extension/xep0220_server_dailback/DialbackIdGenerator.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGenerator.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/DefaultHandlerDictionary.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/protocol/DefaultHandlerDictionary.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/
      - copied from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnector.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/DefaultXMPPServerConnectorRegistry.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandler.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/FeaturesHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandler.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/TlsProceedHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/XMPPServerConnector.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/XMPPServerConnector.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/XMPPServerConnectorRegistry.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/XMPPServerConnectorRegistry.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/XmppEndpointResolver.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/server/s2s/XmppEndpointResolver.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/failure/
      - copied from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/delivery/failure/
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategyTestCase.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategyTestCase.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelayTestCase.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelayTestCase.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
      - copied, changed from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/RecordingDeliveryFailureStrategy.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/RecordingDeliveryFailureStrategy.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/RelayResultTestCase.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/RelayResultTestCase.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/TestExecutorService.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/TestExecutorService.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/
      - copied from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandlerTestCase.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DbVerifyHandlerTestCase.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGeneratorTestCase.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0220_server_dailback/DialbackIdGeneratorTestCase.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/
      - copied from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/Server2Server.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/ServerMain.java
      - copied unchanged from r1054813, mina/vysper/branches/s2s/server/core/src/test/java/org/apache/vysper/xmpp/server/s2s/ServerMain.java
Removed:
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInboundStanzaRelay.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/AbstractHandlerDictionary.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringStanzaRelayTestCase.java
Modified:
    mina/vysper/trunk/pom.xml
    mina/vysper/trunk/server/core/   (props changed)
    mina/vysper/trunk/server/core-inttest/   (props changed)
    mina/vysper/trunk/server/core-inttest/src/test/resources/log4j.properties
    mina/vysper/trunk/server/core/pom.xml
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/StanzaLoggingFilter.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSession.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java   (props changed)
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingIQHandler.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingModule.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/AbstractStanzaHandlerLookup.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.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/protocol/StanzaHandlerLookup.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java   (props changed)
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.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/DefaultServerRuntimeContext.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/SessionContext.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaHandlerLookup.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java
    mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/stanza/StanzaBuilder.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailInitialOutHandlerTestCase.java   (props changed)
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceSubRequestOutHandlerTestCase.java   (props changed)
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AuthHandlerPlainMechanismTestCase.java   (props changed)
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
    mina/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/stanza/StanzaBuilderTestCase.java
    mina/vysper/trunk/server/core/src/test/resources/log4j.properties
    mina/vysper/trunk/server/extensions/xep0045-muc/   (props changed)
    mina/vysper/trunk/server/extensions/xep0045-muc/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0045_muc/TestSessionContext.java
    mina/vysper/trunk/server/extensions/xep0060-pubsub/src/test/java/org/apache/vysper/xmpp/modules/extension/xep0060_pubsub/TestSessionContext.java
    mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java

Modified: mina/vysper/trunk/pom.xml
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/pom.xml?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/pom.xml (original)
+++ mina/vysper/trunk/pom.xml Mon Jan  3 23:06:37 2011
@@ -120,7 +120,7 @@
       <dependency>
         <groupId>commons-codec</groupId>
         <artifactId>commons-codec</artifactId>
-        <version>1.3</version>
+        <version>1.4</version>
       </dependency>
 
       <dependency>
@@ -216,6 +216,13 @@
         <artifactId>log4j</artifactId>
         <version>1.2.14</version>
       </dependency>
+      
+      <dependency>
+        <groupId>org.mockito</groupId>
+        <artifactId>mockito-all</artifactId>
+        <version>1.8.5</version>
+      </dependency>
+
     </dependencies>
   </dependencyManagement>
 

Propchange: mina/vysper/trunk/server/core/
------------------------------------------------------------------------------
    svn:mergeinfo = /mina/vysper/branches/s2s/server/core:1050957-1054813

Propchange: mina/vysper/trunk/server/core-inttest/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Jan  3 23:06:37 2011
@@ -2,3 +2,5 @@
 target
 .classpath
 .project
+s2s-jabber.org.properties
+s2s-protocol7.com.properties

Propchange: mina/vysper/trunk/server/core-inttest/
------------------------------------------------------------------------------
    svn:mergeinfo = /mina/vysper/branches/s2s/server/core-inttest:1050957-1054813

Modified: mina/vysper/trunk/server/core-inttest/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core-inttest/src/test/resources/log4j.properties?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core-inttest/src/test/resources/log4j.properties (original)
+++ mina/vysper/trunk/server/core-inttest/src/test/resources/log4j.properties Mon Jan  3 23:06:37 2011
@@ -15,7 +15,7 @@
 # specific language governing permissions and limitations
 # under the License.
 
-log4j.rootLogger=DEBUG, C
+log4j.rootLogger=INFO, C
 
 log4j.logger.org.apache.vysper.mina.XmppIoHandlerAdapter=WARN,C
 log4j.logger.org.apache.mina.filter.executor.ExecutorFilter=WARN,C

Modified: mina/vysper/trunk/server/core/pom.xml
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/pom.xml?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/pom.xml (original)
+++ mina/vysper/trunk/server/core/pom.xml Mon Jan  3 23:06:37 2011
@@ -97,6 +97,12 @@
     </dependency>
       
 
+	<dependency>
+	    <groupId>dnsjava</groupId>
+	    <artifactId>dnsjava</artifactId>
+	    <version>2.0.8</version>
+	</dependency>
+
     <!-- Logging -->
     <dependency>
       <groupId>org.slf4j</groupId>
@@ -140,6 +146,24 @@
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    
+    <dependency>
+      <groupId>jivesoftware</groupId>
+      <artifactId>smack</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>jivesoftware</groupId>
+      <artifactId>smackx</artifactId>
+      <scope>test</scope>
+    </dependency>
+    
+	<dependency>
+    	<groupId>org.mockito</groupId>
+    	<artifactId>mockito-all</artifactId>
+		<scope>test</scope>
+	</dependency>
   </dependencies>
 
 </project>

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/MinaBackedSessionContext.java Mon Jan  3 23:06:37 2011
@@ -19,6 +19,8 @@
  */
 package org.apache.vysper.mina;
 
+import java.util.concurrent.TimeUnit;
+
 import org.apache.mina.core.future.CloseFuture;
 import org.apache.mina.core.future.IoFuture;
 import org.apache.mina.core.future.IoFutureListener;
@@ -48,6 +50,7 @@ public class MinaBackedSessionContext ex
     private boolean openingStanzaWritten = false;
 
     private boolean switchToTLS = false;
+    private boolean clientTLS = false;
 
     protected CloseFuture closeFuture;
 
@@ -64,25 +67,38 @@ public class MinaBackedSessionContext ex
         return this;
     }
 
-    public void switchToTLS() {
-        switchToTLS = true;
+    public void switchToTLS(boolean delayed, boolean clientTls) {
+        this.clientTLS = clientTls;
+
+        if(delayed) {
+            switchToTLS = true;
+        } else {
+            addSslFilter();
+        }
     }
 
     public void setIsReopeningXMLStream() {
         openingStanzaWritten = false;
     }
+    
+    private void addSslFilter() {
+        minaSession.suspendRead();
+        minaSession.suspendWrite();
+        SslFilter filter = new SslFilter(getServerRuntimeContext().getSslContext());
+        filter.setUseClientMode(clientTLS);
+        minaSession.getFilterChain().addFirst("sslFilter", filter);
+        if(!clientTLS) {
+            minaSession.setAttribute(SslFilter.DISABLE_ENCRYPTION_ONCE, Boolean.TRUE);
+        }
+        minaSession.setAttribute(SslFilter.USE_NOTIFICATION, Boolean.TRUE);
+        minaSession.resumeWrite();
+        minaSession.resumeRead();
+        
+    }
 
     public void write(Stanza stanza) {
         if (switchToTLS) {
-            minaSession.suspendRead();
-            minaSession.suspendWrite();
-            SslFilter filter = new SslFilter(getServerRuntimeContext().getSslContext());
-            filter.setUseClientMode(false);
-            minaSession.getFilterChain().addFirst("sslFilter", filter);
-            minaSession.setAttribute(SslFilter.DISABLE_ENCRYPTION_ONCE, Boolean.TRUE);
-            minaSession.setAttribute(SslFilter.USE_NOTIFICATION, Boolean.TRUE);
-            minaSession.resumeWrite();
-            minaSession.resumeRead();
+            addSslFilter();
             switchToTLS = false;
         }
 
@@ -93,7 +109,15 @@ public class MinaBackedSessionContext ex
     public void close() {
         logger.info("session will be closed now");
         closeFuture.setClosed();
-        minaSession.close(false);
+        try {
+            // allow some time to flush before closibng
+            if(!minaSession.close(false).await(5000, TimeUnit.MILLISECONDS)) {
+                // no really close if necessary
+                minaSession.close(true);
+            }
+        } catch (InterruptedException e) {
+            // ignore
+        }
         logger.info("session closed");
     }
 

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/StanzaLoggingFilter.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/StanzaLoggingFilter.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/StanzaLoggingFilter.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/StanzaLoggingFilter.java Mon Jan  3 23:06:37 2011
@@ -44,9 +44,9 @@ public class StanzaLoggingFilter extends
             XMLElement element = (XMLElement) message;
 
             if (clientLogger.isInfoEnabled()) {
-                clientLogger.info(DenseStanzaLogRenderer.render(element));
+                //clientLogger.info(DenseStanzaLogRenderer.render(element));
             }
-            if (clientLogger.isDebugEnabled()) {
+//            if (clientLogger.isDebugEnabled()) {
                 boolean openElement = true;
                 boolean closeElement = true;
                 // this is somewhat of a hack, can we detect opening and closing elements only cleaner?
@@ -62,8 +62,8 @@ public class StanzaLoggingFilter extends
 
                 String xml = toXml(element, openElement, closeElement);
                 clientLogger.debug("Received stanza: " + xml);
-            }
-
+                clientLogger.info("< " + xml);
+//            }
         }
 
         nextFilter.messageReceived(session, message);
@@ -75,14 +75,15 @@ public class StanzaLoggingFilter extends
             StanzaWriteInfo stanzaWriteInfo = (StanzaWriteInfo) message;
 
             if (serverLogger.isInfoEnabled()) {
-                serverLogger.info(DenseStanzaLogRenderer.render(stanzaWriteInfo.getStanza()));
+                //serverLogger.info(DenseStanzaLogRenderer.render(stanzaWriteInfo.getStanza()));
             }
-            if (serverLogger.isDebugEnabled()) {
+//            if (serverLogger.isDebugEnabled()) {
                 String xml = toXml(stanzaWriteInfo.getStanza(), stanzaWriteInfo.isWriteOpeningElement(),
                         stanzaWriteInfo.isWriteClosingElement());
 
-                serverLogger.info("Sent stanza: " + xml);
-            }
+                //serverLogger.info("Sent stanza: " + xml);
+                clientLogger.info("> " + xml);
+//            }
         }
 
         nextFilter.messageSent(session, request);

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/mina/TCPEndpoint.java Mon Jan  3 23:06:37 2011
@@ -77,5 +77,6 @@ public class TCPEndpoint implements Endp
 
     public void stop() {
         acceptor.unbind();
+        acceptor.dispose();
     }
 }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java Mon Jan  3 23:06:37 2011
@@ -26,7 +26,7 @@ import org.apache.vysper.xmpp.delivery.S
 import org.apache.vysper.xmpp.delivery.failure.DeliveryException;
 import org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
 import org.apache.vysper.xmpp.modules.Module;
-import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
+import org.apache.vysper.xmpp.protocol.HandlerDictionary;
 import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.ServerFeatures;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -51,7 +51,7 @@ public class SpringCompatibleDefaultServ
     }
 
     public SpringCompatibleDefaultServerRuntimeContext(Entity serverEntity, ServerFeatures serverFeatures,
-            List<NamespaceHandlerDictionary> dictionaries, ResourceRegistry resourceRegistry) {
+            List<HandlerDictionary> dictionaries, ResourceRegistry resourceRegistry) {
         super(serverEntity, new StanzaRelayHull(), serverFeatures, dictionaries, resourceRegistry);
     }
 

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSession.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSession.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSession.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSession.java Mon Jan  3 23:06:37 2011
@@ -38,7 +38,7 @@ public class StanzaSession {
     }
 
     public void setIsSecure() {
-        sessionContext.switchToTLS();
+        sessionContext.switchToTLS(true, false);
     }
 
     public Stanza poll() {

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/stanzasession/StanzaSessionContext.java Mon Jan  3 23:06:37 2011
@@ -52,7 +52,7 @@ public class StanzaSessionContext extend
                 sessionStateHolder);
     }
 
-    public void switchToTLS() {
+    public void switchToTLS(boolean delayed, boolean clientTls) {
         if (sessionStateHolder.getState() == SessionState.ENCRYPTION_STARTED)
             sessionStateHolder.setState(SessionState.ENCRYPTED);
     }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java Mon Jan  3 23:06:37 2011
@@ -65,15 +65,17 @@ public class ReturnErrorToSenderFailureS
             @SpecCompliant(spec = "rfc3921bis-08", section = "4.3", status = NOT_STARTED, coverage = UNKNOWN) })
     public void process(Stanza failedToDeliverStanza, List<DeliveryException> deliveryExceptions)
             throws DeliveryException {
-
         StanzaErrorCondition stanzaErrorCondition = StanzaErrorCondition.SERVICE_UNAVAILABLE;
         StanzaErrorType errorType = StanzaErrorType.CANCEL;
 
+        // TODO would it be better to check for the correct stanzas instead of assuming the stanza is wrapped?
         if (!(failedToDeliverStanza instanceof XMPPCoreStanza)) {
             throw new DeliveryException("could not return to sender");
         }
+        
+        
         XMPPCoreStanza failedCoreStanza = (XMPPCoreStanza) failedToDeliverStanza;
-        if (failedCoreStanza.getType() != null && failedCoreStanza.getType().equals("error")) {
+        if ("error".equals(failedCoreStanza.getType())) {
             return; // do not answer these
         }
 
@@ -112,6 +114,15 @@ public class ReturnErrorToSenderFailureS
                         return;
                     }
                 }
+            } else if (deliveryException instanceof SmartDeliveryException) {
+                // RFC3921bis#10.4.3: return remote server error to sender
+                SmartDeliveryException smartDeliveryException = (SmartDeliveryException) deliveryException;
+                XMPPCoreStanza error = XMPPCoreStanza
+                        .getWrapper(ServerErrorResponses.getInstance().getStanzaError(
+                                smartDeliveryException.getStanzaErrorCondition(), failedCoreStanza,
+                                smartDeliveryException.getStanzaErrorType(), smartDeliveryException.getErrorText(),
+                                "en", null));
+                stanzaRelay.relay(error.getTo(), error, IgnoreFailureStrategy.IGNORE_FAILURE_STRATEGY);
             }
         } else if (deliveryExceptions.size() > 1) {
             throw new RuntimeException("cannot return to sender for multiple failed deliveries");

Propchange: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Mon Jan  3 23:06:37 2011
@@ -0,0 +1 @@
+/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java:1050957-1054813

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java Mon Jan  3 23:06:37 2011
@@ -103,7 +103,7 @@ public class MessageHandler extends XMPP
                 if (resource == null)
                     throw new IllegalStateException("could not determine unique resource");
                 from = new EntityImpl(sessionContext.getInitiatingEntity(), resource);
-                StanzaBuilder stanzaBuilder = new StanzaBuilder(stanza.getName());
+                StanzaBuilder stanzaBuilder = new StanzaBuilder(stanza.getName(), stanza.getNamespaceURI());
                 for (Attribute attribute : stanza.getAttributes()) {
                     if ("from".equals(attribute.getName()))
                         continue;

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/StreamStartHandler.java Mon Jan  3 23:06:37 2011
@@ -20,6 +20,7 @@
 
 package org.apache.vysper.xmpp.modules.core.base.handler;
 
+import org.apache.vysper.mina.MinaBackedSessionContext;
 import org.apache.vysper.xml.fragment.XMLElementVerifier;
 import org.apache.vysper.xmpp.addressing.EntityFormatException;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -36,6 +37,7 @@ import org.apache.vysper.xmpp.server.XMP
 import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
 import org.apache.vysper.xmpp.server.response.ServerResponses;
 import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 
 /**
  *
@@ -69,6 +71,7 @@ public class StreamStartHandler implemen
         boolean clientCall = xmlElementVerifier.namespacePresent(NamespaceURIs.JABBER_CLIENT);
         boolean serverCall = xmlElementVerifier.namespacePresent(NamespaceURIs.JABBER_SERVER);
 
+        // TODO is it better to derive c2s or s2s from the type of endpoint and verify the namespace here?
         if (clientCall && serverCall)
             serverCall = false; // silently ignore ambiguous attributes
         if (serverCall)
@@ -128,9 +131,8 @@ public class StreamStartHandler implemen
             // RFC3920: 'to' attribute SHOULD be used by the initiating entity
             String toValue = stanza.getAttributeValue("to");
             if (toValue != null) {
-                EntityImpl toEntity = null;
                 try {
-                    toEntity = EntityImpl.parse(toValue);
+                    EntityImpl.parse(toValue);
                 } catch (EntityFormatException e) {
                     return new ResponseStanzaContainerImpl(ServerErrorResponses.getInstance().getStreamError(
                             StreamErrorCondition.IMPROPER_ADDRESSING, sessionContext.getXMLLang(),
@@ -143,23 +145,23 @@ public class StreamStartHandler implemen
                 // TODO RFC3920: 'from' attribute SHOULD be silently ignored by the receiving entity
                 // TODO RFC3920bis: 'from' attribute SHOULD be not ignored by the receiving entity and used as 'to' in responses
             }
-            responseStanza = new ServerResponses().getStreamOpener(clientCall, sessionContext.getServerJID(),
+            responseStanza = new ServerResponses().getStreamOpenerForClient(sessionContext.getServerJID(),
                     responseVersion, sessionContext);
         } else if (serverCall) {
             // RFC3920: 'from' attribute SHOULD be used by the receiving entity
             String fromValue = stanza.getAttributeValue("from");
             if (fromValue != null) {
-                EntityImpl entity = null;
                 try {
-                    entity = EntityImpl.parse(fromValue);
+                    EntityImpl.parse(fromValue);
                 } catch (EntityFormatException e) {
                     return new ResponseStanzaContainerImpl(ServerErrorResponses.getInstance().getStreamError(
                             StreamErrorCondition.INVALID_FROM, sessionContext.getXMLLang(),
                             "could not parse incoming stanza's FROM attribute", null));
-
                 }
             }
-            throw new RuntimeException("server connection not yet supported");
+
+            responseStanza = new ServerResponses().getStreamOpenerForServerAcceptor(sessionContext.getServerJID(),
+                    responseVersion, sessionContext, serverRuntimeContext.getSslContext() != null);
         } else {
             String descriptiveText = "one of the two namespaces must be present: " + NamespaceURIs.JABBER_CLIENT
                     + " or " + NamespaceURIs.JABBER_SERVER;

Propchange: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 23:06:37 2011
@@ -0,0 +1 @@
+/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/sasl/handler/AbortHandler.java:1050957-1054813

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/starttls/handler/StartTLSHandler.java Mon Jan  3 23:06:37 2011
@@ -70,7 +70,7 @@ public class StartTLSHandler implements 
         // if all is correct, go to next phase
         sessionStateHolder.setState(SessionState.ENCRYPTION_STARTED);
 
-        sessionContext.switchToTLS();
+        sessionContext.switchToTLS(true, false);
 
         return new ResponseStanzaContainerImpl(responseStanza);
     }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingIQHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingIQHandler.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingIQHandler.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingIQHandler.java Mon Jan  3 23:06:37 2011
@@ -19,6 +19,9 @@
  */
 package org.apache.vysper.xmpp.modules.extension.xep0119_xmppping;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.vysper.compliance.SpecCompliant;
 import org.apache.vysper.xmpp.modules.core.base.handler.DefaultIQHandler;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
@@ -47,10 +50,38 @@ import org.apache.vysper.xmpp.stanza.Sta
 @SpecCompliant(spec = "xep-0199", status = SpecCompliant.ComplianceStatus.IN_PROGRESS, coverage = SpecCompliant.ComplianceCoverage.PARTIAL)
 public class XmppPingIQHandler extends DefaultIQHandler {
 
+    private List<XmppPinger> pingers = new ArrayList<XmppPinger>();
+    
     public XmppPingIQHandler() {
     }
 
     @Override
+    public boolean verify(Stanza stanza) {
+        boolean extension = super.verify(stanza);
+        if(extension) {
+            return true;
+        } else {
+            String type = stanza.getAttributeValue("type");
+            if(type != null && type.equals("result")) {
+                String id = stanza.getAttributeValue("id");
+                if(id != null && id.startsWith("xmppping-")) {
+                    return true;
+                }
+            }
+        }
+        
+        return false;
+    }
+    
+    protected void addPinger(XmppPinger pinger) {
+        pingers.add(pinger);
+    }
+
+    protected void removePinger(XmppPinger pinger) {
+        pingers.remove(pinger);
+    }
+    
+    @Override
     protected boolean verifyNamespace(Stanza stanza) {
         return verifyInnerNamespace(stanza, NamespaceURIs.URN_XMPP_PING);
     }
@@ -68,4 +99,16 @@ public class XmppPingIQHandler extends D
 
         return stanzaBuilder.build();
     }
+    
+    @Override
+    protected Stanza handleResult(IQStanza stanza, ServerRuntimeContext serverRuntimeContext,
+            SessionContext sessionContext) {
+        for(XmppPinger pinger : pingers) {
+            pinger.pong(stanza.getID());
+        }
+        
+        return null;
+    }
+    
+    
 }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingModule.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingModule.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingModule.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/extension/xep0119_xmppping/XmppPingModule.java Mon Jan  3 23:06:37 2011
@@ -23,14 +23,16 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.modules.DefaultDiscoAwareModule;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.Feature;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoElement;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.InfoRequest;
 import org.apache.vysper.xmpp.modules.servicediscovery.management.ServerInfoRequestListener;
+import org.apache.vysper.xmpp.protocol.DefaultHandlerDictionary;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
-import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.writer.StanzaWriter;
 
 /**
  * A module for <a href="http://xmpp.org/extensions/xep-0199.html">XEP-0199 XMPP Ping</a>.
@@ -39,6 +41,8 @@ import org.apache.vysper.xmpp.protocol.N
  */
 public class XmppPingModule extends DefaultDiscoAwareModule implements ServerInfoRequestListener {
 
+    private XmppPingIQHandler handler = new XmppPingIQHandler();
+    
     @Override
     public String getName() {
         return "XEP-0199 XMPP Ping";
@@ -64,6 +68,13 @@ public class XmppPingModule extends Defa
 
     @Override
     protected void addHandlerDictionaries(List<HandlerDictionary> dictionary) {
-        dictionary.add(new NamespaceHandlerDictionary(NamespaceURIs.URN_XMPP_PING, new XmppPingIQHandler()));
+        dictionary.add(new DefaultHandlerDictionary(handler));
     }
+    
+    public void ping(StanzaWriter stanzaWriter, Entity from, Entity to, int timeoutMillis, XmppPingListener listener) {
+        XmppPinger pinger = new XmppPinger(handler);
+        pinger.ping(stanzaWriter, from, to, timeoutMillis, listener);
+    }
+    
+    
 }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/AbstractStanzaHandlerLookup.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/AbstractStanzaHandlerLookup.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/AbstractStanzaHandlerLookup.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/AbstractStanzaHandlerLookup.java Mon Jan  3 23:06:37 2011
@@ -19,8 +19,9 @@
  */
 package org.apache.vysper.xmpp.protocol;
 
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.List;
 
 import org.apache.vysper.xml.fragment.XMLElement;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -29,13 +30,10 @@ import org.apache.vysper.xmpp.stanza.Sta
  * basic facility to collect and query a set of namespace-based handlers 
  */
 public abstract class AbstractStanzaHandlerLookup {
-    protected Map<String, NamespaceHandlerDictionary> namespaceDictionaries = new LinkedHashMap<String, NamespaceHandlerDictionary>();
+    protected List<HandlerDictionary> namespaceDictionaries = new ArrayList<HandlerDictionary>();
 
-    public void addDictionary(NamespaceHandlerDictionary namespaceHandlerDictionary) {
-        String namespace = namespaceHandlerDictionary.getNamespaceURI();
-        if (namespaceDictionaries.containsKey(namespace))
-            throw new IllegalArgumentException("dictionary already exists covering namespace " + namespace);
-        namespaceDictionaries.put(namespace, namespaceHandlerDictionary);
+    public void addDictionary(HandlerDictionary namespaceHandlerDictionary) {
+        namespaceDictionaries.add(namespaceHandlerDictionary);
     }
 
     public abstract StanzaHandler getHandler(Stanza stanza);
@@ -46,18 +44,10 @@ public abstract class AbstractStanzaHand
      * 2. xmlElements namespace, if the element name has a namespace prefix
      */
     protected StanzaHandler getHandlerForElement(Stanza stanza, XMLElement xmlElement) {
-
-        String namespace = xmlElement.getNamespaceURI();
-        NamespaceHandlerDictionary namespaceHandlerDictionary = namespaceDictionaries.get(namespace);
-
-        // another try to get a dictionary
-        if (namespaceHandlerDictionary == null) {
-            namespace = xmlElement.getNamespacePrefix();
-            namespaceHandlerDictionary = namespaceDictionaries.get(namespace);
+        for(HandlerDictionary dictionary : namespaceDictionaries) {
+            StanzaHandler stanzaHandler = dictionary.get(stanza);
+            if(stanzaHandler != null) return stanzaHandler;
         }
-        if (namespaceHandlerDictionary != null)
-            return namespaceHandlerDictionary.get(stanza);
-
         return null;
     }
 }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceHandlerDictionary.java Mon Jan  3 23:06:37 2011
@@ -21,12 +21,14 @@ package org.apache.vysper.xmpp.protocol;
 
 import java.util.List;
 
+import org.apache.vysper.xmpp.stanza.Stanza;
+
 /**
  * holds all stanza handlers for a distinct namespace
  *
  * @author The Apache MINA Project (dev@mina.apache.org)
  */
-public class NamespaceHandlerDictionary extends AbstractHandlerDictionary {
+public class NamespaceHandlerDictionary extends DefaultHandlerDictionary {
 
     private String namespaceURI;
 
@@ -47,4 +49,20 @@ public class NamespaceHandlerDictionary 
     public String getNamespaceURI() {
         return namespaceURI;
     }
+
+    @Override
+    public StanzaHandler get(Stanza stanza) {
+        String namespace;
+        if(stanza.getVerifier().subElementsPresentExact(1)) {
+            namespace = stanza.getFirstInnerElement().getNamespaceURI();
+        } else {
+            namespace = stanza.getNamespaceURI();
+        }
+        
+        if(namespace != null && namespace.equals(namespaceURI)) {
+            return super.get(stanza);
+        } else {
+            return null;
+        }
+    }
 }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/NamespaceURIs.java Mon Jan  3 23:06:37 2011
@@ -70,6 +70,8 @@ public class NamespaceURIs {
     
     public static final String URN_XMPP_XBOSH = "urn:xmpp:xbosh";
 
+    public static final String URN_XMPP_FEATURES_DIALBACK = "urn:xmpp:features:dialback";
+
     public static final String VCARD_TEMP = "vcard-temp";
 
     public static final String XEP0030_SERVICE_DISCOVERY_ITEMS = "http://jabber.org/protocol/disco#items";

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=1054817&r1=1054816&r2=1054817&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 Mon Jan  3 23:06:37 2011
@@ -35,7 +35,11 @@ import org.apache.vysper.xmpp.protocol.w
 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.response.ServerErrorResponses;
 import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
+import org.apache.vysper.xmpp.stanza.StanzaErrorType;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
 import org.apache.vysper.xmpp.writer.DenseStanzaLogRenderer;
 import org.slf4j.Logger;
@@ -109,39 +113,79 @@ public class ProtocolWorker implements S
             }
         }
 
-        // make sure that 'from' (if present) matches the bare authorized entity
-        // else repond with a stanza error 'unknown-sender'
-        // see rfc3920_draft-saintandre-rfc3920bis-04.txt#8.5.4
         Entity from = stanza.getFrom();
-        if (from != null && sessionContext.getInitiatingEntity() != null) {
-            Entity fromBare = from.getBareJID();
-            Entity initiatingEntity = sessionContext.getInitiatingEntity();
-            if (!initiatingEntity.equals(fromBare)) {
-                responseWriter.handleWrongFromJID(sessionContext, stanza);
-                return;
+        if(sessionContext.isServerToServer()) {
+            XMPPCoreStanza coreStanza = XMPPCoreStanza.getWrapper(stanza);
+            
+            if(coreStanza != null) {
+                // stanza must come from the origin server
+                if(from == null) {
+                    Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
+                            coreStanza, StanzaErrorType.MODIFY, "Missing from attribute", null, null);
+                    ResponseWriter.writeResponse(sessionContext, errorStanza);
+                    return;
+                } else if(!from.getDomain().equals(sessionContext.getInitiatingEntity().getDomain())) {
+                    // make sure the from attribute refers to the correct remote server
+                    
+                        Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.UNKNOWN_SENDER,
+                                coreStanza, StanzaErrorType.MODIFY, "Incorrect from attribute", null, null);
+                        ResponseWriter.writeResponse(sessionContext, errorStanza); 
+                        return;
+                }
+                
+                Entity to = stanza.getTo();
+                if(to == null) {
+                    // TODO what's the appropriate error? StreamErrorCondition.IMPROPER_ADDRESSING?
+                    Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
+                            coreStanza, StanzaErrorType.MODIFY, "Missing to attribute", null, null);
+                    ResponseWriter.writeResponse(sessionContext, errorStanza);
+                    return;                    
+                } else if(!to.getDomain().equals(serverRuntimeContext.getServerEnitity().getDomain())) {
+                    // TODO what's the appropriate error? StreamErrorCondition.IMPROPER_ADDRESSING?
+                    Stanza errorStanza = ServerErrorResponses.getInstance().getStanzaError(StanzaErrorCondition.BAD_REQUEST,
+                            coreStanza, StanzaErrorType.MODIFY, "Invalid to attribute", null, null);
+                    ResponseWriter.writeResponse(sessionContext, errorStanza);
+                    return;                    
+                    
+                }
+
+                // rewrite namespace
+                stanza = StanzaBuilder.rewriteNamespace(stanza, NamespaceURIs.JABBER_SERVER, NamespaceURIs.JABBER_CLIENT);
+            }                
+        } else {
+            // make sure that 'from' (if present) matches the bare authorized entity
+            // else respond with a stanza error 'unknown-sender'
+            // see rfc3920_draft-saintandre-rfc3920bis-04.txt#8.5.4
+            if (from != null && sessionContext.getInitiatingEntity() != null) {
+                Entity fromBare = from.getBareJID();
+                Entity initiatingEntity = sessionContext.getInitiatingEntity();
+                if (!initiatingEntity.equals(fromBare)) {
+                    responseWriter.handleWrongFromJID(sessionContext, stanza);
+                    return;
+                }
             }
-        }
-        // make sure that there is a bound resource entry for that from's resource id attribute!
-        if (from != null && from.getResource() != null) {
-            List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
-                    .getBoundResources(from, false);
-            if (boundResources.size() == 0) {
-                responseWriter.handleWrongFromJID(sessionContext, stanza);
-                return;
+            // make sure that there is a bound resource entry for that from's resource id attribute!
+            if (from != null && from.getResource() != null) {
+                List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
+                        .getBoundResources(from, false);
+                if (boundResources.size() == 0) {
+                    responseWriter.handleWrongFromJID(sessionContext, stanza);
+                    return;
+                }
             }
-        }
-        // make sure that there is a full from entity given in cases where more than one resource is bound
-        // in the same session.
-        // see rfc3920_draft-saintandre-rfc3920bis-04.txt#8.5.4
-        if (from != null && from.getResource() == null) {
-            List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
-                    .getResourcesForSession(sessionContext);
-            if (boundResources.size() > 1) {
-                responseWriter.handleWrongFromJID(sessionContext, stanza);
-                return;
+            // make sure that there is a full from entity given in cases where more than one resource is bound
+            // in the same session.
+            // see rfc3920_draft-saintandre-rfc3920bis-04.txt#8.5.4
+            if (from != null && from.getResource() == null) {
+                List<String> boundResources = sessionContext.getServerRuntimeContext().getResourceRegistry()
+                        .getResourcesForSession(sessionContext);
+                if (boundResources.size() > 1) {
+                    responseWriter.handleWrongFromJID(sessionContext, stanza);
+                    return;
+                }
             }
         }
-
+        
         try {
             stateAwareProtocolWorker.processStanza(sessionContext, sessionStateHolder, stanza, stanzaHandler);
         } catch (Exception e) {

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/StanzaHandlerLookup.java Mon Jan  3 23:06:37 2011
@@ -27,6 +27,8 @@ import org.apache.vysper.xmpp.modules.co
 import org.apache.vysper.xmpp.modules.core.base.handler.StreamStartHandler;
 import org.apache.vysper.xmpp.modules.core.base.handler.XMLPrologHandler;
 import org.apache.vysper.xmpp.modules.core.im.handler.PresenceHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbResultHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerifyHandler;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
@@ -66,31 +68,33 @@ public class StanzaHandlerLookup extends
         if (stanza == null)
             return null;
 
-        String name = stanza.getName();
-        if ("xml".equals(name))
-            return new XMLPrologHandler();
-        else if ("stream".equals(name))
-            return new StreamStartHandler();
-        else if (iqHandler.verify(stanza))
-            return getIQHandler(stanza);
-        else if (messageHandler.verify(stanza))
-            return getMessageHandler(stanza);
-        else if (presenceHandler.verify(stanza))
-            return getPresenceHandler(stanza);
-        else {
-            // this is not a core stanza (RFC3920), but something like the following
-            // (in descending-probability order):
-            // a. a custom extension of iq, message, presence
-            // b. some handshake stanza other than iq, message, presence
-            // c. an arbitrary test stanza
-            // d. an evil forged stanza
-            // e. some extension we don't know yet
-            // ...so we delegate:
-            StanzaHandler stanzaHandler = getHandlerForElement(stanza, stanza);
-            // ... and if we could not resolve and it's a core stanza, we can safely return an error
-            if (stanzaHandler == null && XMPPCoreStanza.getWrapper(stanza) != null)
-                return SERVICE_UNAVAILABLE_STANZA_ERROR_HANDLER;
+        // allow extensions to override default handling
+        StanzaHandler stanzaHandler = getHandlerForElement(stanza, stanza);
+        
+        if(stanzaHandler != null) {
             return stanzaHandler;
+        } else {
+            String name = stanza.getName();
+    
+            if ("xml".equals(name)) {
+                return new XMLPrologHandler();
+            } else if ("stream".equals(name)) {
+                return new StreamStartHandler();
+            } else if ("verify".equals(name)) {
+                return new DbVerifyHandler();
+            } else if ("result".equals(name)) {
+                return new DbResultHandler();
+            } else if (iqHandler.verify(stanza)) {
+                return getIQHandler(stanza);
+            } else if (messageHandler.verify(stanza)) {
+                return getMessageHandler(stanza);
+            } else if (presenceHandler.verify(stanza)) {
+                return getPresenceHandler(stanza);
+            } else {
+                // ... and if we could not resolve and it's a core stanza, we can safely return an error
+                if (XMPPCoreStanza.getWrapper(stanza) != null) return SERVICE_UNAVAILABLE_STANZA_ERROR_HANDLER;
+                else return null;
+            }
         }
     }
 

Propchange: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 23:06:37 2011
@@ -0,0 +1 @@
+/mina/vysper/branches/s2s/server/core/src/main/java/org/apache/vysper/xmpp/protocol/exception/AuthorizationFailedException.java:1050957-1054813

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/EncryptedProtocolWorker.java Mon Jan  3 23:06:37 2011
@@ -22,6 +22,8 @@ package org.apache.vysper.xmpp.protocol.
 import org.apache.vysper.xmpp.modules.core.base.handler.StreamStartHandler;
 import org.apache.vysper.xmpp.modules.core.base.handler.XMLPrologHandler;
 import org.apache.vysper.xmpp.modules.core.sasl.handler.AbstractSASLHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbResultHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerifyHandler;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
@@ -43,12 +45,17 @@ public class EncryptedProtocolWorker ext
     @Override
     protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
             StanzaHandler stanzaHandler) {
+        
         if (stanzaHandler instanceof StreamStartHandler)
             return true;
         if (stanzaHandler instanceof AbstractSASLHandler)
             return true;
         if (stanzaHandler instanceof XMLPrologHandler)
             return true; // PSI client sends that. 
+        if (sessionContext.isServerToServer() && stanzaHandler instanceof DbResultHandler)
+            return true;
+        if (sessionContext.isServerToServer() && stanzaHandler instanceof DbVerifyHandler)
+            return true;
         ResponseWriter.writeUnsupportedStanzaError(sessionContext);
         return false;
     }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/protocol/worker/StartedProtocolWorker.java Mon Jan  3 23:06:37 2011
@@ -20,6 +20,8 @@
 package org.apache.vysper.xmpp.protocol.worker;
 
 import org.apache.vysper.xmpp.modules.core.starttls.handler.StartTLSHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbResultHandler;
+import org.apache.vysper.xmpp.modules.extension.xep0220_server_dailback.DbVerifyHandler;
 import org.apache.vysper.xmpp.protocol.ResponseWriter;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
@@ -41,8 +43,13 @@ public class StartedProtocolWorker exten
     @Override
     protected boolean checkState(SessionContext sessionContext, SessionStateHolder sessionStateHolder, Stanza stanza,
             StanzaHandler stanzaHandler) {
+
         if (stanzaHandler instanceof StartTLSHandler)
             return true;
+        if (sessionContext.isServerToServer() && stanzaHandler instanceof DbVerifyHandler)
+            return true;
+        if (sessionContext.isServerToServer() && stanzaHandler instanceof DbResultHandler)
+            return true;
         ResponseWriter.writeUnsupportedStanzaError(sessionContext);
         return false;
     }

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=1054817&r1=1054816&r2=1054817&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 Mon Jan  3 23:06:37 2011
@@ -116,6 +116,11 @@ public abstract class AbstractSessionCon
         return sessionId;
     }
 
+    public void setSessionId(String sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    
     public String getXMLLang() {
         return xmlLang;
     }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java Mon Jan  3 23:06:37 2011
@@ -20,6 +20,8 @@
 
 package org.apache.vysper.xmpp.server;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -38,13 +40,14 @@ import org.apache.vysper.xmpp.modules.Mo
 import org.apache.vysper.xmpp.modules.ModuleRegistry;
 import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
-import org.apache.vysper.xmpp.protocol.NamespaceHandlerDictionary;
 import org.apache.vysper.xmpp.protocol.ProtocolWorker;
 import org.apache.vysper.xmpp.protocol.QueuedStanzaProcessor;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaHandlerLookup;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.components.Component;
+import org.apache.vysper.xmpp.server.s2s.DefaultXMPPServerConnectorRegistry;
+import org.apache.vysper.xmpp.server.s2s.XMPPServerConnectorRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.state.presence.LatestPresenceCache;
 import org.apache.vysper.xmpp.state.presence.SimplePresenceCache;
@@ -111,6 +114,8 @@ public class DefaultServerRuntimeContext
      */
     private LatestPresenceCache presenceCache = new SimplePresenceCache();
 
+    private XMPPServerConnectorRegistry serverConnectorRegistry = new DefaultXMPPServerConnectorRegistry(this);
+    
     /**
      * holds the storage services
      */
@@ -121,6 +126,8 @@ public class DefaultServerRuntimeContext
      */
     final private Map<String, ServerRuntimeContextService> serverRuntimeContextServiceMap = new HashMap<String, ServerRuntimeContextService>();
 
+    private List<Module> modules = new ArrayList<Module>();
+    
     /**
      * map of all registered components, index by the subdomain they are registered for
      */
@@ -140,7 +147,7 @@ public class DefaultServerRuntimeContext
     }
 
     public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay stanzaRelay, ServerFeatures serverFeatures,
-            List<NamespaceHandlerDictionary> dictionaries, ResourceRegistry resourceRegistry) {
+            List<HandlerDictionary> dictionaries, ResourceRegistry resourceRegistry) {
         this(serverEntity, stanzaRelay);
         this.serverFeatures = serverFeatures;
         this.resourceRegistry = resourceRegistry;
@@ -186,12 +193,16 @@ public class DefaultServerRuntimeContext
         return serverFeatures;
     }
 
-    public void addDictionary(NamespaceHandlerDictionary namespaceHandlerDictionary) {
+    public XMPPServerConnectorRegistry getServerConnectorRegistry() {
+        return serverConnectorRegistry;
+    }
+
+    public void addDictionary(HandlerDictionary namespaceHandlerDictionary) {
         stanzaHandlerLookup.addDictionary(namespaceHandlerDictionary);
     }
 
-    protected void addDictionaries(List<NamespaceHandlerDictionary> dictionaries) {
-        for (NamespaceHandlerDictionary dictionary : dictionaries) {
+    protected void addDictionaries(List<HandlerDictionary> dictionaries) {
+        for (HandlerDictionary dictionary : dictionaries) {
             addDictionary(dictionary);
         }
     }
@@ -321,12 +332,7 @@ public class DefaultServerRuntimeContext
         if (handlerDictionaryList != null) {
 
             for (HandlerDictionary handlerDictionary : handlerDictionaryList) {
-                if (handlerDictionary instanceof NamespaceHandlerDictionary) {
-                    addDictionary((NamespaceHandlerDictionary) handlerDictionary);
-                } else {
-                    throw new RuntimeException("arbitrary HandlerDictionary implementations not supported yet, "
-                            + "only NamespaceHandlerDictionary.");
-                }
+                addDictionary(handlerDictionary);
             }
 
         }
@@ -334,8 +340,21 @@ public class DefaultServerRuntimeContext
         if (module instanceof Component) {
             registerComponent((Component) module);
         }
+        
+        modules.add(module);
+    }
+    
+    public List<Module> getModules() {
+        return Collections.unmodifiableList(modules);
     }
 
+    public <T> T getModule(Class<T> clazz) {
+        for(Module module : modules) {
+            if(module.getClass().equals(clazz)) return (T) module;
+        }
+        return null;
+    }
+    
     public void registerComponent(Component component) {
         componentMap.put(component.getSubdomain(), component);
     }
@@ -353,4 +372,5 @@ public class DefaultServerRuntimeContext
         return component.getStanzaProcessor();
     }
 
+
 }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerFeatures.java Mon Jan  3 23:06:37 2011
@@ -49,7 +49,7 @@ public class ServerFeatures {
     /**
      * flag indicating whether stanzas are sent to remote servers or not
      */
-    private boolean relayToFederationServers = false;
+    private boolean relayToFederationServers = true;
 
     /**
      * counter, how many times a session can try authentication before session is terminated

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java Mon Jan  3 23:06:37 2011
@@ -20,16 +20,20 @@
 
 package org.apache.vysper.xmpp.server;
 
+import java.util.List;
+
 import javax.net.ssl.SSLContext;
 
 import org.apache.vysper.storage.StorageProvider;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.authorization.UserAuthorization;
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
+import org.apache.vysper.xmpp.modules.Module;
 import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.components.Component;
+import org.apache.vysper.xmpp.server.s2s.XMPPServerConnectorRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.state.presence.LatestPresenceCache;
 import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
@@ -71,4 +75,10 @@ public interface ServerRuntimeContext {
     void registerComponent(Component component);
 
     StanzaProcessor getComponentStanzaProcessor(Entity entity);
+    
+    XMPPServerConnectorRegistry getServerConnectorRegistry();
+    
+    List<Module> getModules();
+
+    <T> T getModule(Class<T> clazz);
 }

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=1054817&r1=1054816&r2=1054817&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 Mon Jan  3 23:06: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 {
+public interface SessionContext extends StanzaWriter {
 
     static final String SESSION_ATTRIBUTE_MESSAGE_STANZA_NO_RECEIVE = "stanza.message.no_receive";
 
@@ -77,12 +77,12 @@ public interface SessionContext {
     boolean isRemotelyInitiatedSession();
 
     /**
-     * @return the initiating {@link Entity}
+     * @return the initiating {@link Entity}. For c2s, this is the client {@link Entity}. For s2s, this is the server {@link Entity}
      */
     Entity getInitiatingEntity();
 
     /**
-     * Sets the initiating entity.
+     * Sets the initiating entity. For c2s, this is the client {@link Entity}. For s2s, this is the server {@link Entity}
      *
      * @param entity
      */
@@ -150,7 +150,7 @@ public interface SessionContext {
     /**
      * signals the underlying transport to handle TLS handshake
      */
-    void switchToTLS();
+    void switchToTLS(boolean delayed, boolean clientTls);
 
     /**
      * this method signals that from now on a new <stream:stream>... xml stream

Modified: 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/xmpp/server/XMPPServer.java?rev=1054817&r1=1054816&r2=1054817&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/xmpp/server/XMPPServer.java Mon Jan  3 23:06:37 2011
@@ -32,15 +32,15 @@ import org.apache.vysper.xmpp.authorizat
 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.cryptography.InputStreamBasedTLSContextFactory;
 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.delivery.inbound.DeliveringInternalInboundStanzaRelay;
+import org.apache.vysper.xmpp.delivery.inbound.DeliveringExternalInboundStanzaRelay;
 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.protocol.HandlerDictionary;
 import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
 
 /**
@@ -72,6 +72,7 @@ public class XMPPServer {
     private String tlsCertificatePassword;
 
     private final List<Endpoint> endpoints = new ArrayList<Endpoint>();
+    
 
     public XMPPServer(String domain) {
         this.serverDomain = domain;
@@ -109,7 +110,7 @@ public class XMPPServer {
         tlsContextFactory.setPassword(tlsCertificatePassword);
         tlsContextFactory.setTrustManagerFactory(bogusTrustManagerFactory);
 
-        List<NamespaceHandlerDictionary> dictionaries = new ArrayList<NamespaceHandlerDictionary>();
+        List<HandlerDictionary> dictionaries = new ArrayList<HandlerDictionary>();
         addCoreDictionaries(dictionaries);
 
         ResourceRegistry resourceRegistry = new ResourceRegistry();
@@ -118,9 +119,9 @@ public class XMPPServer {
 
         AccountManagement accountManagement = (AccountManagement) storageProviderRegistry
                 .retrieve(AccountManagement.class);
-        DeliveringInboundStanzaRelay internalStanzaRelay = new DeliveringInboundStanzaRelay(serverEntity,
+        DeliveringInternalInboundStanzaRelay internalStanzaRelay = new DeliveringInternalInboundStanzaRelay(serverEntity,
                 resourceRegistry, accountManagement);
-        RecordingStanzaRelay externalStanzaRelay = new RecordingStanzaRelay();
+        DeliveringExternalInboundStanzaRelay externalStanzaRelay = new DeliveringExternalInboundStanzaRelay();
 
         StanzaRelayBroker stanzaRelayBroker = new StanzaRelayBroker();
         stanzaRelayBroker.setInternalRelay(internalStanzaRelay);
@@ -139,6 +140,7 @@ public class XMPPServer {
 
         stanzaRelayBroker.setServerRuntimeContext(serverRuntimeContext);
         internalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
+        externalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
 
         if (endpoints.size() == 0)
             throw new IllegalStateException("server must have at least one endpoint");
@@ -152,13 +154,15 @@ public class XMPPServer {
         for (Endpoint endpoint : endpoints) {
             endpoint.stop();
         }
+        
+        serverRuntimeContext.getServerConnectorRegistry().close();
     }
 
     public void addModule(Module module) {
         serverRuntimeContext.addModule(module);
     }
 
-    private void addCoreDictionaries(List<NamespaceHandlerDictionary> dictionaries) {
+    private void addCoreDictionaries(List<HandlerDictionary> 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());
@@ -166,4 +170,8 @@ public class XMPPServer {
         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 ServerRuntimeContext getServerRuntimeContext() {
+        return serverRuntimeContext;
+    }
 }

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaHandlerLookup.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaHandlerLookup.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaHandlerLookup.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ComponentStanzaHandlerLookup.java Mon Jan  3 23:06:37 2011
@@ -20,7 +20,7 @@
 package org.apache.vysper.xmpp.server.components;
 
 import org.apache.vysper.xml.fragment.XMLElement;
-import org.apache.vysper.xmpp.protocol.AbstractHandlerDictionary;
+import org.apache.vysper.xmpp.protocol.DefaultHandlerDictionary;
 import org.apache.vysper.xmpp.protocol.AbstractStanzaHandlerLookup;
 import org.apache.vysper.xmpp.protocol.StanzaHandler;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -30,7 +30,7 @@ import org.apache.vysper.xmpp.stanza.Sta
  */
 public class ComponentStanzaHandlerLookup extends AbstractStanzaHandlerLookup {
 
-    private static class ComponentHandlerDictionary extends AbstractHandlerDictionary {
+    private static class ComponentHandlerDictionary extends DefaultHandlerDictionary {
 
         public ComponentHandlerDictionary() {
             super();

Modified: mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java?rev=1054817&r1=1054816&r2=1054817&view=diff
==============================================================================
--- mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java (original)
+++ mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/response/ServerResponses.java Mon Jan  3 23:06:37 2011
@@ -41,7 +41,7 @@ public class ServerResponses {
         return getStreamOpener(forClient, from, null, version, errorStanza).build();
     }
 
-    public Stanza getStreamOpener(boolean forClient, Entity from, XMPPVersion version, SessionContext sessionContext) {
+    public Stanza getStreamOpenerForClient(Entity from, XMPPVersion version, SessionContext sessionContext) {
         Stanza innerFeatureStanza;
         if (sessionContext.getState() == SessionState.INITIATED)
             innerFeatureStanza = getFeaturesForEncryption(sessionContext);
@@ -55,12 +55,47 @@ public class ServerResponses {
             throw new IllegalStateException("unsupported state for responding with stream opener");
         }
 
-        StanzaBuilder stanzaBuilder = getStreamOpener(forClient, from, sessionContext.getXMLLang(), version,
+        StanzaBuilder stanzaBuilder = getStreamOpener(true, from, sessionContext.getXMLLang(), version,
                 sessionContext.getSessionId(), innerFeatureStanza);
 
         return stanzaBuilder.build();
     }
 
+    public Stanza getStreamOpenerForServerAcceptor(Entity from, XMPPVersion version, SessionContext sessionContext, boolean tlsConfigured) {
+        
+        Stanza features = null;
+        
+        // only include <features> if the other server support version 1.0
+        if(XMPPVersion.VERSION_1_0.equals(version)) {
+            StanzaBuilder featureBuilder = startFeatureStanza();
+            if (sessionContext.getState() == SessionState.INITIATED) {
+                featureBuilder.startInnerElement("starttls", NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_TLS).endInnerElement();
+                featureBuilder.startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement();
+                
+            } else if (sessionContext.getState() == SessionState.ENCRYPTED) {
+                featureBuilder.startInnerElement("dialback", NamespaceURIs.URN_XMPP_FEATURES_DIALBACK).endInnerElement();
+            } else {
+                throw new IllegalStateException("unsupported state for responding with stream opener");
+            }
+            features = featureBuilder.build();
+        }
+        
+        StanzaBuilder stanzaBuilder = getStreamOpener(false, from, sessionContext.getXMLLang(), version,
+                sessionContext.getSessionId(), features);
+
+        stanzaBuilder.declareNamespace("db", NamespaceURIs.JABBER_SERVER_DIALBACK);
+        return stanzaBuilder.build();
+    }
+
+    public Stanza getStreamOpenerForServerConnector(Entity from, Entity to, XMPPVersion version, SessionContext sessionContext) {
+        StanzaBuilder stanzaBuilder = getStreamOpener(false, from, sessionContext.getXMLLang(), version,
+                null, null);
+        stanzaBuilder.addAttribute("to", to.getDomain());
+        stanzaBuilder.declareNamespace("db", NamespaceURIs.JABBER_SERVER_DIALBACK);
+        return stanzaBuilder.build();
+    }
+
+    
     public StanzaBuilder getStreamOpener(boolean forClient, Entity from, String xmlLang, XMPPVersion version,
             Stanza innerStanza) {
         return getStreamOpener(forClient, from, xmlLang, version, null, innerStanza);
@@ -75,7 +110,7 @@ public class ServerResponses {
             stanzaBuilder.addAttribute(NamespaceURIs.XML, "lang", xmlLang);
         if (version != null)
             stanzaBuilder.addAttribute("version", version.toString());
-        if (forClient && sessionId != null)
+        if (sessionId != null)
             stanzaBuilder.addAttribute("id", sessionId);
         if (innerStanza != null)
             stanzaBuilder.addPreparedElement(innerStanza);