package hu.sztaki.ilab.longneck.bootstrap; import hu.sztaki.ilab.longneck.process.AbstractReference; import hu.sztaki.ilab.longneck.process.FrameAddressResolver; import hu.sztaki.ilab.longneck.process.SourceInfoContainer; import hu.sztaki.ilab.longneck.process.block.Block; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.castor.xml.UnmarshalListener; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * * @author Molnár Péter <molnarp@sztaki.mta.hu> */ public class SpringUnmarshalListener implements UnmarshalListener, ApplicationContextAware { /** The application context. */ private ApplicationContext context; /** Bean factory for configuring unmarshalled objects. */ private AutowireCapableBeanFactory beanFactory; /** Frame address resolver. */ private FrameAddressResolver frameAddressResolver; /** Reference list to keep track of loaded block, constraint or entity references. */ private final List<AbstractReference> references = new ArrayList<AbstractReference>(); @Override public void initialized(Object target, Object parent) { } @Override public void attributesProcessed(Object target, Object parent) { } @Override public void fieldAdded(String fieldName, Object parent, Object child) { } @Override public void unmarshalled(Object target, Object parent) { // Assign address if (target instanceof Block) { SourceInfoContainer obj = (SourceInfoContainer) target; frameAddressResolver.put((Block) obj); } if (target instanceof AbstractReference) { references.add((AbstractReference) target); } // Configure bean String[] beanNames = context.getBeanNamesForType(target.getClass()); if (beanNames.length > 0) { beanFactory.configureBean(target, beanNames[0]); } } public List<AbstractReference> getReferences() { return Collections.unmodifiableList(references); } public FrameAddressResolver getFrameAddressResolver() { return frameAddressResolver; } public void setFrameAddressResolver(FrameAddressResolver frameAddressResolver) { this.frameAddressResolver = frameAddressResolver; } @Override public void setApplicationContext(ApplicationContext ac) throws BeansException { context = ac; beanFactory = context.getAutowireCapableBeanFactory(); } }