package rtt.annotation.editor.data; import java.util.List; import rtt.annotation.editor.model.ClassElement; import rtt.annotation.editor.model.ClassElementReference; import rtt.annotation.editor.model.ClassModel; import rtt.annotation.editor.model.ElementReference; public class NameResolver { private String packageSeparator = "."; public NameResolver(String packageSeparator) { this.packageSeparator = packageSeparator; } public static final NameResolver create(String packageSeparator) { return new NameResolver(packageSeparator); } public final String computePackageName(String completeName) { int packageBorder = computePackageBorder(completeName); if (packageBorder > 0) { return completeName.substring(0, packageBorder); } return ""; } public final String computeClassName(String completeName) { int packageBorder = computePackageBorder(completeName); if (packageBorder > 0) { return completeName.substring(packageBorder + 1); } return ""; } private int computePackageBorder(String completeName) { return completeName.lastIndexOf(packageSeparator); } public final void resolveModel(ClassModel model) { for (List<ClassElement> classList : model.getClassElements().values()) { for (ClassElement classElement : classList) { resolveSuperClass(classElement, model); resolveInterfaces(classElement, model); } } } private void resolveSuperClass(ClassElement classElement, ClassModel model) { ElementReference<ClassElement> reference = classElement.getSuperClass(); if (reference != null && !reference.isResolved()) { ClassElement superClass = findClass(reference.getName(), model); if (superClass != null) { reference.setReference(superClass); } } } private void resolveInterfaces(ClassElement classElement, ClassModel model) { List<ClassElementReference> interfaces = classElement.getInterfaces(); if (interfaces != null && !interfaces.isEmpty()) { for (ElementReference<ClassElement> interfaceRef : interfaces) { interfaceRef.setReference(resolveInterface(interfaceRef, model)); } } } private ClassElement resolveInterface(ElementReference<ClassElement> interfaceRef, ClassModel model) { if (interfaceRef != null && !interfaceRef.isResolved()) { ClassElement interfaceElement = findClass(interfaceRef.getName(), model); if (interfaceElement != null) { return interfaceElement; } } return null; } public ClassElement findClass(String completeName, ClassModel model) { String packageName = computePackageName(completeName); String className = computeClassName(completeName); List<ClassElement> classes = model.getClasses(packageName); if (classes != null && !classes.isEmpty()) { for (ClassElement element : classes) { if (element.getName().equals(className) && element.getPackageName().equals(packageName)) { return element; } } } return null; } }