[ 
https://issues.apache.org/jira/browse/CAMEL-16825?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17603787#comment-17603787
 ] 

Dirk Vanhaute commented on CAMEL-16825:
---------------------------------------

Hi Claus,  I believe this is what you are looking for: 
[https://github.com/apache/camel/pull/5890]

It does what I explained here : 
{quote}WhenDefinition and OtherwiseDefinition are indeed on top of 
ChoiceDefinition.
It is a special construction. It is a child of choice, and 
ChoiceDefinition.when creates the new WhenDefinition or OtherwiseDefinition, 
but returns the current ChoiceDefinition instead.

Thus, indeed, I agree, endChoice should test first on being on level 
ChoiceDefinition and, if so, decide we're fine, not end the choice, but just 
return itself.
{quote}
But since the original test failed, I am not sure this is a correct analysis of 
what happened.

What I explained further is in CAMEL-4050, endParent was created in 
ProcessorDefinition and overridden in WhenDefinition but not in 
OtherDefinition.  It might be this whole parent thing that makes it impossible 
to use endChoice in a nested choice where it is not necessarry ( see my first 
example for a test ).

> can not use endChoice() in nest choice DSL
> ------------------------------------------
>
>                 Key: CAMEL-16825
>                 URL: https://issues.apache.org/jira/browse/CAMEL-16825
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-core, eip
>    Affects Versions: 3.6.0, 3.11.0
>            Reporter: tang honggang
>            Priority: Minor
>             Fix For: 3.x
>
>
> I want to use nest choice DSL to finish some job, but it doesn't work well in 
> my test case.  When I use endChoice() in the inner choice clause, it return 
> back to the outer choice definition actually. 
> And this is the test case:
> ProcessorDefinition<?> end = from("timer:foo?period=5000&synchronous=true")
>  .transform(simple("${random(1000)}"))
>  .choice()
>  .when(simple("${body} > 500"))
>  .log("High number ${body}")
>  .choice()
>  .when(simple("${body} > 750"))
>  .log("High number >750 ${body}")
>  .endChoice()
>  .otherwise()
>  .log("High number <750 ${body}")
>  .endChoice()
>  .endChoice()
>  .otherwise()
>  .log("Low number ${body}")
>  .endChoice();
>  
> Though in this case, I can fix the problem by not use endChoice(), I see the 
> code of endChoice(). I found that change the sequence of the two judgement 
> below can fix my problem, but I am not sure the influence. So I hope you can 
> give me an answer, thx!
> // are we nested choice?
> ProcessorDefinition<?> def = this;
> if (def.getParent() instanceof WhenDefinition) {
>  return (ChoiceDefinition) def.getParent().getParent();
> }
> // are we already a choice?
> if (def instanceof ChoiceDefinition) {
>  return (ChoiceDefinition) def;
> }
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to