package org.eclipse.team.internal.ccvs.core.util;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

import java.util.NoSuchElementException;
import java.util.StringTokenizer;

/**
 * The EmptyTokenizer is essentialy a StringTokenizer.
 * 
 * The difference is that empty Tokens are given back as 
 * empty Strings.
 * 
 * If giveFirst an emptyString is the first return of nextToken() 
 * on line that starts with its delim.
 * 
 * If giveLast an emptyString is the last retrun of nextToken() on
 * line that ends with its delim.
 */
public class EmptyTokenizer {
	
	private StringTokenizer st;
	private boolean lastWasDelim;
	private final boolean giveLast;
	private final boolean giveFirst;
	private String delim;
	private String line;
	
	private String cacheToken;
	
	public EmptyTokenizer(String line, String delim) {
		this(line, delim, false, true);
	}

	public EmptyTokenizer(String line, String delim, boolean giveFirst, boolean giveLast) {
	
		this.delim = delim;
		this.line = line;
		this.giveFirst = giveFirst;
		lastWasDelim = giveFirst;
		this.giveLast = giveLast;
		
		st = new StringTokenizer(line, delim, true);
		startCacheToken();
		
	}
	
	/**
	 * Call this before using cachedNextToken().
	 */
	private void startCacheToken() {
		if (st.hasMoreTokens()) {
			cacheToken = st.nextToken();
		} else {
			cacheToken = null;
		}
	}
	
	/**
	 * Gives the next Token back. Ensures that cacheToken holds the
	 * next Token to be given back. 
	 * This is done to have a chance to predict if we have got a token
	 * at the end of the entry.
	 */
	private String cachedNextToken() throws NoSuchElementException {	
		
		String oldCacheToken = cacheToken;
		
		if (cacheToken == null) {
			throw new NoSuchElementException();
		}
	
		if (st.hasMoreTokens()) {
			cacheToken = st.nextToken();
		} else {
			cacheToken = null;
		}
		
		return oldCacheToken;
	}
		
	
	public boolean hasMoreTokens() {
		return (giveLast && lastWasDelim) || 
			   (cacheToken != null && !cacheToken.equals(delim)) ||
			   (cacheToken != null && cacheToken.equals(delim) && st.hasMoreTokens()) ||
			   (cacheToken != null && cacheToken.equals(delim) && giveLast);
	}
	
	public String nextToken() {
		
		String token;
		
		if (giveLast && lastWasDelim && cacheToken == null) {
			lastWasDelim = false;			
			return ""; //$NON-NLS-1$
		}
		
		token = cachedNextToken();
		
		if (!token.equals(delim)) {
			lastWasDelim = false;
			return token;
		}
		
		if (lastWasDelim) {
			return ""; //$NON-NLS-1$
		} else {
			lastWasDelim = true;
			return nextToken();
		}		
	}
	
	public int countTokens() {
		
		EmptyTokenizer tmpEmptyTokenizer;
		int i=0;
		
		tmpEmptyTokenizer = new EmptyTokenizer(line, delim, giveFirst, giveLast);
		while (tmpEmptyTokenizer.hasMoreTokens()) {
			tmpEmptyTokenizer.nextToken();
			i++;
		}
		
		return i;

	}
	
}
