1:
31: package ;
32:
33: import ;
34:
35: import ;
36: import ;
37: import ;
38: import ;
39: import ;
40: import ;
41: import ;
42: import ;
43: import ;
44:
45:
50: public class FindFunction implements Function
51: {
52: public FindFunction()
53: {
54: }
55:
56: public TypeValuePair evaluate(final FormulaContext context, final ParameterCallback parameters) throws EvaluationException
57: {
58: final int parameterCount = parameters.getParameterCount();
59: if (parameterCount < 2 || parameterCount > 3)
60: {
61: throw new EvaluationException(LibFormulaErrorValue.ERROR_ARGUMENTS_VALUE);
62: }
63: final TypeRegistry typeRegistry = context.getTypeRegistry();
64:
65: final Type searchType = parameters.getType(0);
66: final Object searchValue = parameters.getValue(0);
67: final Type textType = parameters.getType(1);
68: final Object textValue = parameters.getValue(1);
69: Type indexType = null;
70: Object indexValue = null;
71:
72: if (parameterCount == 3)
73: {
74: indexType = parameters.getType(2);
75: indexValue = parameters.getValue(2);
76: }
77:
78: final String search = typeRegistry.convertToText(searchType, searchValue);
79: final String text = typeRegistry.convertToText(textType, textValue);
80:
81: if (search == null || text == null)
82: {
83: throw new EvaluationException(LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
84: }
85: int indexFrom = 0;
86:
87: if (indexType != null && indexValue != null)
88: {
89: final Number n = typeRegistry.convertToNumber(indexType, indexValue);
90: if (n.intValue() >= 1)
91: {
92: indexFrom = n.intValue() - 1;
93: }
94: else
95: {
96: throw new EvaluationException(LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
97: }
98: }
99:
100: final int index = text.indexOf(search, indexFrom);
101: if (index < 0)
102: {
103: throw new EvaluationException(LibFormulaErrorValue.ERROR_NOT_FOUND_VALUE);
104: }
105:
106: return new TypeValuePair(NumberType.GENERIC_NUMBER, new BigDecimal(index + 1));
107: }
108:
109: public String getCanonicalName()
110: {
111: return "FIND";
112: }
113: