package org.jboss.seam.persistence;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import org.jboss.seam.core.Expressions.ValueExpression;
import org.jboss.seam.core.Expressions;
public class QueryParser
{
private List<ValueExpression> parameterValueBindings = new ArrayList<ValueExpression>();
private StringBuilder ejbqlBuilder;
public static String getParameterName(int loc)
{
return "el" + (loc+1);
}
public String getEjbql()
{
return ejbqlBuilder.toString();
}
public List<ValueExpression> getParameterValueBindings()
{
return parameterValueBindings;
}
public QueryParser(String ejbql)
{
this(ejbql, 0);
}
public QueryParser(String ejbql, int startingParameterNumber)
{
StringTokenizer tokens = new StringTokenizer(ejbql, "#}", true);
ejbqlBuilder = new StringBuilder(ejbql.length());
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if ("#".equals(token) && tokens.hasMoreTokens()) {
String expressionToken = tokens.nextToken();
if (!expressionToken.startsWith("{") || !tokens.hasMoreTokens()) {
ejbqlBuilder.append(token).append(expressionToken);
} else {
String expression = token + expressionToken + tokens.nextToken();
ejbqlBuilder.append(':').append( getParameterName( startingParameterNumber + parameterValueBindings.size() ) );
parameterValueBindings.add( Expressions.instance().createValueExpression(expression) );
}
} else {
ejbqlBuilder.append(token);
}
}
}
}