Java 类org.springframework.test.context.ContextHierarchy 实例源码

项目:spring4-understanding    文件:AbstractTestContextBootstrapper.java   
/**
 * {@inheritDoc}
 */
@SuppressWarnings("unchecked")
@Override
public final MergedContextConfiguration buildMergedContextConfiguration() {
    Class<?> testClass = getBootstrapContext().getTestClass();
    CacheAwareContextLoaderDelegate cacheAwareContextLoaderDelegate = getCacheAwareContextLoaderDelegate();

    if (MetaAnnotationUtils.findAnnotationDescriptorForTypes(testClass, ContextConfiguration.class,
        ContextHierarchy.class) == null) {
        if (logger.isInfoEnabled()) {
            logger.info(String.format(
                "Neither @ContextConfiguration nor @ContextHierarchy found for test class [%s]",
                testClass.getName()));
        }
        return new MergedContextConfiguration(testClass, null, null, null, null);
    }

    if (AnnotationUtils.findAnnotation(testClass, ContextHierarchy.class) != null) {
        Map<String, List<ContextConfigurationAttributes>> hierarchyMap = ContextLoaderUtils.buildContextHierarchyMap(testClass);
        MergedContextConfiguration parentConfig = null;
        MergedContextConfiguration mergedConfig = null;

        for (List<ContextConfigurationAttributes> list : hierarchyMap.values()) {
            List<ContextConfigurationAttributes> reversedList = new ArrayList<ContextConfigurationAttributes>(list);
            Collections.reverse(reversedList);

            // Don't use the supplied testClass; instead ensure that we are
            // building the MCC for the actual test class that declared the
            // configuration for the current level in the context hierarchy.
            Assert.notEmpty(reversedList, "ContextConfigurationAttributes list must not be empty");
            Class<?> declaringClass = reversedList.get(0).getDeclaringClass();

            mergedConfig = buildMergedContextConfiguration(declaringClass, reversedList, parentConfig,
                cacheAwareContextLoaderDelegate);
            parentConfig = mergedConfig;
        }

        // Return the last level in the context hierarchy
        return mergedConfig;
    }
    else {
        return buildMergedContextConfiguration(testClass,
            ContextLoaderUtils.resolveContextConfigurationAttributes(testClass), null,
            cacheAwareContextLoaderDelegate);
    }
}