You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by be...@apache.org on 2009/08/02 21:28:44 UTC

svn commit: r800135 - in /mina/sandbox/vysper/trunk/server/core/src: main/java/org/apache/vysper/xmpp/modules/core/base/handler/ test/java/org/apache/vysper/xmpp/modules/core/ test/java/org/apache/vysper/xmpp/modules/core/base/handler/ test/java/org/ap...

Author: berndf
Date: Sun Aug  2 19:28:43 2009
New Revision: 800135

URL: http://svn.apache.org/viewvc?rev=800135&view=rev
Log:
add 'from' attribute (VYSPER-165)

Modified:
    mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
    mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/TestUser.java
    mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java
    mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java

Modified: mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java?rev=800135&r1=800134&r2=800135&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java Sun Aug  2 19:28:43 2009
@@ -21,13 +21,16 @@
 package org.apache.vysper.xmpp.modules.core.base.handler;
 
 import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.stanza.MessageStanza;
 import org.apache.vysper.xmpp.stanza.Stanza;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.xmlfragment.XMLElement;
 import org.apache.vysper.xmpp.xmlfragment.XMLSemanticError;
+import org.apache.vysper.xmpp.xmlfragment.Attribute;
 import org.apache.vysper.xmpp.delivery.StanzaRelay;
 import org.apache.vysper.xmpp.delivery.failure.ReturnErrorToSenderFailureStrategy;
 
@@ -84,9 +87,6 @@
 
         // TODO inspect all BODY elements and make sure they conform to the spec
 
-        Entity to = stanza.getTo();
-
-
         if (isOutboundStanza) {
             // check if message reception is turned of either globally or locally
             if (!serverRuntimeContext.getServerFeatures().isRelayingMessages() ||
@@ -94,9 +94,25 @@
                 return null;
             }
 
+            Entity from = stanza.getFrom();
+            if (from == null || !from.isResourceSet()) {
+                // rewrite stanza with new from
+                from = new EntityImpl(sessionContext.getInitiatingEntity(), serverRuntimeContext.getResourceRegistry().getUniqueResourceForSession(sessionContext));
+                StanzaBuilder stanzaBuilder = new StanzaBuilder(stanza.getName());
+                for (Attribute attribute : stanza.getAttributes()) {
+                    if ("from".equals(attribute.getName())) continue;
+                    stanzaBuilder.addAttribute(attribute);
+                }
+                stanzaBuilder.addAttribute(new Attribute("from", from.getFullQualifiedName()));
+                for (XMLElement preparedElement : stanza.getInnerElements()) {
+                    stanzaBuilder.addPreparedElement(preparedElement);
+                }
+                stanza = XMPPCoreStanza.getWrapper(stanzaBuilder.getFinalStanza());
+            }
+
             StanzaRelay stanzaRelay = serverRuntimeContext.getStanzaRelay();
             try {
-                stanzaRelay.relay(to, stanza, new ReturnErrorToSenderFailureStrategy(stanzaRelay));
+                stanzaRelay.relay(stanza.getTo(), stanza, new ReturnErrorToSenderFailureStrategy(stanzaRelay));
             } catch (Exception e) {
                 // TODO return error stanza
                 e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

Modified: mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/TestUser.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/TestUser.java?rev=800135&r1=800134&r2=800135&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/TestUser.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/TestUser.java Sun Aug  2 19:28:43 2009
@@ -38,8 +38,12 @@
     protected Entity fqEntity;
 
     public static TestUser createForSession(TestSessionContext sessionContext, Entity entity) throws BindException {
+        return createForSession(sessionContext, entity, true);
+    }
+
+    public static TestUser createForSession(TestSessionContext sessionContext, Entity entity, boolean receiveForFullJID) throws BindException {
         String boundResourceId = sessionContext.bindResource();
-        StanzaReceiverQueue queue = sessionContext.addReceiver(entity, boundResourceId);
+        StanzaReceiverQueue queue = sessionContext.addReceiver(entity, receiveForFullJID ? boundResourceId : null);
         return new TestUser(boundResourceId, entity, queue);
     }
 

Modified: mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java?rev=800135&r1=800134&r2=800135&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandlerRelayTestCase.java Sun Aug  2 19:28:43 2009
@@ -33,72 +33,84 @@
 import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
 import org.apache.vysper.xmpp.xmlfragment.XMLElementVerifier;
+import org.apache.vysper.xmpp.modules.core.TestUser;
 
 /**
  */
 public class MessageHandlerRelayTestCase extends TestCase {
-    private TestSessionContext sessionContext;
-
-    private SessionStateHolder sessionStateHolder = new SessionStateHolder();
     private MessageHandler messageHandler = new MessageHandler();
 
+    private TestSessionContext senderSessionContext;
+//    private SessionStateHolder sessionStateHolder = new SessionStateHolder();
+    protected Entity sender;
+    protected TestUser senderUser;
+
+    private TestSessionContext receiverSessionContext;
+//    private SessionStateHolder sessionStateHolder = new SessionStateHolder();
+    protected Entity receiver;
+    protected TestUser receiverUser;
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        sessionContext = TestSessionContext.createWithStanzaReceiverRelay(sessionStateHolder);
+        
+        // sender
+        senderSessionContext = TestSessionContext.createWithStanzaReceiverRelay(new SessionStateHolder());
+        sender = EntityImpl.parse("sender@vysper.org");
+        senderSessionContext.setInitiatingEntity(sender);
+        senderUser = TestUser.createForSession(senderSessionContext, sender);
+        
+        // receiver
+        receiverSessionContext = TestSessionContext.createWithStanzaReceiverRelay(new SessionStateHolder(), senderSessionContext.getServerRuntimeContext());
+        receiver = EntityImpl.parse("receiver@vysper.org");
+        receiverSessionContext.setInitiatingEntity(receiver);
+        receiverUser = TestUser.createForSession(receiverSessionContext, receiver, false);
     }
 
     public void testStanzaRelayed() {
-        sessionContext = new TestSessionContext(sessionStateHolder);
-        
         String timestamp = "" + System.currentTimeMillis();
 
         StanzaBuilder stanzaBuilder = new StanzaBuilder("message", NamespaceURIs.JABBER_SERVER);
-        String receiver = "test@example.com";
-        stanzaBuilder.addAttribute("to", receiver);
+        // receiver@vysper.org, NOT receiver@vysper.org/resourceID 
+        stanzaBuilder.addAttribute("to", receiverUser.getEntity().getBareJID().getFullQualifiedName());
         stanzaBuilder.startInnerElement("timestamp").addAttribute("value", timestamp).endInnerElement();
 
-        sessionContext.setServerToServer();
+        senderSessionContext.setClientToServer();
         
-        RecordingStanzaRelay stanzaRelay = (RecordingStanzaRelay) sessionContext.getServerRuntimeContext().getStanzaRelay();
-        assertFalse(stanzaRelay.iterator().hasNext()); // nothing there yet
+        assertNull(receiverUser.getNextStanza()); // nothing there yet
+        assertNull(senderUser.getNextStanza()); // nothing there yet
 
         Stanza stanza = stanzaBuilder.getFinalStanza();
-        ResponseStanzaContainer responseStanzaContainer = messageHandler.execute(stanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null);
+        ResponseStanzaContainer responseStanzaContainer = messageHandler.execute(stanza, senderSessionContext.getServerRuntimeContext(), true, senderSessionContext, null);
 
-        RecordingStanzaRelay.Triple triple = stanzaRelay.iterator().next();
-        XMLElementVerifier timestampVerifier = triple.getStanza().getFirstInnerElement().getVerifier();
+        Stanza receivedStanza = receiverUser.getNextStanza();
+        XMLElementVerifier timestampVerifier = receivedStanza.getFirstInnerElement().getVerifier();
         
-        assertTrue("stanza relayed to", triple.getStanza().getVerifier().toAttributeEquals(receiver));
+        assertTrue("stanza relayed to", receivedStanza.getVerifier().toAttributeEquals(receiverUser.getEntity().getFullQualifiedName()));
         assertTrue("stanza relayed inner", timestampVerifier.attributeEquals("value", timestamp));
-        assertEquals("stanza relayed to correct receiver", new EntityImpl("test", "example.com", null), triple.getEntity());
+        assertNotNull("from added", receivedStanza.getFrom());
+        assertNotNull("from is full JID", receivedStanza.getFrom().equals(senderUser.getEntityFQ()));
+        assertEquals("stanza relayed to correct receiver", receiverUser.getEntity(), receivedStanza.getTo());
 
-        // clean and do not accept follow-up relays
-        stanzaRelay.reset();
-        stanzaRelay.setAcceptingMode(false);
-        
-        responseStanzaContainer = messageHandler.execute(stanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null);
-        assertFalse(stanzaRelay.iterator().hasNext());
-       
     }
 
     public void testStanzaReceiverUnavailable() throws EntityFormatException, DeliveryException {
-        Entity sender = EntityImpl.parse("from@example.com");
+        Entity sender = EntityImpl.parse("from@example.com/resID");
         Entity receiver = EntityImpl.parse("to_exist@example.com");
         Entity noReceiver = EntityImpl.parse("to_unavail@example.com");
 
-        StanzaReceiverRelay stanzaRelay = (StanzaReceiverRelay) sessionContext.getServerRuntimeContext().getStanzaRelay();
+        StanzaReceiverRelay stanzaRelay = (StanzaReceiverRelay) senderSessionContext.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.getServerRuntimeContext(), true, sessionContext, sessionStateHolder);
+        ResponseStanzaContainer responseStanzaContainer = messageHandler.execute(successfulMessageStanza, senderSessionContext.getServerRuntimeContext(), true, senderSessionContext, null);
         assertEquals(successfulMessageStanza, receiverQueue.getNext());
 
         Stanza failureMessageStanza = StanzaBuilder.createMessageStanza(sender, noReceiver, "en", "info").getFinalStanza();
-        responseStanzaContainer = messageHandler.execute(failureMessageStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, sessionStateHolder);
+        responseStanzaContainer = messageHandler.execute(failureMessageStanza, senderSessionContext.getServerRuntimeContext(), true, senderSessionContext, null);
         assertNull(receiverQueue.getNext());
         Stanza rejectionStanza = senderQueue.getNext();
         assertNotNull(rejectionStanza);

Modified: mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java?rev=800135&r1=800134&r2=800135&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/test/java/org/apache/vysper/xmpp/server/TestSessionContext.java Sun Aug  2 19:28:43 2009
@@ -45,6 +45,11 @@
     private boolean isReopeningXMLStream;
     private int recordedResponsesTotal = 0;
 
+    /**
+     * creates a new session context (but doesn't set the runtime context)
+     * @param entity
+     * @return
+     */
     public static TestSessionContext createSessionContext(Entity entity) {
         SessionStateHolder sessionStateHolder = new SessionStateHolder();
         TestSessionContext sessionContext = new TestSessionContext(sessionStateHolder);
@@ -52,12 +57,21 @@
         return sessionContext;
     }
 
+    /**
+     * creates a new authenticated session and a new runtime context
+     * @return
+     */
     public static TestSessionContext createWithStanzaReceiverRelayAuthenticated() {
         SessionStateHolder sessionStateHolder = new SessionStateHolder();
         sessionStateHolder.setState(SessionState.AUTHENTICATED);
         return createWithStanzaReceiverRelay(sessionStateHolder);
     }
-    
+
+    /**
+     * creates a session and also creates a fresh runtime context for it
+     * @param sessionStateHolder
+     * @return
+     */
     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);
@@ -65,6 +79,18 @@
         return new TestSessionContext(serverContext, sessionStateHolder);
     }
 
+    /**
+     * creates another session for an already created runtime context
+     * @param sessionStateHolder
+     * @param serverContext
+     * @return
+     */
+    public static TestSessionContext createWithStanzaReceiverRelay(SessionStateHolder sessionStateHolder, ServerRuntimeContext serverContext) {
+        StanzaReceiverRelay relay = (StanzaReceiverRelay)serverContext.getStanzaRelay();
+        relay.setServerRuntimeContext(serverContext);
+        return new TestSessionContext(serverContext, sessionStateHolder);
+    }
+
     public TestSessionContext(SessionStateHolder sessionStateHolder) {
         this(new DefaultServerRuntimeContext(
                 new EntityImpl(null, "test", null),