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),