You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2011/01/27 22:45:15 UTC

svn commit: r1064322 - in /mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper: mina/ xmpp/modules/core/base/handler/ xmpp/protocol/ xmpp/server/ xmpp/server/components/

Author: ngn
Date: Thu Jan 27 21:45:15 2011
New Revision: 1064322

URL: http://svn.apache.org/viewvc?rev=1064322&view=rev
Log:
Basic relay for external components. Needs more discussion before finished

Added:
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ExternalComponentStanzaProcessor.java
Modified:
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
    mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java?rev=1064322&r1=1064321&r2=1064322&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/mina/XmppIoHandlerAdapter.java Thu Jan 27 21:45:15 2011
@@ -27,6 +27,7 @@ import org.apache.mina.filter.ssl.SslFil
 import org.apache.vysper.xml.fragment.XMLText;
 import org.apache.vysper.xmpp.protocol.SessionStateHolder;
 import org.apache.vysper.xmpp.protocol.StreamErrorCondition;
+import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionContext;
 import org.apache.vysper.xmpp.server.SessionContext.SessionMode;
@@ -112,6 +113,8 @@ public class XmppIoHandlerAdapter implem
         
         ioSession.setAttribute(ATTRIBUTE_VYSPER_SESSION, sessionContext);
         ioSession.setAttribute(ATTRIBUTE_VYSPER_SESSIONSTATEHOLDER, stateHolder);
+        
+        ((DefaultServerRuntimeContext)serverRuntimeContext).sessionCreated(sessionContext);
     }
 
     public void sessionOpened(IoSession ioSession) throws Exception {
@@ -124,7 +127,10 @@ public class XmppIoHandlerAdapter implem
         if (sessionContext != null) {
             sessionId = sessionContext.getSessionId();
             sessionContext.endSession(SessionContext.SessionTerminationCause.CONNECTION_ABORT);
+            
+            ((DefaultServerRuntimeContext)serverRuntimeContext).sessionClosed(sessionContext);
         }
+        
         logger.info("session {} has been closed", sessionId);
     }
 

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java?rev=1064322&r1=1064321&r2=1064322&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/modules/core/base/handler/MessageHandler.java Thu Jan 27 21:45:15 2011
@@ -86,8 +86,8 @@ public class MessageHandler extends XMPP
         }
 
         // TODO inspect all BODY elements and make sure they conform to the spec
-
         if (isOutboundStanza) {
+
             // check if message reception is turned of either globally or locally
             if (!serverRuntimeContext.getServerFeatures().isRelayingMessages()
                     || (sessionContext != null && sessionContext
@@ -97,23 +97,28 @@ public class MessageHandler extends XMPP
 
             Entity from = stanza.getFrom();
             if (from == null || !from.isResourceSet()) {
-                // rewrite stanza with new from
-                String resource = serverRuntimeContext.getResourceRegistry()
-                        .getUniqueResourceForSession(sessionContext);
-                if (resource == null)
-                    throw new IllegalStateException("could not determine unique resource");
-                from = new EntityImpl(sessionContext.getInitiatingEntity(), resource);
-                StanzaBuilder stanzaBuilder = new StanzaBuilder(stanza.getName(), stanza.getNamespaceURI());
-                for (Attribute attribute : stanza.getAttributes()) {
-                    if ("from".equals(attribute.getName()))
-                        continue;
-                    stanzaBuilder.addAttribute(attribute);
-                }
-                stanzaBuilder.addAttribute("from", from.getFullQualifiedName());
-                for (XMLElement preparedElement : stanza.getInnerElements()) {
-                    stanzaBuilder.addPreparedElement(preparedElement);
+                if(from == null || from.isNodeSet()) {
+                
+                    // rewrite stanza with new from
+                    String resource = serverRuntimeContext.getResourceRegistry()
+                            .getUniqueResourceForSession(sessionContext);
+                    if (resource == null)
+                        throw new IllegalStateException("could not determine unique resource");
+                    from = new EntityImpl(sessionContext.getInitiatingEntity(), resource);
+                    StanzaBuilder stanzaBuilder = new StanzaBuilder(stanza.getName(), stanza.getNamespaceURI());
+                    for (Attribute attribute : stanza.getAttributes()) {
+                        if ("from".equals(attribute.getName()))
+                            continue;
+                        stanzaBuilder.addAttribute(attribute);
+                    }
+                    stanzaBuilder.addAttribute("from", from.getFullQualifiedName());
+                    for (XMLElement preparedElement : stanza.getInnerElements()) {
+                        stanzaBuilder.addPreparedElement(preparedElement);
+                    }
+                    stanza = XMPPCoreStanza.getWrapper(stanzaBuilder.build());
+                } else {
+                    // message sent from component
                 }
-                stanza = XMPPCoreStanza.getWrapper(stanzaBuilder.build());
             }
 
             StanzaRelay stanzaRelay = serverRuntimeContext.getStanzaRelay();

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java?rev=1064322&r1=1064321&r2=1064322&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/protocol/ProtocolWorker.java Thu Jan 27 21:45:15 2011
@@ -198,6 +198,11 @@ public class ProtocolWorker implements S
             }
         } else if(sessionContext.isSessionMode(SessionMode.COMPONENT_ACCEPT)) {
             // TODO make sure that "from" is from the component
+            
+            // rewrite namespace
+            if(coreStanza != null) {
+                stanza = StanzaBuilder.rewriteNamespace(stanza, NamespaceURIs.JABBER_COMPONENT_ACCEPT, NamespaceURIs.JABBER_CLIENT);
+            }
         }
         
         try {

Modified: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java?rev=1064322&r1=1064321&r2=1064322&view=diff
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java (original)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java Thu Jan 27 21:45:15 2011
@@ -21,6 +21,7 @@
 package org.apache.vysper.xmpp.server;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -39,6 +40,7 @@ import org.apache.vysper.xmpp.delivery.S
 import org.apache.vysper.xmpp.modules.Module;
 import org.apache.vysper.xmpp.modules.ModuleRegistry;
 import org.apache.vysper.xmpp.modules.ServerRuntimeContextService;
+import org.apache.vysper.xmpp.modules.extension.xep0114_component.ComponentAuthentication;
 import org.apache.vysper.xmpp.protocol.HandlerDictionary;
 import org.apache.vysper.xmpp.protocol.ProtocolWorker;
 import org.apache.vysper.xmpp.protocol.QueuedStanzaProcessor;
@@ -46,6 +48,7 @@ import org.apache.vysper.xmpp.protocol.S
 import org.apache.vysper.xmpp.protocol.StanzaHandlerLookup;
 import org.apache.vysper.xmpp.protocol.StanzaProcessor;
 import org.apache.vysper.xmpp.server.components.Component;
+import org.apache.vysper.xmpp.server.components.ExternalComponentStanzaProcessor;
 import org.apache.vysper.xmpp.server.s2s.DefaultXMPPServerConnectorRegistry;
 import org.apache.vysper.xmpp.server.s2s.XMPPServerConnectorRegistry;
 import org.apache.vysper.xmpp.stanza.Stanza;
@@ -364,13 +367,50 @@ public class DefaultServerRuntimeContext
         if (!EntityUtils.isAddressingServerComponent(entity, getServerEnitity())) {
             return null;
         }
+        
+        // find an internal component
         String domain = entity.getDomain();
         String subdomain = domain.replace("." + serverDomain, "");
         Component component = componentMap.get(subdomain);
-        if (component == null)
-            return null;
-        return component.getStanzaProcessor();
+        if (component != null) {
+            return component.getStanzaProcessor();
+        } else {
+            // find an external component
+            
+            ComponentAuthentication componentAuthentication = (ComponentAuthentication) getStorageProvider(ComponentAuthentication.class);
+            if(componentAuthentication != null) {
+                if(componentAuthentication.exists(entity)) {
+                    return new ExternalComponentStanzaProcessor(entity);
+                } else {
+                    // TODO handle
+                    return null;
+                }
+            } else {
+                // TODO handle
+                return null;
+            }
+        }
+    }
+
+    private List<SessionContext> sessions = new ArrayList<SessionContext>();
+    
+    public Collection<SessionContext> getSessions(Entity entity) {
+        List<SessionContext> matching = new ArrayList<SessionContext>();
+        for(SessionContext sessionContext : sessions) {
+            if(sessionContext.getInitiatingEntity() != null && sessionContext.getInitiatingEntity().equals(entity)) {
+                matching.add(sessionContext);
+            }
+        }
+        
+        return matching;
+    }
+    
+    public void sessionCreated(SessionContext sessionContext) {
+        sessions.add(sessionContext);
     }
 
+    public void sessionClosed(SessionContext sessionContext) {
+        sessions.remove(sessionContext);
+    }
 
 }

Added: mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ExternalComponentStanzaProcessor.java
URL: http://svn.apache.org/viewvc/mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ExternalComponentStanzaProcessor.java?rev=1064322&view=auto
==============================================================================
--- mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ExternalComponentStanzaProcessor.java (added)
+++ mina/vysper/branches/xep0114/server/core/src/main/java/org/apache/vysper/xmpp/server/components/ExternalComponentStanzaProcessor.java Thu Jan 27 21:45:15 2011
@@ -0,0 +1,69 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.server.components;
+
+import java.util.Collection;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.protocol.NamespaceURIs;
+import org.apache.vysper.xmpp.protocol.SessionStateHolder;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
+import org.apache.vysper.xmpp.server.ServerRuntimeContext;
+import org.apache.vysper.xmpp.server.SessionContext;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
+
+/**
+ */
+public class ExternalComponentStanzaProcessor implements StanzaProcessor {
+
+    private Entity component;
+
+    public ExternalComponentStanzaProcessor(Entity component) {
+System.out.println(11111);
+        this.component  = component;
+    }
+
+    public void processStanza(ServerRuntimeContext serverRuntimeContext, SessionContext sessionContext, Stanza stanza,
+            SessionStateHolder sessionStateHolder) {
+        if (stanza == null)
+            throw new RuntimeException("cannot process NULL stanzas");
+
+        // rewrite namespace
+        stanza = StanzaBuilder.rewriteNamespace(stanza, NamespaceURIs.JABBER_CLIENT, NamespaceURIs.JABBER_COMPONENT_ACCEPT);
+
+        Collection<SessionContext> componentSessions = ((DefaultServerRuntimeContext)serverRuntimeContext).getSessions(component);
+        
+        
+
+        if(!componentSessions.isEmpty()) {
+            SessionContext componentSession = componentSessions.iterator().next();
+            componentSession.getResponseWriter().write(stanza);
+        } else {
+            // component not connected
+            // TODO implement
+        }
+    }
+
+    public void processTLSEstablished(SessionContext sessionContext, SessionStateHolder sessionStateHolder) {
+        // do nothing
+    }
+}