Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-dev] Aspectj in an OSGi environment

I created an aspect that uses OSGi context information.  The static block of the aspect is executed when the bundle's loaded.  Otherwise, the aspect doesn't seem to advise any functions in its pointcut.  I have included the code below:

OsgiAspect:

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());

}

Configuration:

<?xml version="1.0" encoding="UTF-8"?>

    <context:annotation-config />
    
    <context:load-time-weaver aspectj-weaving="on" />
    <bean class="net.test.aspects.OsgiAnnotationBeanConfigurerAspect"
          factory-method="aspectOf" />

</beans>
 
Thanks.

Back to the top