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 );
}
}