001/** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.camel.osgi; 018 019import javax.xml.bind.annotation.XmlAccessType; 020import javax.xml.bind.annotation.XmlAccessorType; 021import javax.xml.bind.annotation.XmlRootElement; 022import javax.xml.bind.annotation.XmlTransient; 023 024import org.apache.camel.core.osgi.OsgiCamelContextPublisher; 025import org.apache.camel.core.osgi.OsgiEventAdminNotifier; 026import org.apache.camel.spring.SpringCamelContext; 027import org.osgi.framework.BundleContext; 028import org.slf4j.Logger; 029import org.slf4j.LoggerFactory; 030import org.springframework.osgi.context.BundleContextAware; 031 032@XmlRootElement(name = "camelContext") 033@XmlAccessorType(XmlAccessType.FIELD) 034public class CamelContextFactoryBean extends org.apache.camel.spring.CamelContextFactoryBean implements BundleContextAware { 035 private static final Logger LOG = LoggerFactory.getLogger(CamelContextFactoryBean.class); 036 037 @XmlTransient 038 private BundleContext bundleContext; 039 040 public BundleContext getBundleContext() { 041 return bundleContext; 042 } 043 044 public void setBundleContext(BundleContext bundleContext) { 045 LOG.debug("Using BundleContext: {}", bundleContext); 046 this.bundleContext = bundleContext; 047 } 048 049 protected SpringCamelContext createContext() { 050 SpringCamelContext ctx = newCamelContext(); 051 // only set the name if its explicit (Camel will auto assign name if none explicit set) 052 if (!isImplicitId()) { 053 ctx.setName(getId()); 054 } 055 return ctx; 056 } 057 058 protected SpringCamelContext newCamelContext() { 059 return new OsgiSpringCamelContext(getApplicationContext(), getBundleContext()); 060 } 061 062 @Override 063 public void afterPropertiesSet() throws Exception { 064 super.afterPropertiesSet(); 065 getContext().getManagementStrategy().addEventNotifier(new OsgiCamelContextPublisher(bundleContext)); 066 try { 067 getClass().getClassLoader().loadClass("org.osgi.service.event.EventAdmin"); 068 getContext().getManagementStrategy().addEventNotifier(new OsgiEventAdminNotifier(bundleContext)); 069 } catch (Throwable t) { 070 // Ignore, if the EventAdmin package is not available, just don't use it 071 LOG.debug("EventAdmin package is not available, just don't use it"); 072 } 073 } 074}