public TypeValuePair evaluate(FormulaContext context, ParameterCallback parameters) throws EvaluationException
{
final int parameterCount = parameters.getParameterCount();
if (parameterCount < 2 || parameterCount > 3)
{
throw new EvaluationException(LibFormulaErrorValue.ERROR_ARGUMENTS_VALUE);
}
final TypeRegistry typeRegistry = context.getTypeRegistry();
final Type searchType = parameters.getType(0);
final Object searchValue = parameters.getValue(0);
final Type textType = parameters.getType(1);
final Object textValue = parameters.getValue(1);
Type indexType = null;
Object indexValue = null;
if (parameterCount == 3)
{
indexType = parameters.getType(2);
indexValue = parameters.getValue(2);
}
final String search = typeRegistry.convertToText(searchType, searchValue);
final String text = typeRegistry.convertToText(textType, textValue);
if (search == null || text == null)
{
throw new EvaluationException(LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
}
int indexFrom = 0;
if (indexType != null && indexValue != null)
{
final Number n = typeRegistry.convertToNumber(indexType, indexValue);
if (n.intValue() >= 1)
{
indexFrom = n.intValue() - 1;
}
else
{
throw new EvaluationException(LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
}
}
final int index = text.indexOf(search, indexFrom);
if (index < 0)
{
throw new EvaluationException(LibFormulaErrorValue.ERROR_NOT_FOUND_VALUE);
}
return new TypeValuePair(NumberType.GENERIC_NUMBER, new BigDecimal(index + 1));
}