/*
 * Copyright (c) 2002 Jaru Soft, 
 *                    All Rights Reserved.
 * 
 * ÀÌ ¶óÀÌºê·¯¸®´Â ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾îÀÔ´Ï´Ù. 
 * ¼ÒÇÁÆ®¿þ¾îÀÇ ÇÇ¾çµµÀÚ´Â ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´ÜÀÌ °øÇ¥ÇÑ GNU ¾à¼Ò ÀÏ¹Ý °øÁß »ç¿ë Çã°¡¼­ 2.1ÆÇ ¶Ç´Â 
 * ±× ÀÌÈÄ ÆÇÀ» ÀÓÀÇ·Î ¼±ÅÃÇØ¼­, ±× ±ÔÁ¤¿¡ µû¶ó ¶óÀÌºê·¯¸®¸¦ °³ÀÛÇÏ°Å³ª Àç¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * 
 * ÀÌ ¶óÀÌºê·¯¸®´Â À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖÀ¸¸®¶ó´Â Èñ¸Á¿¡¼­ ¹èÆ÷µÇ°í ÀÖÁö¸¸, 
 * Æ¯Á¤ÇÑ ¸ñÀû¿¡ ¸Â´Â ÀûÇÕ¼º ¿©ºÎ³ª ÆÇ¸Å¿ëÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖÀ¸¸®¶ó´Â 
 * ¹¬½ÃÀûÀÎ º¸ÁõÀ» Æ÷ÇÔÇÑ ¾î¶°ÇÑ ÇüÅÂÀÇ º¸Áõµµ Á¦°øÇÏÁö ¾Ê½À´Ï´Ù. 
 * º¸´Ù ÀÚ¼¼ÇÑ »çÇ×¿¡ ´ëÇØ¼­´Â GNU ¾à¼Ò ÀÏ¹Ý °øÁß »ç¿ë Çã°¡¼­¸¦ Âü°íÇÏ½Ã±â ¹Ù¶ø´Ï´Ù. 
 * 
 * GNU ¾à¼Ò ÀÏ¹Ý °øÁß »ç¿ë Çã°¡¼­´Â ÀÌ ¶óÀÌºê·¯¸®¿Í ÇÔ²² Á¦°øµË´Ï´Ù. 
 * 
 * [°³¹ßÁ¤º¸]
 * ¸¸µçÀÌ : kangwoo(kangwoo@jarusoft.com)
 * ¸¸µç°÷ : ÀÚ·ç(http://www.jarusoft.com)
 * ¸¸µç³¯ : 2002. 04. 11.
 * 
 * [°³¹ß±â·Ï]
 *  1.0.0 - 2002. 04. 11. kangwoo
 *      : Ã³À½ ¸¸µë
 *      
 *  1.0.1 - 2008. 11. 11. badnom
 *      : ÀçÁ¤¸®
 */
package kr.kangwoo.util;

/**
 * <p>StrTokenizer Å¬·¡½º¸¦ »ç¿ëÇÏ¸é, ¹®ÀÚ¿­À» ±¸ºÐÀÚ·Î ºÐÇÒ ÇÒ ¼ö ÀÖ½À´Ï´Ù.</p>
 * <pre> ±¸ºÐÀÚ »çÀÌ¿¡ ¾Æ¹«°Íµµ ¾øÀ¸¸é, °ø¹é¹®ÀÚ¸¦ ¹ÝÈ¯ÇÑ´Ù.
 * ex) 1||3 -> 1, °ø¹é, 3 ÀÌ·¸°Ô 3°³ÀÇ ÅäÅ«À» ¹ÝÈ¯ÇÑ´Ù.
 * </pre>
 * 
 * @author <a href="mailto:kangwoo@jarusoft.com">kangwoo</a>
 * @version v 1.0
 */
public class StrTokenizer  {
	
	private int currentPosition;
	private int maxPosition;
	private String str;
	private String delimiter;
	private int delimiterSize;
	
	private int countTokens	 = -1;	// TokenÀÇ °¹¼ö
	
	/**
	 * ´ë»ó ¹®ÀÚ¿­¿¡ ´ëÇÑ Tokenizer¸¦ »ý¼ºÇÕ´Ï´Ù. ±¸ºÐÀÚ´Â ±âº»°ª(" ")À¸·Î »ç¿ëÇÕ´Ï´Ù.
	 * 
	 * @param str ´ë»ó ¹®ÀÚ¿­
	 */
	public StrTokenizer(String str) {
		this(str, " ");
	}
	
	/**
	 * ´ë»ó ¹®ÀÚ¿­¿¡ ´ëÇÑ Tokenizer¸¦ »ý¼ºÇÕ´Ï´Ù. delim´Â ±¸ºÐÀÚÀÌ´Ï´Ù.
	 * 
	 * 
	 * @param str ´ë»ó ¹®ÀÚ¿­
	 * @param delim ±¸ºÐÀÚ
	 * @throws NullPointerException - str °¡ null °æ¿ì
	 */
	public StrTokenizer(String str, String delim) {
		this.str = str;
		this.delimiter = delim;
		currentPosition = 0;
		maxPosition = this.str.length();
		delimiterSize = this.delimiter.length(); 
	}	
	
	/**
	 * ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ÅäÅ«ÀÌ ´õ Á¸ÀçÇÏÁö¸¦ ÆÇ´ÜÇÕ´Ï´Ù. ÀÌ ¸Þ¼­µå°¡ <code>true</code>¸¦ µ¹·ÁÁÖ´Â °æ¿ì, nextToken ¸Þ¼Òµå¸¦ È£ÃâÇØ ´ÙÀ½ ÅäÅ«À» °¡Á®°¥ ¼ö ÀÖ½À´Ï´Ù.
	 *  
	 * @return Çö À§Ä¡ÀÇ µÚ·Î, 1°³ ÀÌ»óÀÇ ÅäÅ«ÀÌ Á¸ÀçÇÒ °æ¿ì true, ±×·¸Áö ¾ÊÀ» °æ¿ì false
	 */
	public boolean hasMoreTokens() {
		return ( (currentPosition <= maxPosition) || (str.indexOf(delimiter, currentPosition) > -1));
	}
	
	/**
	 * ´ÙÀ½ ÅäÅ«À» ¹ÝÈ¯ÇÑ´Ù.
	 * ¹ÝÈ¯ÇÒ ÅäÅ«ÀÌ ¾øÀ¸¸é nullÀ» µ¹·ÁÁØ´Ù.
	 * 
	 * @return ´ÙÀ½ ÅäÅ«
	 */
	public String nextToken() {
		String result = null;
		int index = str.indexOf(delimiter, currentPosition);
		if (index > -1) {
			result = str.substring(currentPosition, index);
			currentPosition = index + delimiterSize;
		} else {
			result = str.substring(currentPosition);
			currentPosition = maxPosition + delimiterSize;
		}
		return result;
	}
	
	/**
	 * ÅäÅ«ÀÇ ÃÑ °¹¼ö¸¦ ¹ÝÈ¯ÇÑ´Ù.
	 * 
	 * @return ÅäÅ«ÀÇ ÃÑ °¹¼ö
	 */
	public int countTokens() {
		if (countTokens < 0) {
			int tCountTokens = 1;
			int cPos = 0;
			int index = 0;
			while ((index = str.indexOf(delimiter, cPos)) > -1) {
			    tCountTokens++;
				cPos = index + delimiterSize;
			}
			countTokens = tCountTokens;
		}
		return countTokens;
	}
	
	/**
	 * ¹è¿­ Å©±â ¸¸Å­ÀÇ ¹®ÀÚ¿­¹è¿­À» ¸¸µçÈÄ, ÅäÅ« °ªÀ» Ã¤¿ö³ÖÀº ÈÄ ¹ÝÈ¯ÇÑ´Ù.
	 * ÅäÅ« °¹¼ö°¡ ¹è¿­ Å©±âº¸´Ù ÀÛÀ» °æ¿ì´Â, ³ª¸ÓÁö °ªÀ» null·Î ¼³Á¤ÇÑ°í,
	 * ÅäÅ« °¹¼ö°¡ ¹è¿­ Å©±âº¸´Ù Å¬ °æ¿ì´Â, ¹è¿­ Å©±â¸¸Å­¸¸ °ªÀ» ¼³Á¤ÇÑ´Ù.
	 * 
	 * @param arraySize ¹è¿­ Å©±â
	 * @return
	 */
	public String[] toArray(int arraySize) {
	    String[] array = new String[arraySize];
	    for (int i = 0; i < arraySize && hasMoreTokens(); i++) {
	        array[i] = nextToken();
	    }
	    return array;
	}
	
	/**
	 * ÅäÅ«µéÀ» ¹®ÀÚ¿­¹è¿­·Î ¸¸µç´Ù.
	 * ¹®ÀÚ¿­¹è¿­ÀÇ Å©±â´Â ÅäÅ«ÀÇ Å©±â·Î ¸¸µé¾îÁø´Ù.
	 * 
	 * @return ¹®ÀÚ¿­¹è¿­
	 */
	public String[] toArray() {
	    return toArray(countTokens());
	}
	
}
