package es.ejie.frmk.admon.logs;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import es.ejie.frmk.infraestructura.logs.base.Q70LogInterno;

/**
 * @version 1.0
 * Fecha: 18-mar-04
 */
public class Q70ColumnParser {
	
	//utilizado para realizar el parseo de las columnas
	StringTokenizer st;
	String actualToken = null;
	
	private String columnas; 
	
	public Q70ColumnParser(String columnas)
	{
		this.columnas = columnas;	
	}
	
	//tamaño por defecto para las columnas que no lo especifican;
	private final static int DEFAULT_SIZE = 15;
	//lee los tokens evitando caracteres en blanco 
	private String nextToken()
	{
		String token = null;
		do
		{
			if (st.hasMoreTokens())
				token = st.nextToken();
			else
				return null;
		}
		while (token.equals(" "));

		if (Q70LogInterno.isEnabled())
			Q70LogInterno.log("next token: " + token);
		return token;
	}

	private void column(List list)
	{
		int size = DEFAULT_SIZE;
		String columnName = nextToken();
		actualToken = nextToken();
		if (actualToken != null && actualToken.equals("("))
		{
			//viene el tamaño
			actualToken = nextToken();
			try
			{
				size = Integer.parseInt(actualToken);
			}
			catch (java.lang.NumberFormatException nfe)
			{
				if (Q70LogInterno.isEnabled())
					Q70LogInterno.log(actualToken + " no es un número");
				size = DEFAULT_SIZE;
			}
			actualToken = nextToken();
			if (actualToken != null && actualToken.equals(")"))
			{
				Q70Columna col = new Q70Columna(columnName, size);
				list.add(col);
				if (Q70LogInterno.isEnabled())
					Q70LogInterno.log("columna: " + columnName + " tamaño: " + size);
				actualToken = nextToken();
			}
		}
		else
		{
			Q70Columna col = new Q70Columna(columnName, DEFAULT_SIZE);
			list.add(col);
			if (Q70LogInterno.isEnabled())
				Q70LogInterno.log("columna: " + columnName + " tamaño: " + DEFAULT_SIZE);
		}

	}

	
	public List parseColumns()
	{
		List listaColumnas = new ArrayList();
		if (columnas != null && !columnas.trim().equals(""))
		{
			st = new StringTokenizer(columnas, ",()", true);

			if (st.hasMoreTokens())
			{
				column(listaColumnas);

				while (actualToken != null)
				{
					if (actualToken.equals(","))
						column(listaColumnas);
					else
					{
						return listaColumnas;
					}
				}
			}
		}
		return listaColumnas;

	}
}
