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/31 10:11:40 UTC

svn commit: r809496 - /mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java

Author: berndf
Date: Mon Aug 31 08:11:39 2009
New Revision: 809496

URL: http://svn.apache.org/viewvc?rev=809496&view=rev
Log:
VYSPER-6: route directed unavail presence

Modified:
    mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java

Modified: mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java?rev=809496&r1=809495&r2=809496&view=diff
==============================================================================
--- mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java (original)
+++ mina/sandbox/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/im/handler/PresenceAvailabilityHandler.java Mon Aug 31 08:11:39 2009
@@ -141,6 +141,10 @@
                                              SessionContext sessionContext, RosterManager rosterManager, Entity user, 
                                              ResourceRegistry registry) {
 
+        boolean hasTo = presenceStanza.getCoreVerifier().attributePresent("to");
+        if (hasTo) return handleOutboundDirectedPresence(presenceStanza, serverRuntimeContext, sessionContext, 
+                rosterManager, user, registry, true);
+
         if (!user.isResourceSet()) throw new RuntimeException("resource id not available");
         registry.setResourceState(user.getResource(), ResourceState.UNAVAILABLE);
 
@@ -199,7 +203,7 @@
                                                    ResourceRegistry registry) {
         boolean hasTo = presenceStanza.getCoreVerifier().attributePresent("to");
         if (hasTo) return handleOutboundDirectedPresence(presenceStanza, serverRuntimeContext, sessionContext, 
-                rosterManager, user, registry);
+                rosterManager, user, registry, false);
 
         if (!user.isResourceSet()) throw new RuntimeException("resource id not available");
         String resourceId = user.getResource();
@@ -276,18 +280,17 @@
     }
 
     @SpecCompliant(spec = "RFC3921bis-08", section = "4.6.2")
-    private PresenceStanza handleOutboundDirectedPresence(PresenceStanza presenceStanza, 
-                                                          ServerRuntimeContext serverRuntimeContext, 
-                                                          SessionContext sessionContext, 
-                                                          RosterManager rosterManager, 
-                                                          Entity user, 
-                                                          ResourceRegistry registry) {
-        PresenceStanza redirectDirectedStanza = presenceStanza;
+    private PresenceStanza handleOutboundDirectedPresence(PresenceStanza presenceStanza,
+                                                          ServerRuntimeContext serverRuntimeContext,
+                                                          SessionContext sessionContext,
+                                                          RosterManager rosterManager,
+                                                          Entity user,
+                                                          ResourceRegistry registry, 
+                                                          final boolean unvailable) {
+        Stanza redirectDirectedStanza = presenceStanza;
         if (presenceStanza.getFrom() == null) {
-            StanzaBuilder builder = StanzaBuilder.createClone(presenceStanza, true, null);
             EntityImpl from = new EntityImpl(sessionContext.getInitiatingEntity(), registry.getUniqueResourceForSession(sessionContext));
-            builder.addAttribute("from", from.getFullQualifiedName());
-            redirectDirectedStanza = (PresenceStanza)XMPPCoreStanza.getWrapper(builder.getFinalStanza());
+            redirectDirectedStanza = StanzaBuilder.createForwardStanza(presenceStanza, from, null);
         }
 
         try {
@@ -296,7 +299,7 @@
             e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
         }
 
-        logger.warn("directed presence is not yet implemented");
+        logger.warn("directed presence is not yet fully implemented");
         return null;
     }
     
@@ -386,7 +389,7 @@
 	}
 
     private void relayTo(Entity from, List<Entity> tos, PresenceStanza original, SessionContext sessionContext) {
-        List<Attribute> toFromReplacements = new ArrayList<Attribute>();
+        List<Attribute> toFromReplacements = new ArrayList<Attribute>(2);
         toFromReplacements.add(new Attribute("from", from.getFullQualifiedName()));
 
         for (Entity to : tos) {