From a9290d80c4fcac4c6f2ed7b2fec74cb3f692f201 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 31 Oct 2012 09:30:17 -0700 Subject: [PATCH] Backport "Polish @Imports search code" Issue: SPR-9925 Backport-Commit: 4cdf46f83c775c5101bc664c819fd5c0bb0682f7 Conflicts: spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java --- .../annotation/ConfigurationClassParser.java | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java index 217c73a6be9..9995feb27a5 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java +++ b/org.springframework.context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java @@ -16,6 +16,8 @@ package org.springframework.context.annotation; +import static org.springframework.context.annotation.MetadataUtils.attributesFor; + import java.io.IOException; import java.util.Arrays; import java.util.Collections; @@ -24,7 +26,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; -import java.util.LinkedList; import java.util.Map; import java.util.Set; import java.util.Stack; @@ -51,8 +52,6 @@ import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.AssignableTypeFilter; import org.springframework.util.StringUtils; -import static org.springframework.context.annotation.MetadataUtils.*; - /** * Parses a {@link Configuration} class definition, populating a collection of * {@link ConfigurationClass} objects (parsing a single Configuration class may result in @@ -73,8 +72,6 @@ import static org.springframework.context.annotation.MetadataUtils.*; */ class ConfigurationClassParser { - private static final String[] EMPTY_IMPORTS = {}; - private final MetadataReaderFactory metadataReaderFactory; private final ProblemReporter problemReporter; @@ -223,7 +220,10 @@ class ConfigurationClassParser { } // process any @Import annotations - processImport(configClass, getImports(metadata.getClassName()), true); + Set imports = getImports(metadata.getClassName(), null, new HashSet()); + if (imports != null && !imports.isEmpty()) { + processImport(configClass, imports.toArray(new String[imports.size()]), true); + } // process any @ImportResource annotations if (metadata.isAnnotated(ImportResource.class.getName())) { @@ -285,31 +285,23 @@ class ConfigurationClassParser { * @return a set of all {@link Import#value() import values} or {@code null} * @throws IOException if there is any problem reading metadata from the named class */ - private String[] getImports(String className) throws IOException { - LinkedList imports = new LinkedList(); - collectImports(className, imports, new HashSet()); - if(imports == null || imports.isEmpty()) { - return EMPTY_IMPORTS; - } - LinkedHashSet uniqueImports = new LinkedHashSet(imports); - return uniqueImports.toArray(new String[uniqueImports.size()]); - } - - private void collectImports(String className, LinkedList imports, + private Set getImports(String className, Set imports, Set visited) throws IOException { if (visited.add(className)) { AnnotationMetadata metadata = metadataReaderFactory.getMetadataReader(className).getAnnotationMetadata(); for (String annotationType : metadata.getAnnotationTypes()) { - collectImports(annotationType, imports, visited); + imports = getImports(annotationType, imports, visited); } Map attributes = metadata.getAnnotationAttributes(Import.class.getName(), true); if (attributes != null) { String[] value = (String[]) attributes.get("value"); if (value != null && value.length > 0) { + imports = (imports == null ? new LinkedHashSet() : imports); imports.addAll(Arrays.asList(value)); } } } + return imports; } private void processImport(ConfigurationClass configClass, String[] classesToImport, boolean checkForCircularImports) throws IOException {