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.lw;
018
019import java.io.IOException;
020import java.io.InputStream;
021import java.util.ArrayList;
022import java.util.Collection;
023import java.util.Collections;
024import java.util.Date;
025import java.util.List;
026import java.util.Map;
027import java.util.Set;
028import java.util.concurrent.ExecutorService;
029import java.util.concurrent.ScheduledExecutorService;
030import java.util.concurrent.TimeUnit;
031import java.util.stream.Collectors;
032
033import org.apache.camel.AsyncProcessor;
034import org.apache.camel.CamelContext;
035import org.apache.camel.CamelContextAware;
036import org.apache.camel.CatalogCamelContext;
037import org.apache.camel.Component;
038import org.apache.camel.ConsumerTemplate;
039import org.apache.camel.Endpoint;
040import org.apache.camel.ErrorHandlerFactory;
041import org.apache.camel.ExchangeConstantProvider;
042import org.apache.camel.ExtendedCamelContext;
043import org.apache.camel.FluentProducerTemplate;
044import org.apache.camel.GlobalEndpointConfiguration;
045import org.apache.camel.IsSingleton;
046import org.apache.camel.LoggingLevel;
047import org.apache.camel.NoSuchEndpointException;
048import org.apache.camel.NoSuchLanguageException;
049import org.apache.camel.Processor;
050import org.apache.camel.ProducerTemplate;
051import org.apache.camel.ResolveEndpointFailedException;
052import org.apache.camel.Route;
053import org.apache.camel.RoutesBuilder;
054import org.apache.camel.RuntimeCamelException;
055import org.apache.camel.Service;
056import org.apache.camel.ServiceStatus;
057import org.apache.camel.ShutdownRoute;
058import org.apache.camel.ShutdownRunningTask;
059import org.apache.camel.StartupListener;
060import org.apache.camel.TypeConverter;
061import org.apache.camel.ValueHolder;
062import org.apache.camel.catalog.RuntimeCamelCatalog;
063import org.apache.camel.impl.converter.CoreTypeConverterRegistry;
064import org.apache.camel.impl.engine.DefaultComponentResolver;
065import org.apache.camel.impl.engine.DefaultDataFormatResolver;
066import org.apache.camel.impl.engine.DefaultLanguageResolver;
067import org.apache.camel.impl.engine.EndpointKey;
068import org.apache.camel.spi.AnnotationBasedProcessorFactory;
069import org.apache.camel.spi.AsyncProcessorAwaitManager;
070import org.apache.camel.spi.BeanIntrospection;
071import org.apache.camel.spi.BeanProcessorFactory;
072import org.apache.camel.spi.BeanProxyFactory;
073import org.apache.camel.spi.CamelBeanPostProcessor;
074import org.apache.camel.spi.CamelContextNameStrategy;
075import org.apache.camel.spi.ClassResolver;
076import org.apache.camel.spi.ComponentNameResolver;
077import org.apache.camel.spi.ComponentResolver;
078import org.apache.camel.spi.ConfigurerResolver;
079import org.apache.camel.spi.DataFormat;
080import org.apache.camel.spi.DataFormatResolver;
081import org.apache.camel.spi.DataType;
082import org.apache.camel.spi.Debugger;
083import org.apache.camel.spi.DeferServiceFactory;
084import org.apache.camel.spi.EndpointRegistry;
085import org.apache.camel.spi.EndpointStrategy;
086import org.apache.camel.spi.ExecutorServiceManager;
087import org.apache.camel.spi.FactoryFinder;
088import org.apache.camel.spi.FactoryFinderResolver;
089import org.apache.camel.spi.HeadersMapFactory;
090import org.apache.camel.spi.InflightRepository;
091import org.apache.camel.spi.Injector;
092import org.apache.camel.spi.InterceptSendToEndpoint;
093import org.apache.camel.spi.InterceptStrategy;
094import org.apache.camel.spi.Language;
095import org.apache.camel.spi.LanguageResolver;
096import org.apache.camel.spi.LifecycleStrategy;
097import org.apache.camel.spi.LogListener;
098import org.apache.camel.spi.ManagementMBeanAssembler;
099import org.apache.camel.spi.ManagementNameStrategy;
100import org.apache.camel.spi.ManagementStrategy;
101import org.apache.camel.spi.MessageHistoryFactory;
102import org.apache.camel.spi.ModelJAXBContextFactory;
103import org.apache.camel.spi.ModelToXMLDumper;
104import org.apache.camel.spi.NodeIdFactory;
105import org.apache.camel.spi.NormalizedEndpointUri;
106import org.apache.camel.spi.PackageScanClassResolver;
107import org.apache.camel.spi.PackageScanResourceResolver;
108import org.apache.camel.spi.ProcessorFactory;
109import org.apache.camel.spi.PropertiesComponent;
110import org.apache.camel.spi.ReactiveExecutor;
111import org.apache.camel.spi.Registry;
112import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
113import org.apache.camel.spi.RestConfiguration;
114import org.apache.camel.spi.RestRegistry;
115import org.apache.camel.spi.RouteController;
116import org.apache.camel.spi.RoutePolicyFactory;
117import org.apache.camel.spi.RouteStartupOrder;
118import org.apache.camel.spi.RuntimeEndpointRegistry;
119import org.apache.camel.spi.ShutdownStrategy;
120import org.apache.camel.spi.StreamCachingStrategy;
121import org.apache.camel.spi.SupervisingRouteController;
122import org.apache.camel.spi.Tracer;
123import org.apache.camel.spi.Transformer;
124import org.apache.camel.spi.TransformerRegistry;
125import org.apache.camel.spi.TypeConverterRegistry;
126import org.apache.camel.spi.UnitOfWorkFactory;
127import org.apache.camel.spi.UuidGenerator;
128import org.apache.camel.spi.Validator;
129import org.apache.camel.spi.ValidatorRegistry;
130import org.apache.camel.spi.XMLRoutesDefinitionLoader;
131import org.apache.camel.support.CamelContextHelper;
132import org.apache.camel.support.NormalizedUri;
133import org.apache.camel.support.jsse.SSLContextParameters;
134import org.apache.camel.util.IOHelper;
135import org.apache.camel.util.ObjectHelper;
136import org.apache.camel.util.StringHelper;
137import org.apache.camel.util.TimeUtils;
138import org.apache.camel.util.URISupport;
139import org.slf4j.Logger;
140import org.slf4j.LoggerFactory;
141
142public class LightweightRuntimeCamelContext implements ExtendedCamelContext, CatalogCamelContext {
143
144    private static final Logger LOG = LoggerFactory.getLogger(LightweightRuntimeCamelContext.class);
145
146    private final CamelContext reference;
147    private final Registry registry;
148    private final CoreTypeConverterRegistry typeConverter;
149    private final ModelJAXBContextFactory modelJAXBContextFactory;
150    private final RuntimeCamelCatalog camelRuntimeCatalog;
151    private final ComponentResolver componentResolver;
152    private final ComponentNameResolver componentNameResolver;
153    private final LanguageResolver languageResolver;
154    private final DataFormatResolver dataFormatResolver;
155    private final UuidGenerator uuidGenerator;
156    private final EndpointRegistry<EndpointKey> endpoints;
157    private final Map<String, Component> components;
158    private final Map<String, Language> languages;
159    private final PropertiesComponent propertiesComponent;
160    private final BeanIntrospection beanIntrospection;
161    private final HeadersMapFactory headersMapFactory;
162    private final ReactiveExecutor reactiveExecutor;
163    private final AsyncProcessorAwaitManager asyncProcessorAwaitManager;
164    private final ExecutorServiceManager executorServiceManager;
165    private final ShutdownStrategy shutdownStrategy;
166    private final ClassLoader applicationContextClassLoader;
167    private final UnitOfWorkFactory unitOfWorkFactory;
168    private final RouteController routeController;
169    private final InflightRepository inflightRepository;
170    private final Injector injector;
171    private final ClassResolver classResolver;
172    private final Map<String, String> globalOptions;
173    private final String name;
174    private final boolean eventNotificationApplicable;
175    private final boolean useDataType;
176    private final boolean useBreadcrumb;
177    private final String mdcLoggingKeysPattern;
178    private final boolean useMDCLogging;
179    private final List<Route> routes;
180    private final boolean messageHistory;
181    private final boolean allowUseOriginalMessage;
182    private final boolean logExhaustedMessageBody;
183    private final String version;
184    private Date startDate;
185
186    LightweightRuntimeCamelContext(CamelContext reference, CamelContext context) {
187        this.reference = reference;
188        registry = context.getRegistry();
189        typeConverter = new CoreTypeConverterRegistry(context.getTypeConverterRegistry());
190        modelJAXBContextFactory = context.adapt(ExtendedCamelContext.class).getModelJAXBContextFactory();
191        camelRuntimeCatalog = context.adapt(ExtendedCamelContext.class).getRuntimeCamelCatalog();
192        routes = Collections.unmodifiableList(context.getRoutes());
193        uuidGenerator = context.getUuidGenerator();
194        componentResolver = context.adapt(ExtendedCamelContext.class).getComponentResolver();
195        componentNameResolver = context.adapt(ExtendedCamelContext.class).getComponentNameResolver();
196        languageResolver = context.adapt(ExtendedCamelContext.class).getLanguageResolver();
197        dataFormatResolver = context.adapt(ExtendedCamelContext.class).getDataFormatResolver();
198        endpoints = (EndpointRegistry) context.getEndpointRegistry();
199        components = context.getComponentNames().stream()
200                .collect(Collectors.toMap(s -> s, s -> context.hasComponent(s)));
201        languages = context.getLanguageNames().stream()
202                .collect(Collectors.toMap(s -> s, s -> context.resolveLanguage(s)));
203        propertiesComponent = context.getPropertiesComponent();
204        beanIntrospection = context.adapt(ExtendedCamelContext.class).getBeanIntrospection();
205        headersMapFactory = context.adapt(ExtendedCamelContext.class).getHeadersMapFactory();
206        reactiveExecutor = context.adapt(ExtendedCamelContext.class).getReactiveExecutor();
207        asyncProcessorAwaitManager = context.adapt(ExtendedCamelContext.class).getAsyncProcessorAwaitManager();
208        executorServiceManager = context.getExecutorServiceManager();
209        shutdownStrategy = context.getShutdownStrategy();
210        applicationContextClassLoader = context.getApplicationContextClassLoader();
211        unitOfWorkFactory = context.adapt(ExtendedCamelContext.class).getUnitOfWorkFactory();
212        routeController = context.getRouteController();
213        inflightRepository = context.getInflightRepository();
214        globalOptions = context.getGlobalOptions();
215        injector = context.getInjector();
216        classResolver = context.getClassResolver();
217        name = context.getName();
218        eventNotificationApplicable = context.adapt(ExtendedCamelContext.class).isEventNotificationApplicable();
219        useDataType = context.isUseDataType();
220        useBreadcrumb = context.isUseBreadcrumb();
221        mdcLoggingKeysPattern = context.getMDCLoggingKeysPattern();
222        useMDCLogging = context.isUseMDCLogging();
223        messageHistory = context.isMessageHistory();
224        allowUseOriginalMessage = context.isAllowUseOriginalMessage();
225        logExhaustedMessageBody = context.isLogExhaustedMessageBody();
226        version = context.getVersion();
227    }
228
229    public CamelContext getCamelContextReference() {
230        return reference;
231    }
232
233    //
234    // Lifecycle
235    //
236
237    @Override
238    public boolean isStarted() {
239        return false;
240    }
241
242    @Override
243    public boolean isStarting() {
244        return false;
245    }
246
247    @Override
248    public boolean isStopped() {
249        return false;
250    }
251
252    @Override
253    public boolean isStopping() {
254        return false;
255    }
256
257    @Override
258    public boolean isSuspended() {
259        return false;
260    }
261
262    @Override
263    public boolean isRunAllowed() {
264        return false;
265    }
266
267    @Override
268    public boolean isSuspending() {
269        return false;
270    }
271
272    @Override
273    public void build() {
274        throw new UnsupportedOperationException();
275    }
276
277    @Override
278    public void init() {
279        throw new UnsupportedOperationException();
280    }
281
282    @Override
283    public void suspend() {
284        throw new UnsupportedOperationException();
285    }
286
287    @Override
288    public void resume() {
289        throw new UnsupportedOperationException();
290    }
291
292    @Override
293    public void start() {
294        startDate = new Date();
295        LOG.info("Apache Camel {} ({}) is starting", getVersion(), getName());
296        for (Route route : routes) {
297            route.getConsumer().start();
298        }
299        if (LOG.isInfoEnabled()) {
300            long l = System.currentTimeMillis() - startDate.getTime();
301            LOG.info("Apache Camel {} ({}) {} routes started in {}",
302                    getVersion(), getName(), routes.size(), TimeUtils.printDuration(l));
303        }
304    }
305
306    @Override
307    public void stop() {
308        for (Route route : routes) {
309            route.getConsumer().stop();
310        }
311    }
312
313    @Override
314    public void shutdown() {
315    }
316
317    @Override
318    public void close() throws IOException {
319        stop();
320    }
321
322    //
323    // RuntimeConfig
324    //
325
326    @Override
327    public void setStreamCaching(Boolean cache) {
328        throw new UnsupportedOperationException();
329    }
330
331    @Override
332    public Boolean isStreamCaching() {
333        throw new UnsupportedOperationException();
334    }
335
336    @Override
337    public Boolean isTracing() {
338        throw new UnsupportedOperationException();
339    }
340
341    @Override
342    public String getTracingPattern() {
343        throw new UnsupportedOperationException();
344    }
345
346    @Override
347    public Boolean isBacklogTracing() {
348        throw new UnsupportedOperationException();
349    }
350
351    @Override
352    public Boolean isDebugging() {
353        throw new UnsupportedOperationException();
354    }
355
356    @Override
357    public Boolean isMessageHistory() {
358        return messageHistory;
359    }
360
361    @Override
362    public Boolean isLogMask() {
363        throw new UnsupportedOperationException();
364    }
365
366    @Override
367    public Boolean isLogExhaustedMessageBody() {
368        return logExhaustedMessageBody;
369    }
370
371    @Override
372    public Long getDelayer() {
373        throw new UnsupportedOperationException();
374    }
375
376    @Override
377    public Boolean isAutoStartup() {
378        throw new UnsupportedOperationException();
379    }
380
381    @Override
382    public ShutdownRoute getShutdownRoute() {
383        throw new UnsupportedOperationException();
384    }
385
386    @Override
387    public ShutdownRunningTask getShutdownRunningTask() {
388        throw new UnsupportedOperationException();
389    }
390
391    @Override
392    public void setAllowUseOriginalMessage(Boolean allowUseOriginalMessage) {
393        throw new UnsupportedOperationException();
394    }
395
396    @Override
397    public Boolean isAllowUseOriginalMessage() {
398        return allowUseOriginalMessage;
399    }
400
401    @Override
402    public Boolean isCaseInsensitiveHeaders() {
403        throw new UnsupportedOperationException();
404    }
405
406    @Override
407    public void setCaseInsensitiveHeaders(Boolean caseInsensitiveHeaders) {
408        throw new UnsupportedOperationException();
409    }
410
411
412    //
413    // Model
414    //
415
416    @Override
417    public Registry getRegistry() {
418        return registry;
419    }
420
421    @Override
422    public TypeConverterRegistry getTypeConverterRegistry() {
423        return typeConverter;
424    }
425
426    @Override
427    public ModelJAXBContextFactory getModelJAXBContextFactory() {
428        return modelJAXBContextFactory;
429    }
430
431    @Override
432    public ComponentResolver getComponentResolver() {
433        return componentResolver;
434    }
435
436    @Override
437    public ComponentNameResolver getComponentNameResolver() {
438        return componentNameResolver;
439    }
440
441    @Override
442    public LanguageResolver getLanguageResolver() {
443        return languageResolver;
444    }
445
446    @Override
447    public DataFormatResolver getDataFormatResolver() {
448        return dataFormatResolver;
449    }
450
451    @Override
452    public UuidGenerator getUuidGenerator() {
453        return uuidGenerator;
454    }
455
456    @Override
457    public <T extends CamelContext> T adapt(Class<T> type) {
458        if (type.isInstance(this)) {
459            return type.cast(this);
460        }
461        throw new UnsupportedOperationException();
462    }
463
464    @Override
465    public <T> T getExtension(Class<T> type) {
466        throw new UnsupportedOperationException();
467    }
468
469    @Override
470    public <T> void setExtension(Class<T> type, T module) {
471        throw new UnsupportedOperationException();
472    }
473
474    @Override
475    public boolean isVetoStarted() {
476        throw new UnsupportedOperationException();
477    }
478
479    @Override
480    public String getName() {
481        return name;
482    }
483
484    @Override
485    public CamelContextNameStrategy getNameStrategy() {
486        throw new UnsupportedOperationException();
487    }
488
489    @Override
490    public void setNameStrategy(CamelContextNameStrategy nameStrategy) {
491        throw new UnsupportedOperationException();
492    }
493
494    @Override
495    public ManagementNameStrategy getManagementNameStrategy() {
496        throw new UnsupportedOperationException();
497    }
498
499    @Override
500    public void setManagementNameStrategy(ManagementNameStrategy nameStrategy) {
501        throw new UnsupportedOperationException();
502    }
503
504    @Override
505    public String getManagementName() {
506        throw new UnsupportedOperationException();
507    }
508
509    @Override
510    public void setManagementName(String name) {
511        throw new UnsupportedOperationException();
512    }
513
514    @Override
515    public String getVersion() {
516        return version;
517    }
518
519    @Override
520    public ServiceStatus getStatus() {
521        return ServiceStatus.Started;
522    }
523
524    @Override
525    public String getUptime() {
526        long delta = getUptimeMillis();
527        if (delta == 0) {
528            return "";
529        }
530        return TimeUtils.printDuration(delta);
531    }
532
533    @Override
534    public long getUptimeMillis() {
535        if (startDate == null) {
536            return 0;
537        }
538        return new Date().getTime() - startDate.getTime();
539    }
540
541    @Override
542    public Date getStartDate() {
543        return startDate;
544    }
545
546    @Override
547    public void addService(Object object) throws Exception {
548    }
549
550    @Override
551    public void addService(Object object, boolean stopOnShutdown) throws Exception {
552
553    }
554
555    @Override
556    public void addService(Object object, boolean stopOnShutdown, boolean forceStart) throws Exception {
557
558    }
559
560    @Override
561    public void addPrototypeService(Object object) throws Exception {
562
563    }
564
565    @Override
566    public boolean removeService(Object object) throws Exception {
567        return false;
568    }
569
570    @Override
571    public boolean hasService(Object object) {
572        return false;
573    }
574
575    @Override
576    public <T> T hasService(Class<T> type) {
577        return null;
578    }
579
580    @Override
581    public <T> Set<T> hasServices(Class<T> type) {
582        return null;
583    }
584
585    @Override
586    public void deferStartService(Object object, boolean stopOnShutdown) throws Exception {
587    }
588
589    @Override
590    public void addStartupListener(StartupListener listener) throws Exception {
591    }
592
593    @Override
594    public Component hasComponent(String componentName) {
595        return components.get(componentName);
596    }
597
598    @Override
599    public Component getComponent(String componentName) {
600        return getComponent(name, true, true);
601    }
602
603    @Override
604    public Component getComponent(String name, boolean autoCreateComponents) {
605        return getComponent(name, autoCreateComponents, true);
606    }
607
608    @Override
609    public Component getComponent(String name, boolean autoCreateComponents, boolean autoStart) {
610        return components.get(name);
611    }
612
613    @Override
614    public <T extends Component> T getComponent(String name, Class<T> componentType) {
615        return componentType.cast(hasComponent(name));
616    }
617
618    @Override
619    public List<String> getComponentNames() {
620        return new ArrayList<>(components.keySet());
621    }
622
623    @Override
624    public EndpointRegistry<? extends ValueHolder<String>> getEndpointRegistry() {
625        return endpoints;
626    }
627
628    @Override
629    public Endpoint getEndpoint(String uri) {
630        return doGetEndpoint(uri, false, false);
631    }
632
633    /**
634     * Normalize uri so we can do endpoint hits with minor mistakes and
635     * parameters is not in the same order.
636     *
637     * @param uri the uri
638     * @return normalized uri
639     * @throws ResolveEndpointFailedException if uri cannot be normalized
640     */
641    protected static String normalizeEndpointUri(String uri) {
642        try {
643            uri = URISupport.normalizeUri(uri);
644        } catch (Exception e) {
645            throw new ResolveEndpointFailedException(uri, e);
646        }
647        return uri;
648    }
649
650    @Override
651    public Endpoint getEndpoint(String uri, Map<String, Object> parameters) {
652        return doGetEndpoint(uri, parameters, false);
653    }
654
655    @Override
656    public <T extends Endpoint> T getEndpoint(String name, Class<T> endpointType) {
657        Endpoint endpoint = getEndpoint(name);
658        if (endpoint == null) {
659            throw new NoSuchEndpointException(name);
660        }
661        if (endpoint instanceof InterceptSendToEndpoint) {
662            endpoint = ((InterceptSendToEndpoint)endpoint).getOriginalEndpoint();
663        }
664        if (endpointType.isInstance(endpoint)) {
665            return endpointType.cast(endpoint);
666        } else {
667            throw new IllegalArgumentException("The endpoint is not of type: " + endpointType + " but is: " + endpoint.getClass().getCanonicalName());
668        }
669    }
670
671    @Override
672    public Collection<Endpoint> getEndpoints() {
673        return new ArrayList<>(endpoints.values());
674    }
675
676    @Override
677    public Map<String, Endpoint> getEndpointMap() {
678        throw new UnsupportedOperationException();
679    }
680
681    @Override
682    public Endpoint hasEndpoint(String uri) {
683        return endpoints.get(new EndpointKey(uri));
684    }
685
686    @Override
687    public GlobalEndpointConfiguration getGlobalEndpointConfiguration() {
688        throw new UnsupportedOperationException();
689    }
690
691    @Override
692    public RouteController getRouteController() {
693        return routeController;
694    }
695
696    @Override
697    public List<Route> getRoutes() {
698        return routes;
699    }
700
701    @Override
702    public int getRoutesSize() {
703        return routes.size();
704    }
705
706    @Override
707    public Route getRoute(String id) {
708        throw new UnsupportedOperationException();
709    }
710
711    @Override
712    public Processor getProcessor(String id) {
713        throw new UnsupportedOperationException();
714    }
715
716    @Override
717    public <T extends Processor> T getProcessor(String id, Class<T> type) {
718        throw new UnsupportedOperationException();
719    }
720
721    @Override
722    public List<RoutePolicyFactory> getRoutePolicyFactories() {
723        throw new UnsupportedOperationException();
724    }
725
726    @Override
727    public RestConfiguration getRestConfiguration() {
728        throw new UnsupportedOperationException();
729    }
730
731    @Override
732    public RestRegistry getRestRegistry() {
733        throw new UnsupportedOperationException();
734    }
735
736    @Override
737    public TypeConverter getTypeConverter() {
738        return typeConverter;
739    }
740
741    @Override
742    public <T> T getRegistry(Class<T> type) {
743        return type.cast(registry);
744    }
745
746    @Override
747    public Injector getInjector() {
748        return injector;
749    }
750
751    @Override
752    public List<LifecycleStrategy> getLifecycleStrategies() {
753        throw new UnsupportedOperationException();
754    }
755
756    @Override
757    public Language resolveLanguage(String language) throws NoSuchLanguageException {
758        Language answer;
759        synchronized (languages) {
760            answer = languages.get(language);
761            // check if the language is singleton, if so return the shared
762            // instance
763            if (answer instanceof IsSingleton) {
764                boolean singleton = ((IsSingleton)answer).isSingleton();
765                if (singleton) {
766                    return answer;
767                }
768            }
769            // language not known or not singleton, then use resolver
770            answer = getLanguageResolver().resolveLanguage(language, reference);
771            // inject CamelContext if aware
772            if (answer != null) {
773                if (answer instanceof CamelContextAware) {
774                    ((CamelContextAware)answer).setCamelContext(reference);
775                }
776                if (answer instanceof Service) {
777                    try {
778                        startService((Service)answer);
779                    } catch (Exception e) {
780                        throw RuntimeCamelException.wrapRuntimeCamelException(e);
781                    }
782                }
783                languages.put(language, answer);
784            }
785        }
786        return answer;
787    }
788
789    @Override
790    public String resolvePropertyPlaceholders(String text) {
791        if (text != null && text.contains(PropertiesComponent.PREFIX_TOKEN)) {
792            // the parser will throw exception if property key was not found
793            return getPropertiesComponent().parseUri(text);
794        }
795        // is the value a known field (currently we only support
796        // constants from Exchange.class)
797        if (text != null && text.startsWith("Exchange.")) {
798            String field = StringHelper.after(text, "Exchange.");
799            String constant = ExchangeConstantProvider.lookup(field);
800            if (constant != null) {
801                return constant;
802            } else {
803                throw new IllegalArgumentException("Constant field with name: " + field + " not found on Exchange.class");
804            }
805        }
806        // return original text as is
807        return text;
808    }
809
810    @Override
811    public PropertiesComponent getPropertiesComponent() {
812        return propertiesComponent;
813    }
814
815    @Override
816    public List<String> getLanguageNames() {
817        throw new UnsupportedOperationException();
818    }
819
820    @Override
821    public ProducerTemplate createProducerTemplate() {
822        throw new UnsupportedOperationException();
823    }
824
825    @Override
826    public ProducerTemplate createProducerTemplate(int maximumCacheSize) {
827        throw new UnsupportedOperationException();
828    }
829
830    @Override
831    public FluentProducerTemplate createFluentProducerTemplate() {
832        throw new UnsupportedOperationException();
833    }
834
835    @Override
836    public FluentProducerTemplate createFluentProducerTemplate(int maximumCacheSize) {
837        throw new UnsupportedOperationException();
838    }
839
840    @Override
841    public ConsumerTemplate createConsumerTemplate() {
842        throw new UnsupportedOperationException();
843    }
844
845    @Override
846    public ConsumerTemplate createConsumerTemplate(int maximumCacheSize) {
847        throw new UnsupportedOperationException();
848    }
849
850    @Override
851    public DataFormat resolveDataFormat(String name) {
852        throw new UnsupportedOperationException();
853    }
854
855    @Override
856    public DataFormat createDataFormat(String name) {
857        throw new UnsupportedOperationException();
858    }
859
860    @Override
861    public Transformer resolveTransformer(String model) {
862        throw new UnsupportedOperationException();
863    }
864
865    @Override
866    public Transformer resolveTransformer(DataType from, DataType to) {
867        throw new UnsupportedOperationException();
868    }
869
870    @Override
871    public TransformerRegistry getTransformerRegistry() {
872        throw new UnsupportedOperationException();
873    }
874
875    @Override
876    public Validator resolveValidator(DataType type) {
877        throw new UnsupportedOperationException();
878    }
879
880    @Override
881    public ValidatorRegistry getValidatorRegistry() {
882        throw new UnsupportedOperationException();
883    }
884
885    @Override
886    public void setGlobalOptions(Map<String, String> globalOptions) {
887        throw new UnsupportedOperationException();
888    }
889
890    @Override
891    public Map<String, String> getGlobalOptions() {
892        return globalOptions;
893    }
894
895    @Override
896    public String getGlobalOption(String key) {
897        String value = getGlobalOptions().get(key);
898        if (ObjectHelper.isNotEmpty(value)) {
899            try {
900                value = resolvePropertyPlaceholders(value);
901            } catch (Exception e) {
902                throw new RuntimeCamelException("Error getting global option: " + key, e);
903            }
904        }
905        return value;
906    }
907
908    @Override
909    public ClassResolver getClassResolver() {
910        return classResolver;
911    }
912
913    @Override
914    public ManagementStrategy getManagementStrategy() {
915        return null;
916    }
917
918    @Override
919    public void disableJMX() throws IllegalStateException {
920        throw new UnsupportedOperationException();
921    }
922
923    @Override
924    public InflightRepository getInflightRepository() {
925        return inflightRepository;
926    }
927
928    @Override
929    public ClassLoader getApplicationContextClassLoader() {
930        return applicationContextClassLoader;
931    }
932
933    @Override
934    public ShutdownStrategy getShutdownStrategy() {
935        return shutdownStrategy;
936    }
937
938    @Override
939    public ExecutorServiceManager getExecutorServiceManager() {
940        return executorServiceManager;
941    }
942
943    @Override
944    public MessageHistoryFactory getMessageHistoryFactory() {
945        throw new UnsupportedOperationException();
946    }
947
948    @Override
949    public Debugger getDebugger() {
950        throw new UnsupportedOperationException();
951    }
952
953    @Override
954    public Tracer getTracer() {
955        throw new UnsupportedOperationException();
956    }
957
958    @Override
959    public Boolean isLoadTypeConverters() {
960        throw new UnsupportedOperationException();
961    }
962
963    @Override
964    public void setLoadTypeConverters(Boolean loadTypeConverters) {
965        throw new UnsupportedOperationException();
966    }
967
968    @Override
969    public Boolean isTypeConverterStatisticsEnabled() {
970        throw new UnsupportedOperationException();
971    }
972
973    @Override
974    public void setTypeConverterStatisticsEnabled(Boolean typeConverterStatisticsEnabled) {
975        throw new UnsupportedOperationException();
976    }
977
978    @Override
979    public Boolean isUseMDCLogging() {
980        return useMDCLogging;
981    }
982
983    @Override
984    public void setUseMDCLogging(Boolean useMDCLogging) {
985        throw new UnsupportedOperationException();
986    }
987
988    @Override
989    public String getMDCLoggingKeysPattern() {
990        return mdcLoggingKeysPattern;
991    }
992
993    @Override
994    public void setMDCLoggingKeysPattern(String pattern) {
995        throw new UnsupportedOperationException();
996    }
997
998    @Override
999    public Boolean isUseDataType() {
1000        return useDataType;
1001    }
1002
1003    @Override
1004    public void setUseDataType(Boolean useDataType) {
1005        throw new UnsupportedOperationException();
1006    }
1007
1008    @Override
1009    public Boolean isUseBreadcrumb() {
1010        return useBreadcrumb;
1011    }
1012
1013    @Override
1014    public void setUseBreadcrumb(Boolean useBreadcrumb) {
1015        throw new UnsupportedOperationException();
1016    }
1017
1018    @Override
1019    public StreamCachingStrategy getStreamCachingStrategy() {
1020        throw new UnsupportedOperationException();
1021    }
1022
1023    @Override
1024    public RuntimeEndpointRegistry getRuntimeEndpointRegistry() {
1025        throw new UnsupportedOperationException();
1026    }
1027
1028    @Override
1029    public SSLContextParameters getSSLContextParameters() {
1030        throw new UnsupportedOperationException();
1031    }
1032
1033    //
1034    // ExtendedCamelContext
1035    //
1036
1037    @Override
1038    public Endpoint getPrototypeEndpoint(String uri) {
1039        throw new UnsupportedOperationException();
1040    }
1041
1042    @Override
1043    public Endpoint getPrototypeEndpoint(NormalizedEndpointUri uri) {
1044        throw new UnsupportedOperationException();
1045    }
1046
1047    @Override
1048    public Endpoint hasEndpoint(NormalizedEndpointUri uri) {
1049        EndpointKey key;
1050        if (uri instanceof EndpointKey) {
1051            key = (EndpointKey) uri;
1052        } else {
1053            key = getEndpointKeyPreNormalized(uri.getUri());
1054        }
1055        return endpoints.get(key);
1056    }
1057
1058    @Override
1059    public Endpoint getEndpoint(NormalizedEndpointUri uri) {
1060        return doGetEndpoint(uri.getUri(), true, false);
1061    }
1062
1063    @Override
1064    public Endpoint getEndpoint(NormalizedEndpointUri uri, Map<String, Object> parameters) {
1065        return doGetEndpoint(uri.getUri(), parameters, true);
1066    }
1067
1068    protected Endpoint doGetEndpoint(String uri, boolean normalized, boolean prototype) {
1069        StringHelper.notEmpty(uri, "uri");
1070        // in case path has property placeholders then try to let property
1071        // component resolve those
1072        if (!normalized) {
1073            try {
1074                uri = resolvePropertyPlaceholders(uri);
1075            } catch (Exception e) {
1076                throw new ResolveEndpointFailedException(uri, e);
1077            }
1078        }
1079        final String rawUri = uri;
1080        // normalize uri so we can do endpoint hits with minor mistakes and
1081        // parameters is not in the same order
1082        if (!normalized) {
1083            uri = normalizeEndpointUri(uri);
1084        }
1085        String scheme;
1086        Endpoint answer = null;
1087        if (!prototype) {
1088            // use optimized method to get the endpoint uri
1089            EndpointKey key = getEndpointKeyPreNormalized(uri);
1090            // only lookup and reuse existing endpoints if not prototype scoped
1091            answer = endpoints.get(key);
1092        }
1093        // unknown scheme
1094        if (answer == null) {
1095            throw new NoSuchEndpointException(uri);
1096        }
1097        return answer;
1098    }
1099
1100    protected Endpoint doGetEndpoint(String uri, Map<String, Object> parameters, boolean normalized) {
1101        StringHelper.notEmpty(uri, "uri");
1102        // in case path has property placeholders then try to let property
1103        // component resolve those
1104        if (!normalized) {
1105            try {
1106                uri = resolvePropertyPlaceholders(uri);
1107            } catch (Exception e) {
1108                throw new ResolveEndpointFailedException(uri, e);
1109            }
1110        }
1111        final String rawUri = uri;
1112        // normalize uri so we can do endpoint hits with minor mistakes and
1113        // parameters is not in the same order
1114        if (!normalized) {
1115            uri = normalizeEndpointUri(uri);
1116        }
1117        Endpoint answer;
1118        String scheme = null;
1119        // use optimized method to get the endpoint uri
1120        EndpointKey key = getEndpointKeyPreNormalized(uri);
1121        answer = endpoints.get(key);
1122        // unknown scheme
1123        if (answer == null) {
1124            throw new ResolveEndpointFailedException(uri, "No component found with scheme: " + scheme);
1125        }
1126        return answer;
1127    }
1128
1129    protected EndpointKey getEndpointKeyPreNormalized(String uri) {
1130        return new EndpointKey(uri, true);
1131    }
1132
1133    @Override
1134    public NormalizedEndpointUri normalizeUri(String uri) {
1135        try {
1136            uri = resolvePropertyPlaceholders(uri);
1137            uri = normalizeEndpointUri(uri);
1138            return new NormalizedUri(uri);
1139        } catch (Exception e) {
1140            throw new ResolveEndpointFailedException(uri, e);
1141        }
1142    }
1143
1144    @Override
1145    public List<RouteStartupOrder> getRouteStartupOrder() {
1146        throw new UnsupportedOperationException();
1147    }
1148
1149    @Override
1150    public CamelBeanPostProcessor getBeanPostProcessor() {
1151        throw new UnsupportedOperationException();
1152    }
1153
1154    @Override
1155    public ManagementMBeanAssembler getManagementMBeanAssembler() {
1156        throw new UnsupportedOperationException();
1157    }
1158
1159    @Override
1160    public AsyncProcessor createMulticast(Collection<Processor> processors, ExecutorService executor, boolean shutdownExecutorService) {
1161        throw new UnsupportedOperationException();
1162    }
1163
1164    @Override
1165    public ErrorHandlerFactory getErrorHandlerFactory() {
1166        throw new UnsupportedOperationException();
1167    }
1168
1169    @Override
1170    public PackageScanClassResolver getPackageScanClassResolver() {
1171        throw new UnsupportedOperationException();
1172    }
1173
1174    @Override
1175    public PackageScanResourceResolver getPackageScanResourceResolver() {
1176        throw new UnsupportedOperationException();
1177    }
1178
1179    @Override
1180    public FactoryFinder getDefaultFactoryFinder() {
1181        throw new UnsupportedOperationException();
1182    }
1183
1184    @Override
1185    public FactoryFinder getFactoryFinder(String path) {
1186        throw new UnsupportedOperationException();
1187    }
1188
1189    @Override
1190    public FactoryFinderResolver getFactoryFinderResolver() {
1191        throw new UnsupportedOperationException();
1192    }
1193
1194    @Override
1195    public ProcessorFactory getProcessorFactory() {
1196        throw new UnsupportedOperationException();
1197    }
1198
1199    @Override
1200    public DeferServiceFactory getDeferServiceFactory() {
1201        throw new UnsupportedOperationException();
1202    }
1203
1204    @Override
1205    public UnitOfWorkFactory getUnitOfWorkFactory() {
1206        return unitOfWorkFactory;
1207    }
1208
1209    @Override
1210    public AnnotationBasedProcessorFactory getAnnotationBasedProcessorFactory() {
1211        throw new UnsupportedOperationException();
1212    }
1213
1214    @Override
1215    public BeanProxyFactory getBeanProxyFactory() {
1216        throw new UnsupportedOperationException();
1217    }
1218
1219    @Override
1220    public BeanProcessorFactory getBeanProcessorFactory() {
1221        throw new UnsupportedOperationException();
1222    }
1223
1224    @Override
1225    public ScheduledExecutorService getErrorHandlerExecutorService() {
1226        throw new UnsupportedOperationException();
1227    }
1228
1229    @Override
1230    public List<InterceptStrategy> getInterceptStrategies() {
1231        throw new UnsupportedOperationException();
1232    }
1233
1234    @Override
1235    public Set<LogListener> getLogListeners() {
1236        throw new UnsupportedOperationException();
1237    }
1238
1239    @Override
1240    public AsyncProcessorAwaitManager getAsyncProcessorAwaitManager() {
1241        return asyncProcessorAwaitManager;
1242    }
1243
1244    @Override
1245    public BeanIntrospection getBeanIntrospection() {
1246        return beanIntrospection;
1247    }
1248
1249    @Override
1250    public HeadersMapFactory getHeadersMapFactory() {
1251        return headersMapFactory;
1252    }
1253
1254    @Override
1255    public ReactiveExecutor getReactiveExecutor() {
1256        return reactiveExecutor;
1257    }
1258
1259    @Override
1260    public boolean isEventNotificationApplicable() {
1261        return eventNotificationApplicable;
1262    }
1263
1264    @Override
1265    public ModelToXMLDumper getModelToXMLDumper() {
1266        throw new UnsupportedOperationException();
1267    }
1268
1269    @Override
1270    public RuntimeCamelCatalog getRuntimeCamelCatalog() {
1271        throw new UnsupportedOperationException();
1272    }
1273
1274    @Override
1275    public ConfigurerResolver getConfigurerResolver() {
1276        throw new UnsupportedOperationException();
1277    }
1278
1279    @Override
1280    public void addRoute(Route route) {
1281        throw new UnsupportedOperationException();
1282    }
1283
1284    @Override
1285    public void removeRoute(Route route) {
1286        throw new UnsupportedOperationException();
1287    }
1288
1289    @Override
1290    public Processor createErrorHandler(Route route, Processor processor) throws Exception {
1291        // TODO: need to revisit this in order to support dynamic endpoints uri
1292        throw new UnsupportedOperationException();
1293    }
1294
1295    //
1296    // CatalogCamelContext
1297    //
1298
1299    @Override
1300    public String getComponentParameterJsonSchema(String componentName) throws IOException {
1301        Class<?> clazz;
1302        Object instance = getRegistry().lookupByNameAndType(componentName, Component.class);
1303        if (instance != null) {
1304            clazz = instance.getClass();
1305        } else {
1306            clazz = getFactoryFinder(DefaultComponentResolver.RESOURCE_PATH).findClass(componentName).orElse(null);
1307            if (clazz == null) {
1308                instance = hasComponent(componentName);
1309                if (instance != null) {
1310                    clazz = instance.getClass();
1311                } else {
1312                    return null;
1313                }
1314            }
1315        }
1316        // special for ActiveMQ as it is really just JMS
1317        if ("ActiveMQComponent".equals(clazz.getSimpleName())) {
1318            return getComponentParameterJsonSchema("jms");
1319        } else {
1320            return getJsonSchema(clazz.getPackage().getName(), componentName);
1321        }
1322    }
1323
1324    @Override
1325    public String getDataFormatParameterJsonSchema(String dataFormatName) throws IOException {
1326        Class<?> clazz;
1327        Object instance = getRegistry().lookupByNameAndType(dataFormatName, DataFormat.class);
1328        if (instance != null) {
1329            clazz = instance.getClass();
1330        } else {
1331            clazz = getFactoryFinder(DefaultDataFormatResolver.DATAFORMAT_RESOURCE_PATH).findClass(dataFormatName).orElse(null);
1332            if (clazz == null) {
1333                return null;
1334            }
1335        }
1336        return getJsonSchema(clazz.getPackage().getName(), dataFormatName);
1337    }
1338
1339    @Override
1340    public String getLanguageParameterJsonSchema(String languageName) throws IOException {
1341        Class<?> clazz;
1342        Object instance = getRegistry().lookupByNameAndType(languageName, Language.class);
1343        if (instance != null) {
1344            clazz = instance.getClass();
1345        } else {
1346            clazz = getFactoryFinder(DefaultLanguageResolver.LANGUAGE_RESOURCE_PATH).findClass(languageName).orElse(null);
1347            if (clazz == null) {
1348                return null;
1349            }
1350        }
1351        return getJsonSchema(clazz.getPackage().getName(), languageName);
1352    }
1353
1354    @Override
1355    public String getEipParameterJsonSchema(String eipName) throws IOException {
1356        // the eip json schema may be in some of the sub-packages so look until
1357        // we find it
1358        String[] subPackages = new String[] {"", "/config", "/dataformat", "/language", "/loadbalancer", "/rest" };
1359        for (String sub : subPackages) {
1360            String path = CamelContextHelper.MODEL_DOCUMENTATION_PREFIX + sub + "/" + eipName + ".json";
1361            InputStream inputStream = getClassResolver().loadResourceAsStream(path);
1362            if (inputStream != null) {
1363                try {
1364                    return IOHelper.loadText(inputStream);
1365                } finally {
1366                    IOHelper.close(inputStream);
1367                }
1368            }
1369        }
1370        return null;
1371    }
1372
1373    private String getJsonSchema(String packageName, String name) throws IOException {
1374        String path = packageName.replace('.', '/') + "/" + name + ".json";
1375        InputStream inputStream = getClassResolver().loadResourceAsStream(path);
1376        if (inputStream != null) {
1377            try {
1378                return IOHelper.loadText(inputStream);
1379            } finally {
1380                IOHelper.close(inputStream);
1381            }
1382        }
1383        return null;
1384    }
1385
1386    //
1387    // Unsupported mutable methods
1388    //
1389
1390    @Override
1391    public void setName(String name) {
1392        throw new UnsupportedOperationException();
1393    }
1394
1395    @Override
1396    public void setRegistry(Registry registry) {
1397        throw new UnsupportedOperationException();
1398    }
1399
1400    @Override
1401    public void setupRoutes(boolean done) {
1402        throw new UnsupportedOperationException();
1403    }
1404
1405    @Override
1406    public boolean isSetupRoutes() {
1407        return false;
1408    }
1409
1410    @Override
1411    public void setStreamCachingStrategy(StreamCachingStrategy streamCachingStrategy) {
1412        throw new UnsupportedOperationException();
1413    }
1414
1415    @Override
1416    public void setErrorHandlerFactory(ErrorHandlerFactory errorHandlerFactory) {
1417        throw new UnsupportedOperationException();
1418    }
1419
1420    @Override
1421    public void setComponentResolver(ComponentResolver componentResolver) {
1422        throw new UnsupportedOperationException();
1423    }
1424
1425    @Override
1426    public void setComponentNameResolver(ComponentNameResolver componentResolver) {
1427        throw new UnsupportedOperationException();
1428    }
1429
1430    @Override
1431    public void setLanguageResolver(LanguageResolver languageResolver) {
1432        throw new UnsupportedOperationException();
1433    }
1434
1435    @Override
1436    public void setDataFormatResolver(DataFormatResolver dataFormatResolver) {
1437        throw new UnsupportedOperationException();
1438    }
1439
1440    @Override
1441    public void setPackageScanClassResolver(PackageScanClassResolver resolver) {
1442        throw new UnsupportedOperationException();
1443    }
1444
1445    @Override
1446    public void setPackageScanResourceResolver(PackageScanResourceResolver resolver) {
1447        throw new UnsupportedOperationException();
1448    }
1449
1450    @Override
1451    public void setFactoryFinderResolver(FactoryFinderResolver resolver) {
1452        throw new UnsupportedOperationException();
1453    }
1454
1455    @Override
1456    public void setProcessorFactory(ProcessorFactory processorFactory) {
1457        throw new UnsupportedOperationException();
1458    }
1459
1460    @Override
1461    public void setModelJAXBContextFactory(ModelJAXBContextFactory modelJAXBContextFactory) {
1462        throw new UnsupportedOperationException();
1463    }
1464
1465    @Override
1466    public void setUnitOfWorkFactory(UnitOfWorkFactory unitOfWorkFactory) {
1467        throw new UnsupportedOperationException();
1468    }
1469
1470    @Override
1471    public void addInterceptStrategy(InterceptStrategy interceptStrategy) {
1472        throw new UnsupportedOperationException();
1473    }
1474
1475    @Override
1476    public void setupManagement(Map<String, Object> options) {
1477        throw new UnsupportedOperationException();
1478    }
1479
1480    @Override
1481    public void addLogListener(LogListener listener) {
1482        throw new UnsupportedOperationException();
1483    }
1484
1485    @Override
1486    public void setAsyncProcessorAwaitManager(AsyncProcessorAwaitManager manager) {
1487        throw new UnsupportedOperationException();
1488    }
1489
1490    @Override
1491    public void setBeanIntrospection(BeanIntrospection beanIntrospection) {
1492        throw new UnsupportedOperationException();
1493    }
1494
1495    @Override
1496    public void setHeadersMapFactory(HeadersMapFactory factory) {
1497        throw new UnsupportedOperationException();
1498    }
1499
1500    @Override
1501    public void setReactiveExecutor(ReactiveExecutor reactiveExecutor) {
1502        throw new UnsupportedOperationException();
1503    }
1504
1505    @Override
1506    public void setEventNotificationApplicable(boolean eventNotificationApplicable) {
1507        throw new UnsupportedOperationException();
1508    }
1509
1510    @Override
1511    public void setXMLRoutesDefinitionLoader(XMLRoutesDefinitionLoader xmlRoutesDefinitionLoader) {
1512        throw new UnsupportedOperationException();
1513    }
1514
1515    @Override
1516    public void setModelToXMLDumper(ModelToXMLDumper modelToXMLDumper) {
1517        throw new UnsupportedOperationException();
1518    }
1519
1520    @Override
1521    public void setRestBindingJaxbDataFormatFactory(RestBindingJaxbDataFormatFactory restBindingJaxbDataFormatFactory) {
1522        throw new UnsupportedOperationException();
1523    }
1524
1525    @Override
1526    public RestBindingJaxbDataFormatFactory getRestBindingJaxbDataFormatFactory() {
1527        throw new UnsupportedOperationException();
1528    }
1529
1530    @Override
1531    public void setRuntimeCamelCatalog(RuntimeCamelCatalog runtimeCamelCatalog) {
1532        throw new UnsupportedOperationException();
1533    }
1534
1535    @Override
1536    public void setConfigurerResolver(ConfigurerResolver configurerResolver) {
1537        throw new UnsupportedOperationException();
1538    }
1539
1540    @Override
1541    public XMLRoutesDefinitionLoader getXMLRoutesDefinitionLoader() {
1542        throw new UnsupportedOperationException();
1543    }
1544
1545    @Override
1546    public void registerEndpointCallback(EndpointStrategy strategy) {
1547        throw new UnsupportedOperationException();
1548    }
1549
1550    @Override
1551    public void setNodeIdFactory(NodeIdFactory factory) {
1552        throw new UnsupportedOperationException();
1553    }
1554
1555    @Override
1556    public Endpoint addEndpoint(String uri, Endpoint endpoint) throws Exception {
1557        throw new UnsupportedOperationException();
1558    }
1559
1560    @Override
1561    public void removeEndpoint(Endpoint endpoint) throws Exception {
1562        throw new UnsupportedOperationException();
1563    }
1564
1565    @Override
1566    public Collection<Endpoint> removeEndpoints(String pattern) throws Exception {
1567        throw new UnsupportedOperationException();
1568    }
1569
1570    @Override
1571    public NodeIdFactory getNodeIdFactory() {
1572        throw new UnsupportedOperationException();
1573    }
1574
1575    @Override
1576    public void setRuntimeEndpointRegistry(RuntimeEndpointRegistry runtimeEndpointRegistry) {
1577        throw new UnsupportedOperationException();
1578    }
1579
1580    @Override
1581    public void setSSLContextParameters(SSLContextParameters sslContextParameters) {
1582        throw new UnsupportedOperationException();
1583    }
1584
1585    @Override
1586    public void setTracer(Tracer tracer) {
1587        throw new UnsupportedOperationException();
1588    }
1589
1590    @Override
1591    public void setUuidGenerator(UuidGenerator uuidGenerator) {
1592        throw new UnsupportedOperationException();
1593    }
1594
1595    @Override
1596    public void addComponent(String componentName, Component component) {
1597        throw new UnsupportedOperationException();
1598    }
1599
1600    @Override
1601    public Component removeComponent(String componentName) {
1602        throw new UnsupportedOperationException();
1603    }
1604
1605    @Override
1606    public void setRouteController(RouteController routeController) {
1607        throw new UnsupportedOperationException();
1608    }
1609
1610    @Override
1611    public void addRoutes(RoutesBuilder builder) throws Exception {
1612        throw new UnsupportedOperationException();
1613    }
1614
1615    @Override
1616    public boolean removeRoute(String routeId) throws Exception {
1617        throw new UnsupportedOperationException();
1618    }
1619
1620    @Override
1621    public void addRoutePolicyFactory(RoutePolicyFactory routePolicyFactory) {
1622        throw new UnsupportedOperationException();
1623    }
1624
1625    @Override
1626    public void setRestConfiguration(RestConfiguration restConfiguration) {
1627        throw new UnsupportedOperationException();
1628    }
1629
1630    @Override
1631    public void setRestRegistry(RestRegistry restRegistry) {
1632        throw new UnsupportedOperationException();
1633    }
1634
1635    @Override
1636    public void setDebugger(Debugger debugger) {
1637        throw new UnsupportedOperationException();
1638    }
1639
1640    @Override
1641    public void setTracing(Boolean tracing) {
1642        throw new UnsupportedOperationException();
1643    }
1644
1645    @Override
1646    public void setTracingPattern(String tracePattern) {
1647        throw new UnsupportedOperationException();
1648    }
1649
1650    @Override
1651    public void setBacklogTracing(Boolean backlogTrace) {
1652        throw new UnsupportedOperationException();
1653    }
1654
1655    @Override
1656    public void setDebugging(Boolean debugging) {
1657        throw new UnsupportedOperationException();
1658    }
1659
1660    @Override
1661    public void setMessageHistory(Boolean messageHistory) {
1662        throw new UnsupportedOperationException();
1663    }
1664
1665    @Override
1666    public void setLogMask(Boolean logMask) {
1667        throw new UnsupportedOperationException();
1668    }
1669
1670    @Override
1671    public void setLogExhaustedMessageBody(Boolean logExhaustedMessageBody) {
1672        throw new UnsupportedOperationException();
1673    }
1674
1675    @Override
1676    public void setDelayer(Long delay) {
1677        throw new UnsupportedOperationException();
1678    }
1679
1680    @Override
1681    public void setAutoStartup(Boolean autoStartup) {
1682        throw new UnsupportedOperationException();
1683    }
1684
1685    @Override
1686    public void setShutdownRoute(ShutdownRoute shutdownRoute) {
1687        throw new UnsupportedOperationException();
1688    }
1689
1690    @Override
1691    public void setShutdownRunningTask(ShutdownRunningTask shutdownRunningTask) {
1692        throw new UnsupportedOperationException();
1693    }
1694
1695    @Override
1696    public void setClassResolver(ClassResolver resolver) {
1697        throw new UnsupportedOperationException();
1698    }
1699
1700    @Override
1701    public void setManagementStrategy(ManagementStrategy strategy) {
1702        throw new UnsupportedOperationException();
1703    }
1704
1705    @Override
1706    public void setInflightRepository(InflightRepository repository) {
1707        throw new UnsupportedOperationException();
1708    }
1709
1710    @Override
1711    public void setApplicationContextClassLoader(ClassLoader classLoader) {
1712        throw new UnsupportedOperationException();
1713    }
1714
1715    @Override
1716    public void setShutdownStrategy(ShutdownStrategy shutdownStrategy) {
1717        throw new UnsupportedOperationException();
1718    }
1719
1720    @Override
1721    public void setExecutorServiceManager(ExecutorServiceManager executorServiceManager) {
1722        throw new UnsupportedOperationException();
1723    }
1724
1725    @Override
1726    public void setMessageHistoryFactory(MessageHistoryFactory messageHistoryFactory) {
1727        throw new UnsupportedOperationException();
1728    }
1729
1730    @Override
1731    public void setTypeConverterRegistry(TypeConverterRegistry typeConverterRegistry) {
1732        throw new UnsupportedOperationException();
1733    }
1734
1735    @Override
1736    public void setInjector(Injector injector) {
1737        throw new UnsupportedOperationException();
1738    }
1739
1740    @Override
1741    public void addLifecycleStrategy(LifecycleStrategy lifecycleStrategy) {
1742        throw new UnsupportedOperationException();
1743    }
1744
1745    @Override
1746    public void setPropertiesComponent(PropertiesComponent propertiesComponent) {
1747        throw new UnsupportedOperationException();
1748    }
1749
1750    @Override
1751    public RouteController getInternalRouteController() {
1752        return new RouteController() {
1753            @Override
1754            public LoggingLevel getRouteStartupLoggingLevel() {
1755                throw new UnsupportedOperationException();
1756            }
1757
1758            @Override
1759            public void setRouteStartupLoggingLevel(LoggingLevel loggingLevel) {
1760                throw new UnsupportedOperationException();
1761            }
1762
1763            @Override
1764            public SupervisingRouteController supervising() {
1765                throw new UnsupportedOperationException();
1766            }
1767
1768            @Override
1769            public <T extends RouteController> T adapt(Class<T> type) {
1770                return type.cast(this);
1771            }
1772
1773            @Override
1774            public Collection<Route> getControlledRoutes() {
1775                return routes;
1776            }
1777
1778            @Override
1779            public void startAllRoutes() throws Exception {
1780                throw new UnsupportedOperationException();
1781            }
1782
1783            @Override
1784            public boolean isStartingRoutes() {
1785                return false;
1786            }
1787
1788            @Override
1789            public ServiceStatus getRouteStatus(String routeId) {
1790                return ServiceStatus.Started;
1791            }
1792
1793            @Override
1794            public void startRoute(String routeId) throws Exception {
1795                throw new UnsupportedOperationException();
1796            }
1797
1798            @Override
1799            public void stopRoute(String routeId) throws Exception {
1800                throw new UnsupportedOperationException();
1801            }
1802
1803            @Override
1804            public void stopRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception {
1805                throw new UnsupportedOperationException();
1806            }
1807
1808            @Override
1809            public boolean stopRoute(String routeId, long timeout, TimeUnit timeUnit, boolean abortAfterTimeout) throws Exception {
1810                throw new UnsupportedOperationException();
1811            }
1812
1813            @Override
1814            public void suspendRoute(String routeId) throws Exception {
1815                throw new UnsupportedOperationException();
1816            }
1817
1818            @Override
1819            public void suspendRoute(String routeId, long timeout, TimeUnit timeUnit) throws Exception {
1820                throw new UnsupportedOperationException();
1821            }
1822
1823            @Override
1824            public void resumeRoute(String routeId) throws Exception {
1825                throw new UnsupportedOperationException();
1826            }
1827
1828            @Override
1829            public void setCamelContext(CamelContext camelContext) {
1830                throw new UnsupportedOperationException();
1831            }
1832
1833            @Override
1834            public CamelContext getCamelContext() {
1835                throw new UnsupportedOperationException();
1836            }
1837
1838            @Override
1839            public void start() {
1840                throw new UnsupportedOperationException();
1841            }
1842
1843            @Override
1844            public void stop() {
1845                throw new UnsupportedOperationException();
1846            }
1847        };
1848    }
1849
1850    private void startService(Service service) throws Exception {
1851        // and register startup aware so they can be notified when
1852        // camel context has been started
1853        if (service instanceof StartupListener) {
1854            StartupListener listener = (StartupListener)service;
1855            addStartupListener(listener);
1856        }
1857        if (service instanceof CamelContextAware) {
1858            CamelContextAware aware = (CamelContextAware)service;
1859            aware.setCamelContext(reference);
1860        }
1861        service.start();
1862    }
1863}