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