001    /**
002     *
003     * Licensed to the Apache Software Foundation (ASF) under one or more
004     * contributor license agreements.  See the NOTICE file distributed with
005     * this work for additional information regarding copyright ownership.
006     * The ASF licenses this file to You under the Apache License, Version 2.0
007     * (the "License"); you may not use this file except in compliance with
008     * the License.  You may obtain a copy of the License at
009     *
010     * http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    package org.apache.camel.spring;
019    
020    import org.apache.camel.impl.DefaultCamelContext;
021    import org.apache.camel.spi.Injector;
022    import org.apache.camel.spi.ComponentResolver;
023    import org.apache.camel.CamelContext;
024    import org.apache.camel.spring.spi.SpringComponentResolver;
025    import org.apache.camel.spring.spi.SpringInjector;
026    import org.apache.camel.spring.component.BeanComponent;
027    import org.springframework.beans.factory.InitializingBean;
028    import org.springframework.beans.factory.DisposableBean;
029    import org.springframework.beans.BeansException;
030    import org.springframework.context.ApplicationContextAware;
031    import org.springframework.context.ApplicationContext;
032    import org.springframework.context.support.ClassPathXmlApplicationContext;
033    import org.springframework.context.support.AbstractRefreshableApplicationContext;
034    
035    /**
036     * A Spring aware implementation of {@link CamelContext} which will automatically register itself with Springs lifecycle
037     * methods  plus allows spring to be used to customize a any
038     * <a href="http://activemq.apache.org/camel/type-converter.html">Type Converters</a> as well as supporting accessing components
039     * and beans via the Spring {@link ApplicationContext}
040     *
041     * @version $Revision: 538919 $
042     */
043    public class SpringCamelContext extends DefaultCamelContext implements InitializingBean, DisposableBean, ApplicationContextAware {
044        private ApplicationContext applicationContext;
045    
046        public SpringCamelContext() {
047        }
048    
049        public SpringCamelContext(ApplicationContext applicationContext) {
050            setApplicationContext(applicationContext);
051        }
052    
053        public static SpringCamelContext springCamelContext(ApplicationContext applicationContext) throws Exception {
054            // lets try and look up a configured camel context in the context
055            String[] names = applicationContext.getBeanNamesForType(SpringCamelContext.class);
056            if (names.length == 1) {
057                return (SpringCamelContext) applicationContext.getBean(names[0], SpringCamelContext.class);
058            }
059            SpringCamelContext answer = new SpringCamelContext();
060            answer.setApplicationContext(applicationContext);
061            answer.afterPropertiesSet();
062            return answer;
063        }
064    
065        public static SpringCamelContext springCamelContext(String configLocations) throws Exception {
066            return springCamelContext(new ClassPathXmlApplicationContext(configLocations));
067        }
068    
069        public void afterPropertiesSet() throws Exception {
070            // lets force lazy initialisation
071            getInjector();
072    
073            start();
074        }
075    
076        public void destroy() throws Exception {
077            stop();
078        }
079    
080        public ApplicationContext getApplicationContext() {
081            return applicationContext;
082        }
083    
084        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
085            this.applicationContext = applicationContext;
086            addComponent("bean", new BeanComponent(applicationContext));
087        }
088    
089        @Override
090        protected Injector createInjector() {
091            return new SpringInjector((AbstractRefreshableApplicationContext) getApplicationContext());
092        }
093    
094        @Override
095        protected ComponentResolver createComponentResolver() {
096            ComponentResolver defaultResolver = super.createComponentResolver();
097            return new SpringComponentResolver(getApplicationContext(), defaultResolver);
098        }
099    }