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}