Search in sources :

Example 1 with RuntimeAware

use of org.apache.camel.k.RuntimeAware in project camel-k-runtime by apache.

the class SourcesSupport method load.

public static void load(Runtime runtime, Source source) {
    final List<RouteBuilderLifecycleStrategy> interceptors;
    switch(source.getType()) {
        case source:
            interceptors = RuntimeSupport.loadInterceptors(runtime.getCamelContext(), source);
            interceptors.forEach(interceptor -> {
                if (interceptor instanceof RuntimeAware) {
                    ((RuntimeAware) interceptor).setRuntime(runtime);
                }
            });
            break;
        case template:
            if (!source.getInterceptors().isEmpty()) {
                LOGGER.warn("Interceptors associated to the route template {} will be ignored", source.getName());
            }
            interceptors = List.of(new RouteBuilderLifecycleStrategy() {

                @Override
                public void afterConfigure(RouteBuilder builder) {
                    List<RouteDefinition> routes = builder.getRouteCollection().getRoutes();
                    List<RouteTemplateDefinition> templates = builder.getRouteTemplateCollection().getRouteTemplates();
                    if (routes.size() != 1) {
                        throw new IllegalArgumentException("There should be a single route definition, got " + routes.size());
                    }
                    if (!templates.isEmpty()) {
                        throw new IllegalArgumentException("There should not be any template, got " + templates.size());
                    }
                    // create a new template from the source
                    RouteTemplateDefinition templatesDefinition = builder.getRouteTemplateCollection().routeTemplate(source.getId());
                    templatesDefinition.setRoute(routes.get(0));
                    source.getPropertyNames().forEach(templatesDefinition::templateParameter);
                    // remove all routes definitions as they have been translated
                    // in the related route template
                    routes.clear();
                }
            });
            break;
        case errorHandler:
            if (!source.getInterceptors().isEmpty()) {
                LOGGER.warn("Interceptors associated to the route template {} will be ignored", source.getName());
            }
            interceptors = List.of(new RouteBuilderLifecycleStrategy() {

                @Override
                public void afterConfigure(RouteBuilder builder) {
                    List<RouteDefinition> routes = builder.getRouteCollection().getRoutes();
                    List<RouteTemplateDefinition> templates = builder.getRouteTemplateCollection().getRouteTemplates();
                    if (!routes.isEmpty()) {
                        throw new IllegalArgumentException("There should be no route definition, got " + routes.size());
                    }
                    if (!templates.isEmpty()) {
                        throw new IllegalArgumentException("There should not be any template, got " + templates.size());
                    }
                    if (hasErrorHandlerBuilder(builder)) {
                        LOGGER.debug("Setting default error handler builder factory as {}", builder.getErrorHandlerBuilder());
                        runtime.getCamelContext().adapt(ExtendedCamelContext.class).setErrorHandlerFactory(builder.getErrorHandlerBuilder());
                    }
                }
            });
            break;
        default:
            throw new IllegalArgumentException("Unknown source type: " + source.getType());
    }
    try {
        final Resource resource = Sources.asResource(runtime.getCamelContext(), source);
        final ExtendedCamelContext ecc = runtime.getCamelContext(ExtendedCamelContext.class);
        final Collection<RoutesBuilder> builders = ecc.getRoutesLoader().findRoutesBuilders(resource);
        builders.stream().map(RouteBuilder.class::cast).peek(b -> interceptors.forEach(b::addLifecycleInterceptor)).forEach(runtime::addRoutes);
    } catch (Exception e) {
        throw RuntimeCamelException.wrapRuntimeCamelException(e);
    }
}
Also used : RuntimeCamelException(org.apache.camel.RuntimeCamelException) RouteDefinition(org.apache.camel.model.RouteDefinition) RoutesBuilder(org.apache.camel.RoutesBuilder) RouteTemplateDefinition(org.apache.camel.model.RouteTemplateDefinition) SourcesConfigurer(org.apache.camel.k.listener.SourcesConfigurer) Logger(org.slf4j.Logger) Resource(org.apache.camel.spi.Resource) AbstractPhaseListener(org.apache.camel.k.listener.AbstractPhaseListener) Collection(java.util.Collection) LoggerFactory(org.slf4j.LoggerFactory) ExtendedCamelContext(org.apache.camel.ExtendedCamelContext) List(java.util.List) SourceDefinition(org.apache.camel.k.SourceDefinition) RouteBuilder(org.apache.camel.builder.RouteBuilder) Source(org.apache.camel.k.Source) RuntimeAware(org.apache.camel.k.RuntimeAware) Runtime(org.apache.camel.k.Runtime) ObjectHelper(org.apache.camel.util.ObjectHelper) RouteBuilderLifecycleStrategy(org.apache.camel.builder.RouteBuilderLifecycleStrategy) RuntimeAware(org.apache.camel.k.RuntimeAware) RouteBuilder(org.apache.camel.builder.RouteBuilder) Resource(org.apache.camel.spi.Resource) RouteTemplateDefinition(org.apache.camel.model.RouteTemplateDefinition) RuntimeCamelException(org.apache.camel.RuntimeCamelException) RouteDefinition(org.apache.camel.model.RouteDefinition) ExtendedCamelContext(org.apache.camel.ExtendedCamelContext) RouteBuilderLifecycleStrategy(org.apache.camel.builder.RouteBuilderLifecycleStrategy) RoutesBuilder(org.apache.camel.RoutesBuilder)

Aggregations

Collection (java.util.Collection)1 List (java.util.List)1 ExtendedCamelContext (org.apache.camel.ExtendedCamelContext)1 RoutesBuilder (org.apache.camel.RoutesBuilder)1 RuntimeCamelException (org.apache.camel.RuntimeCamelException)1 RouteBuilder (org.apache.camel.builder.RouteBuilder)1 RouteBuilderLifecycleStrategy (org.apache.camel.builder.RouteBuilderLifecycleStrategy)1 Runtime (org.apache.camel.k.Runtime)1 RuntimeAware (org.apache.camel.k.RuntimeAware)1 Source (org.apache.camel.k.Source)1 SourceDefinition (org.apache.camel.k.SourceDefinition)1 AbstractPhaseListener (org.apache.camel.k.listener.AbstractPhaseListener)1 SourcesConfigurer (org.apache.camel.k.listener.SourcesConfigurer)1 RouteDefinition (org.apache.camel.model.RouteDefinition)1 RouteTemplateDefinition (org.apache.camel.model.RouteTemplateDefinition)1 Resource (org.apache.camel.spi.Resource)1 ObjectHelper (org.apache.camel.util.ObjectHelper)1 Logger (org.slf4j.Logger)1 LoggerFactory (org.slf4j.LoggerFactory)1