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}