Author: berndf
Date: Tue May 15 15:35:50 2012
New Revision: 1338756

URL: http://svn.apache.org/viewvc?rev=1338756&view=rev
Log:
VYSPER-302: add interface for logging stanza content. based on a patch by Stig 
Runar Vangen. thanks for contributing.

Added:
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractBodyTextLogStorageProvider.java
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractLogStorageProvider.java
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/LogStorageProvider.java
Modified:
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/RelayResult.java
    
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java

Added: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractBodyTextLogStorageProvider.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractBodyTextLogStorageProvider.java?rev=1338756&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractBodyTextLogStorageProvider.java
 (added)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractBodyTextLogStorageProvider.java
 Tue May 15 15:35:50 2012
@@ -0,0 +1,54 @@
+/*
+ *  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.storage.logstanzas;
+
+import java.util.List;
+
+import org.apache.vysper.xml.fragment.XMLElement;
+import org.apache.vysper.xml.fragment.XMLText;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
+
+/**
+ * Logs stanza body texts
+ */
+public abstract class AbstractBodyTextLogStorageProvider extends 
AbstractLogStorageProvider {
+
+    public AbstractBodyTextLogStorageProvider() {
+        // empty
+    }
+
+    public AbstractBodyTextLogStorageProvider(boolean logMessage, boolean 
logPresence, boolean logIQ) {
+        super(logMessage, logPresence, logIQ);
+    }
+
+    @Override
+    protected void logStanza(Entity from, Entity receiver, XMPPCoreStanza 
stanza) {
+        final List<XMLElement> bodies = stanza.getInnerElementsNamed("body");
+        for (final XMLElement body : bodies) {
+            final XMLText innerText = body.getInnerText();
+            if (innerText != null) {
+                logText(from, receiver, innerText.getText());
+            }
+        }
+    }
+
+    protected abstract void logText(Entity from, Entity to, String message);
+}

Added: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractLogStorageProvider.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractLogStorageProvider.java?rev=1338756&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractLogStorageProvider.java
 (added)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/AbstractLogStorageProvider.java
 Tue May 15 15:35:50 2012
@@ -0,0 +1,61 @@
+/*
+ *  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.storage.logstanzas;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.stanza.IQStanza;
+import org.apache.vysper.xmpp.stanza.MessageStanza;
+import org.apache.vysper.xmpp.stanza.PresenceStanza;
+import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.XMPPCoreStanza;
+
+/**
+ * logs stanzas
+ */
+public abstract class AbstractLogStorageProvider implements LogStorageProvider 
{
+    protected boolean logMessage = true;
+    protected boolean logPresence = false;
+    protected boolean logIQ = false;
+
+    public AbstractLogStorageProvider() {
+        // empty
+    }
+
+    public AbstractLogStorageProvider(boolean logMessage, boolean logPresence, 
boolean logIQ) {
+        this.logMessage = logMessage;
+        this.logPresence = logPresence;
+        this.logIQ = logIQ;
+    }
+    
+    public void logStanza(final Entity receiver, final Stanza stanza) {
+        final XMPPCoreStanza coreStanza = XMPPCoreStanza.getWrapper(stanza);
+        if (coreStanza == null) return;
+        
+        // skip stanza types which are not logged
+        if (!logMessage && coreStanza instanceof MessageStanza) return;
+        if (!logPresence && coreStanza instanceof PresenceStanza) return;
+        if (!logIQ && coreStanza instanceof IQStanza) return;
+        
+        final Entity from = stanza.getFrom();
+        logStanza(from, receiver, coreStanza);
+    }
+
+    protected abstract void logStanza(Entity from, Entity receiver, 
XMPPCoreStanza stanza);
+}

Added: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/LogStorageProvider.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/LogStorageProvider.java?rev=1338756&view=auto
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/LogStorageProvider.java
 (added)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/storage/logstanzas/LogStorageProvider.java
 Tue May 15 15:35:50 2012
@@ -0,0 +1,29 @@
+/*
+ *  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.storage.logstanzas;
+
+import org.apache.vysper.storage.StorageProvider;
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.stanza.Stanza;
+
+public interface LogStorageProvider extends StorageProvider {
+
+    void logStanza(Entity receiver, Stanza stanza);
+}

Modified: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java?rev=1338756&r1=1338755&r2=1338756&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
 (original)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringExternalInboundStanzaRelay.java
 Tue May 15 15:35:50 2012
@@ -147,7 +147,7 @@ public class DeliveringExternalInboundSt
                 XMPPServerConnector connector = 
serverRuntimeContext.getServerConnectorRegistry().connect(EntityImpl.parseUnchecked(stanza.getTo().getDomain()));
                 
                 connector.write(stanza);
-                return relayResult;
+                return relayResult.setProcessed();
             } catch (DeliveryException e) {
                 return new RelayResult(e);
             }

Modified: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java?rev=1338756&r1=1338755&r2=1338756&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
 (original)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
 Tue May 15 15:35:50 2012
@@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.vysper.compliance.SpecCompliant;
 import org.apache.vysper.storage.StorageProviderRegistry;
+import org.apache.vysper.storage.logstanzas.LogStorageProvider;
 import org.apache.vysper.xmpp.addressing.Entity;
 import org.apache.vysper.xmpp.addressing.EntityUtils;
 import org.apache.vysper.xmpp.authentication.AccountManagement;
@@ -85,6 +86,8 @@ public class DeliveringInternalInboundSt
     protected Entity serverEntity;
 
     protected ServerRuntimeContext serverRuntimeContext = null;
+    
+    protected LogStorageProvider logStorageProvider = null;
 
     public DeliveringInternalInboundStanzaRelay(Entity serverEntity, 
ResourceRegistry resourceRegistry,
             StorageProviderRegistry storageProviderRegistry) {
@@ -113,6 +116,10 @@ public class DeliveringInternalInboundSt
         this.serverRuntimeContext = serverRuntimeContext;
     }
 
+    public final void setLogStorageProvider(final LogStorageProvider 
logStorageProvider) {
+        this.logStorageProvider = logStorageProvider;
+    }
+
     public void relay(Entity receiver, Stanza stanza, DeliveryFailureStrategy 
deliveryFailureStrategy)
             throws DeliveryException {
         if (!isRelaying()) {
@@ -120,6 +127,9 @@ public class DeliveringInternalInboundSt
         }
         
         Future<RelayResult> resultFuture = executor.submit(new Relay(receiver, 
stanza, deliveryFailureStrategy));
+        if (this.logStorageProvider != null) {
+            this.logStorageProvider.logStanza(receiver, stanza);
+        }
     }
 
     public boolean isRelaying() {
@@ -201,7 +211,7 @@ public class DeliveringInternalInboundSt
                     }
 
                     processor.processStanza(serverRuntimeContext, null, 
stanza, null);
-                    return new RelayResult();
+                    return new RelayResult().setProcessed();
                 }
 
                 if (receiver.isResourceSet()) {
@@ -329,7 +339,7 @@ public class DeliveringInternalInboundSt
                 }
 
             }
-            return relayResult;
+            return relayResult.setProcessed();
         }
 
         protected RelayResult relayToAllSessions() {
@@ -365,7 +375,7 @@ public class DeliveringInternalInboundSt
                 }
             }
 
-            return relayResult; // return success result
+            return relayResult.setProcessed(); // return success result
         }
     }
 

Modified: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/RelayResult.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/RelayResult.java?rev=1338756&r1=1338755&r2=1338756&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/RelayResult.java
 (original)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/RelayResult.java
 Tue May 15 15:35:50 2012
@@ -27,6 +27,7 @@ import org.apache.vysper.xmpp.delivery.f
 
 public class RelayResult {
     private List<DeliveryException> processingErrors = new 
ArrayList<DeliveryException>();
+    protected boolean processed = false;
 
     public RelayResult() {
         // empty
@@ -34,8 +35,14 @@ public class RelayResult {
 
     public RelayResult(DeliveryException processingError) {
         addProcessingError(processingError);
+        setProcessed();
     }
 
+    public RelayResult setProcessed() {
+        processed = true;
+        return this;
+    }
+    
     public void addProcessingError(DeliveryException processingError) {
         processingErrors.add(processingError);
     }

Modified: 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
URL: 
http://svn.apache.org/viewvc/mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java?rev=1338756&r1=1338755&r2=1338756&view=diff
==============================================================================
--- 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
 (original)
+++ 
mina/vysper/trunk/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
 Tue May 15 15:35:50 2012
@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.vysper.storage.StorageProviderRegistry;
+import org.apache.vysper.storage.logstanzas.LogStorageProvider;
 import org.apache.vysper.xmpp.addressing.EntityImpl;
 import org.apache.vysper.xmpp.authentication.AccountManagement;
 import org.apache.vysper.xmpp.authentication.Plain;
@@ -163,8 +164,11 @@ public class XMPPServer {
         internalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
         externalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
 
-        if (endpoints.size() == 0)
-            throw new IllegalStateException("server must have at least one 
endpoint");
+        final LogStorageProvider logStorageProvider =
+                (LogStorageProvider) 
this.storageProviderRegistry.retrieve(LogStorageProvider.class);
+        if (logStorageProvider != null) 
internalStanzaRelay.setLogStorageProvider(logStorageProvider);
+
+        if (endpoints.size() == 0) throw new IllegalStateException("server 
must have at least one endpoint");
         for (Endpoint endpoint : endpoints) {
             endpoint.setServerRuntimeContext(serverRuntimeContext);
             endpoint.start();


Reply via email to