You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by be...@apache.org on 2008/05/23 08:36:33 UTC

svn commit: r659449 - in /labs/vysper/src: main/java/org/apache/vysper/xmpp/delivery/ main/java/org/apache/vysper/xmpp/delivery/failure/ main/java/org/apache/vysper/xmpp/modules/core/base/handler/ test/java/org/apache/vysper/xmpp/modules/core/base/hand...

Author: berndf
Date: Thu May 22 23:36:28 2008
New Revision: 659449

URL: http://svn.apache.org/viewvc?rev=659449&view=rev
Log:
[vysper] use of failure strategy in delivery, extend message handler tests

Added:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverQueue.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java
Modified:
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveringStanzaRelay.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveryFailureStrategy.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/MasterStanzaRelay.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/IgnoreFailureStrategy.java
    labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolStateTestCase.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerAquireTestCase.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
    labs/vysper/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveringStanzaRelay.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveringStanzaRelay.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveringStanzaRelay.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveringStanzaRelay.java Thu May 22 23:36:28 2008
@@ -78,6 +78,26 @@
         }
 
         public RelayResult call() {
+            RelayResult relayResult = deliver();
+            if (relayResult == null || relayResult.isRelayed()) return relayResult;
+            return runFailureStrategy(relayResult);
+        }
+
+        private RelayResult runFailureStrategy(RelayResult relayResult) {
+            if (deliveryFailureStrategy != null) {
+                try {
+                    deliveryFailureStrategy.process(stanza, null, relayResult.getProcessingError());
+                } catch (DeliveryException e) {
+                    return new RelayResult(e);
+                } catch (RuntimeException e) {
+                    return new RelayResult(new DeliveryException(e));
+                }
+            }
+            // TODO throw relayResult.getProcessingError() in some appropriate context
+            return relayResult;
+        }
+
+        protected RelayResult deliver() {
             try {
                 List<SessionContext> receivingSessions = resourceRegistry.getSessions(receiver);
                 if (receivingSessions == null || receivingSessions.size() == 0) {
@@ -89,22 +109,23 @@
                     try {
                         stanzaWriter = sessionContext.getResponseWriter();
                     } catch (Exception e) {
-                        return new RelayResult(e);
+                        // TODO do not break out here. we should try to deliver to the others first!
+                        return new RelayResult(new DeliveryException(e));
                     }
                     stanzaWriter.write(stanza);
                 }
             } catch (RuntimeException e) {
-                return new RelayResult(e);
+                return new RelayResult(new DeliveryException(e));
             }
             return new RelayResult();
         }
     }
        
     private class RelayResult {
-        private Throwable processingError;
+        private DeliveryException processingError;
         private boolean relayed;
 
-        public RelayResult(Throwable processingError) {
+        public RelayResult(DeliveryException processingError) {
             this.processingError = processingError;
             this.relayed = false;
         }
@@ -113,7 +134,7 @@
             this.relayed = true;
         }
 
-        public Throwable getProcessingError() {
+        public DeliveryException getProcessingError() {
             return processingError;
         }
 

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveryFailureStrategy.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveryFailureStrategy.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveryFailureStrategy.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/DeliveryFailureStrategy.java Thu May 22 23:36:28 2008
@@ -29,6 +29,6 @@
  */
 public interface DeliveryFailureStrategy {
  
-    public void process(Stanza failedToDeliverStanza, ServerRuntimeContext serverRuntimeContext, DeliveryException deliveryException);
+    public void process(Stanza failedToDeliverStanza, ServerRuntimeContext serverRuntimeContext, DeliveryException deliveryException) throws DeliveryException;
     
 }

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/MasterStanzaRelay.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/MasterStanzaRelay.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/MasterStanzaRelay.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/MasterStanzaRelay.java Thu May 22 23:36:28 2008
@@ -59,10 +59,10 @@
         boolean relayToExternal = serverRuntimeContext.getServerFeatures().isRelayingToFederationServers();
 
         if (domain.equals(serverRuntimeContext.getServerEnitity().getDomain())) {
-            internalRelay.relay(receiver, stanza, new IgnoreFailureStrategy());
+            internalRelay.relay(receiver, stanza, deliveryFailureStrategy);
         } else {
             if (!relayToExternal) throw new IllegalStateException("this server is not relaying to external currently");
-            externalRelay.relay(receiver, stanza, new IgnoreFailureStrategy());
+            externalRelay.relay(receiver, stanza, deliveryFailureStrategy);
         }
     }
 

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/RecordingStanzaRelay.java Thu May 22 23:36:28 2008
@@ -23,20 +23,21 @@
 import java.util.Iterator;
 
 /**
- * a relay which simply records the sequence of entity/stanza pairs received
+ * a relay which does not relay anything but simply records the sequence of entity/stanza pairs received
  * and makes it accessible for debugging or testing purposes
+ * for a little bit more advanced testing relay see StanzaReceiverRelay
  */
 public class RecordingStanzaRelay implements StanzaRelay {
     
-    private final ArrayList<Pair> entityStanzaPairs = new ArrayList<Pair>();
+    private final ArrayList<Triple> entityStanzaPairs = new ArrayList<Triple>();
     private boolean acceptingMode = true;
 
     public void relay(Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy) throws DeliveryException {
         if (!acceptingMode) return;
-        entityStanzaPairs.add(new Pair(receiver, stanza));
+        entityStanzaPairs.add(new Triple(receiver, stanza, deliveryFailureStrategy));
     }
 
-    public Iterator<Pair> iterator() {
+    public Iterator<Triple> iterator() {
         return entityStanzaPairs.iterator();
     }
 
@@ -52,13 +53,15 @@
         this.acceptingMode = accepting;
     }
 
-    public class Pair {
+    public class Triple {
         private Entity entity;
         private Stanza stanza;
+        private DeliveryFailureStrategy deliveryFailureStrategy;
 
-        Pair(Entity entity, Stanza stanza) {
+        Triple(Entity entity, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy) {
             this.entity = entity;
             this.stanza = stanza;
+            this.deliveryFailureStrategy = deliveryFailureStrategy;
         }
 
         public Entity getEntity() {
@@ -68,5 +71,9 @@
         public Stanza getStanza() {
             return stanza;
         }
+
+        public DeliveryFailureStrategy getDeliveryFailureStrategy() {
+            return deliveryFailureStrategy;
+        }
     }
 }

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverQueue.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverQueue.java?rev=659449&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverQueue.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverQueue.java Thu May 22 23:36:28 2008
@@ -0,0 +1,37 @@
+/***********************************************************************
+ * Copyright (c) 2006-2007 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.delivery;
+
+import org.apache.vysper.xmpp.stanza.Stanza;
+
+import java.util.Queue;
+import java.util.LinkedList;
+
+/**
+ */
+public class StanzaReceiverQueue implements StanzaReceiver {
+    
+    Queue<Stanza> queue = new LinkedList<Stanza>(); 
+    
+    public void deliver(Stanza stanza) {
+        queue.add(stanza);
+    }
+    
+    public Stanza getNext() {
+        return queue.poll();
+    }
+}

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/StanzaReceiverRelay.java Thu May 22 23:36:28 2008
@@ -19,16 +19,24 @@
 
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 
 import java.util.Map;
 import java.util.HashMap;
 
 /**
- * relays stanzas to a StanzaReceiver identified by a Entity
+ * relays stanzas to a StanzaReceiver identified by an Entity
+ * this relay is mostly for testing purposes
  */
 public class StanzaReceiverRelay implements StanzaRelay {
 
     private Map<Entity, StanzaReceiver> receiverMap = new HashMap<Entity, StanzaReceiver>();
+    private boolean exploitFailureStrategy = true;
+    private ServerRuntimeContext serverRuntimeContext = null;
+
+    public void setServerRuntimeContext(ServerRuntimeContext serverRuntimeContext) {
+        this.serverRuntimeContext = serverRuntimeContext;
+    }
 
     public void add(Entity receiverID, StanzaReceiver receiver) {
         receiverMap.put(receiverID, receiver);
@@ -36,7 +44,15 @@
 
     public void relay(Entity receiver, Stanza stanza, DeliveryFailureStrategy deliveryFailureStrategy) throws DeliveryException {
         if (receiver == null) throw new DeliveryException("receiver cannot be NULL");
-        if (receiverMap.get(receiver) == null) throw new DeliveryException("cannot find receiver" + receiver.getFullQualifiedName());
+        if (receiverMap.get(receiver) == null) {
+
+            if (deliveryFailureStrategy != null && exploitFailureStrategy) {
+                deliveryFailureStrategy.process(stanza, serverRuntimeContext, null);
+            }
+
+            throw new LocalRecipientNotReachableException("cannot find receiver" + receiver.getFullQualifiedName());
+        }
+        
         receiverMap.get(receiver).deliver(stanza);
     }
 

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/IgnoreFailureStrategy.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/IgnoreFailureStrategy.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/IgnoreFailureStrategy.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/IgnoreFailureStrategy.java Thu May 22 23:36:28 2008
@@ -26,6 +26,8 @@
  */
 public class IgnoreFailureStrategy implements DeliveryFailureStrategy {
 
+    public final static IgnoreFailureStrategy IGNORE_FAILURE_STRATEGY = new IgnoreFailureStrategy();
+    
     public void process(Stanza failedToDeliverStanza, ServerRuntimeContext serverRuntimeContext, DeliveryException deliveryException) {
         // do nothing                                                                                           
     }

Added: labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java?rev=659449&view=auto
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java (added)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/delivery/failure/ReturnErrorToSenderFailureStrategy.java Thu May 22 23:36:28 2008
@@ -0,0 +1,59 @@
+/***********************************************************************
+ * Copyright (c) 2006-2007 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.delivery.failure;
+
+import org.apache.vysper.xmpp.delivery.DeliveryFailureStrategy;
+import org.apache.vysper.xmpp.delivery.DeliveryException;
+import org.apache.vysper.xmpp.delivery.LocalRecipientNotReachableException;
+import org.apache.vysper.xmpp.stanza.*;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.response.ServerErrorResponses;
+import org.apache.vysper.xmpp.addressing.Entity;
+
+/**
+ */
+public class ReturnErrorToSenderFailureStrategy implements DeliveryFailureStrategy {
+
+    public void process(Stanza failedToDeliverStanza, ServerRuntimeContext serverRuntimeContext, DeliveryException deliveryException) throws DeliveryException {
+
+        StanzaErrorCondition stanzaErrorCondition = StanzaErrorCondition.SERVICE_UNAVAILABLE;
+        StanzaErrorType errorType = StanzaErrorType.CANCEL;
+
+        if (!(failedToDeliverStanza instanceof XMPPCoreStanza)) {
+            throw new DeliveryException("could not return to sender");
+        }
+        XMPPCoreStanza failedCoreStanza = (XMPPCoreStanza) failedToDeliverStanza;
+        if (failedCoreStanza.getType() != null && failedCoreStanza.getType().equals("error")) {
+            return; // do not answer these
+        }
+        
+        if (deliveryException != null) {
+            if (deliveryException instanceof LocalRecipientNotReachableException) {
+                stanzaErrorCondition = StanzaErrorCondition.RECIPIENT_UNAVAILABLE;
+                if (failedCoreStanza instanceof MessageStanza) {
+                    // RFC3921bis#8.1
+                    stanzaErrorCondition = StanzaErrorCondition.SERVICE_UNAVAILABLE; 
+                }
+            }
+        }
+        
+        Entity from = failedCoreStanza.getFrom();
+
+        Stanza error = ServerErrorResponses.getInstance().getStanzaError(stanzaErrorCondition, failedCoreStanza, errorType, "stanza could not be delivered", "en", null);
+        serverRuntimeContext.getStanzaRelay().relay(from, error, IgnoreFailureStrategy.IGNORE_FAILURE_STRATEGY);
+    }
+}

Modified: labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java (original)
+++ labs/vysper/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java Thu May 22 23:36:28 2008
@@ -20,6 +20,7 @@
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
+import org.apache.vysper.xmpp.delivery.failure.ReturnErrorToSenderFailureStrategy;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.stanza.MessageStanza;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -79,7 +80,7 @@
         
         StanzaRelay stanzaRelay = sessionContext.getServerRuntimeContext().getStanzaRelay();
         try {
-            stanzaRelay.relay(to, stanza, new IgnoreFailureStrategy());
+            stanzaRelay.relay(to, stanza, new ReturnErrorToSenderFailureStrategy());
         } catch (Exception e) {
             // TODO return error stanza
             e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java Thu May 22 23:36:28 2008
@@ -19,13 +19,16 @@
 
 import junit.framework.TestCase;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
-import org.apache.vysper.xmpp.delivery.RecordingStanzaRelay;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityFormatException;
+import org.apache.vysper.xmpp.delivery.*;
 import org.apache.vysper.xmpp.protocol.NamespaceURIs;
 import org.apache.vysper.xmpp.protocol.ResponseStanzaContainer;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.server.TestSessionContext;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
 import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
 
 /**
@@ -34,14 +37,16 @@
     private TestSessionContext sessionContext;
 
     private SessionStateHolder sessionStateHolder = new SessionStateHolder();
+    private MessageHandler messageHandler = new MessageHandler();
 
     protected void setUp() throws Exception {
         super.setUp();
-        sessionContext = new TestSessionContext(sessionStateHolder);
+        sessionContext = TestSessionContext.createWithStanzaReceiverRelay(sessionStateHolder);
     }
 
     public void testStanzaRelayed() {
-
+        sessionContext = new TestSessionContext(sessionStateHolder);
+        
         String timestamp = "" + System.currentTimeMillis();
 
         StanzaBuilder stanzaBuilder = new StanzaBuilder("message", NamespaceURIs.JABBER_SERVER);
@@ -49,22 +54,20 @@
         stanzaBuilder.addAttribute("to", receiver);
         stanzaBuilder.startInnerElement("timestamp").addAttribute("value", timestamp).endInnerElement();
 
-        TestSessionContext sessionContext = this.sessionContext;
         sessionContext.setServerToServer();
         
         RecordingStanzaRelay stanzaRelay = (RecordingStanzaRelay) sessionContext.getServerRuntimeContext().getStanzaRelay();
-        assertFalse(stanzaRelay.iterator().hasNext());
+        assertFalse(stanzaRelay.iterator().hasNext()); // nothing there yet
 
-        MessageHandler messageHandler = new MessageHandler();
         Stanza stanza = stanzaBuilder.getFinalStanza();
         ResponseStanzaContainer responseStanzaContainer = messageHandler.execute(stanza, sessionContext, null);
 
-        RecordingStanzaRelay.Pair pair = stanzaRelay.iterator().next();
-        XMLElementVerifier timestampVerifier = pair.getStanza().getFirstInnerElement().getVerifier();
+        RecordingStanzaRelay.Triple triple = stanzaRelay.iterator().next();
+        XMLElementVerifier timestampVerifier = triple.getStanza().getFirstInnerElement().getVerifier();
         
-        assertTrue("stanza relayed to", pair.getStanza().getVerifier().toAttributeEquals(receiver));
+        assertTrue("stanza relayed to", triple.getStanza().getVerifier().toAttributeEquals(receiver));
         assertTrue("stanza relayed inner", timestampVerifier.attributeEquals("value", timestamp));
-        assertEquals("stanza relayed to correct receiver", new EntityImpl("test", "example.com", null), pair.getEntity());
+        assertEquals("stanza relayed to correct receiver", new EntityImpl("test", "example.com", null), triple.getEntity());
 
         // clean and do not accept follow-up relays
         stanzaRelay.reset();
@@ -75,4 +78,29 @@
        
     }
 
+    public void testStanzaReceiverUnavailable() throws EntityFormatException, DeliveryException {
+        Entity sender = EntityImpl.parse("from@example.com");
+        Entity receiver = EntityImpl.parse("to_exist@example.com");
+        Entity noReceiver = EntityImpl.parse("to_unavail@example.com");
+
+        StanzaReceiverRelay stanzaRelay = (StanzaReceiverRelay) sessionContext.getServerRuntimeContext().getStanzaRelay();
+        StanzaReceiverQueue senderQueue = new StanzaReceiverQueue();
+        StanzaReceiverQueue receiverQueue = new StanzaReceiverQueue();
+        stanzaRelay.add(sender, senderQueue);
+        stanzaRelay.add(receiver, receiverQueue);
+
+        Stanza successfulMessageStanza = StanzaBuilder.createMessageStanza(sender, receiver, "en", "info").getFinalStanza();
+        ResponseStanzaContainer responseStanzaContainer = messageHandler.execute(successfulMessageStanza, sessionContext, sessionStateHolder);
+        assertEquals(successfulMessageStanza, receiverQueue.getNext());
+
+        Stanza failureMessageStanza = StanzaBuilder.createMessageStanza(sender, noReceiver, "en", "info").getFinalStanza();
+        responseStanzaContainer = messageHandler.execute(failureMessageStanza, sessionContext, sessionStateHolder);
+        assertNull(receiverQueue.getNext());
+        Stanza rejectionStanza = senderQueue.getNext();
+        assertNotNull(rejectionStanza);
+        XMPPCoreStanza rejectionCoreStanza = XMPPCoreStanza.getWrapper(rejectionStanza);
+        assertEquals("error", rejectionCoreStanza.getType());
+
+    }
+    
 }
\ No newline at end of file

Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolStateTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolStateTestCase.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolStateTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolStateTestCase.java Thu May 22 23:36:28 2008
@@ -44,7 +44,9 @@
         super.setUp();
 
         protocolWorker = new ProtocolWorker();
-        serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, new StanzaReceiverRelay());
+        StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
+        serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, receiverRelay);
+        receiverRelay.setServerRuntimeContext(serverRuntimeContext);
         serverRuntimeContext.addDictionary(new BaseStreamStanzaDictionary());
         sessionStateHolder = new SessionStateHolder();
         sessionContext = new TestSessionContext(serverRuntimeContext, sessionStateHolder);

Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerAquireTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerAquireTestCase.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerAquireTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerAquireTestCase.java Thu May 22 23:36:28 2008
@@ -40,7 +40,10 @@
 
         protocolWorker = new ProtocolWorker();
         sessionStateHolder = new SessionStateHolder();
-        sessionContext = new TestSessionContext(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new StanzaReceiverRelay()), sessionStateHolder);
+        StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
+        DefaultServerRuntimeContext context = new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), receiverRelay);
+        receiverRelay.setServerRuntimeContext(context);
+        sessionContext = new TestSessionContext(context, sessionStateHolder);
     }
 
     public void testAquireSimpleStanza() {
@@ -92,4 +95,4 @@
         assertFalse("not closed", sessionContext.isClosed());
     }
 
-}
\ No newline at end of file
+}

Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerProcessTestCase.java Thu May 22 23:36:28 2008
@@ -50,7 +50,9 @@
 
         protocolWorker = new ProtocolWorker();
         namespaceHandlerDictionary = new NamespaceHandlerDictionary("testNSURI");
-        serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, new StanzaReceiverRelay());
+        StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
+        serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, receiverRelay);
+        receiverRelay.setServerRuntimeContext(serverRuntimeContext);
         serverRuntimeContext.addDictionary(namespaceHandlerDictionary);
         sessionStateHolder = new SessionStateHolder();
         sessionContext = new TestSessionContext(serverRuntimeContext, sessionStateHolder);

Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java Thu May 22 23:36:28 2008
@@ -44,7 +44,9 @@
         protocolWorker = new ProtocolWorker();
         sessionStateHolder = new SessionStateHolder();
         Entity serverEnitity = new EntityImpl(null, "vysper-server.org", null);
-        DefaultServerRuntimeContext serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, new StanzaReceiverRelay());
+        StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
+        DefaultServerRuntimeContext serverRuntimeContext = new DefaultServerRuntimeContext(serverEnitity, receiverRelay);
+        receiverRelay.setServerRuntimeContext(serverRuntimeContext);
         serverRuntimeContext.addDictionary(new BaseStreamStanzaDictionary());
         sessionStateHolder = new SessionStateHolder();
         sessionContext = new TestSessionContext(serverRuntimeContext, sessionStateHolder);
@@ -100,4 +102,4 @@
     }
 
 
-}
\ No newline at end of file
+}

Modified: labs/vysper/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
URL: http://svn.apache.org/viewvc/labs/vysper/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java?rev=659449&r1=659448&r2=659449&view=diff
==============================================================================
--- labs/vysper/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java (original)
+++ labs/vysper/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java Thu May 22 23:36:28 2008
@@ -17,9 +17,10 @@
 
 package org.apache.vysper.xmpp.server;
 
-import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.delivery.RecordingStanzaRelay;
+import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.writer.StanzaWriter;
@@ -34,6 +35,20 @@
     private boolean switchToTLSCalled;
     private boolean isReopeningXMLStream;
 
+    public static TestSessionContext createSessionContext(Entity entity) {
+        SessionStateHolder sessionStateHolder = new SessionStateHolder();
+        TestSessionContext sessionContext = new TestSessionContext(sessionStateHolder);
+        sessionContext.setInitiatingEntity(entity);
+        return sessionContext;
+    }
+
+    public static TestSessionContext createWithStanzaReceiverRelay(SessionStateHolder sessionStateHolder) {
+        StanzaReceiverRelay relay = new org.apache.vysper.xmpp.delivery.StanzaReceiverRelay();
+        DefaultServerRuntimeContext serverContext = new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), relay);
+        relay.setServerRuntimeContext(serverContext);
+        return new TestSessionContext(serverContext, sessionStateHolder);
+    }
+
     public TestSessionContext(SessionStateHolder sessionStateHolder) {
         this(new DefaultServerRuntimeContext(new EntityImpl(null, "test", null), new RecordingStanzaRelay()), sessionStateHolder);
     }
@@ -79,11 +94,4 @@
     public boolean isSwitchToTLSCalled() {
         return switchToTLSCalled;
     }
-
-    public static TestSessionContext createSessionContext(Entity entity) {
-        SessionStateHolder sessionStateHolder = new SessionStateHolder();
-        TestSessionContext sessionContext = new TestSessionContext(sessionStateHolder);
-        sessionContext.setInitiatingEntity(entity);
-        return sessionContext;
-    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org