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}