blob: 012bf4ed7ec824519fae68d173b584f02a697161 [file] [log] [blame]
/*
* 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.mina;
import org.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.WriteRequest;
import org.apache.vysper.mina.codec.StanzaWriteInfo;
import org.apache.vysper.xml.fragment.Renderer;
import org.apache.vysper.xml.fragment.XMLElement;
import org.apache.vysper.xmpp.writer.DenseStanzaLogRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author The Apache MINA Project (dev@mina.apache.org)
*/
public class StanzaLoggingFilter extends IoFilterAdapter {
final Logger serverLogger = LoggerFactory.getLogger("stanza.server");
final Logger clientLogger = LoggerFactory.getLogger("stanza.client");
public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
if (message instanceof XMLElement) {
XMLElement element = (XMLElement) message;
if(clientLogger.isDebugEnabled()) {
boolean openElement = true;
boolean closeElement = true;
// this is somewhat of a hack, can we detect opening and closing elements only cleaner?
if (element.getName().equals("stream")) {
if (element.getAttributes().size() > 0) {
// is stream element, and with attributes, should be opening tag
closeElement = false;
} else {
// is stream element, without attributes, should be closing tag
openElement = false;
}
}
String xml = toXml(element, openElement, closeElement);
clientLogger.debug("< " + xml);
} else if (clientLogger.isInfoEnabled()) {
clientLogger.info(DenseStanzaLogRenderer.render(element));
}
}
nextFilter.messageReceived(session, message);
}
public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest request) throws Exception {
Object message = request.getMessage();
if (message instanceof StanzaWriteInfo) {
StanzaWriteInfo stanzaWriteInfo = (StanzaWriteInfo) message;
if(serverLogger.isDebugEnabled()) {
String xml = toXml(stanzaWriteInfo.getStanza(), stanzaWriteInfo.isWriteOpeningElement(),
stanzaWriteInfo.isWriteClosingElement());
serverLogger.debug("> " + xml);
} else if (serverLogger.isInfoEnabled()) {
serverLogger.info(DenseStanzaLogRenderer.render(stanzaWriteInfo.getStanza()));
}
}
nextFilter.messageSent(session, request);
}
private String toXml(XMLElement element, boolean openElement, boolean closeElement) {
Renderer renderer = new Renderer(element);
StringBuffer xml = new StringBuffer();
if (openElement) {
xml.append(renderer.getOpeningElement());
}
xml.append(renderer.getElementContent());
if (closeElement) {
xml.append(renderer.getClosingElement());
}
return xml.toString();
}
}