public aspect OsgiAnnotationBeanConfigurerAspect extends AbstractInterfaceDrivenDependencyInjectionAspect {
private ConcurrentHashMap<Bundle, ConfigurableListableBeanFactory> mapOfBeanFactories = new ConcurrentHashMap<Bundle, ConfigurableListableBeanFactory>();
private Map<String, BeanConfigurerSupport> mapOfBeanConfigurers = new HashMap<String, BeanConfigurerSupport>();
static final class Finder extends SecurityManager {
@SuppressWarnings("unchecked")
public Class[] getClassContext() {
return super.getClassContext();
}
}
static ClassLoader finderClassLoader;
static Finder contextFinder;
static {
AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
finderClassLoader = OsgiAnnotationBeanConfigurerAspect.class.getClassLoader();
contextFinder = new Finder();
return null;
}
});
}
public void setBundleBeanFactory(BundleContext p_bundleContext, ConfigurableListableBeanFactory p_beanFactory) {
Bundle bundle = p_bundleContext.getBundle();
String bundleName = bundle.getSymbolicName();
mapOfBeanFactories.put(bundle, p_beanFactory);
BeanConfigurerSupport beanConfigurerSupport = new BeanConfigurerSupport();
beanConfigurerSupport.setBeanFactory(p_beanFactory);
beanConfigurerSupport.setBeanWiringInfoResolver(new AnnotationBeanWiringInfoResolver());
mapOfBeanConfigurers.put(bundleName, beanConfigurerSupport);
}
private PackageAdmin m_packageAdmin;
public void setPackageAdmin(PackageAdmin p_packageAdmin) {
m_packageAdmin = p_packageAdmin;
}
public void configureBean(Object bean) {
Bundle bundle = m_packageAdmin.getBundle(bean.getClass());
String bundleName = bundle.getSymbolicName();
BeanConfigurerSupport beanConfigurerSupport = mapOfBeanConfigurers.get(bundleName);
if (beanConfigurerSupport != null) {
beanConfigurerSupport.configureBean(bean);
} else {
boolean configured = false;
Class[] stack = contextFinder.getClassContext();
for (Class klass : stack) {
bundle = m_packageAdmin.getBundle(klass);
if (bundle != null) {
bundleName = bundle.getSymbolicName();
beanConfigurerSupport = mapOfBeanConfigurers.get(bundleName);
if (beanConfigurerSupport != null) {
configured = false;
beanConfigurerSupport.configureBean(bean);
configured = true;
break;
}
}
}
if (!configured) {
throw new RuntimeException( "configure failed" );
}
}
}
public pointcut inConfigurableBean() : @this(Configurable);
public pointcut preConstructionConfiguration() : preConstructionConfigurationSupport(*);
declare parents: @Configurable * implements ConfigurableObject;
/*
* An intermediary to match preConstructionConfiguration signature (that
* doesn't expose the annotation object)
*/
private pointcut preConstructionConfigurationSupport(Configurable c) : @this(c) && if(c.preConstruction());
}