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.impl; 018 019import java.util.Map; 020 021import javax.naming.Context; 022 023import org.apache.camel.CamelContext; 024import org.apache.camel.Endpoint; 025import org.apache.camel.TypeConverter; 026import org.apache.camel.catalog.RuntimeCamelCatalog; 027import org.apache.camel.health.HealthCheckRegistry; 028import org.apache.camel.impl.converter.DefaultTypeConverter; 029import org.apache.camel.impl.engine.BeanProcessorFactoryResolver; 030import org.apache.camel.impl.engine.BeanProxyFactoryResolver; 031import org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager; 032import org.apache.camel.impl.engine.DefaultBeanIntrospection; 033import org.apache.camel.impl.engine.DefaultCamelBeanPostProcessor; 034import org.apache.camel.impl.engine.DefaultCamelContextNameStrategy; 035import org.apache.camel.impl.engine.DefaultClassResolver; 036import org.apache.camel.impl.engine.DefaultComponentResolver; 037import org.apache.camel.impl.engine.DefaultConfigurerResolver; 038import org.apache.camel.impl.engine.DefaultDataFormatResolver; 039import org.apache.camel.impl.engine.DefaultEndpointRegistry; 040import org.apache.camel.impl.engine.DefaultFactoryFinderResolver; 041import org.apache.camel.impl.engine.DefaultInflightRepository; 042import org.apache.camel.impl.engine.DefaultInjector; 043import org.apache.camel.impl.engine.DefaultLanguageResolver; 044import org.apache.camel.impl.engine.DefaultManagementNameStrategy; 045import org.apache.camel.impl.engine.DefaultMessageHistoryFactory; 046import org.apache.camel.impl.engine.DefaultNodeIdFactory; 047import org.apache.camel.impl.engine.DefaultPackageScanClassResolver; 048import org.apache.camel.impl.engine.DefaultPackageScanResourceResolver; 049import org.apache.camel.impl.engine.DefaultProcessorFactory; 050import org.apache.camel.impl.engine.DefaultRouteController; 051import org.apache.camel.impl.engine.DefaultShutdownStrategy; 052import org.apache.camel.impl.engine.DefaultStreamCachingStrategy; 053import org.apache.camel.impl.engine.DefaultTracer; 054import org.apache.camel.impl.engine.DefaultUnitOfWorkFactory; 055import org.apache.camel.impl.engine.DefaultUuidGenerator; 056import org.apache.camel.impl.engine.EndpointKey; 057import org.apache.camel.impl.engine.HeadersMapFactoryResolver; 058import org.apache.camel.impl.engine.PropertiesComponentFactoryResolver; 059import org.apache.camel.impl.engine.ReactiveExecutorResolver; 060import org.apache.camel.impl.engine.RestRegistryFactoryResolver; 061import org.apache.camel.impl.engine.RuntimeCamelCatalogResolver; 062import org.apache.camel.impl.engine.WebSpherePackageScanClassResolver; 063import org.apache.camel.impl.health.DefaultHealthCheckRegistry; 064import org.apache.camel.spi.AsyncProcessorAwaitManager; 065import org.apache.camel.spi.BeanIntrospection; 066import org.apache.camel.spi.BeanProcessorFactory; 067import org.apache.camel.spi.BeanProxyFactory; 068import org.apache.camel.spi.BeanRepository; 069import org.apache.camel.spi.CamelBeanPostProcessor; 070import org.apache.camel.spi.CamelContextNameStrategy; 071import org.apache.camel.spi.ClassResolver; 072import org.apache.camel.spi.ComponentResolver; 073import org.apache.camel.spi.ConfigurerResolver; 074import org.apache.camel.spi.DataFormatResolver; 075import org.apache.camel.spi.EndpointRegistry; 076import org.apache.camel.spi.ExecutorServiceManager; 077import org.apache.camel.spi.FactoryFinder; 078import org.apache.camel.spi.FactoryFinderResolver; 079import org.apache.camel.spi.HeadersMapFactory; 080import org.apache.camel.spi.InflightRepository; 081import org.apache.camel.spi.Injector; 082import org.apache.camel.spi.LanguageResolver; 083import org.apache.camel.spi.ManagementNameStrategy; 084import org.apache.camel.spi.MessageHistoryFactory; 085import org.apache.camel.spi.ModelJAXBContextFactory; 086import org.apache.camel.spi.ModelToXMLDumper; 087import org.apache.camel.spi.NodeIdFactory; 088import org.apache.camel.spi.PackageScanClassResolver; 089import org.apache.camel.spi.PackageScanResourceResolver; 090import org.apache.camel.spi.ProcessorFactory; 091import org.apache.camel.spi.PropertiesComponent; 092import org.apache.camel.spi.ReactiveExecutor; 093import org.apache.camel.spi.Registry; 094import org.apache.camel.spi.RestRegistryFactory; 095import org.apache.camel.spi.RouteController; 096import org.apache.camel.spi.ShutdownStrategy; 097import org.apache.camel.spi.StreamCachingStrategy; 098import org.apache.camel.spi.Tracer; 099import org.apache.camel.spi.TypeConverterRegistry; 100import org.apache.camel.spi.UnitOfWorkFactory; 101import org.apache.camel.spi.UuidGenerator; 102import org.apache.camel.spi.XMLRoutesDefinitionLoader; 103import org.apache.camel.support.DefaultRegistry; 104import org.slf4j.Logger; 105import org.slf4j.LoggerFactory; 106 107/** 108 * Represents the context used to configure routes and the policies to use. 109 */ 110public class DefaultCamelContext extends AbstractModelCamelContext { 111 112 private static final Logger LOG = LoggerFactory.getLogger(DefaultCamelContext.class); 113 114 /** 115 * Creates the {@link CamelContext} using {@link DefaultRegistry} as 116 * registry. 117 * <p/> 118 * Use one of the other constructors to force use an explicit registry. 119 */ 120 public DefaultCamelContext() { 121 } 122 123 /** 124 * Creates the {@link CamelContext} using the given {@link BeanRepository} 125 * as first-choice repository, and the 126 * {@link org.apache.camel.support.SimpleRegistry} as fallback, via the 127 * {@link DefaultRegistry} implementation. 128 * 129 * @param repository the bean repository. 130 */ 131 public DefaultCamelContext(BeanRepository repository) { 132 super(new DefaultRegistry(repository)); 133 } 134 135 /** 136 * Creates the {@link CamelContext} using the given JNDI context as the 137 * registry 138 * 139 * @param jndiContext the JNDI context 140 * @deprecated create a new {@link JndiRegistry} and use the constructor 141 * that accepts this registry. 142 */ 143 @Deprecated 144 public DefaultCamelContext(Context jndiContext) { 145 this(new JndiRegistry(jndiContext)); 146 } 147 148 /** 149 * Creates the {@link CamelContext} using the given registry 150 * 151 * @param registry the registry 152 */ 153 public DefaultCamelContext(Registry registry) { 154 super(registry); 155 } 156 157 /** 158 * Creates the {@link CamelContext} and allows to control whether the 159 * context should automatic initialize or not. 160 * <p/> 161 * This is used by some Camel components such as camel-cdi and 162 * camel-blueprint, however this constructor is not intended for regular 163 * Camel end users. 164 * 165 * @param init whether to automatic initialize. 166 */ 167 public DefaultCamelContext(boolean init) { 168 super(init); 169 } 170 171 @Override 172 protected TypeConverter createTypeConverter() { 173 return new DefaultTypeConverter(this, getPackageScanClassResolver(), getInjector(), getDefaultFactoryFinder(), isLoadTypeConverters()); 174 } 175 176 @Override 177 protected TypeConverterRegistry createTypeConverterRegistry() { 178 TypeConverter typeConverter = getTypeConverter(); 179 // type converter is also registry so create type converter 180 if (typeConverter == null) { 181 typeConverter = createTypeConverter(); 182 } 183 if (typeConverter instanceof TypeConverterRegistry) { 184 return (TypeConverterRegistry)typeConverter; 185 } 186 return null; 187 } 188 189 @Override 190 protected Injector createInjector() { 191 FactoryFinder finder = getDefaultFactoryFinder(); 192 return finder.newInstance("Injector", Injector.class).orElse(new DefaultInjector(this)); 193 } 194 195 @Override 196 protected PropertiesComponent createPropertiesComponent() { 197 return new PropertiesComponentFactoryResolver().resolve(this); 198 } 199 200 @Override 201 protected CamelBeanPostProcessor createBeanPostProcessor() { 202 return new DefaultCamelBeanPostProcessor(this); 203 } 204 205 @Override 206 protected ComponentResolver createComponentResolver() { 207 return new DefaultComponentResolver(); 208 } 209 210 @Override 211 protected Registry createRegistry() { 212 return new DefaultRegistry(); 213 } 214 215 @Override 216 protected UuidGenerator createUuidGenerator() { 217 return new DefaultUuidGenerator(); 218 } 219 220 @Override 221 protected ModelJAXBContextFactory createModelJAXBContextFactory() { 222 return new DefaultModelJAXBContextFactory(); 223 } 224 225 @Override 226 protected NodeIdFactory createNodeIdFactory() { 227 return new DefaultNodeIdFactory(); 228 } 229 230 @Override 231 protected FactoryFinderResolver createFactoryFinderResolver() { 232 return new DefaultFactoryFinderResolver(); 233 } 234 235 @Override 236 protected ClassResolver createClassResolver() { 237 return new DefaultClassResolver(this); 238 } 239 240 @Override 241 protected ProcessorFactory createProcessorFactory() { 242 return new DefaultProcessorFactory(); 243 } 244 245 @Override 246 protected DataFormatResolver createDataFormatResolver() { 247 return new DefaultDataFormatResolver(); 248 } 249 250 @Override 251 protected MessageHistoryFactory createMessageHistoryFactory() { 252 return new DefaultMessageHistoryFactory(); 253 } 254 255 @Override 256 protected InflightRepository createInflightRepository() { 257 return new DefaultInflightRepository(); 258 } 259 260 @Override 261 protected AsyncProcessorAwaitManager createAsyncProcessorAwaitManager() { 262 return new DefaultAsyncProcessorAwaitManager(); 263 } 264 265 @Override 266 protected RouteController createRouteController() { 267 return new DefaultRouteController(this); 268 } 269 270 @Override 271 protected HealthCheckRegistry createHealthCheckRegistry() { 272 return new DefaultHealthCheckRegistry(this); 273 } 274 275 @Override 276 protected ShutdownStrategy createShutdownStrategy() { 277 return new DefaultShutdownStrategy(this); 278 } 279 280 @Override 281 protected PackageScanClassResolver createPackageScanClassResolver() { 282 PackageScanClassResolver packageScanClassResolver; 283 // use WebSphere specific resolver if running on WebSphere 284 if (WebSpherePackageScanClassResolver.isWebSphereClassLoader(this.getClass().getClassLoader())) { 285 LOG.info("Using WebSphere specific PackageScanClassResolver"); 286 packageScanClassResolver = new WebSpherePackageScanClassResolver("META-INF/services/org/apache/camel/TypeConverter"); 287 } else { 288 packageScanClassResolver = new DefaultPackageScanClassResolver(); 289 } 290 return packageScanClassResolver; 291 } 292 293 @Override 294 protected PackageScanResourceResolver createPackageScanResourceResolver() { 295 return new DefaultPackageScanResourceResolver(); 296 } 297 298 @Override 299 protected ExecutorServiceManager createExecutorServiceManager() { 300 return new DefaultExecutorServiceManager(this); 301 } 302 303 @Override 304 protected UnitOfWorkFactory createUnitOfWorkFactory() { 305 return new DefaultUnitOfWorkFactory(); 306 } 307 308 @Override 309 protected RuntimeCamelCatalog createRuntimeCamelCatalog() { 310 return new RuntimeCamelCatalogResolver().resolve(this); 311 } 312 313 @Override 314 protected CamelContextNameStrategy createCamelContextNameStrategy() { 315 return new DefaultCamelContextNameStrategy(); 316 } 317 318 @Override 319 protected ManagementNameStrategy createManagementNameStrategy() { 320 return new DefaultManagementNameStrategy(this); 321 } 322 323 @Override 324 protected HeadersMapFactory createHeadersMapFactory() { 325 return new HeadersMapFactoryResolver().resolve(this); 326 } 327 328 @Override 329 protected BeanProxyFactory createBeanProxyFactory() { 330 return new BeanProxyFactoryResolver().resolve(this); 331 } 332 333 @Override 334 protected BeanProcessorFactory createBeanProcessorFactory() { 335 return new BeanProcessorFactoryResolver().resolve(this); 336 } 337 338 @Override 339 protected BeanIntrospection createBeanIntrospection() { 340 return new DefaultBeanIntrospection(); 341 } 342 343 @Override 344 protected XMLRoutesDefinitionLoader createXMLRoutesDefinitionLoader() { 345 return new XMLRoutesDefinitionLoaderResolver().resolve(this); 346 } 347 348 @Override 349 protected ModelToXMLDumper createModelToXMLDumper() { 350 return new ModelToXMLDumperResolver().resolve(this); 351 } 352 353 @Override 354 protected Tracer createTracer() { 355 Tracer tracer = null; 356 if (getRegistry() != null) { 357 // lookup in registry 358 Map<String, Tracer> map = getRegistry().findByTypeWithName(Tracer.class); 359 if (map.size() == 1) { 360 tracer = map.values().iterator().next(); 361 } 362 } 363 if (tracer == null) { 364 tracer = getExtension(Tracer.class); 365 } 366 if (tracer == null) { 367 tracer = new DefaultTracer(); 368 setExtension(Tracer.class, tracer); 369 } 370 return tracer; 371 } 372 373 @Override 374 protected LanguageResolver createLanguageResolver() { 375 return new DefaultLanguageResolver(); 376 } 377 378 @Override 379 protected ConfigurerResolver createConfigurerResolver() { 380 return new DefaultConfigurerResolver(); 381 } 382 383 @Override 384 protected RestRegistryFactory createRestRegistryFactory() { 385 return new RestRegistryFactoryResolver().resolve(this); 386 } 387 388 @Override 389 protected EndpointRegistry<EndpointKey> createEndpointRegistry(Map<EndpointKey, Endpoint> endpoints) { 390 return new DefaultEndpointRegistry(this, endpoints); 391 } 392 393 @Override 394 protected StreamCachingStrategy createStreamCachingStrategy() { 395 return new DefaultStreamCachingStrategy(); 396 } 397 398 @Override 399 protected ReactiveExecutor createReactiveExecutor() { 400 return new ReactiveExecutorResolver().resolve(this); 401 } 402 403}