package org.msh.utils;

import org.apache.commons.beanutils.PropertyUtils;

import java.util.StringTokenizer;

public class TextUtils {

	/**
	 * Set the string property of a bean to upper case
	 * @param bean
	 * @param property
	 */
	public static void setPropertyUpperCase(Object bean, String propName) {
		try {
			String value = (String)PropertyUtils.getProperty(bean, propName);
			if (value != null) {
				value = value.toUpperCase();
				PropertyUtils.setProperty(bean, propName, value);
			}
			
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}


	public interface TokenInterpreter {
		String translate(String token);
	}


	/**
	 * Recognizes all occurrences of delimited el expressions #{token} and call {@link TokenInterpreter}
	 * to translate token
	 * @param text
	 * @param interp
	 * @return
	 */
	public static String eltokenFormat(String text, TokenInterpreter interp) {
		StringTokenizer tokens = new StringTokenizer(text, "#}", true);
		StringBuilder res = new StringBuilder(text.length());

		while (tokens.hasMoreTokens()) {
			String token = tokens.nextToken();
			if ("#".equals(token) && tokens.hasMoreTokens()) {
				String expressionToken = tokens.nextToken();
				String endToken = tokens.nextToken();
				
				if (!expressionToken.startsWith("{") || !endToken.equals("}")) {
					res.append(token).append(expressionToken + endToken);
				} else {
					String fieldName = expressionToken.substring(1);
					String s = interp.translate(fieldName);
					if (s == null) {
						res.append("#{" + fieldName + "}");
					}
					else {
						res.append(s);
					}
				}    
			} else {
				res.append(token);
			}
		}
		
		return res.toString();
	}
}
