1:
31: package ;
32:
33: import ;
34: import ;
35: import ;
36: import ;
37: import ;
38: import ;
39: import ;
40: import ;
41: import ;
42:
43:
48: public class SubstituteFunction implements Function
49: {
50: public SubstituteFunction()
51: {
52: }
53:
54: public TypeValuePair evaluate(final FormulaContext context,
55: final ParameterCallback parameters)
56: throws EvaluationException
57: {
58: final int parameterCount = parameters.getParameterCount();
59: if (parameterCount < 3 || parameterCount > 4)
60: {
61: throw new EvaluationException(LibFormulaErrorValue.ERROR_ARGUMENTS_VALUE);
62: }
63: final TypeRegistry typeRegistry = context.getTypeRegistry();
64:
65: final Type newTextType = parameters.getType(2);
66: final Object newTextValue = parameters.getValue(2);
67: final Type textType = parameters.getType(0);
68: final Object textValue = parameters.getValue(0);
69: final Type oldTextType = parameters.getType(1);
70: final Object oldTextValue = parameters.getValue(1);
71:
72: final String newText = typeRegistry.convertToText(newTextType, newTextValue);
73: final String text = typeRegistry.convertToText(textType, textValue);
74: final String oldText = typeRegistry.convertToText(oldTextType, oldTextValue);
75:
76: if (parameterCount == 3)
77: {
78: int index = text.indexOf(oldText);
79: if (index == -1)
80: {
81: return new TypeValuePair(TextType.TYPE, text);
82: }
83:
84: String result = text;
85: while (index >= 0)
86: {
87: final StringBuffer buffer = new StringBuffer(result);
88: buffer.replace(index, index + oldText.length(), newText);
89: result = buffer.toString();
90: index = result.indexOf(oldText, index + newText.length());
91: }
92: return new TypeValuePair(TextType.TYPE, result);
93: }
94:
95:
96:
97: final Type whichType = parameters.getType(3);
98: final Object whichValue = parameters.getValue(3);
99: final Number n = typeRegistry.convertToNumber(whichType, whichValue);
100: if (n.doubleValue() < 1)
101: {
102: throw new EvaluationException(
103: LibFormulaErrorValue.ERROR_INVALID_ARGUMENT_VALUE);
104: }
105:
106: final int nthOccurence = n.intValue();
107:
108: int index = text.indexOf(oldText);
109: if (index == -1)
110: {
111: return new TypeValuePair(TextType.TYPE, text);
112: }
113:
114: String result = text;
115: int counter = 1;
116: while (index >= 0)
117: {
118: if (counter == nthOccurence)
119: {
120: final StringBuffer buffer = new StringBuffer(result);
121: buffer.replace(index, index + oldText.length(), newText);
122: result = buffer.toString();
123: index = result.indexOf(oldText, index + newText.length());
124: }
125: else
126: {
127: index = result.indexOf(oldText, index + 1);
128: }
129: counter += 1;
130: }
131: return new TypeValuePair(TextType.TYPE, result);
132: }
133:
134: public String getCanonicalName()
135: {
136: return "SUBSTITUTE";
137: }
138: