package org.springframework.roo.model;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.apache.commons.lang3.Validate;
/**
* Implementation of {@link ImportRegistrationResolver}.
*
* @author Ben Alex
* @since 1.0
*/
public class ImportRegistrationResolverImpl implements
ImportRegistrationResolver {
private final JavaPackage compilationUnitPackage;
private final SortedSet<JavaType> registeredImports = new TreeSet<JavaType>(
new Comparator<JavaType>() {
public int compare(final JavaType o1, final JavaType o2) {
return o1.getFullyQualifiedTypeName().compareTo(
o2.getFullyQualifiedTypeName());
}
});
public ImportRegistrationResolverImpl(
final JavaPackage compilationUnitPackage) {
Validate.notNull(compilationUnitPackage,
"Compilation unit package required");
this.compilationUnitPackage = compilationUnitPackage;
}
public void addImport(final JavaType javaType) {
if (javaType != null) {
if (!JdkJavaType.isPartOfJavaLang(javaType)) {
registeredImports.add(javaType);
}
}
}
public void addImports(final JavaType... typesToImport) {
for (final JavaType typeToImport : typesToImport) {
addImport(typeToImport);
}
}
public void addImports(final List<JavaType> typesToImport) {
if (typesToImport != null) {
for (final JavaType typeToImport : typesToImport) {
addImport(typeToImport);
}
}
}
public JavaPackage getCompilationUnitPackage() {
return compilationUnitPackage;
}
public Set<JavaType> getRegisteredImports() {
return Collections.unmodifiableSet(registeredImports);
}
public boolean isAdditionLegal(final JavaType javaType) {
Validate.notNull(javaType, "Java type required");
if (javaType.getDataType() != DataType.TYPE) {
// It's a type variable or primitive
return false;
}
if (javaType.isDefaultPackage()) {
// Cannot import types from the default package
return false;
}
// Must be a class, so it's legal if there isn't an existing
// registration that conflicts
for (final JavaType candidate : registeredImports) {
if (candidate.getSimpleTypeName().equals(
javaType.getSimpleTypeName())) {
// Conflict detected
return false;
}
}
return true;
}
public boolean isFullyQualifiedFormRequired(final JavaType javaType) {
Validate.notNull(javaType, "Java type required");
if (javaType.getDataType() == DataType.PRIMITIVE
|| javaType.getDataType() == DataType.VARIABLE) {
// Primitives and type variables do not need to be used in
// fully-qualified form
return false;
}
if (registeredImports.contains(javaType)) {
// Already know about this one
return false;
}
if (compilationUnitPackage.equals(javaType.getPackage())) {
// No need for an explicit registration, given it's in the same
// package
return false;
}
if (JdkJavaType.isPartOfJavaLang(javaType)) {
return false;
}
// To get this far, it must need a fully-qualified name
return true;
}
public boolean isFullyQualifiedFormRequiredAfterAutoImport(
final JavaType javaType) {
Validate.notNull(javaType, "Java type required");
// Try to add import if possible
if (isAdditionLegal(javaType)) {
addImport(javaType);
}
// Indicate whether we can use in a simple or need a fully-qualified
// form
return isFullyQualifiedFormRequired(javaType);
}
}