/* * 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(); } }