001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.commons.net; 019 020 import java.io.PrintStream; 021 import java.io.PrintWriter; 022 import org.apache.commons.net.ProtocolCommandEvent; 023 import org.apache.commons.net.ProtocolCommandListener; 024 025 /*** 026 * This is a support class for some of the example programs. It is 027 * a sample implementation of the ProtocolCommandListener interface 028 * which just prints out to a specified stream all command/reply traffic. 029 * <p> 030 * 031 * @since 2.0 032 ***/ 033 034 public class PrintCommandListener implements ProtocolCommandListener 035 { 036 private final PrintWriter __writer; 037 private final boolean __nologin; 038 private final char __eolMarker; 039 private final boolean __directionMarker; 040 041 /** 042 * Create the default instance which prints everything. 043 * 044 * @param stream where to write the commands and responses 045 * e.g. System.out 046 * @since 3.0 047 */ 048 public PrintCommandListener(PrintStream stream) 049 { 050 this(new PrintWriter(stream)); 051 } 052 053 /** 054 * Create an instance which optionally suppresses login command text 055 * and indicates where the EOL starts with the specified character. 056 * 057 * @param stream where to write the commands and responses 058 * @param suppressLogin if {@code true}, only print command name for login 059 * 060 * @since 3.0 061 */ 062 public PrintCommandListener(PrintStream stream, boolean suppressLogin) { 063 this(new PrintWriter(stream), suppressLogin); 064 } 065 066 /** 067 * Create an instance which optionally suppresses login command text 068 * and indicates where the EOL starts with the specified character. 069 * 070 * @param stream where to write the commands and responses 071 * @param suppressLogin if {@code true}, only print command name for login 072 * @param eolMarker if non-zero, add a marker just before the EOL. 073 * 074 * @since 3.0 075 */ 076 public PrintCommandListener(PrintStream stream, boolean suppressLogin, char eolMarker) { 077 this(new PrintWriter(stream), suppressLogin, eolMarker); 078 } 079 080 /** 081 * Create an instance which optionally suppresses login command text 082 * and indicates where the EOL starts with the specified character. 083 * 084 * @param stream where to write the commands and responses 085 * @param suppressLogin if {@code true}, only print command name for login 086 * @param eolMarker if non-zero, add a marker just before the EOL. 087 * @param showDirection if {@code true}, add "> " or "< " as appropriate to the output 088 * 089 * @since 3.0 090 */ 091 public PrintCommandListener(PrintStream stream, boolean suppressLogin, char eolMarker, boolean showDirection) { 092 this(new PrintWriter(stream), suppressLogin, eolMarker, showDirection); 093 } 094 095 /** 096 * Create the default instance which prints everything. 097 * 098 * @param writer where to write the commands and responses 099 */ 100 public PrintCommandListener(PrintWriter writer) 101 { 102 this(writer, false); 103 } 104 105 /** 106 * Create an instance which optionally suppresses login command text. 107 * 108 * @param writer where to write the commands and responses 109 * @param suppressLogin if {@code true}, only print command name for login 110 * 111 * @since 3.0 112 */ 113 public PrintCommandListener(PrintWriter writer, boolean suppressLogin) 114 { 115 this(writer, suppressLogin, (char) 0); 116 } 117 118 /** 119 * Create an instance which optionally suppresses login command text 120 * and indicates where the EOL starts with the specified character. 121 * 122 * @param writer where to write the commands and responses 123 * @param suppressLogin if {@code true}, only print command name for login 124 * @param eolMarker if non-zero, add a marker just before the EOL. 125 * 126 * @since 3.0 127 */ 128 public PrintCommandListener(PrintWriter writer, boolean suppressLogin, char eolMarker) 129 { 130 this(writer, suppressLogin, eolMarker, false); 131 } 132 133 /** 134 * Create an instance which optionally suppresses login command text 135 * and indicates where the EOL starts with the specified character. 136 * 137 * @param writer where to write the commands and responses 138 * @param suppressLogin if {@code true}, only print command name for login 139 * @param eolMarker if non-zero, add a marker just before the EOL. 140 * @param showDirection if {@code true}, add "> " or "< " as appropriate to the output 141 * 142 * @since 3.0 143 */ 144 public PrintCommandListener(PrintWriter writer, boolean suppressLogin, char eolMarker, boolean showDirection) 145 { 146 __writer = writer; 147 __nologin = suppressLogin; 148 __eolMarker = eolMarker; 149 __directionMarker = showDirection; 150 } 151 152 public void protocolCommandSent(ProtocolCommandEvent event) 153 { 154 if (__directionMarker) { 155 __writer.print("> "); 156 } 157 if (__nologin) { 158 String cmd = event.getCommand(); 159 if ("PASS".equalsIgnoreCase(cmd) || "USER".equalsIgnoreCase(cmd)) { 160 __writer.print(cmd); 161 __writer.println(" *******"); // Don't bother with EOL marker for this! 162 } else { 163 final String IMAP_LOGIN = "LOGIN"; 164 if (IMAP_LOGIN.equalsIgnoreCase(cmd)) { // IMAP 165 String msg = event.getMessage(); 166 msg=msg.substring(0, msg.indexOf(IMAP_LOGIN)+IMAP_LOGIN.length()); 167 __writer.print(msg); 168 __writer.println(" *******"); // Don't bother with EOL marker for this! 169 } else { 170 __writer.print(getPrintableString(event.getMessage())); 171 } 172 } 173 } else { 174 __writer.print(getPrintableString(event.getMessage())); 175 } 176 __writer.flush(); 177 } 178 179 private String getPrintableString(String msg){ 180 if (__eolMarker == 0) { 181 return msg; 182 } 183 int pos = msg.indexOf(SocketClient.NETASCII_EOL); 184 if (pos > 0) { 185 StringBuilder sb = new StringBuilder(); 186 sb.append(msg.substring(0,pos)); 187 sb.append(__eolMarker); 188 sb.append(msg.substring(pos)); 189 return sb.toString(); 190 } 191 return msg; 192 } 193 public void protocolReplyReceived(ProtocolCommandEvent event) 194 { 195 if (__directionMarker) { 196 __writer.print("< "); 197 } 198 __writer.print(event.getMessage()); 199 __writer.flush(); 200 } 201 } 202