package com.google.code.joto.ui; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import com.google.code.joto.JotoConfig; import com.google.code.joto.eventrecorder.spy.calls.ObjectReplacementMap; /** * Springframework helper class for creating JotoContext */ public class JotoContextSpringFactoryBean implements FactoryBean<JotoContext>, ApplicationContextAware { private static Logger log = LoggerFactory.getLogger(JotoContextSpringFactoryBean.class); /** * injected by spring ApplicationContextAware */ private ApplicationContext applicationContext; /** * optional */ private JotoConfig config; // ------------------------------------------------------------------------ public JotoContextSpringFactoryBean() { } // ------------------------------------------------------------------------ @Override public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Override public JotoContext getObject() { JotoContext res = new JotoContext(config, null); // register object to Spring bean name replacement map for code generation ObjectReplacementMap objReplMap = res.getObjReplMap(); if (objReplMap == null) { objReplMap = new ObjectReplacementMap(); res.setObjReplMap(objReplMap); } String[] beanNames = applicationContext.getBeanDefinitionNames(); for (String beanName : beanNames) { if (!beanName.endsWith("DAO")) { continue; // TEMPORARY HACK } try { Object bean = applicationContext.getBean(beanName); objReplMap.addObjectInstanceReplacement(bean, beanName, beanName); } catch(Exception ex) { // ignore, no rethrow! log.error("failed to add spring bean replacement for joto", ex); } } return res; } @Override public Class<JotoContext> getObjectType() { return JotoContext.class; } @Override public boolean isSingleton() { return true; } }