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.stream.Collectors;
029
030import org.apache.camel.CamelContext;
031import org.apache.camel.CamelContextAware;
032import org.apache.camel.CatalogCamelContext;
033import org.apache.camel.Component;
034import org.apache.camel.ConsumerTemplate;
035import org.apache.camel.Endpoint;
036import org.apache.camel.Experimental;
037import org.apache.camel.ExtendedCamelContext;
038import org.apache.camel.FluentProducerTemplate;
039import org.apache.camel.GlobalEndpointConfiguration;
040import org.apache.camel.IsSingleton;
041import org.apache.camel.NoSuchEndpointException;
042import org.apache.camel.NoSuchLanguageException;
043import org.apache.camel.Processor;
044import org.apache.camel.ProducerTemplate;
045import org.apache.camel.Route;
046import org.apache.camel.RouteConfigurationsBuilder;
047import org.apache.camel.RouteTemplateContext;
048import org.apache.camel.RoutesBuilder;
049import org.apache.camel.RuntimeCamelException;
050import org.apache.camel.Service;
051import org.apache.camel.ServiceStatus;
052import org.apache.camel.ShutdownRoute;
053import org.apache.camel.ShutdownRunningTask;
054import org.apache.camel.StartupListener;
055import org.apache.camel.StartupSummaryLevel;
056import org.apache.camel.TypeConverter;
057import org.apache.camel.ValueHolder;
058import org.apache.camel.impl.converter.CoreTypeConverterRegistry;
059import org.apache.camel.impl.engine.DefaultComponentResolver;
060import org.apache.camel.impl.engine.DefaultDataFormatResolver;
061import org.apache.camel.impl.engine.DefaultLanguageResolver;
062import org.apache.camel.spi.CamelContextNameStrategy;
063import org.apache.camel.spi.ClassResolver;
064import org.apache.camel.spi.DataFormat;
065import org.apache.camel.spi.DataType;
066import org.apache.camel.spi.Debugger;
067import org.apache.camel.spi.EndpointRegistry;
068import org.apache.camel.spi.ExecutorServiceManager;
069import org.apache.camel.spi.InflightRepository;
070import org.apache.camel.spi.Injector;
071import org.apache.camel.spi.InterceptSendToEndpoint;
072import org.apache.camel.spi.Language;
073import org.apache.camel.spi.LifecycleStrategy;
074import org.apache.camel.spi.ManagementNameStrategy;
075import org.apache.camel.spi.ManagementStrategy;
076import org.apache.camel.spi.MessageHistoryFactory;
077import org.apache.camel.spi.PropertiesComponent;
078import org.apache.camel.spi.Registry;
079import org.apache.camel.spi.RestConfiguration;
080import org.apache.camel.spi.RestRegistry;
081import org.apache.camel.spi.RouteController;
082import org.apache.camel.spi.RoutePolicyFactory;
083import org.apache.camel.spi.RuntimeEndpointRegistry;
084import org.apache.camel.spi.ShutdownStrategy;
085import org.apache.camel.spi.StreamCachingStrategy;
086import org.apache.camel.spi.Tracer;
087import org.apache.camel.spi.Transformer;
088import org.apache.camel.spi.TransformerRegistry;
089import org.apache.camel.spi.TypeConverterRegistry;
090import org.apache.camel.spi.UuidGenerator;
091import org.apache.camel.spi.Validator;
092import org.apache.camel.spi.ValidatorRegistry;
093import org.apache.camel.support.CamelContextHelper;
094import org.apache.camel.support.NormalizedUri;
095import org.apache.camel.support.jsse.SSLContextParameters;
096import org.apache.camel.util.IOHelper;
097import org.apache.camel.util.ObjectHelper;
098import org.apache.camel.util.TimeUtils;
099import org.apache.camel.vault.VaultConfiguration;
100import org.slf4j.Logger;
101import org.slf4j.LoggerFactory;
102
103@Experimental
104public class LightweightRuntimeCamelContext implements CamelContext, CatalogCamelContext {
105
106    private static final Logger LOG = LoggerFactory.getLogger(LightweightRuntimeCamelContext.class);
107
108    private final CamelContext reference;
109    private final Registry registry;
110    private final CoreTypeConverterRegistry typeConverter;
111    private final UuidGenerator uuidGenerator;
112    private final EndpointRegistry<? extends ValueHolder<String>> endpoints;
113    private final Map<String, Component> components;
114    private final Map<String, Language> languages;
115    private final PropertiesComponent propertiesComponent;
116    private final ExecutorServiceManager executorServiceManager;
117    private final ShutdownStrategy shutdownStrategy;
118    private final ClassLoader applicationContextClassLoader;
119    private final RouteController routeController;
120    private final InflightRepository inflightRepository;
121    private final Injector injector;
122    private final ClassResolver classResolver;
123    private final Map<String, String> globalOptions;
124    private final String name;
125    private final boolean useDataType;
126    private final boolean useBreadcrumb;
127    private final boolean dumpRoutes;
128    private final String mdcLoggingKeysPattern;
129    private final boolean useMDCLogging;
130    private final List<Route> routes;
131    private final boolean messageHistory;
132    private final boolean allowUseOriginalMessage;
133    private final boolean logExhaustedMessageBody;
134    private final String version;
135    private final LightweightCamelContextExtension lwCamelContextExtension = new LightweightCamelContextExtension(this);
136    private Date startDate;
137    private StartupSummaryLevel startupSummaryLevel;
138
139    LightweightRuntimeCamelContext(CamelContext reference, CamelContext context) {
140        this.reference = reference;
141        registry = context.getRegistry();
142        typeConverter = new CoreTypeConverterRegistry(context.getTypeConverterRegistry());
143        routes = Collections.unmodifiableList(context.getRoutes());
144        uuidGenerator = context.getUuidGenerator();
145        endpoints = context.getEndpointRegistry();
146        components = context.getComponentNames().stream().collect(Collectors.toMap(s -> s, context::hasComponent));
147        languages = context.getLanguageNames().stream().collect(Collectors.toMap(s -> s, context::resolveLanguage));
148        propertiesComponent = context.getPropertiesComponent();
149        executorServiceManager = context.getExecutorServiceManager();
150        shutdownStrategy = context.getShutdownStrategy();
151        applicationContextClassLoader = context.getApplicationContextClassLoader();
152        routeController = context.getRouteController();
153        inflightRepository = context.getInflightRepository();
154        globalOptions = context.getGlobalOptions();
155        injector = context.getInjector();
156        classResolver = context.getClassResolver();
157        name = context.getName();
158        useDataType = context.isUseDataType();
159        useBreadcrumb = context.isUseBreadcrumb();
160        dumpRoutes = context.isDumpRoutes();
161        mdcLoggingKeysPattern = context.getMDCLoggingKeysPattern();
162        useMDCLogging = context.isUseMDCLogging();
163        messageHistory = context.isMessageHistory();
164        allowUseOriginalMessage = context.isAllowUseOriginalMessage();
165        logExhaustedMessageBody = context.isLogExhaustedMessageBody();
166        version = context.getVersion();
167        startupSummaryLevel = context.getStartupSummaryLevel();
168    }
169
170    //
171    // Lifecycle
172    //
173    @Override
174    public boolean isStarted() {
175        return false;
176    }
177
178    @Override
179    public boolean isStarting() {
180        return false;
181    }
182
183    @Override
184    public boolean isStopped() {
185        return false;
186    }
187
188    @Override
189    public boolean isStopping() {
190        return false;
191    }
192
193    @Override
194    public boolean isSuspended() {
195        return false;
196    }
197
198    @Override
199    public boolean isRunAllowed() {
200        return false;
201    }
202
203    @Override
204    public boolean isSuspending() {
205        return false;
206    }
207
208    @Override
209    public void build() {
210        throw new UnsupportedOperationException();
211    }
212
213    @Override
214    public void init() {
215        throw new UnsupportedOperationException();
216    }
217
218    @Override
219    public void suspend() {
220        throw new UnsupportedOperationException();
221    }
222
223    @Override
224    public void resume() {
225        throw new UnsupportedOperationException();
226    }
227
228    @Override
229    public void start() {
230        startDate = new Date();
231        LOG.info("Apache Camel {} ({}) is starting", getVersion(), lwCamelContextExtension.getName());
232        for (Route route : routes) {
233            route.getConsumer().start();
234        }
235        if (LOG.isInfoEnabled()) {
236            long l = System.currentTimeMillis() - startDate.getTime();
237            LOG.info("Apache Camel {} ({}) {} routes started in {}",
238                    getVersion(), lwCamelContextExtension.getName(), routes.size(), TimeUtils.printDuration(l, true));
239        }
240    }
241
242    @Override
243    public void stop() {
244        for (Route route : routes) {
245            route.getConsumer().stop();
246        }
247    }
248
249    @Override
250    public void shutdown() {
251    }
252
253    //
254    // RuntimeConfig
255    //
256
257    @Override
258    public void close() throws IOException {
259        stop();
260    }
261
262    @Override
263    public void setStreamCaching(Boolean cache) {
264        throw new UnsupportedOperationException();
265    }
266
267    @Override
268    public Boolean isStreamCaching() {
269        throw new UnsupportedOperationException();
270    }
271
272    @Override
273    public Boolean isTracing() {
274        throw new UnsupportedOperationException();
275    }
276
277    @Override
278    public String getTracingPattern() {
279        throw new UnsupportedOperationException();
280    }
281
282    @Override
283    public void setTracingPattern(String tracePattern) {
284        throw new UnsupportedOperationException();
285    }
286
287    @Override
288    public String getTracingLoggingFormat() {
289        throw new UnsupportedOperationException();
290    }
291
292    @Override
293    public void setTracingLoggingFormat(String format) {
294        throw new UnsupportedOperationException();
295    }
296
297    @Override
298    public Boolean isBacklogTracing() {
299        throw new UnsupportedOperationException();
300    }
301
302    @Override
303    public Boolean isDebugging() {
304        throw new UnsupportedOperationException();
305    }
306
307    @Override
308    public Boolean isMessageHistory() {
309        return messageHistory;
310    }
311
312    @Override
313    public Boolean isLogMask() {
314        throw new UnsupportedOperationException();
315    }
316
317    @Override
318    public Boolean isLogExhaustedMessageBody() {
319        return logExhaustedMessageBody;
320    }
321
322    @Override
323    public Long getDelayer() {
324        throw new UnsupportedOperationException();
325    }
326
327    @Override
328    public void setDelayer(Long delay) {
329        throw new UnsupportedOperationException();
330    }
331
332    @Override
333    public Boolean isAutoStartup() {
334        throw new UnsupportedOperationException();
335    }
336
337    @Override
338    public ShutdownRoute getShutdownRoute() {
339        throw new UnsupportedOperationException();
340    }
341
342    @Override
343    public void setShutdownRoute(ShutdownRoute shutdownRoute) {
344        throw new UnsupportedOperationException();
345    }
346
347    @Override
348    public ShutdownRunningTask getShutdownRunningTask() {
349        throw new UnsupportedOperationException();
350    }
351
352    //
353    // Model
354    //
355
356    @Override
357    public void setShutdownRunningTask(ShutdownRunningTask shutdownRunningTask) {
358        throw new UnsupportedOperationException();
359    }
360
361    @Override
362    public void setAllowUseOriginalMessage(Boolean allowUseOriginalMessage) {
363        throw new UnsupportedOperationException();
364    }
365
366    @Override
367    public Boolean isAllowUseOriginalMessage() {
368        return allowUseOriginalMessage;
369    }
370
371    @Override
372    public Boolean isCaseInsensitiveHeaders() {
373        throw new UnsupportedOperationException();
374    }
375
376    @Override
377    public void setCaseInsensitiveHeaders(Boolean caseInsensitiveHeaders) {
378        throw new UnsupportedOperationException();
379    }
380
381    @Override
382    public Boolean isAutowiredEnabled() {
383        throw new UnsupportedOperationException();
384    }
385
386    @Override
387    public void setAutowiredEnabled(Boolean autowiredEnabled) {
388        throw new UnsupportedOperationException();
389    }
390
391    @Override
392    public TypeConverterRegistry getTypeConverterRegistry() {
393        return typeConverter;
394    }
395
396    @Override
397    public void setTypeConverterRegistry(TypeConverterRegistry typeConverterRegistry) {
398        throw new UnsupportedOperationException();
399    }
400
401    @Override
402    public Registry getRegistry() {
403        return null;
404    }
405
406    @Override
407    public UuidGenerator getUuidGenerator() {
408        return uuidGenerator;
409    }
410
411    @Override
412    public void setUuidGenerator(UuidGenerator uuidGenerator) {
413        throw new UnsupportedOperationException();
414    }
415
416    @Override
417    public ExtendedCamelContext getCamelContextExtension() {
418        return lwCamelContextExtension;
419    }
420
421    @Override
422    public <T> T getExtension(Class<T> type) {
423        throw new UnsupportedOperationException();
424    }
425
426    @Override
427    public <T> void setExtension(Class<T> type, T module) {
428        throw new UnsupportedOperationException();
429    }
430
431    @Override
432    public boolean isVetoStarted() {
433        throw new UnsupportedOperationException();
434    }
435
436    @Override
437    public String getName() {
438        return name;
439    }
440
441    @Override
442    public String getDescription() {
443        return lwCamelContextExtension.getDescription();
444    }
445
446    @Override
447    public CamelContextNameStrategy getNameStrategy() {
448        throw new UnsupportedOperationException();
449    }
450
451    @Override
452    public void setNameStrategy(CamelContextNameStrategy nameStrategy) {
453        throw new UnsupportedOperationException();
454    }
455
456    @Override
457    public ManagementNameStrategy getManagementNameStrategy() {
458        throw new UnsupportedOperationException();
459    }
460
461    @Override
462    public void setManagementNameStrategy(ManagementNameStrategy nameStrategy) {
463        throw new UnsupportedOperationException();
464    }
465
466    @Override
467    public String getManagementName() {
468        throw new UnsupportedOperationException();
469    }
470
471    @Override
472    public void setManagementName(String name) {
473        throw new UnsupportedOperationException();
474    }
475
476    @Override
477    public String getVersion() {
478        return version;
479    }
480
481    @Override
482    public ServiceStatus getStatus() {
483        return ServiceStatus.Started;
484    }
485
486    @Override
487    public String getUptime() {
488        long delta = getUptimeMillis();
489        if (delta == 0) {
490            return "";
491        }
492        return TimeUtils.printDuration(delta);
493    }
494
495    @Override
496    public long getUptimeMillis() {
497        if (startDate == null) {
498            return 0;
499        }
500        return new Date().getTime() - startDate.getTime();
501    }
502
503    @Override
504    public Date getStartDate() {
505        return startDate;
506    }
507
508    @Override
509    public void addService(Object object) throws Exception {
510    }
511
512    @Override
513    public void addService(Object object, boolean stopOnShutdown) throws Exception {
514
515    }
516
517    @Override
518    public void addService(Object object, boolean stopOnShutdown, boolean forceStart) throws Exception {
519
520    }
521
522    @Override
523    public void addPrototypeService(Object object) throws Exception {
524
525    }
526
527    @Override
528    public boolean removeService(Object object) throws Exception {
529        return false;
530    }
531
532    @Override
533    public boolean hasService(Object object) {
534        return false;
535    }
536
537    @Override
538    public <T> T hasService(Class<T> type) {
539        return null;
540    }
541
542    @Override
543    public <T> Set<T> hasServices(Class<T> type) {
544        return null;
545    }
546
547    @Override
548    public void deferStartService(Object object, boolean stopOnShutdown) throws Exception {
549    }
550
551    @Override
552    public void addStartupListener(StartupListener listener) throws Exception {
553    }
554
555    @Override
556    public Component hasComponent(String componentName) {
557        return components.get(componentName);
558    }
559
560    @Override
561    public Component getComponent(String componentName) {
562        return getComponent(name, true, true);
563    }
564
565    @Override
566    public Component getComponent(String name, boolean autoCreateComponents) {
567        return getComponent(name, autoCreateComponents, true);
568    }
569
570    @Override
571    public Component getComponent(String name, boolean autoCreateComponents, boolean autoStart) {
572        return components.get(name);
573    }
574
575    @Override
576    public <T extends Component> T getComponent(String name, Class<T> componentType) {
577        return componentType.cast(hasComponent(name));
578    }
579
580    @Override
581    public Set<String> getComponentNames() {
582        return Collections.unmodifiableSet(components.keySet());
583    }
584
585    @Override
586    public EndpointRegistry<? extends ValueHolder<String>> getEndpointRegistry() {
587        return endpoints;
588    }
589
590    @Override
591    public Endpoint getEndpoint(String uri) {
592        return lwCamelContextExtension.doGetEndpoint(uri, false, false);
593    }
594
595    @Override
596    public Endpoint getEndpoint(String uri, Map<String, Object> parameters) {
597        return lwCamelContextExtension.doGetEndpoint(uri, parameters, false);
598    }
599
600    @Override
601    public <T extends Endpoint> T getEndpoint(String name, Class<T> endpointType) {
602        Endpoint endpoint = getEndpoint(name);
603        if (endpoint == null) {
604            throw new NoSuchEndpointException(name);
605        }
606        if (endpoint instanceof InterceptSendToEndpoint) {
607            endpoint = ((InterceptSendToEndpoint) endpoint).getOriginalEndpoint();
608        }
609        if (endpointType.isInstance(endpoint)) {
610            return endpointType.cast(endpoint);
611        } else {
612            throw new IllegalArgumentException(
613                    "The endpoint is not of type: " + endpointType + " but is: " + endpoint.getClass().getCanonicalName());
614        }
615    }
616
617    @Override
618    public Collection<Endpoint> getEndpoints() {
619        return new ArrayList<>(endpoints.values());
620    }
621
622    @Override
623    public Endpoint hasEndpoint(String uri) {
624        return endpoints.get(NormalizedUri.newNormalizedUri(uri, false));
625    }
626
627    @Override
628    public GlobalEndpointConfiguration getGlobalEndpointConfiguration() {
629        throw new UnsupportedOperationException();
630    }
631
632    @Override
633    public RouteController getRouteController() {
634        return routeController;
635    }
636
637    @Override
638    public void setRouteController(RouteController routeController) {
639        throw new UnsupportedOperationException();
640    }
641
642    @Override
643    public List<Route> getRoutes() {
644        return routes;
645    }
646
647    @Override
648    public int getRoutesSize() {
649        return routes.size();
650    }
651
652    @Override
653    public Route getRoute(String id) {
654        throw new UnsupportedOperationException();
655    }
656
657    @Override
658    public Processor getProcessor(String id) {
659        throw new UnsupportedOperationException();
660    }
661
662    @Override
663    public <T extends Processor> T getProcessor(String id, Class<T> type) {
664        throw new UnsupportedOperationException();
665    }
666
667    @Override
668    public List<RoutePolicyFactory> getRoutePolicyFactories() {
669        throw new UnsupportedOperationException();
670    }
671
672    @Override
673    public RestConfiguration getRestConfiguration() {
674        throw new UnsupportedOperationException();
675    }
676
677    @Override
678    public void setRestConfiguration(RestConfiguration restConfiguration) {
679        throw new UnsupportedOperationException();
680    }
681
682    @Override
683    public void setVaultConfiguration(VaultConfiguration vaultConfiguration) {
684        throw new UnsupportedOperationException();
685    }
686
687    @Override
688    public VaultConfiguration getVaultConfiguration() {
689        throw new UnsupportedOperationException();
690    }
691
692    @Override
693    public RestRegistry getRestRegistry() {
694        throw new UnsupportedOperationException();
695    }
696
697    @Override
698    public void setRestRegistry(RestRegistry restRegistry) {
699        throw new UnsupportedOperationException();
700    }
701
702    @Override
703    public TypeConverter getTypeConverter() {
704        return typeConverter;
705    }
706
707    @Override
708    public <T> T getRegistry(Class<T> type) {
709        return type.cast(registry);
710    }
711
712    @Override
713    public Injector getInjector() {
714        return injector;
715    }
716
717    @Override
718    public void setInjector(Injector injector) {
719        throw new UnsupportedOperationException();
720    }
721
722    @Override
723    public List<LifecycleStrategy> getLifecycleStrategies() {
724        throw new UnsupportedOperationException();
725    }
726
727    @Override
728    public Language resolveLanguage(String language) throws NoSuchLanguageException {
729        Language answer;
730        synchronized (languages) {
731            answer = languages.get(language);
732            // check if the language is singleton, if so return the shared
733            // instance
734            if (answer instanceof IsSingleton) {
735                boolean singleton = ((IsSingleton) answer).isSingleton();
736                if (singleton) {
737                    return answer;
738                }
739            }
740            // language not known or not singleton, then use resolver
741            answer = lwCamelContextExtension.getLanguageResolver().resolveLanguage(language, reference);
742            // inject CamelContext if aware
743            if (answer != null) {
744                CamelContextAware.trySetCamelContext(answer, reference);
745                if (answer instanceof Service) {
746                    try {
747                        startService((Service) answer);
748                    } catch (Exception e) {
749                        throw RuntimeCamelException.wrapRuntimeCamelException(e);
750                    }
751                }
752                languages.put(language, answer);
753            }
754        }
755        return answer;
756    }
757
758    @Override
759    public String resolvePropertyPlaceholders(String text) {
760        return lwCamelContextExtension.resolvePropertyPlaceholders(text, false);
761    }
762
763    @Override
764    public PropertiesComponent getPropertiesComponent() {
765        return propertiesComponent;
766    }
767
768    @Override
769    public void setPropertiesComponent(PropertiesComponent propertiesComponent) {
770        throw new UnsupportedOperationException();
771    }
772
773    @Override
774    public Set<String> getLanguageNames() {
775        throw new UnsupportedOperationException();
776    }
777
778    @Override
779    public ProducerTemplate createProducerTemplate() {
780        throw new UnsupportedOperationException();
781    }
782
783    @Override
784    public ProducerTemplate createProducerTemplate(int maximumCacheSize) {
785        throw new UnsupportedOperationException();
786    }
787
788    @Override
789    public FluentProducerTemplate createFluentProducerTemplate() {
790        throw new UnsupportedOperationException();
791    }
792
793    @Override
794    public FluentProducerTemplate createFluentProducerTemplate(int maximumCacheSize) {
795        throw new UnsupportedOperationException();
796    }
797
798    @Override
799    public ConsumerTemplate createConsumerTemplate() {
800        throw new UnsupportedOperationException();
801    }
802
803    @Override
804    public ConsumerTemplate createConsumerTemplate(int maximumCacheSize) {
805        throw new UnsupportedOperationException();
806    }
807
808    @Override
809    public DataFormat resolveDataFormat(String name) {
810        throw new UnsupportedOperationException();
811    }
812
813    @Override
814    public DataFormat createDataFormat(String name) {
815        throw new UnsupportedOperationException();
816    }
817
818    @Override
819    public Set<String> getDataFormatNames() {
820        throw new UnsupportedOperationException();
821    }
822
823    @Override
824    public Transformer resolveTransformer(String model) {
825        throw new UnsupportedOperationException();
826    }
827
828    @Override
829    public Transformer resolveTransformer(DataType from, DataType to) {
830        throw new UnsupportedOperationException();
831    }
832
833    @Override
834    public TransformerRegistry getTransformerRegistry() {
835        throw new UnsupportedOperationException();
836    }
837
838    @Override
839    public Validator resolveValidator(DataType type) {
840        throw new UnsupportedOperationException();
841    }
842
843    @Override
844    public ValidatorRegistry getValidatorRegistry() {
845        throw new UnsupportedOperationException();
846    }
847
848    @Override
849    public Map<String, String> getGlobalOptions() {
850        return globalOptions;
851    }
852
853    @Override
854    public void setGlobalOptions(Map<String, String> globalOptions) {
855        throw new UnsupportedOperationException();
856    }
857
858    @Override
859    public String getGlobalOption(String key) {
860        String value = getGlobalOptions().get(key);
861        if (ObjectHelper.isNotEmpty(value)) {
862            try {
863                value = resolvePropertyPlaceholders(value);
864            } catch (Exception e) {
865                throw new RuntimeCamelException("Error getting global option: " + key, e);
866            }
867        }
868        return value;
869    }
870
871    @Override
872    public ClassResolver getClassResolver() {
873        return classResolver;
874    }
875
876    @Override
877    public void setClassResolver(ClassResolver resolver) {
878        throw new UnsupportedOperationException();
879    }
880
881    @Override
882    public ManagementStrategy getManagementStrategy() {
883        return null;
884    }
885
886    @Override
887    public void setManagementStrategy(ManagementStrategy strategy) {
888        throw new UnsupportedOperationException();
889    }
890
891    @Override
892    public void disableJMX() throws IllegalStateException {
893        throw new UnsupportedOperationException();
894    }
895
896    @Override
897    public InflightRepository getInflightRepository() {
898        return inflightRepository;
899    }
900
901    @Override
902    public void setInflightRepository(InflightRepository repository) {
903        throw new UnsupportedOperationException();
904    }
905
906    @Override
907    public void setTracingStandby(boolean tracingStandby) {
908        throw new UnsupportedOperationException();
909    }
910
911    @Override
912    public boolean isTracingStandby() {
913        return false;
914    }
915
916    @Override
917    public void setBacklogTracingStandby(boolean backlogTracingStandby) {
918        throw new UnsupportedOperationException();
919    }
920
921    @Override
922    public boolean isBacklogTracingStandby() {
923        return false;
924    }
925
926    //
927    // ExtendedCamelContext
928    //
929
930    @Override
931    public ClassLoader getApplicationContextClassLoader() {
932        return applicationContextClassLoader;
933    }
934
935    @Override
936    public void setApplicationContextClassLoader(ClassLoader classLoader) {
937        throw new UnsupportedOperationException();
938    }
939
940    @Override
941    public ShutdownStrategy getShutdownStrategy() {
942        return shutdownStrategy;
943    }
944
945    @Override
946    public void setShutdownStrategy(ShutdownStrategy shutdownStrategy) {
947        throw new UnsupportedOperationException();
948    }
949
950    @Override
951    public ExecutorServiceManager getExecutorServiceManager() {
952        return executorServiceManager;
953    }
954
955    @Override
956    public void setExecutorServiceManager(ExecutorServiceManager executorServiceManager) {
957        throw new UnsupportedOperationException();
958    }
959
960    @Override
961    public MessageHistoryFactory getMessageHistoryFactory() {
962        throw new UnsupportedOperationException();
963    }
964
965    @Override
966    public void setMessageHistoryFactory(MessageHistoryFactory messageHistoryFactory) {
967        throw new UnsupportedOperationException();
968    }
969
970    @Override
971    public Debugger getDebugger() {
972        throw new UnsupportedOperationException();
973    }
974
975    @Override
976    public void setDebugger(Debugger debugger) {
977        throw new UnsupportedOperationException();
978    }
979
980    @Override
981    public Tracer getTracer() {
982        throw new UnsupportedOperationException();
983    }
984
985    @Override
986    public void setTracer(Tracer tracer) {
987        throw new UnsupportedOperationException();
988    }
989
990    @Override
991    public Boolean isLoadTypeConverters() {
992        throw new UnsupportedOperationException();
993    }
994
995    @Override
996    public void setLoadTypeConverters(Boolean loadTypeConverters) {
997        throw new UnsupportedOperationException();
998    }
999
1000    @Override
1001    public Boolean isLoadHealthChecks() {
1002        throw new UnsupportedOperationException();
1003    }
1004
1005    @Override
1006    public Boolean isDevConsole() {
1007        throw new UnsupportedOperationException();
1008    }
1009
1010    @Override
1011    public void setDevConsole(Boolean loadDevConsoles) {
1012        throw new UnsupportedOperationException();
1013    }
1014
1015    @Override
1016    public Boolean isModeline() {
1017        throw new UnsupportedOperationException();
1018    }
1019
1020    @Override
1021    public void setModeline(Boolean modeline) {
1022        throw new UnsupportedOperationException();
1023    }
1024
1025    @Override
1026    public void setLoadHealthChecks(Boolean loadHealthChecks) {
1027        throw new UnsupportedOperationException();
1028    }
1029
1030    @Override
1031    public Boolean isSourceLocationEnabled() {
1032        throw new UnsupportedOperationException();
1033    }
1034
1035    @Override
1036    public void setSourceLocationEnabled(Boolean sourceLocationEnabled) {
1037        throw new UnsupportedOperationException();
1038    }
1039
1040    @Override
1041    public Boolean isTypeConverterStatisticsEnabled() {
1042        throw new UnsupportedOperationException();
1043    }
1044
1045    @Override
1046    public void setTypeConverterStatisticsEnabled(Boolean typeConverterStatisticsEnabled) {
1047        throw new UnsupportedOperationException();
1048    }
1049
1050    @Override
1051    public Boolean isDumpRoutes() {
1052        return dumpRoutes;
1053    }
1054
1055    @Override
1056    public void setDumpRoutes(Boolean dumpRoutes) {
1057        throw new UnsupportedOperationException();
1058    }
1059
1060    @Override
1061    public Boolean isUseMDCLogging() {
1062        return useMDCLogging;
1063    }
1064
1065    @Override
1066    public void setUseMDCLogging(Boolean useMDCLogging) {
1067        throw new UnsupportedOperationException();
1068    }
1069
1070    @Override
1071    public String getMDCLoggingKeysPattern() {
1072        return mdcLoggingKeysPattern;
1073    }
1074
1075    @Override
1076    public void setMDCLoggingKeysPattern(String pattern) {
1077        throw new UnsupportedOperationException();
1078    }
1079
1080    @Override
1081    public Boolean isUseDataType() {
1082        return useDataType;
1083    }
1084
1085    @Override
1086    public void setUseDataType(Boolean useDataType) {
1087        throw new UnsupportedOperationException();
1088    }
1089
1090    @Override
1091    public Boolean isUseBreadcrumb() {
1092        return useBreadcrumb;
1093    }
1094
1095    @Override
1096    public void setUseBreadcrumb(Boolean useBreadcrumb) {
1097        throw new UnsupportedOperationException();
1098    }
1099
1100    @Override
1101    public StreamCachingStrategy getStreamCachingStrategy() {
1102        throw new UnsupportedOperationException();
1103    }
1104
1105    @Override
1106    public void setStreamCachingStrategy(StreamCachingStrategy streamCachingStrategy) {
1107        throw new UnsupportedOperationException();
1108    }
1109
1110    @Override
1111    public RuntimeEndpointRegistry getRuntimeEndpointRegistry() {
1112        throw new UnsupportedOperationException();
1113    }
1114
1115    @Override
1116    public void setRuntimeEndpointRegistry(RuntimeEndpointRegistry runtimeEndpointRegistry) {
1117        throw new UnsupportedOperationException();
1118    }
1119
1120    @Override
1121    public SSLContextParameters getSSLContextParameters() {
1122        throw new UnsupportedOperationException();
1123    }
1124
1125    @Override
1126    public void setSSLContextParameters(SSLContextParameters sslContextParameters) {
1127        throw new UnsupportedOperationException();
1128    }
1129
1130    @Override
1131    public void setStartupSummaryLevel(StartupSummaryLevel startupSummaryLevel) {
1132        throw new UnsupportedOperationException();
1133    }
1134
1135    @Override
1136    public StartupSummaryLevel getStartupSummaryLevel() {
1137        return startupSummaryLevel;
1138    }
1139
1140    //
1141    // Unsupported mutable methods
1142    //
1143
1144    @Override
1145    public String getComponentParameterJsonSchema(String componentName) throws IOException {
1146        Class<?> clazz;
1147        Object instance = lwCamelContextExtension.getRegistry().lookupByNameAndType(componentName, Component.class);
1148        if (instance != null) {
1149            clazz = instance.getClass();
1150        } else {
1151            clazz = lwCamelContextExtension.getFactoryFinder(DefaultComponentResolver.RESOURCE_PATH).findClass(componentName)
1152                    .orElse(null);
1153            if (clazz == null) {
1154                instance = hasComponent(componentName);
1155                if (instance != null) {
1156                    clazz = instance.getClass();
1157                } else {
1158                    return null;
1159                }
1160            }
1161        }
1162
1163        return getJsonSchema(clazz.getPackage().getName(), componentName);
1164    }
1165
1166    @Override
1167    public String getDataFormatParameterJsonSchema(String dataFormatName) throws IOException {
1168        Class<?> clazz;
1169        Object instance = lwCamelContextExtension.getRegistry().lookupByNameAndType(dataFormatName, DataFormat.class);
1170        if (instance != null) {
1171            clazz = instance.getClass();
1172        } else {
1173            clazz = lwCamelContextExtension.getFactoryFinder(DefaultDataFormatResolver.DATAFORMAT_RESOURCE_PATH)
1174                    .findClass(dataFormatName).orElse(null);
1175            if (clazz == null) {
1176                return null;
1177            }
1178        }
1179        return getJsonSchema(clazz.getPackage().getName(), dataFormatName);
1180    }
1181
1182    @Override
1183    public String getLanguageParameterJsonSchema(String languageName) throws IOException {
1184        Class<?> clazz;
1185        Object instance = lwCamelContextExtension.getRegistry().lookupByNameAndType(languageName, Language.class);
1186        if (instance != null) {
1187            clazz = instance.getClass();
1188        } else {
1189            clazz = lwCamelContextExtension.getFactoryFinder(DefaultLanguageResolver.LANGUAGE_RESOURCE_PATH)
1190                    .findClass(languageName).orElse(null);
1191            if (clazz == null) {
1192                return null;
1193            }
1194        }
1195        return getJsonSchema(clazz.getPackage().getName(), languageName);
1196    }
1197
1198    @Override
1199    public String getEipParameterJsonSchema(String eipName) throws IOException {
1200        // the eip json schema may be in some of the sub-packages so look until
1201        // we find it
1202        String[] subPackages = new String[] { "", "/config", "/dataformat", "/language", "/loadbalancer", "/rest" };
1203        for (String sub : subPackages) {
1204            String path = CamelContextHelper.MODEL_DOCUMENTATION_PREFIX + sub + "/" + eipName + ".json";
1205            InputStream inputStream = getClassResolver().loadResourceAsStream(path);
1206            if (inputStream != null) {
1207                try {
1208                    return IOHelper.loadText(inputStream);
1209                } finally {
1210                    IOHelper.close(inputStream);
1211                }
1212            }
1213        }
1214        return null;
1215    }
1216
1217    private String getJsonSchema(String packageName, String name) throws IOException {
1218        String path = packageName.replace('.', '/') + "/" + name + ".json";
1219        InputStream inputStream = getClassResolver().loadResourceAsStream(path);
1220        if (inputStream != null) {
1221            try {
1222                return IOHelper.loadText(inputStream);
1223            } finally {
1224                IOHelper.close(inputStream);
1225            }
1226        }
1227        return null;
1228    }
1229
1230    @Override
1231    public Endpoint addEndpoint(String uri, Endpoint endpoint) throws Exception {
1232        throw new UnsupportedOperationException();
1233    }
1234
1235    @Override
1236    public void removeEndpoint(Endpoint endpoint) throws Exception {
1237        throw new UnsupportedOperationException();
1238    }
1239
1240    @Override
1241    public Collection<Endpoint> removeEndpoints(String pattern) throws Exception {
1242        throw new UnsupportedOperationException();
1243    }
1244
1245    @Override
1246    public void addComponent(String componentName, Component component) {
1247        throw new UnsupportedOperationException();
1248    }
1249
1250    @Override
1251    public Component removeComponent(String componentName) {
1252        throw new UnsupportedOperationException();
1253    }
1254
1255    @Override
1256    public void addRoutes(RoutesBuilder builder) throws Exception {
1257        throw new UnsupportedOperationException();
1258    }
1259
1260    @Override
1261    public void addTemplatedRoutes(RoutesBuilder builder) throws Exception {
1262        throw new UnsupportedOperationException();
1263    }
1264
1265    @Override
1266    public void addRoutesConfigurations(RouteConfigurationsBuilder builder) throws Exception {
1267        throw new UnsupportedOperationException();
1268    }
1269
1270    @Override
1271    public boolean removeRoute(String routeId) throws Exception {
1272        throw new UnsupportedOperationException();
1273    }
1274
1275    @Override
1276    public void addRoutePolicyFactory(RoutePolicyFactory routePolicyFactory) {
1277        throw new UnsupportedOperationException();
1278    }
1279
1280    @Override
1281    public void setTracing(Boolean tracing) {
1282        throw new UnsupportedOperationException();
1283    }
1284
1285    @Override
1286    public void setBacklogTracing(Boolean backlogTrace) {
1287        throw new UnsupportedOperationException();
1288    }
1289
1290    @Override
1291    public void setDebugging(Boolean debugging) {
1292        throw new UnsupportedOperationException();
1293    }
1294
1295    @Override
1296    public void setMessageHistory(Boolean messageHistory) {
1297        throw new UnsupportedOperationException();
1298    }
1299
1300    @Override
1301    public void setLogMask(Boolean logMask) {
1302        throw new UnsupportedOperationException();
1303    }
1304
1305    @Override
1306    public void setLogExhaustedMessageBody(Boolean logExhaustedMessageBody) {
1307        throw new UnsupportedOperationException();
1308    }
1309
1310    @Override
1311    public void setAutoStartup(Boolean autoStartup) {
1312        throw new UnsupportedOperationException();
1313    }
1314
1315    @Override
1316    public void addLifecycleStrategy(LifecycleStrategy lifecycleStrategy) {
1317        throw new UnsupportedOperationException();
1318    }
1319
1320    @Override
1321    public String addRouteFromTemplate(String routeId, String routeTemplateId, Map<String, Object> parameters)
1322            throws Exception {
1323        throw new UnsupportedOperationException();
1324    }
1325
1326    @Override
1327    public String addRouteFromTemplate(String routeId, String routeTemplateId, String prefixId, Map<String, Object> parameters)
1328            throws Exception {
1329        throw new UnsupportedOperationException();
1330    }
1331
1332    @Override
1333    public String addRouteFromTemplate(String routeId, String routeTemplateId, RouteTemplateContext routeTemplateContext)
1334            throws Exception {
1335        throw new UnsupportedOperationException();
1336    }
1337
1338    @Override
1339    public String addRouteFromTemplate(
1340            String routeId, String routeTemplateId, String prefixId, RouteTemplateContext routeTemplateContext)
1341            throws Exception {
1342        throw new UnsupportedOperationException();
1343    }
1344
1345    @Override
1346    public void removeRouteTemplates(String pattern) throws Exception {
1347        throw new UnsupportedOperationException();
1348    }
1349
1350    private void startService(Service service) throws Exception {
1351        // and register startup aware so they can be notified when
1352        // camel context has been started
1353        if (service instanceof StartupListener) {
1354            StartupListener listener = (StartupListener) service;
1355            addStartupListener(listener);
1356        }
1357        CamelContextAware.trySetCamelContext(service, reference);
1358        service.start();
1359    }
1360
1361    public ExtendedCamelContext getLwCamelContextExtension() {
1362        return lwCamelContextExtension;
1363    }
1364
1365}