001 /*
002 * Copyright 2010 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package com.hs.mail.imap.server;
017
018 import java.io.PrintStream;
019
020 import org.jboss.netty.buffer.ChannelBuffer;
021 import org.jboss.netty.channel.ChannelDownstreamHandler;
022 import org.jboss.netty.channel.ChannelEvent;
023 import org.jboss.netty.channel.ChannelHandlerContext;
024 import org.jboss.netty.channel.ChannelPipelineCoverage;
025 import org.jboss.netty.channel.ChannelUpstreamHandler;
026 import org.jboss.netty.channel.MessageEvent;
027
028 /**
029 * A ChannelHandler that logs all protocol streams.
030 *
031 * @author Won Chul Doh
032 * @since Jul 7, 2010
033 */
034
035 @ChannelPipelineCoverage("all")
036 public class DebuggingHandler implements ChannelUpstreamHandler,
037 ChannelDownstreamHandler {
038
039 private PrintStream out; // debug output stream
040
041 public DebuggingHandler() {
042 }
043
044 /**
045 * Set the stream to be used for debugging output. If <code>out</code> is
046 * null, <code>System.out</code> will be used.
047 *
048 * @param out
049 * the PrintStream to use for debugging output
050 */
051 public synchronized void setDebugOut(PrintStream out) {
052 this.out = out;
053 }
054
055 /**
056 * Returns the stream to be used for debugging output. If no stream has been
057 * set, <code>System.out</code> is returned.
058 *
059 * @return the PrintStream to use for debugging output.
060 */
061 public synchronized PrintStream getDebugOut() {
062 if (out == null)
063 return System.out;
064 else
065 return out;
066 }
067
068 private String toString(ChannelBuffer buffer) {
069 byte[] dst = new byte[buffer.readableBytes()];
070 buffer.getBytes(buffer.readerIndex(), dst);
071 return new String(dst);
072 }
073
074 /**
075 * Logs the specified event to the {@link out} returned by
076 * {@link #getDebugOut()}.
077 */
078 public void debug(ChannelEvent e) {
079 if (e instanceof MessageEvent) {
080 Object msg = ((MessageEvent) e).getMessage();
081 if (msg instanceof ChannelBuffer) {
082 getDebugOut().print(toString((ChannelBuffer) msg));
083 } else {
084 getDebugOut().print(msg);
085 }
086 }
087 }
088
089 public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e)
090 throws Exception {
091 if (e != null) {
092 debug(e);
093 ctx.sendUpstream(e);
094 }
095 }
096
097 public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent e)
098 throws Exception {
099 if (e != null) {
100 debug(e);
101 ctx.sendDownstream(e);
102 }
103 }
104
105 }