/*
* Copyright (c) 2006-2011 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.emulation.hibernate3.ast;
import java.util.regex.*;
public final class PathAndAlias
{
private static final Pattern REGEX = Pattern.compile("\\w+(\\.\\w+)*");
public final String path;
public final String[] pathElements;
public final String alias;
private PathAndAlias(String path, String[] pathElements, String alias)
{
this.path = path;
this.pathElements = pathElements;
this.alias = alias;
}
public PathAndAlias(Tokens tokens)
{
path = parsePath(tokens);
pathElements = path.split("\\.");
alias = parseAlias(tokens);
}
static String parsePath(Tokens tokens)
{
String path = tokens.next();
if (REGEX.matcher(path).matches()) {
return path;
}
throw new QuerySyntaxException(tokens);
}
private static String[] parsePathElements(String path)
{
String[] pathElements = null;
if (REGEX.matcher(path).matches()) {
pathElements = path.split("\\.");
}
return pathElements;
}
private static String parseAlias(Tokens tokens)
{
String alias = tokens.next();
if ("as".equalsIgnoreCase(alias)) {
alias = tokens.next();
}
if (!Tokens.isIdentifier(alias)) {
tokens.pushback();
return null;
}
return alias;
}
static PathAndAlias parse(Tokens tokens)
{
String path = tokens.next();
String[] pathElements = parsePathElements(path);
if (pathElements != null) {
String alias = parseAlias(tokens);
return new PathAndAlias(path, pathElements, alias);
}
else {
tokens.pushback();
return null;
}
}
public Object evaluate(Object entity)
{
Object result = entity;
for (int i = 1; i < pathElements.length; i++) {
String element = pathElements[i];
String name = "get" + Character.toUpperCase(element.charAt(0)) + element.substring(1);
result = QueryEval.executeGetter(result, name);
}
return result;
}
}