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();