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