package org.pentaho.reporting.libraries.formula.function.text;
import org.pentaho.reporting.libraries.formula.EvaluationException;
import org.pentaho.reporting.libraries.formula.FormulaContext;
import org.pentaho.reporting.libraries.formula.LibFormulaErrorValue;
import org.pentaho.reporting.libraries.formula.function.Function;
import org.pentaho.reporting.libraries.formula.function.ParameterCallback;
import org.pentaho.reporting.libraries.formula.lvalues.TypeValuePair;
import org.pentaho.reporting.libraries.formula.typing.Type;
import org.pentaho.reporting.libraries.formula.typing.coretypes.TextType;
public class ProperFunction implements Function
{
public ProperFunction()
{
}
public String getCanonicalName()
{
return "PROPER";
}
public TypeValuePair evaluate(final FormulaContext context,
final ParameterCallback parameters) throws EvaluationException
{
final int parameterCount = parameters.getParameterCount();
if (parameterCount != 1)
{
throw EvaluationException.getInstance(LibFormulaErrorValue.ERROR_ARGUMENTS_VALUE);
}
final Type type1 = parameters.getType(0);
final Object value1 = parameters.getValue(0);
final String result = context.getTypeRegistry().convertToText(type1, value1);
if (result == null)
{
throw EvaluationException.getInstance(LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
}
return new TypeValuePair(TextType.TYPE, capitalize(result));
}
private String capitalize(final String text)
{
final char[] textArray = text.toCharArray();
boolean startOfWord = true;
final int textLength = textArray.length;
for (int i = 0; i < textLength; i++)
{
final char c = textArray[i];
// we ignore the punctutation chars or any other possible extra chars
// for now. Words start at whitespaces ...
if (Character.isLetter(c) == false)
{
startOfWord = true;
}
else
{
if (startOfWord == true)
{
if (Character.isLetter(c))
{
textArray[i] = Character.toTitleCase(c);
}
}
startOfWord = false;
}
}
return new String(textArray);
}
}