blob: 881d71223ce3325fdf52df40b78857e8e1e2593e [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.iandt.postprocessors;
import org.eclipse.gemini.blueprint.iandt.BaseIntegrationTest;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.core.PriorityOrdered;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.beans.factory.support.BeanDefinitionBuilder.genericBeanDefinition;
/**
* Tests application of ordered and unordered {@link BeanDefinitionRegistryPostProcessor} and {@link BeanFactoryPostProcessor}.
*
* @author Olaf Otto
*/
public class BeanDefinitionRegistryPostProcessorTest extends BaseIntegrationTest {
private static ThreadLocal<List<String>> INVOCATION_TRACKER = ThreadLocal.withInitial(ArrayList::new);
public static class DefinitionPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessor.postProcessBeanDefinitionRegistry");
registry.registerBeanDefinition("DefinitionPostProcessorChild", genericBeanDefinition(CustomPostProcessor.class).getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessor.postProcessBeanFactory");
}
public static class CustomPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorChild.postProcessBeanDefinitionRegistry");
registry.registerBeanDefinition("DefinitionPostProcessorChildChild", genericBeanDefinition(ArrayList.class).getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorChild.postProcessBeanFactory");
}
}
}
public static class DefinitionPostProcessorWithPriorityOrder2 implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithPriorityOrder2.postProcessBeanDefinitionRegistry");
registry.registerBeanDefinition("DefinitionPostProcessorWithPriorityOrder2Child", genericBeanDefinition(CustomPostProcessor.class).getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithPriorityOrder2.postProcessBeanFactory");
}
@Override
public int getOrder() {
return 2;
}
public static class CustomPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithPriorityOrder2Child.postProcessBeanDefinitionRegistry");
registry.registerBeanDefinition("DefinitionPostProcessorWithPriorityOrder2ChildChild", genericBeanDefinition(ArrayList.class).getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithPriorityOrder2Child.postProcessBeanFactory");
}
}
}
public static class DefinitionPostProcessorWithOrder2 implements BeanDefinitionRegistryPostProcessor, Ordered {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithOrder2.postProcessBeanDefinitionRegistry");
registry.registerBeanDefinition("DefinitionPostProcessorWithOrder2Child", genericBeanDefinition(CustomPostProcessor.class).getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithOrder2.postProcessBeanFactory");
}
@Override
public int getOrder() {
return 2;
}
public static class CustomPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithOrder2Child.postProcessBeanDefinitionRegistry");
registry.registerBeanDefinition("DefinitionPostProcessorWithOrder2Child", genericBeanDefinition(ArrayList.class).getBeanDefinition());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("DefinitionPostProcessorWithOrder2Child.postProcessBeanFactory");
}
}
}
public static class RegularPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("RegularPostProcessor.postProcessBeanFactory");
}
}
public static class RegularPostProcessorWithPriorityOrder2 implements BeanFactoryPostProcessor, PriorityOrdered {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("RegularPostProcessorWithPriorityOrder2.postProcessBeanFactory");
}
@Override
public int getOrder() {
return 2;
}
}
public static class RegularPostProcessorWithOrder2 implements BeanFactoryPostProcessor, Ordered {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
INVOCATION_TRACKER.get().add("RegularPostProcessorWithOrder2.postProcessBeanFactory");
}
@Override
public int getOrder() {
return 2;
}
}
protected String getManifestLocation() {
return null;
}
protected String[] getConfigLocations() {
return new String[]{"/org/eclipse/gemini/blueprint/iandt/postprocessors/postprocessors.xml"};
}
public void testOrderOfRegistryAndFactoryPostProcessorInvocations() throws Exception {
List<String> trackedInvocations = INVOCATION_TRACKER.get();
assertThat(trackedInvocations).containsExactly(
// Registry post processors must be executed first as they may alter the registry itself
// The initial registry post-processors are ordered and must come first.
"DefinitionPostProcessorWithPriorityOrder2.postProcessBeanDefinitionRegistry",
"DefinitionPostProcessorWithOrder2.postProcessBeanDefinitionRegistry",
"DefinitionPostProcessor.postProcessBeanDefinitionRegistry",
"DefinitionPostProcessorWithPriorityOrder2Child.postProcessBeanDefinitionRegistry",
"DefinitionPostProcessorWithOrder2Child.postProcessBeanDefinitionRegistry",
"DefinitionPostProcessorChild.postProcessBeanDefinitionRegistry",
// Factory post processing must be executed after the registry was processed.
// The initial factory post-processors are ordered and must come first.
"DefinitionPostProcessorWithPriorityOrder2.postProcessBeanFactory",
"DefinitionPostProcessorWithOrder2.postProcessBeanFactory",
"DefinitionPostProcessor.postProcessBeanFactory",
"DefinitionPostProcessorWithPriorityOrder2Child.postProcessBeanFactory",
"DefinitionPostProcessorWithOrder2Child.postProcessBeanFactory",
"DefinitionPostProcessorChild.postProcessBeanFactory",
"RegularPostProcessorWithPriorityOrder2.postProcessBeanFactory",
"RegularPostProcessorWithOrder2.postProcessBeanFactory",
"RegularPostProcessor.postProcessBeanFactory"
);
}
}