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


Reply via email to