001package org.dllearner.configuration.spring;
002
003import org.dllearner.core.AnnComponentManager;
004import org.dllearner.core.Component;
005import org.dllearner.core.ComponentInitException;
006import org.dllearner.utilities.Helper;
007import org.slf4j.Logger;
008import org.slf4j.LoggerFactory;
009import org.springframework.beans.BeansException;
010import org.springframework.beans.factory.config.BeanPostProcessor;
011
012/**
013 * Created by IntelliJ IDEA.
014 * User: Chris
015 * Date: 8/23/11
016 * Time: 7:00 AM
017 * <p/>
018 * Post Processor to initialize our components.
019 */
020public class ComponentInitializationBeanPostProcessor implements BeanPostProcessor {
021
022    private static Logger logger = LoggerFactory.getLogger(ComponentInitializationBeanPostProcessor.class);
023
024    @Override
025    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
026
027        if (bean instanceof Component) {
028            Component c = (Component) bean;
029
030            String componentName = AnnComponentManager.getName(c);
031            try {
032                
033                logger.info("Initializing component '{}' of type {} ...", beanName, componentName);
034                long startTime = System.currentTimeMillis();
035                c.init();
036                long stopTime = System.currentTimeMillis();
037                long elapsedTime = stopTime - startTime;
038
039                logger.info("... initialized component '{}' in {}. Status: OK", 
040                                new String[]{beanName, Helper.prettyPrintMilliSeconds(elapsedTime)});
041            } catch (ComponentInitException e) {
042                throw new RuntimeException("Problem initializing the component \"" + componentName + "\" with beanName: " + beanName, e);
043            } catch (Exception e) {
044                /** Catch any exception as an init exception */
045                logger.warn("Could not initialize component \"" + componentName + "\"");
046                throw new RuntimeException(e);
047            }
048        }
049        return bean;
050    }
051
052    @Override
053    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
054        return bean;
055    }
056}