package org.hibernate.tool.ide.completion;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Helper class for completion.
* Package private, not to be used externally.
*
* @author leon, max.andersen@jboss.com
*/
class CompletionHelper {
private CompletionHelper() {
}
public static String getCanonicalPath(List<EntityNameReference> qts, String name) {
Map<String, String> alias2Type = new HashMap<String, String>();
for (Iterator<EntityNameReference> iter = qts.iterator(); iter.hasNext();) {
EntityNameReference qt = iter.next();
alias2Type.put(qt.getAlias(), qt.getEntityName());
}
if (qts.size() == 1) {
EntityNameReference visible = (EntityNameReference) qts.get(0);
String alias = visible.getAlias();
if (name.equals(alias)) {
return visible.getEntityName();
} else if (alias == null || alias.length() == 0 || alias.equals(visible.getEntityName())) {
return visible.getEntityName() + "/" + name;
}
}
return getCanonicalPath(new HashSet<String>(), alias2Type, name);
}
private static String getCanonicalPath(Set<String> resolved, Map<String, String> alias2Type, String name) {
if (resolved.contains(name)) {
// To prevent a stack overflow
return name;
}
resolved.add(name);
String type = (String) alias2Type.get(name);
if (type != null) {
return name.equals(type) ? name : getCanonicalPath(resolved, alias2Type, type);
}
int idx = name.lastIndexOf('.');
if (idx == -1) {
return type != null ? type : name;
}
String baseName = name.substring(0, idx);
String prop = name.substring(idx + 1);
if (isAliasNown(alias2Type, baseName)) {
return getCanonicalPath(resolved, alias2Type, baseName) + "/" + prop;
} else {
return name;
}
}
private static boolean isAliasNown(Map<String, String> alias2Type, String alias) {
if (alias2Type.containsKey(alias)) {
return true;
}
int idx = alias.lastIndexOf('.');
if (idx == -1) {
return false;
}
return isAliasNown(alias2Type, alias.substring(0, idx));
}
}