/** * User: alesj * Date: 18.4.2006 * Time: 12:42:33 * * (C) Genera Lynx d.o.o. */ package org.jboss.spring.kernel; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.config.*; import org.springframework.core.Ordered; /** * @author <a href="mailto:ales.justin@genera-lynx.com">Ales Justin</a> */ public class MicrocontainerConfigurer extends MicrocontainerLocatorSupport implements BeanFactoryPostProcessor, BeanNameAware, BeanFactoryAware, Ordered { private String beanName; private BeanFactory beanFactory; private int order = Integer.MAX_VALUE; private String prefix = "mc${"; public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactoryToProcess) throws BeansException { BeanDefinitionVisitor visitor = new MicrocontainerBeanDefinitionVisitor(); String[] beanNames = beanFactoryToProcess.getBeanDefinitionNames(); //noinspection ForLoopReplaceableByForEach for (int i = 0; i < beanNames.length; i++) { // Check that we're not parsing our own bean definition, // to avoid failing on unresolvable placeholders in properties file locations. if (!(beanNames[i].equals(this.beanName) && beanFactoryToProcess.equals(this.beanFactory))) { BeanDefinition bd = beanFactoryToProcess.getBeanDefinition(beanNames[i]); try { visitor.visitBeanDefinition(bd); } catch (BeanDefinitionStoreException ex) { throw new BeanDefinitionStoreException(bd.getResourceDescription(), beanNames[i], ex.getMessage()); } } } } protected boolean isMicrocontainerRef(String value) { return value != null && value.startsWith(prefix); } protected String parseBeansReference(String value) { int endIndex = value.lastIndexOf("$"); endIndex = endIndex >= 0 ? endIndex : value.length(); return value.substring(prefix.length(), endIndex); } private class MicrocontainerBeanDefinitionVisitor extends BeanDefinitionVisitor { protected String resolveStringValue(String strVal) { return strVal; } protected Object resolveValue(Object value) { value = super.resolveValue(value); if (value instanceof TypedStringValue) { TypedStringValue typedStringValue = (TypedStringValue) value; String beansRef = typedStringValue.getValue(); if (isMicrocontainerRef(beansRef)) { return locateBean(parseBeansReference(beansRef)); } } if (value instanceof String) { String beansRef = (String) value; if (isMicrocontainerRef(beansRef)) { return locateBean(parseBeansReference(beansRef)); } } return value; } } /** * Only necessary to check that we're not parsing our own bean definition, * to avoid failing on unresolvable placeholders in properties file locations. * The latter case can happen with placeholders for system properties in * resource locations. * * @see #setLocations * @see org.springframework.core.io.ResourceEditor */ public void setBeanName(String beanName) { this.beanName = beanName; } /** * Only necessary to check that we're not parsing our own bean definition, * to avoid failing on unresolvable placeholders in properties file locations. * The latter case can happen with placeholders for system properties in * resource locations. * * @see #setLocations * @see org.springframework.core.io.ResourceEditor */ public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public void setPrefix(String prefix) { this.prefix = prefix; } }