001 /* 002 * Copyright 2001-2005 The Apache Software Foundation 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 org.apache.commons.net; 017 018 import java.io.BufferedReader; 019 import java.io.IOException; 020 import java.io.InputStream; 021 import java.io.InputStreamReader; 022 import java.io.BufferedOutputStream; 023 import java.io.DataOutputStream; 024 025 /*** 026 * The FingerClient class implements the client side of the Internet Finger 027 * Protocol defined in RFC 1288. To finger a host you create a 028 * FingerClient instance, connect to the host, query the host, and finally 029 * disconnect from the host. If the finger service you want to query is on 030 * a non-standard port, connect to the host at that port. 031 * Here's a sample use: 032 * <pre> 033 * FingerClient finger; 034 * 035 * finger = new FingerClient(); 036 * 037 * try { 038 * finger.connect("foo.bar.com"); 039 * System.out.println(finger.query("foobar", false)); 040 * finger.disconnect(); 041 * } catch(IOException e) { 042 * System.err.println("Error I/O exception: " + e.getMessage()); 043 * return; 044 * } 045 * </pre> 046 * <p> 047 * <p> 048 * @author Daniel F. Savarese 049 ***/ 050 051 public class FingerClient extends SocketClient 052 { 053 /*** 054 * The default FINGER port. Set to 79 according to RFC 1288. 055 ***/ 056 public static final int DEFAULT_PORT = 79; 057 058 private static final String __LONG_FLAG = "/W "; 059 060 private transient StringBuffer __query = new StringBuffer(64); 061 private transient char[] __buffer = new char[1024]; 062 063 /*** 064 * The default FingerClient constructor. Initializes the 065 * default port to <code> DEFAULT_PORT </code>. 066 ***/ 067 public FingerClient() 068 { 069 setDefaultPort(DEFAULT_PORT); 070 } 071 072 073 /*** 074 * Fingers a user at the connected host and returns the output 075 * as a String. You must first connect to a finger server before 076 * calling this method, and you should disconnect afterward. 077 * <p> 078 * @param longOutput Set to true if long output is requested, false if not. 079 * @param username The name of the user to finger. 080 * @return The result of the finger query. 081 * @exception IOException If an I/O error occurs while reading the socket. 082 ***/ 083 public String query(boolean longOutput, String username) throws IOException 084 { 085 int read; 086 StringBuffer result = new StringBuffer(__buffer.length); 087 BufferedReader input; 088 089 input = 090 new BufferedReader(new InputStreamReader(getInputStream(longOutput, 091 username))); 092 093 while (true) 094 { 095 read = input.read(__buffer, 0, __buffer.length); 096 if (read <= 0) 097 break; 098 result.append(__buffer, 0, read); 099 } 100 101 input.close(); 102 103 return result.toString(); 104 } 105 106 107 /*** 108 * Fingers the connected host and returns the output 109 * as a String. You must first connect to a finger server before 110 * calling this method, and you should disconnect afterward. 111 * This is equivalent to calling <code> query(longOutput, "") </code>. 112 * <p> 113 * @param longOutput Set to true if long output is requested, false if not. 114 * @return The result of the finger query. 115 * @exception IOException If an I/O error occurs while reading the socket. 116 ***/ 117 public String query(boolean longOutput) throws IOException 118 { 119 return query(longOutput, ""); 120 } 121 122 123 /*** 124 * Fingers a user and returns the input stream from the network connection 125 * of the finger query. You must first connect to a finger server before 126 * calling this method, and you should disconnect after finishing reading 127 * the stream. 128 * <p> 129 * @param longOutput Set to true if long output is requested, false if not. 130 * @param username The name of the user to finger. 131 * @return The InputStream of the network connection of the finger query. 132 * Can be read to obtain finger results. 133 * @exception IOException If an I/O error during the operation. 134 ***/ 135 public InputStream getInputStream(boolean longOutput, String username) 136 throws IOException 137 { 138 DataOutputStream output; 139 140 __query.setLength(0); 141 if (longOutput) 142 __query.append(__LONG_FLAG); 143 __query.append(username); 144 __query.append(SocketClient.NETASCII_EOL); 145 146 output = 147 new DataOutputStream(new BufferedOutputStream(_output_, 1024)); 148 output.writeBytes(__query.toString()); 149 output.flush(); 150 151 return _input_; 152 } 153 154 155 /*** 156 * Fingers the connected host and returns the input stream from 157 * the network connection of the finger query. This is equivalent to 158 * calling getInputStream(longOutput, ""). You must first connect to a 159 * finger server before calling this method, and you should disconnect 160 * after finishing reading the stream. 161 * <p> 162 * @param longOutput Set to true if long output is requested, false if not. 163 * @return The InputStream of the network connection of the finger query. 164 * Can be read to obtain finger results. 165 * @exception IOException If an I/O error during the operation. 166 ***/ 167 public InputStream getInputStream(boolean longOutput) throws IOException 168 { 169 return getInputStream(longOutput, ""); 170 } 171 172 }