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.management;
018
019import java.util.concurrent.ThreadPoolExecutor;
020
021import org.apache.camel.CamelContext;
022import org.apache.camel.Component;
023import org.apache.camel.Consumer;
024import org.apache.camel.DelegateProcessor;
025import org.apache.camel.Endpoint;
026import org.apache.camel.NamedNode;
027import org.apache.camel.Processor;
028import org.apache.camel.Producer;
029import org.apache.camel.Route;
030import org.apache.camel.Service;
031import org.apache.camel.cluster.CamelClusterService;
032import org.apache.camel.component.bean.BeanProcessor;
033import org.apache.camel.component.log.LogEndpoint;
034import org.apache.camel.health.HealthCheckRegistry;
035import org.apache.camel.management.mbean.ManagedAggregateProcessor;
036import org.apache.camel.management.mbean.ManagedBeanProcessor;
037import org.apache.camel.management.mbean.ManagedBrowsableEndpoint;
038import org.apache.camel.management.mbean.ManagedCamelContext;
039import org.apache.camel.management.mbean.ManagedCamelHealth;
040import org.apache.camel.management.mbean.ManagedChoice;
041import org.apache.camel.management.mbean.ManagedClaimCheck;
042import org.apache.camel.management.mbean.ManagedClusterService;
043import org.apache.camel.management.mbean.ManagedComponent;
044import org.apache.camel.management.mbean.ManagedConsumer;
045import org.apache.camel.management.mbean.ManagedConvertBody;
046import org.apache.camel.management.mbean.ManagedConvertHeader;
047import org.apache.camel.management.mbean.ManagedConvertVariable;
048import org.apache.camel.management.mbean.ManagedCustomLoadBalancer;
049import org.apache.camel.management.mbean.ManagedDataFormat;
050import org.apache.camel.management.mbean.ManagedDelayer;
051import org.apache.camel.management.mbean.ManagedDisabled;
052import org.apache.camel.management.mbean.ManagedDoCatch;
053import org.apache.camel.management.mbean.ManagedDoFinally;
054import org.apache.camel.management.mbean.ManagedDoTry;
055import org.apache.camel.management.mbean.ManagedDynamicRouter;
056import org.apache.camel.management.mbean.ManagedEndpoint;
057import org.apache.camel.management.mbean.ManagedEnricher;
058import org.apache.camel.management.mbean.ManagedEventNotifier;
059import org.apache.camel.management.mbean.ManagedFailoverLoadBalancer;
060import org.apache.camel.management.mbean.ManagedFilter;
061import org.apache.camel.management.mbean.ManagedIdempotentConsumer;
062import org.apache.camel.management.mbean.ManagedLog;
063import org.apache.camel.management.mbean.ManagedLoop;
064import org.apache.camel.management.mbean.ManagedMarshal;
065import org.apache.camel.management.mbean.ManagedMulticast;
066import org.apache.camel.management.mbean.ManagedPoll;
067import org.apache.camel.management.mbean.ManagedPollEnricher;
068import org.apache.camel.management.mbean.ManagedProcess;
069import org.apache.camel.management.mbean.ManagedProcessor;
070import org.apache.camel.management.mbean.ManagedProducer;
071import org.apache.camel.management.mbean.ManagedRandomLoadBalancer;
072import org.apache.camel.management.mbean.ManagedRecipientList;
073import org.apache.camel.management.mbean.ManagedRemoveHeader;
074import org.apache.camel.management.mbean.ManagedRemoveHeaders;
075import org.apache.camel.management.mbean.ManagedRemoveProperties;
076import org.apache.camel.management.mbean.ManagedRemoveProperty;
077import org.apache.camel.management.mbean.ManagedRemoveVariable;
078import org.apache.camel.management.mbean.ManagedResequencer;
079import org.apache.camel.management.mbean.ManagedRollback;
080import org.apache.camel.management.mbean.ManagedRoundRobinLoadBalancer;
081import org.apache.camel.management.mbean.ManagedRoute;
082import org.apache.camel.management.mbean.ManagedRouteController;
083import org.apache.camel.management.mbean.ManagedRoutingSlip;
084import org.apache.camel.management.mbean.ManagedSamplingThrottler;
085import org.apache.camel.management.mbean.ManagedScheduledPollConsumer;
086import org.apache.camel.management.mbean.ManagedScript;
087import org.apache.camel.management.mbean.ManagedSendDynamicProcessor;
088import org.apache.camel.management.mbean.ManagedSendProcessor;
089import org.apache.camel.management.mbean.ManagedService;
090import org.apache.camel.management.mbean.ManagedSetBody;
091import org.apache.camel.management.mbean.ManagedSetExchangePattern;
092import org.apache.camel.management.mbean.ManagedSetHeader;
093import org.apache.camel.management.mbean.ManagedSetHeaders;
094import org.apache.camel.management.mbean.ManagedSetProperty;
095import org.apache.camel.management.mbean.ManagedSetVariable;
096import org.apache.camel.management.mbean.ManagedSetVariables;
097import org.apache.camel.management.mbean.ManagedSplitter;
098import org.apache.camel.management.mbean.ManagedStep;
099import org.apache.camel.management.mbean.ManagedStickyLoadBalancer;
100import org.apache.camel.management.mbean.ManagedStop;
101import org.apache.camel.management.mbean.ManagedSupervisingRouteController;
102import org.apache.camel.management.mbean.ManagedSuspendableRoute;
103import org.apache.camel.management.mbean.ManagedThreadPool;
104import org.apache.camel.management.mbean.ManagedThreads;
105import org.apache.camel.management.mbean.ManagedThrottler;
106import org.apache.camel.management.mbean.ManagedThroughputLogger;
107import org.apache.camel.management.mbean.ManagedThrowException;
108import org.apache.camel.management.mbean.ManagedTopicLoadBalancer;
109import org.apache.camel.management.mbean.ManagedTransformer;
110import org.apache.camel.management.mbean.ManagedUnmarshal;
111import org.apache.camel.management.mbean.ManagedValidate;
112import org.apache.camel.management.mbean.ManagedWeightedLoadBalancer;
113import org.apache.camel.management.mbean.ManagedWireTapProcessor;
114import org.apache.camel.model.ExpressionNode;
115import org.apache.camel.model.LoadBalanceDefinition;
116import org.apache.camel.model.ProcessDefinition;
117import org.apache.camel.model.ProcessorDefinition;
118import org.apache.camel.model.RecipientListDefinition;
119import org.apache.camel.model.TransformDefinition;
120import org.apache.camel.model.loadbalancer.CustomLoadBalancerDefinition;
121import org.apache.camel.processor.CatchProcessor;
122import org.apache.camel.processor.ChoiceProcessor;
123import org.apache.camel.processor.ClaimCheckProcessor;
124import org.apache.camel.processor.Delayer;
125import org.apache.camel.processor.DisabledProcessor;
126import org.apache.camel.processor.DynamicRouter;
127import org.apache.camel.processor.Enricher;
128import org.apache.camel.processor.ExchangePatternProcessor;
129import org.apache.camel.processor.FilterProcessor;
130import org.apache.camel.processor.FinallyProcessor;
131import org.apache.camel.processor.LogProcessor;
132import org.apache.camel.processor.LoopProcessor;
133import org.apache.camel.processor.MulticastProcessor;
134import org.apache.camel.processor.Pipeline;
135import org.apache.camel.processor.PollEnricher;
136import org.apache.camel.processor.PollProcessor;
137import org.apache.camel.processor.RecipientList;
138import org.apache.camel.processor.RemoveHeaderProcessor;
139import org.apache.camel.processor.RemoveHeadersProcessor;
140import org.apache.camel.processor.RemovePropertiesProcessor;
141import org.apache.camel.processor.RemovePropertyProcessor;
142import org.apache.camel.processor.RemoveVariableProcessor;
143import org.apache.camel.processor.Resequencer;
144import org.apache.camel.processor.RollbackProcessor;
145import org.apache.camel.processor.RoutingSlip;
146import org.apache.camel.processor.SamplingThrottler;
147import org.apache.camel.processor.ScriptProcessor;
148import org.apache.camel.processor.SendDynamicProcessor;
149import org.apache.camel.processor.SendProcessor;
150import org.apache.camel.processor.SetBodyProcessor;
151import org.apache.camel.processor.SetHeaderProcessor;
152import org.apache.camel.processor.SetHeadersProcessor;
153import org.apache.camel.processor.SetPropertyProcessor;
154import org.apache.camel.processor.SetVariableProcessor;
155import org.apache.camel.processor.SetVariablesProcessor;
156import org.apache.camel.processor.Splitter;
157import org.apache.camel.processor.StepProcessor;
158import org.apache.camel.processor.StopProcessor;
159import org.apache.camel.processor.StreamResequencer;
160import org.apache.camel.processor.ThreadsProcessor;
161import org.apache.camel.processor.Throttler;
162import org.apache.camel.processor.ThrowExceptionProcessor;
163import org.apache.camel.processor.TransformProcessor;
164import org.apache.camel.processor.TryProcessor;
165import org.apache.camel.processor.WireTapProcessor;
166import org.apache.camel.processor.aggregate.AggregateProcessor;
167import org.apache.camel.processor.idempotent.IdempotentConsumer;
168import org.apache.camel.processor.loadbalancer.FailOverLoadBalancer;
169import org.apache.camel.processor.loadbalancer.LoadBalancer;
170import org.apache.camel.processor.loadbalancer.RandomLoadBalancer;
171import org.apache.camel.processor.loadbalancer.RoundRobinLoadBalancer;
172import org.apache.camel.processor.loadbalancer.StickyLoadBalancer;
173import org.apache.camel.processor.loadbalancer.TopicLoadBalancer;
174import org.apache.camel.processor.loadbalancer.WeightedLoadBalancer;
175import org.apache.camel.processor.transformer.DataTypeProcessor;
176import org.apache.camel.spi.BrowsableEndpoint;
177import org.apache.camel.spi.DataFormat;
178import org.apache.camel.spi.ErrorHandler;
179import org.apache.camel.spi.EventNotifier;
180import org.apache.camel.spi.ManagementObjectStrategy;
181import org.apache.camel.spi.RouteController;
182import org.apache.camel.spi.SupervisingRouteController;
183import org.apache.camel.support.ScheduledPollConsumer;
184import org.apache.camel.support.processor.ConvertBodyProcessor;
185import org.apache.camel.support.processor.ConvertHeaderProcessor;
186import org.apache.camel.support.processor.ConvertVariableProcessor;
187import org.apache.camel.support.processor.MarshalProcessor;
188import org.apache.camel.support.processor.PredicateValidatingProcessor;
189import org.apache.camel.support.processor.ThroughputLogger;
190import org.apache.camel.support.processor.UnmarshalProcessor;
191
192/**
193 * Default {@link org.apache.camel.spi.ManagementObjectStrategy}.
194 */
195public class DefaultManagementObjectStrategy implements ManagementObjectStrategy {
196
197    @Override
198    public Object getManagedObjectForCamelContext(CamelContext context) {
199        ManagedCamelContext mc = new ManagedCamelContext(context);
200        mc.init(context.getManagementStrategy());
201        return mc;
202    }
203
204    @Override
205    public Object getManagedObjectForCamelHealth(CamelContext context, HealthCheckRegistry healthCheckRegistry) {
206        ManagedCamelHealth mch = new ManagedCamelHealth(context, healthCheckRegistry);
207        mch.init(context.getManagementStrategy());
208        return mch;
209    }
210
211    @Override
212    public Object getManagedObjectForComponent(CamelContext context, Component component, String name) {
213        ManagedComponent mc = new ManagedComponent(name, component);
214        mc.init(context.getManagementStrategy());
215        return mc;
216    }
217
218    @Override
219    public Object getManagedObjectForDataFormat(CamelContext context, DataFormat dataFormat) {
220        ManagedDataFormat md = new ManagedDataFormat(context, dataFormat);
221        md.init(context.getManagementStrategy());
222        return md;
223    }
224
225    @Override
226    public Object getManagedObjectForEndpoint(CamelContext context, Endpoint endpoint) {
227        // we only want to manage singleton endpoints
228        if (!endpoint.isSingleton()) {
229            return null;
230        }
231
232        if (endpoint instanceof BrowsableEndpoint browsableEndpoint) {
233            ManagedBrowsableEndpoint me = new ManagedBrowsableEndpoint(browsableEndpoint);
234            me.init(context.getManagementStrategy());
235            return me;
236        } else {
237            ManagedEndpoint me = new ManagedEndpoint(endpoint);
238            me.init(context.getManagementStrategy());
239            return me;
240        }
241    }
242
243    @Override
244    public Object getManagedObjectForRouteController(CamelContext context, RouteController routeController) {
245        ManagedService mrc;
246        if (routeController instanceof SupervisingRouteController supervisingRouteController) {
247            mrc = new ManagedSupervisingRouteController(context, supervisingRouteController);
248        } else {
249            mrc = new ManagedRouteController(context, routeController);
250        }
251        mrc.init(context.getManagementStrategy());
252        return mrc;
253    }
254
255    @Override
256    public Object getManagedObjectForRoute(CamelContext context, Route route) {
257        ManagedRoute mr;
258        if (route.supportsSuspension()) {
259            mr = new ManagedSuspendableRoute(context, route);
260        } else {
261            mr = new ManagedRoute(context, route);
262        }
263        mr.init(context.getManagementStrategy());
264        return mr;
265    }
266
267    @Override
268    public Object getManagedObjectForThreadPool(
269            CamelContext context, ThreadPoolExecutor threadPool,
270            String id, String sourceId, String routeId, String threadPoolProfileId) {
271        ManagedThreadPool mtp = new ManagedThreadPool(context, threadPool, id, sourceId, routeId, threadPoolProfileId);
272        mtp.init(context.getManagementStrategy());
273        return mtp;
274    }
275
276    @Override
277    public Object getManagedObjectForEventNotifier(CamelContext context, EventNotifier eventNotifier) {
278        ManagedEventNotifier men = new ManagedEventNotifier(context, eventNotifier);
279        men.init(context.getManagementStrategy());
280        return men;
281    }
282
283    @Override
284    public Object getManagedObjectForConsumer(CamelContext context, Consumer consumer) {
285        ManagedConsumer mc;
286        if (consumer instanceof ScheduledPollConsumer scheduledPollConsumer) {
287            mc = new ManagedScheduledPollConsumer(context, scheduledPollConsumer);
288        } else {
289            mc = new ManagedConsumer(context, consumer);
290        }
291        mc.init(context.getManagementStrategy());
292        return mc;
293    }
294
295    @Override
296    public Object getManagedObjectForProducer(CamelContext context, Producer producer) {
297        ManagedProducer mp = new ManagedProducer(context, producer);
298        mp.init(context.getManagementStrategy());
299        return mp;
300    }
301
302    @Override
303    public Object getManagedObjectForService(CamelContext context, Service service) {
304        ManagedService mc = new ManagedService(context, service);
305        mc.init(context.getManagementStrategy());
306        return mc;
307    }
308
309    @Override
310    public Object getManagedObjectForClusterService(CamelContext context, CamelClusterService service) {
311        ManagedClusterService mcs = new ManagedClusterService(context, service);
312        mcs.init(context.getManagementStrategy());
313        return mcs;
314    }
315
316    @Override
317    public Object getManagedObjectForProcessor(
318            CamelContext context, Processor processor,
319            NamedNode node, Route route) {
320        ManagedProcessor answer = null;
321
322        ProcessorDefinition<?> definition = (ProcessorDefinition<?>) node;
323
324        if (definition instanceof RecipientListDefinition) {
325            // special for RecipientListDefinition, as the processor is wrapped in a pipeline as last
326            Pipeline pipeline = (Pipeline) processor;
327            for (Processor value : pipeline.next()) {
328                processor = value;
329            }
330        }
331
332        // unwrap delegates as we want the real target processor
333        Processor target = processor;
334        while (target != null) {
335
336            // skip error handlers
337            if (target instanceof ErrorHandler) {
338                return false;
339            }
340
341            if (target instanceof ConvertBodyProcessor) {
342                answer = new ManagedConvertBody(context, (ConvertBodyProcessor) target, definition);
343            } else if (target instanceof ConvertHeaderProcessor) {
344                answer = new ManagedConvertHeader(context, (ConvertHeaderProcessor) target, definition);
345            } else if (target instanceof ConvertVariableProcessor) {
346                answer = new ManagedConvertVariable(context, (ConvertVariableProcessor) target, definition);
347            } else if (target instanceof ChoiceProcessor) {
348                answer = new ManagedChoice(context, (ChoiceProcessor) target, definition);
349            } else if (target instanceof ClaimCheckProcessor) {
350                answer = new ManagedClaimCheck(context, (ClaimCheckProcessor) target, definition);
351            } else if (target instanceof Delayer) {
352                answer = new ManagedDelayer(context, (Delayer) target, definition);
353            } else if (target instanceof DisabledProcessor) {
354                answer = new ManagedDisabled(context, (DisabledProcessor) target, definition);
355            } else if (target instanceof TryProcessor tryProc) {
356                answer = new ManagedDoTry(context, tryProc, cast(definition));
357            } else if (target instanceof CatchProcessor) {
358                answer = new ManagedDoCatch(context, (CatchProcessor) target, cast(definition));
359            } else if (target instanceof FinallyProcessor) {
360                answer = new ManagedDoFinally(context, (FinallyProcessor) target, cast(definition));
361            } else if (target instanceof Throttler) {
362                answer = new ManagedThrottler(context, (Throttler) target, definition);
363            } else if (target instanceof DynamicRouter) {
364                answer = new ManagedDynamicRouter(context, (DynamicRouter) target, cast(definition));
365            } else if (target instanceof RoutingSlip) {
366                answer = new ManagedRoutingSlip(context, (RoutingSlip) target, cast(definition));
367            } else if (target instanceof FilterProcessor) {
368                answer = new ManagedFilter(context, (FilterProcessor) target, (ExpressionNode) definition);
369            } else if (target instanceof LogProcessor) {
370                answer = new ManagedLog(context, (LogProcessor) target, definition);
371            } else if (target instanceof LoopProcessor) {
372                answer = new ManagedLoop(context, (LoopProcessor) target, cast(definition));
373            } else if (target instanceof MarshalProcessor) {
374                answer = new ManagedMarshal(context, (MarshalProcessor) target, cast(definition));
375            } else if (target instanceof UnmarshalProcessor) {
376                answer = new ManagedUnmarshal(context, (UnmarshalProcessor) target, cast(definition));
377            } else if (target instanceof FailOverLoadBalancer) {
378                answer = new ManagedFailoverLoadBalancer(
379                        context, (FailOverLoadBalancer) target, cast(definition));
380            } else if (target instanceof RandomLoadBalancer) {
381                answer = new ManagedRandomLoadBalancer(
382                        context, (RandomLoadBalancer) target, cast(definition));
383            } else if (target instanceof RoundRobinLoadBalancer) {
384                answer = new ManagedRoundRobinLoadBalancer(
385                        context, (RoundRobinLoadBalancer) target, cast(definition));
386            } else if (target instanceof StickyLoadBalancer) {
387                answer = new ManagedStickyLoadBalancer(
388                        context, (StickyLoadBalancer) target, cast(definition));
389            } else if (target instanceof TopicLoadBalancer) {
390                answer = new ManagedTopicLoadBalancer(context, (TopicLoadBalancer) target, cast(definition));
391            } else if (target instanceof WeightedLoadBalancer) {
392                answer = new ManagedWeightedLoadBalancer(
393                        context, (WeightedLoadBalancer) target, cast(definition));
394            } else if (target instanceof RecipientList) {
395                answer = new ManagedRecipientList(context, (RecipientList) target, cast(definition));
396            } else if (target instanceof Splitter) {
397                answer = new ManagedSplitter(context, (Splitter) target, cast(definition));
398            } else if (target instanceof MulticastProcessor) {
399                answer = new ManagedMulticast(context, (MulticastProcessor) target, definition);
400            } else if (target instanceof SamplingThrottler) {
401                answer = new ManagedSamplingThrottler(context, (SamplingThrottler) target, definition);
402            } else if (target instanceof Resequencer) {
403                answer = new ManagedResequencer(context, (Resequencer) target, definition);
404            } else if (target instanceof RollbackProcessor) {
405                answer = new ManagedRollback(context, (RollbackProcessor) target, definition);
406            } else if (target instanceof StreamResequencer) {
407                answer = new ManagedResequencer(context, (StreamResequencer) target, definition);
408            } else if (target instanceof SetBodyProcessor) {
409                answer = new ManagedSetBody(context, (SetBodyProcessor) target, cast(definition));
410            } else if (target instanceof RemoveHeaderProcessor) {
411                answer = new ManagedRemoveHeader(context, (RemoveHeaderProcessor) target, definition);
412            } else if (target instanceof RemoveHeadersProcessor) {
413                answer = new ManagedRemoveHeaders(context, (RemoveHeadersProcessor) target, definition);
414            } else if (target instanceof SetHeaderProcessor) {
415                answer = new ManagedSetHeader(context, (SetHeaderProcessor) target, cast(definition));
416            } else if (target instanceof SetHeadersProcessor) {
417                answer = new ManagedSetHeaders(context, (SetHeadersProcessor) target, cast(definition));
418            } else if (target instanceof SetVariableProcessor) {
419                answer = new ManagedSetVariable(context, (SetVariableProcessor) target, cast(definition));
420            } else if (target instanceof SetVariablesProcessor) {
421                answer = new ManagedSetVariables(context, (SetVariablesProcessor) target, cast(definition));
422            } else if (target instanceof RemovePropertyProcessor) {
423                answer = new ManagedRemoveProperty(context, (RemovePropertyProcessor) target, definition);
424            } else if (target instanceof RemovePropertiesProcessor) {
425                answer = new ManagedRemoveProperties(context, (RemovePropertiesProcessor) target, definition);
426            } else if (target instanceof RemoveVariableProcessor) {
427                answer = new ManagedRemoveVariable(context, (RemoveVariableProcessor) target, definition);
428            } else if (target instanceof SetPropertyProcessor) {
429                answer = new ManagedSetProperty(context, (SetPropertyProcessor) target, cast(definition));
430            } else if (target instanceof ExchangePatternProcessor) {
431                answer = new ManagedSetExchangePattern(context, (ExchangePatternProcessor) target, definition);
432            } else if (target instanceof ScriptProcessor) {
433                answer = new ManagedScript(context, (ScriptProcessor) target, cast(definition));
434            } else if (target instanceof StepProcessor) {
435                answer = new ManagedStep(context, (StepProcessor) target, definition);
436            } else if (target instanceof StopProcessor) {
437                answer = new ManagedStop(context, (StopProcessor) target, definition);
438            } else if (target instanceof ThreadsProcessor) {
439                answer = new ManagedThreads(context, (ThreadsProcessor) target, definition);
440            } else if (target instanceof ThrowExceptionProcessor) {
441                answer = new ManagedThrowException(context, (ThrowExceptionProcessor) target, definition);
442            } else if (target instanceof TransformProcessor) {
443                answer = new ManagedTransformer(context, target, cast(definition));
444            } else if (target instanceof DataTypeProcessor && definition instanceof TransformDefinition) {
445                answer = new ManagedTransformer(context, target, (TransformDefinition) definition);
446            } else if (target instanceof PredicateValidatingProcessor) {
447                answer = new ManagedValidate(context, (PredicateValidatingProcessor) target, cast(definition));
448            } else if (target instanceof WireTapProcessor) {
449                answer = new ManagedWireTapProcessor(context, (WireTapProcessor) target, definition);
450            } else if (target instanceof SendDynamicProcessor) {
451                answer = new ManagedSendDynamicProcessor(context, (SendDynamicProcessor) target, definition);
452            } else if (target instanceof SendProcessor sp) {
453                // special for sending to throughput logger
454                if (sp.getDestination() instanceof LogEndpoint le && le.getLogger() instanceof ThroughputLogger tl) {
455                    answer = new ManagedThroughputLogger(context, tl, definition);
456                }
457                // regular send processor
458                if (answer == null) {
459                    answer = new ManagedSendProcessor(context, (SendProcessor) target, definition);
460                }
461            } else if (target instanceof BeanProcessor) {
462                answer = new ManagedBeanProcessor(context, (BeanProcessor) target, definition);
463            } else if (target instanceof IdempotentConsumer) {
464                answer = new ManagedIdempotentConsumer(
465                        context, (IdempotentConsumer) target, cast(definition));
466            } else if (target instanceof AggregateProcessor) {
467                answer = new ManagedAggregateProcessor(context, (AggregateProcessor) target, cast(definition));
468            } else if (target instanceof Enricher) {
469                answer = new ManagedEnricher(context, (Enricher) target, cast(definition));
470            } else if (target instanceof PollProcessor) {
471                answer = new ManagedPoll(context, (PollProcessor) target, cast(definition));
472            } else if (target instanceof PollEnricher) {
473                answer = new ManagedPollEnricher(context, (PollEnricher) target, cast(definition));
474            }
475
476            // special for custom load balancer
477            if (definition instanceof LoadBalanceDefinition lb) {
478                if (lb.getLoadBalancerType() instanceof CustomLoadBalancerDefinition) {
479                    answer = new ManagedCustomLoadBalancer(context, (LoadBalancer) target, (LoadBalanceDefinition) definition);
480                }
481            }
482
483            if (answer != null) {
484                // break out as we found an answer
485                break;
486            }
487
488            // no answer yet, so unwrap any delegates and try again
489            if (target instanceof DelegateProcessor) {
490                target = ((DelegateProcessor) target).getProcessor();
491            } else {
492                // no delegate so we dont have any target to try next
493                break;
494            }
495        }
496
497        if (answer == null && definition instanceof ProcessDefinition) {
498            answer = new ManagedProcess(context, target, (ProcessDefinition) definition);
499        } else if (answer == null) {
500            // fallback to a generic processor
501            answer = new ManagedProcessor(context, target, definition);
502        }
503
504        answer.setRoute(route);
505        answer.init(context.getManagementStrategy());
506        return answer;
507    }
508
509    @SuppressWarnings("unchecked")
510    private <T extends ProcessorDefinition<?>> T cast(ProcessorDefinition<?> definition) {
511        return (T) definition;
512    }
513
514}