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