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