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}