1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.commons.net; 19 20 import java.io.PrintStream; 21 import java.io.PrintWriter; 22 23 /*** 24 * This is a support class for some of the example programs. It is 25 * a sample implementation of the ProtocolCommandListener interface 26 * which just prints out to a specified stream all command/reply traffic. 27 * <p> 28 * 29 * @since 2.0 30 ***/ 31 32 public class PrintCommandListener implements ProtocolCommandListener 33 { 34 private final PrintWriter __writer; 35 private final boolean __nologin; 36 private final char __eolMarker; 37 private final boolean __directionMarker; 38 39 /** 40 * Create the default instance which prints everything. 41 * 42 * @param stream where to write the commands and responses 43 * e.g. System.out 44 * @since 3.0 45 */ 46 public PrintCommandListener(PrintStream stream) 47 { 48 this(new PrintWriter(stream)); 49 } 50 51 /** 52 * Create an instance which optionally suppresses login command text 53 * and indicates where the EOL starts with the specified character. 54 * 55 * @param stream where to write the commands and responses 56 * @param suppressLogin if {@code true}, only print command name for login 57 * 58 * @since 3.0 59 */ 60 public PrintCommandListener(PrintStream stream, boolean suppressLogin) { 61 this(new PrintWriter(stream), suppressLogin); 62 } 63 64 /** 65 * Create an instance which optionally suppresses login command text 66 * and indicates where the EOL starts with the specified character. 67 * 68 * @param stream where to write the commands and responses 69 * @param suppressLogin if {@code true}, only print command name for login 70 * @param eolMarker if non-zero, add a marker just before the EOL. 71 * 72 * @since 3.0 73 */ 74 public PrintCommandListener(PrintStream stream, boolean suppressLogin, char eolMarker) { 75 this(new PrintWriter(stream), suppressLogin, eolMarker); 76 } 77 78 /** 79 * Create an instance which optionally suppresses login command text 80 * and indicates where the EOL starts with the specified character. 81 * 82 * @param stream where to write the commands and responses 83 * @param suppressLogin if {@code true}, only print command name for login 84 * @param eolMarker if non-zero, add a marker just before the EOL. 85 * @param showDirection if {@code true}, add "> " or "< " as appropriate to the output 86 * 87 * @since 3.0 88 */ 89 public PrintCommandListener(PrintStream stream, boolean suppressLogin, char eolMarker, boolean showDirection) { 90 this(new PrintWriter(stream), suppressLogin, eolMarker, showDirection); 91 } 92 93 /** 94 * Create the default instance which prints everything. 95 * 96 * @param writer where to write the commands and responses 97 */ 98 public PrintCommandListener(PrintWriter writer) 99 { 100 this(writer, false); 101 } 102 103 /** 104 * Create an instance which optionally suppresses login command text. 105 * 106 * @param writer where to write the commands and responses 107 * @param suppressLogin if {@code true}, only print command name for login 108 * 109 * @since 3.0 110 */ 111 public PrintCommandListener(PrintWriter writer, boolean suppressLogin) 112 { 113 this(writer, suppressLogin, (char) 0); 114 } 115 116 /** 117 * Create an instance which optionally suppresses login command text 118 * and indicates where the EOL starts with the specified character. 119 * 120 * @param writer where to write the commands and responses 121 * @param suppressLogin if {@code true}, only print command name for login 122 * @param eolMarker if non-zero, add a marker just before the EOL. 123 * 124 * @since 3.0 125 */ 126 public PrintCommandListener(PrintWriter writer, boolean suppressLogin, char eolMarker) 127 { 128 this(writer, suppressLogin, eolMarker, false); 129 } 130 131 /** 132 * Create an instance which optionally suppresses login command text 133 * and indicates where the EOL starts with the specified character. 134 * 135 * @param writer where to write the commands and responses 136 * @param suppressLogin if {@code true}, only print command name for login 137 * @param eolMarker if non-zero, add a marker just before the EOL. 138 * @param showDirection if {@code true}, add "> " or "< " as appropriate to the output 139 * 140 * @since 3.0 141 */ 142 public PrintCommandListener(PrintWriter writer, boolean suppressLogin, char eolMarker, boolean showDirection) 143 { 144 __writer = writer; 145 __nologin = suppressLogin; 146 __eolMarker = eolMarker; 147 __directionMarker = showDirection; 148 } 149 150 // @Override 151 public void protocolCommandSent(ProtocolCommandEvent event) 152 { 153 if (__directionMarker) { 154 __writer.print("> "); 155 } 156 if (__nologin) { 157 String cmd = event.getCommand(); 158 if ("PASS".equalsIgnoreCase(cmd) || "USER".equalsIgnoreCase(cmd)) { 159 __writer.print(cmd); 160 __writer.println(" *******"); // Don't bother with EOL marker for this! 161 } else { 162 final String IMAP_LOGIN = "LOGIN"; 163 if (IMAP_LOGIN.equalsIgnoreCase(cmd)) { // IMAP 164 String msg = event.getMessage(); 165 msg=msg.substring(0, msg.indexOf(IMAP_LOGIN)+IMAP_LOGIN.length()); 166 __writer.print(msg); 167 __writer.println(" *******"); // Don't bother with EOL marker for this! 168 } else { 169 __writer.print(getPrintableString(event.getMessage())); 170 } 171 } 172 } else { 173 __writer.print(getPrintableString(event.getMessage())); 174 } 175 __writer.flush(); 176 } 177 178 private String getPrintableString(String msg){ 179 if (__eolMarker == 0) { 180 return msg; 181 } 182 int pos = msg.indexOf(SocketClient.NETASCII_EOL); 183 if (pos > 0) { 184 StringBuilder sb = new StringBuilder(); 185 sb.append(msg.substring(0,pos)); 186 sb.append(__eolMarker); 187 sb.append(msg.substring(pos)); 188 return sb.toString(); 189 } 190 return msg; 191 } 192 // @Override 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