Search in sources :

Example 1 with Contract

use of org.apache.camel.spi.Contract in project camel by apache.

the class DefaultRouteContext method commit.

public void commit() {
    // now lets turn all of the event driven consumer processors into a single route
    if (!eventDrivenProcessors.isEmpty()) {
        Processor target = Pipeline.newInstance(getCamelContext(), eventDrivenProcessors);
        // force creating the route id so its known ahead of the route is started
        String routeId = route.idOrCreate(getCamelContext().getNodeIdFactory());
        // and wrap it in a unit of work so the UoW is on the top, so the entire route will be in the same UoW
        CamelInternalProcessor internal = new CamelInternalProcessor(target);
        internal.addAdvice(new CamelInternalProcessor.UnitOfWorkProcessorAdvice(this));
        // and then optionally add route policy processor if a custom policy is set
        List<RoutePolicy> routePolicyList = getRoutePolicyList();
        if (routePolicyList != null && !routePolicyList.isEmpty()) {
            for (RoutePolicy policy : routePolicyList) {
                // this ensures Camel can control the lifecycle of the policy
                if (!camelContext.hasService(policy)) {
                    try {
                        camelContext.addService(policy);
                    } catch (Exception e) {
                        throw ObjectHelper.wrapRuntimeCamelException(e);
                    }
                }
            }
            internal.addAdvice(new CamelInternalProcessor.RoutePolicyAdvice(routePolicyList));
        }
        // wrap in route inflight processor to track number of inflight exchanges for the route
        internal.addAdvice(new CamelInternalProcessor.RouteInflightRepositoryAdvice(camelContext.getInflightRepository(), routeId));
        // wrap in JMX instrumentation processor that is used for performance stats
        internal.addAdvice(new CamelInternalProcessor.InstrumentationAdvice("route"));
        // wrap in route lifecycle
        internal.addAdvice(new CamelInternalProcessor.RouteLifecycleAdvice());
        // wrap in REST binding
        if (route.getRestBindingDefinition() != null) {
            try {
                internal.addAdvice(route.getRestBindingDefinition().createRestBindingAdvice(this));
            } catch (Exception e) {
                throw ObjectHelper.wrapRuntimeCamelException(e);
            }
        }
        // wrap in contract
        if (route.getInputType() != null || route.getOutputType() != null) {
            Contract contract = new Contract();
            if (route.getInputType() != null) {
                contract.setInputType(route.getInputType().getUrn());
                contract.setValidateInput(route.getInputType().isValidate());
            }
            if (route.getOutputType() != null) {
                contract.setOutputType(route.getOutputType().getUrn());
                contract.setValidateOutput(route.getOutputType().isValidate());
            }
            internal.addAdvice(new ContractAdvice(contract));
        }
        // and create the route that wraps the UoW
        Route edcr = new EventDrivenConsumerRoute(this, getEndpoint(), internal);
        edcr.getProperties().put(Route.ID_PROPERTY, routeId);
        edcr.getProperties().put(Route.PARENT_PROPERTY, Integer.toHexString(route.hashCode()));
        edcr.getProperties().put(Route.DESCRIPTION_PROPERTY, route.getDescriptionText());
        if (route.getGroup() != null) {
            edcr.getProperties().put(Route.GROUP_PROPERTY, route.getGroup());
        }
        String rest = "false";
        if (route.isRest() != null && route.isRest()) {
            rest = "true";
        }
        edcr.getProperties().put(Route.REST_PROPERTY, rest);
        // after the route is created then set the route on the policy processor so we get hold of it
        CamelInternalProcessor.RoutePolicyAdvice task = internal.getAdvice(CamelInternalProcessor.RoutePolicyAdvice.class);
        if (task != null) {
            task.setRoute(edcr);
        }
        CamelInternalProcessor.RouteLifecycleAdvice task2 = internal.getAdvice(CamelInternalProcessor.RouteLifecycleAdvice.class);
        if (task2 != null) {
            task2.setRoute(edcr);
        }
        // invoke init on route policy
        if (routePolicyList != null && !routePolicyList.isEmpty()) {
            for (RoutePolicy policy : routePolicyList) {
                policy.onInit(edcr);
            }
        }
        routes.add(edcr);
    }
}
Also used : CamelInternalProcessor(org.apache.camel.processor.CamelInternalProcessor) Processor(org.apache.camel.Processor) RoutePolicy(org.apache.camel.spi.RoutePolicy) NoSuchEndpointException(org.apache.camel.NoSuchEndpointException) RuntimeCamelException(org.apache.camel.RuntimeCamelException) CamelInternalProcessor(org.apache.camel.processor.CamelInternalProcessor) ContractAdvice(org.apache.camel.processor.ContractAdvice) Contract(org.apache.camel.spi.Contract) Route(org.apache.camel.Route) ShutdownRoute(org.apache.camel.ShutdownRoute)

Aggregations

NoSuchEndpointException (org.apache.camel.NoSuchEndpointException)1 Processor (org.apache.camel.Processor)1 Route (org.apache.camel.Route)1 RuntimeCamelException (org.apache.camel.RuntimeCamelException)1 ShutdownRoute (org.apache.camel.ShutdownRoute)1 CamelInternalProcessor (org.apache.camel.processor.CamelInternalProcessor)1 ContractAdvice (org.apache.camel.processor.ContractAdvice)1 Contract (org.apache.camel.spi.Contract)1 RoutePolicy (org.apache.camel.spi.RoutePolicy)1