001 /* 002 * $HeadURL: http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.11/src/java/org/apache/commons/ssl/Util.java $ 003 * $Revision: 132 $ 004 * $Date: 2008-01-11 21:20:26 -0800 (Fri, 11 Jan 2008) $ 005 * 006 * ==================================================================== 007 * Licensed to the Apache Software Foundation (ASF) under one 008 * or more contributor license agreements. See the NOTICE file 009 * distributed with this work for additional information 010 * regarding copyright ownership. The ASF licenses this file 011 * to you under the Apache License, Version 2.0 (the 012 * "License"); you may not use this file except in compliance 013 * with the License. You may obtain a copy of the License at 014 * 015 * http://www.apache.org/licenses/LICENSE-2.0 016 * 017 * Unless required by applicable law or agreed to in writing, 018 * software distributed under the License is distributed on an 019 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 020 * KIND, either express or implied. See the License for the 021 * specific language governing permissions and limitations 022 * under the License. 023 * ==================================================================== 024 * 025 * This software consists of voluntary contributions made by many 026 * individuals on behalf of the Apache Software Foundation. For more 027 * information on the Apache Software Foundation, please see 028 * <http://www.apache.org/>. 029 * 030 */ 031 032 package org.apache.commons.ssl; 033 034 import org.apache.commons.ssl.util.ByteArrayReadLine; 035 036 import java.io.ByteArrayInputStream; 037 import java.io.IOException; 038 import java.io.InputStream; 039 import java.io.OutputStream; 040 import java.net.UnknownHostException; 041 import java.util.LinkedList; 042 import java.util.Map; 043 import java.util.StringTokenizer; 044 import java.util.TreeMap; 045 046 /** 047 * @author Credit Union Central of British Columbia 048 * @author <a href="http://www.cucbc.com/">www.cucbc.com</a> 049 * @author <a href="mailto:juliusdavies@cucbc.com">juliusdavies@cucbc.com</a> 050 * @since 28-Feb-2006 051 */ 052 public class Util { 053 public final static int SIZE_KEY = 0; 054 public final static int LAST_READ_KEY = 1; 055 056 public static boolean isYes(String yesString) { 057 if (yesString == null) { 058 return false; 059 } 060 String s = yesString.trim().toUpperCase(); 061 return "1".equals(s) || "YES".equals(s) || "TRUE".equals(s) || 062 "ENABLE".equals(s) || "ENABLED".equals(s) || "Y".equals(s) || 063 "ON".equals(s); 064 } 065 066 public static String trim(final String s) { 067 if (s == null || "".equals(s)) { 068 return s; 069 } 070 int i = 0; 071 int j = s.length() - 1; 072 while (isWhiteSpace(s.charAt(i))) { 073 i++; 074 } 075 while (isWhiteSpace(s.charAt(j))) { 076 j--; 077 } 078 return j >= i ? s.substring(i, j + 1) : ""; 079 } 080 081 public static boolean isWhiteSpace(final char c) { 082 switch (c) { 083 case 0: 084 case ' ': 085 case '\t': 086 case '\n': 087 case '\r': 088 case '\f': 089 return true; 090 default: 091 return false; 092 } 093 } 094 095 public static void pipeStream(InputStream in, OutputStream out) 096 throws IOException { 097 pipeStream(in, out, true); 098 } 099 100 public static void pipeStream(InputStream in, OutputStream out, 101 boolean autoClose) 102 throws IOException { 103 byte[] buf = new byte[8192]; 104 IOException ioe = null; 105 try { 106 int bytesRead = in.read(buf); 107 while (bytesRead >= 0) { 108 if (bytesRead > 0) { 109 out.write(buf, 0, bytesRead); 110 } 111 bytesRead = in.read(buf); 112 } 113 } 114 finally { 115 // Probably it's best to let consumer call "close", but I'm usually 116 // the consumer, and I want to be lazy. [Julius, November 20th, 2006] 117 try { in.close(); } catch (IOException e) { ioe = e; } 118 if (autoClose) { 119 try { out.close(); } catch (IOException e) { ioe = e; } 120 } 121 } 122 if (ioe != null) { 123 throw ioe; 124 } 125 } 126 127 public static byte[] streamToBytes(final ByteArrayInputStream in, 128 int maxLength) { 129 byte[] buf = new byte[maxLength]; 130 int[] status = fill(buf, 0, in); 131 int size = status[SIZE_KEY]; 132 if (buf.length != size) { 133 byte[] smallerBuf = new byte[size]; 134 System.arraycopy(buf, 0, smallerBuf, 0, size); 135 buf = smallerBuf; 136 } 137 return buf; 138 } 139 140 public static byte[] streamToBytes(final InputStream in, int maxLength) 141 throws IOException { 142 byte[] buf = new byte[maxLength]; 143 int[] status = fill(buf, 0, in); 144 int size = status[SIZE_KEY]; 145 if (buf.length != size) { 146 byte[] smallerBuf = new byte[size]; 147 System.arraycopy(buf, 0, smallerBuf, 0, size); 148 buf = smallerBuf; 149 } 150 return buf; 151 } 152 153 public static byte[] streamToBytes(final InputStream in) throws IOException { 154 byte[] buf = new byte[4096]; 155 try { 156 int[] status = fill(buf, 0, in); 157 int size = status[SIZE_KEY]; 158 int lastRead = status[LAST_READ_KEY]; 159 while (lastRead != -1) { 160 buf = resizeArray(buf); 161 status = fill(buf, size, in); 162 size = status[SIZE_KEY]; 163 lastRead = status[LAST_READ_KEY]; 164 } 165 if (buf.length != size) { 166 byte[] smallerBuf = new byte[size]; 167 System.arraycopy(buf, 0, smallerBuf, 0, size); 168 buf = smallerBuf; 169 } 170 } 171 finally { 172 in.close(); 173 } 174 return buf; 175 } 176 177 public static byte[] streamToBytes(final ByteArrayInputStream in) { 178 byte[] buf = new byte[4096]; 179 int[] status = fill(buf, 0, in); 180 int size = status[SIZE_KEY]; 181 int lastRead = status[LAST_READ_KEY]; 182 while (lastRead != -1) { 183 buf = resizeArray(buf); 184 status = fill(buf, size, in); 185 size = status[SIZE_KEY]; 186 lastRead = status[LAST_READ_KEY]; 187 } 188 if (buf.length != size) { 189 byte[] smallerBuf = new byte[size]; 190 System.arraycopy(buf, 0, smallerBuf, 0, size); 191 buf = smallerBuf; 192 } 193 // in.close(); <-- this is a no-op on ByteArrayInputStream. 194 return buf; 195 } 196 197 public static int[] fill(final byte[] buf, final int offset, 198 final InputStream in) 199 throws IOException { 200 int read = in.read(buf, offset, buf.length - offset); 201 int lastRead = read; 202 if (read == -1) { 203 read = 0; 204 } 205 while (lastRead != -1 && read + offset < buf.length) { 206 lastRead = in.read(buf, offset + read, buf.length - read - offset); 207 if (lastRead != -1) { 208 read += lastRead; 209 } 210 } 211 return new int[]{offset + read, lastRead}; 212 } 213 214 public static int[] fill(final byte[] buf, final int offset, 215 final ByteArrayInputStream in) { 216 int read = in.read(buf, offset, buf.length - offset); 217 int lastRead = read; 218 if (read == -1) { 219 read = 0; 220 } 221 while (lastRead != -1 && read + offset < buf.length) { 222 lastRead = in.read(buf, offset + read, buf.length - read - offset); 223 if (lastRead != -1) { 224 read += lastRead; 225 } 226 } 227 return new int[]{offset + read, lastRead}; 228 } 229 230 public static byte[] resizeArray(final byte[] bytes) { 231 byte[] biggerBytes = new byte[bytes.length * 2]; 232 System.arraycopy(bytes, 0, biggerBytes, 0, bytes.length); 233 return biggerBytes; 234 } 235 236 public static String pad(String s, final int length, final boolean left) { 237 if (s == null) { 238 s = ""; 239 } 240 int diff = length - s.length(); 241 if (diff == 0) { 242 return s; 243 } else if (diff > 0) { 244 StringBuffer sb = new StringBuffer(); 245 if (left) { 246 for (int i = 0; i < diff; i++) { 247 sb.append(' '); 248 } 249 } 250 sb.append(s); 251 if (!left) { 252 for (int i = 0; i < diff; i++) { 253 sb.append(' '); 254 } 255 } 256 return sb.toString(); 257 } else { 258 return s; 259 } 260 } 261 262 public static Map parseArgs(final String[] cargs) { 263 Map args = new TreeMap(); 264 Map ARGS_MATCH = Ping.ARGS_MATCH; 265 266 int l = cargs.length; 267 final String[] EMPTY_VALUES = {""}; 268 for (int i = 0; i < l; i++) { 269 String k = cargs[i]; 270 Ping.Arg a = (Ping.Arg) ARGS_MATCH.get(k); 271 if (l > i + 1) { 272 String v = cargs[++i]; 273 while (ARGS_MATCH.containsKey(v)) { 274 args.put(a, EMPTY_VALUES); 275 a = (Ping.Arg) ARGS_MATCH.get(v); 276 v = ""; 277 if (l > i + 1) { 278 v = cargs[++i]; 279 } 280 } 281 String[] values = new String[1]; 282 values[0] = v; 283 args.put(a, values); 284 if (l > i + 1 && !ARGS_MATCH.containsKey(cargs[i + 1])) { 285 LinkedList list = new LinkedList(); 286 list.add(v); 287 while (l > i + 1 && !ARGS_MATCH.containsKey(cargs[i + 1])) { 288 v = cargs[++i]; 289 list.add(v); 290 } 291 args.put(a, list.toArray(new String[list.size()])); 292 } 293 } else { 294 args.put(a, EMPTY_VALUES); 295 } 296 } 297 return args; 298 } 299 300 public static HostPort toAddress(final String target, 301 final int defaultPort) 302 throws UnknownHostException { 303 String host = target; 304 int port = defaultPort; 305 StringTokenizer st = new StringTokenizer(target, ":"); 306 if (st.hasMoreTokens()) { 307 host = st.nextToken().trim(); 308 } 309 if (st.hasMoreTokens()) { 310 port = Integer.parseInt(st.nextToken().trim()); 311 } 312 if (st.hasMoreTokens()) { 313 throw new IllegalArgumentException("Invalid host: " + target); 314 } 315 return new HostPort(host, port); 316 } 317 318 public static String cipherToAuthType(String cipher) { 319 if (cipher == null) { 320 return null; 321 } 322 323 // SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA ==> "DHE_DSS_EXPORT" 324 // SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA ==> "DHE_DSS" 325 // SSL_RSA_WITH_3DES_EDE_CBC_SHA ==> "RSA" 326 327 StringTokenizer st = new StringTokenizer(cipher.trim(), "_"); 328 if (st.hasMoreTokens()) { 329 st.nextToken(); // always skip first token 330 } 331 if (st.hasMoreTokens()) { 332 String tok = st.nextToken(); 333 StringBuffer buf = new StringBuffer(); 334 buf.append(tok); 335 if (st.hasMoreTokens()) { 336 tok = st.nextToken(); 337 while (!"WITH".equalsIgnoreCase(tok)) { 338 buf.append('_'); 339 buf.append(tok); 340 tok = st.nextToken(); 341 } 342 } 343 return buf.toString(); 344 } 345 throw new IllegalArgumentException("not a valid cipher: " + cipher); 346 } 347 348 349 public static void main(String[] args) throws Exception { 350 String s = "line1\n\rline2\n\rline3"; 351 ByteArrayInputStream in = new ByteArrayInputStream(s.getBytes()); 352 ByteArrayReadLine readLine = new ByteArrayReadLine(in); 353 String line = readLine.next(); 354 while (line != null) { 355 System.out.println(line); 356 line = readLine.next(); 357 } 358 359 System.out.println("--------- test 2 ----------"); 360 361 s = "line1\n\rline2\n\rline3\n\r\n\r"; 362 in = new ByteArrayInputStream(s.getBytes()); 363 readLine = new ByteArrayReadLine(in); 364 line = readLine.next(); 365 while (line != null) { 366 System.out.println(line); 367 line = readLine.next(); 368 } 369 370 } 371 372 373 }