/**
 *  '$RCSfile: StringUtil.java,v $'
 *  Copyright: 2000 Regents of the University of California
 *    Authors: @authors@
 *    Release: @release@
 *
 *   '$Author: daigle $'
 *     '$Date: 2008-12-11 23:35:47 $'
 * '$Revision: 1.8 $'
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the above
 * copyright notice and the following two paragraphs appear in all copies
 * of this software.
 *
 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
 * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
 * THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
 * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
 * CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
 * ENHANCEMENTS, OR MODIFICATIONS.
 */

package edu.ucsb.nceas.utilities;

import java.io.IOException;
import java.io.Reader;
import java.util.Vector;


/**
 *  General static utilities for String operations
 */
public class StringUtil                                         
{

  /**
  *  private constructor
  */
  private StringUtil() {}

  

  /**
   *  Strips all whitespace characters from the given string. Characters may 
   *  appear anywhere in string - not just a trim() function. Whitespace 
   *  characters removed are currently: ' ', '/t', '/n', '/r' 
   *
   *  @param  input the <code>String</code> whose whitespace will be stripped
   *
   *  @return the <code>String</code> after the whitespace has been stripped
   */
  private static StringBuffer sawBuff = new StringBuffer();
  //
  public static String stripAllWhiteSpace(String input) {

    if (input==null) return null;
    sawBuff.delete(0,sawBuff.length());
    char nextChar = ' ';
    for (int i=0; i<input.length(); i++) {
      nextChar = input.charAt(i);
      if (nextChar != ' ') sawBuff.append(nextChar);
    }
    return stripTabsNewLines(sawBuff.toString());
  }
  
  
  
  
  /**
   *  Strips all '/t', '/n' and '/r' characters from the given string. 
   *` Characters may appear anywhere in string - not just a trim() function. 
   *  Space characters (' ') are *not* removed
   *
   *  @param  input   the <code>String</code> whose tabs and newlines will be 
   *                  stripped
   *
   *  @return the <code>String</code> without the tabs and newlines 
   */
  private static StringBuffer stnlBuff = new StringBuffer();
  //
  public static String stripTabsNewLines(String input) {

    if (input==null) return null;
    stnlBuff.delete(0,stnlBuff.length());
    char nextChar = ' ';
    for (int i=0; i<input.length(); i++) {

      nextChar = input.charAt(i);
      switch (nextChar) {
      case '\r':
      case '\n':
      case '\t':
        break;
      default:
        stnlBuff.append(nextChar);
      }
    }
    return stnlBuff.toString();
  }
  
	/**
	 * Convert a delimited string into a Vector
	 * 
	 * @param list
	 *            delimited list of values
	 * @param delim
	 *            character specifying the delimiter
	 * @return a Vector holding individual values
	 */
	public static Vector<String> toVector(String list, char delim) {
		Vector<String> subList = new Vector<String>();
		if (list == null || list.length() == 0) {
			return subList;
		}

		int fromIndex = 0;
		int toIndex = -2;
		while (toIndex != list.length()) {
			toIndex = list.indexOf(delim, fromIndex);
			if (toIndex == -1) {
				toIndex = list.length();
			}
			subList.add(list.substring(fromIndex, toIndex));
			fromIndex = toIndex + 1;
		}

		return subList;
	} 
  
	/**
	 * Replace any duplicate spaces with single spaces.
	 * 
	 * @param oldString
	 *            the string in which we want to replace duplicate spaces
	 * @return a string holding the modified oldString
	 */
	public static String replaceDuplicateSpaces(String oldString) {		
		while (oldString.contains("  ")) {
			oldString = oldString.replaceAll("  ", " ");
		}

		return oldString;
	} 
	
	/**
	 * Replace any tabs, newlines and carriage returns with single spaces.
	 * 
	 * @param oldString
	 *            the string in which we want to replace tabs, newlines and
	 *            carriage returns
	 * @return a string holding the modified oldString
	 */
	public static String replaceTabsNewLines(String oldString) {		

		oldString = oldString.replaceAll("\r", " ");
		oldString = oldString.replaceAll("\n", " ");
		oldString = oldString.replaceAll("\t", " ");

		return oldString;
	} 
	
	/**
	 * Convert a reader to a string
	 * @param reader the initialized reader
	 * @return string extracted from reader
	 */
	public static String readerToString(Reader reader) throws IOException {
		StringBuffer contents = new StringBuffer();
		int tmp = reader.read();
		while (tmp != -1) {
			contents.append((char)tmp);
			tmp = reader.read();
		}

		reader.reset();
		return contents.toString();
	}
}