/*
* Copyright (C) 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package interactivespaces.evaluation;
/**
* An {@link ExpressionEvaluator} that does simple evaluations of strings.
*
* @author Keith M. Hughes
*/
public abstract class BaseExpressionEvaluator implements ExpressionEvaluator {
/**
* The environment for evaluating the expressions in.
*/
protected EvaluationEnvironment environment;
@Override
public String evaluateStringExpression(String initial) {
// I don't know if the short-circuit is needed, but will leave for now
// and check by profiling
// later.
int exprPos = initial.indexOf("${");
if (exprPos == -1) {
return initial;
} else {
// Store the first part of the string that has no variables.
StringBuffer buffer = new StringBuffer();
// For now there will never be a ${ or } in the middle of an
// expression.
int endExpr = 0;
do {
buffer.append(initial.substring(endExpr, exprPos));
exprPos += 2;
endExpr = initial.indexOf("}", endExpr);
if (endExpr == -1) {
throw new EvaluationInteractiveSpacesException(String.format(
"Expression in string doesn't end with }: %s", initial.substring(exprPos)));
}
String expression = initial.substring(exprPos, endExpr);
Object value = evaluateExpression(expression);
if (value == null || value.equals(expression))
buffer.append("${").append(expression).append("}");
else
buffer.append(value.toString());
endExpr++;
exprPos = initial.indexOf("${", endExpr);
} while (exprPos != -1);
buffer.append(initial.substring(endExpr));
return buffer.toString();
}
}
@Override
public void setEvaluationEnvironment(EvaluationEnvironment environment) {
this.environment = environment;
}
}