On Wed, Jul 7, 2010 at 10:28 AM, Hadrian Zbarcea <hzbar...@gmail.com> wrote: > Thanks Claus, > > I can do it in the morning. It got kinda late. >
I took the liberty to commit the changes in the trunk. What's missing is wiki documentation. Please take a look at the code to see if there is anything you can spot that's not what we talked about or in need of a change. Yeah I do think its night/early morning in the states right now, and you haven't got to bed yet. > Hadrian > > On Jul 7, 2010, at 4:17 AM, Claus Ibsen wrote: > >> On Wed, Jul 7, 2010 at 10:07 AM, Hadrian Zbarcea <hzbar...@gmail.com> wrote: >>> Fair enough, let's do that. I think beforeWrap is actually better though. >>> And then we document how it could/should be used. >>> >> >> Yeah great. There is already javadoc documentation. >> >> But maybe we should add a wiki page about Policy and DefinitionAwarePolicy. >> >> >>> On Jul 7, 2010, at 3:51 AM, Claus Ibsen wrote: >>> >>>> On Wed, Jul 7, 2010 at 9:46 AM, Hadrian Zbarcea <hzbar...@gmail.com> wrote: >>>>> That works quite well actually. What would be good though is if we could >>>>> find a better name for the beforeWrap, something that communicates the >>>>> intent, something like updateDefinitions, something that would be more >>>>> intuitive about how the interface should be used. Yeah, not easy to come >>>>> with the right name :( >>>>> >>>> >>>> Yeah naming a new class or method is not always that strait forward. >>>> >>>> However naming it *update* kinda implies that you *must* update the >>>> definition. What if you intent is not to update it, but you may want >>>> to do something else. >>>> I think the before name in this case is a good name because its >>>> invoked before we do the wrap. >>>> >>>> It could be named onBeforeWrap if people are more into the onXXX naming >>>> style. >>>> >>>> >>>> >>>>> >>>>> On Jul 7, 2010, at 2:33 AM, Claus Ibsen wrote: >>>>> >>>>>> Hi >>>>>> >>>>>> I just had a thought. >>>>>> >>>>>> I think we should modify the DefinitionAwarePolicy a bit to ensure the >>>>>> contract stays the same. >>>>>> This is what I propose >>>>>> >>>>>> public interface DefinitionAwarePolicy extends Policy { >>>>>> >>>>>> /** >>>>>> * Callback invoked before the wrap. >>>>>> * <p/> >>>>>> * This allows you to do any custom logic before the processor is >>>>>> wrapped. For example to >>>>>> * manipulate the {...@link >>>>>> org.apache.camel.model.ProcessorDefinition definiton} >>>>>> * >>>>>> * @param routeContext the route context >>>>>> * @param definition the processor definition >>>>>> */ >>>>>> void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> >>>>>> definition); >>>>>> >>>>>> } >>>>>> >>>>>> >>>>>> Then we have this beforeWrap method which is invoked before the wrap >>>>>> method. This allows Mark / end users to manipulate the definition. >>>>>> And then the wrap method from Policy is used to wrap it. >>>>>> >>>>>> Then the contract stays the same, and there is no surprises. >>>>>> >>>>>> This allows a nice and clean custom policy. >>>>>> >>>>>> public static class MyPolicy implements DefinitionAwarePolicy { >>>>>> >>>>>> private final String name; >>>>>> private int invoked; >>>>>> >>>>>> public MyPolicy(String name) { >>>>>> this.name = name; >>>>>> } >>>>>> >>>>>> public int getInvoked() { >>>>>> return invoked; >>>>>> } >>>>>> >>>>>> public void beforeWrap(RouteContext routeContext, >>>>>> ProcessorDefinition<?> definition) { >>>>>> SetBodyDefinition bodyDef = (SetBodyDefinition) >>>>>> definition.getOutputs().get(0); >>>>>> bodyDef.setExpression(new ConstantExpression("body was >>>>>> altered")); >>>>>> } >>>>>> >>>>>> public Processor wrap(final RouteContext routeContext, final >>>>>> Processor processor) { >>>>>> return new Processor() { >>>>>> public void process(Exchange exchange) throws Exception { >>>>>> invoked++; >>>>>> exchange.getIn().setHeader(name, "was wrapped"); >>>>>> processor.process(exchange); >>>>>> } >>>>>> }; >>>>>> } >>>>>> >>>>>> } >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Wed, Jul 7, 2010 at 8:18 AM, Claus Ibsen <claus.ib...@gmail.com> >>>>>> wrote: >>>>>>> On Wed, Jul 7, 2010 at 8:08 AM, Hadrian Zbarcea <hzbar...@gmail.com> >>>>>>> wrote: >>>>>>>> Should we continue the discussion here or in the jira? >>>>>>>> >>>>>>> >>>>>>> IMHO mailing list is best as they are easier to search. Also a broader >>>>>>> audience may listen and contribute. >>>>>>> >>>>>>> >>>>>>>> Not sure if I get your point. To me a policy is meant exactly for >>>>>>>> that: to wrap a part of a route and inject extra processing. The wrap >>>>>>>> method returns a Processor that does some stuff and at some point >>>>>>>> delegates to the inner Processor that represents the part of the route >>>>>>>> wrapped by the policy. As such one could chose to add another >>>>>>>> SendProcessor to achieve something like a wiretap, or a >>>>>>>> ThreadsProcessor, or a Throttler, or what not. It can be done by >>>>>>>> instantiating Processors, but not by manipulating the ast. Why not? >>>>>>>> This addition allows one to do in a simpler way, what is already >>>>>>>> possible. >>>>>>>> >>>>>>>> Why would you -1 this? What's the harm? >>>>>>>> >>>>>>> >>>>>>> The contract is different between the Policy and the >>>>>>> DefinitionAwarePolicy >>>>>>> >>>>>>> In the former the processor parameter is the created processor >>>>>>> In the latter the processor parameter is a "dummy delegate" because >>>>>>> Mark's goal was to *manipulate* the definition *before* the actual >>>>>>> processor is created. >>>>>>> So he passes in a "dummy delegate" and then afterwards creates the >>>>>>> actual processor, now that he has manipulated the definition. >>>>>>> >>>>>>> This is not intuitive and leads to surprises! >>>>>>> >>>>>>> >>>>>>> Mark's goal is to manipulate the routes before they are created, to >>>>>>> have it adapted to his environment (I assume related to JBoss). >>>>>>> On a greater scheme I would rather introduce a SPI factory to register >>>>>>> a custom factory where Mark can do his manipulation. >>>>>>> >>>>>>> All you have to do is to define a Spring bean with the custom hook and >>>>>>> Camel will pick it up and use it. >>>>>>> >>>>>>> <bean id="customFactory" >>>>>>> class="org.apache.camel.processor.CustomProcessorFactoryTest$MyFactory"/> >>>>>>> >>>>>>> Then the end user doesn't have to remember to add a policy or >>>>>>> whatever. The routes can *stay as is*. >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>>> >>>>>>>> On Jul 7, 2010, at 1:05 AM, Claus Ibsen wrote: >>>>>>>> >>>>>>>>> Hi >>>>>>>>> >>>>>>>>> In the patch on the ticket >>>>>>>>> https://issues.apache.org/activemq/browse/CAMEL-2914 >>>>>>>>> >>>>>>>>> The processor which is passed into the wrap is just a dummy delegate. >>>>>>>>> This breaks the contract that its the actual processor being wrapped. >>>>>>>>> So now there is a different in semantic between the regular wrap and >>>>>>>>> the new wrap with the definition. This is really not good. >>>>>>>>> >>>>>>>>> I am inclined to vote -1 on this and look for the alternative solution >>>>>>>>> with the ProcessorCreater API >>>>>>>>> >>>>>>>>> >>>>>>>>> On Mon, Jul 5, 2010 at 5:00 PM, Mark Proctor <mproc...@codehaus.org> >>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> As well as using Policy to wrap the child processors, I'd like to be >>>>>>>>>> able to >>>>>>>>>> change/augment the child definitions before they are built. My >>>>>>>>>> current use >>>>>>>>>> case for this is so I can augment the DataFormats, with additional >>>>>>>>>> configurations. Additionally this Policy also takes care of setting >>>>>>>>>> the >>>>>>>>>> current context ClassLoader, but that already works fine with the >>>>>>>>>> existing >>>>>>>>>> Policy wrap api. >>>>>>>>>> >>>>>>>>>> API comptability is a problem, but as a sketch to what I'm trying to >>>>>>>>>> achieve, here is a change that while a little clunky (due api >>>>>>>>>> compatability) >>>>>>>>>> should achieve the job. This allows the wrap to still call the child >>>>>>>>>> Process, via the delegate, but to also inspect and change the child >>>>>>>>>> Definitions prior to building. >>>>>>>>>> >>>>>>>>>> public interface DefinitionAwarePolicy extends Policy { >>>>>>>>>> Processor wrap(RouteContext routeContext, >>>>>>>>>> ProcessorDefinition<ProcessorDefinition> processorDefinition, >>>>>>>>>> Processor >>>>>>>>>> processor); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> PolicyDefinition. >>>>>>>>>> public Processor createProcessor(RouteContext routeContext) throws >>>>>>>>>> Exception { >>>>>>>>>> DelegateProcessor childProcessor = new DelegateProcessor(); >>>>>>>>>> >>>>>>>>>> Policy policy = resolvePolicy(routeContext); >>>>>>>>>> ObjectHelper.notNull(policy, "policy", this); >>>>>>>>>> Processor target; >>>>>>>>>> if ( policy instanceof Policy ) { >>>>>>>>>> target = policy.wrap(routeContext, childProcessor); >>>>>>>>>> } else { >>>>>>>>>> target = >>>>>>>>>> ((DefinitionAwarePolicy)policy).wrap(routeContext, >>>>>>>>>> this, childProcessor); >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> childProcessor.setProcessor( >>>>>>>>>> this.createChildProcessor(routeContext, >>>>>>>>>> true) ); >>>>>>>>>> >>>>>>>>>> // wrap the target so it becomes a service and we can manage >>>>>>>>>> its >>>>>>>>>> lifecycle >>>>>>>>>> WrapProcessor wrap = new WrapProcessor(target, >>>>>>>>>> childProcessor); >>>>>>>>>> return wrap; >>>>>>>>>> } >>>>>>>>>> -- >>>>>>>>>> View this message in context: >>>>>>>>>> http://camel.465427.n5.nabble.com/Using-Policy-to-alter-Definitions-before-building-tp696567p696567.html >>>>>>>>>> Sent from the Camel - Users mailing list archive at Nabble.com. >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Claus Ibsen >>>>>>>>> Apache Camel Committer >>>>>>>>> >>>>>>>>> Author of Camel in Action: http://www.manning.com/ibsen/ >>>>>>>>> Open Source Integration: http://fusesource.com >>>>>>>>> Blog: http://davsclaus.blogspot.com/ >>>>>>>>> Twitter: http://twitter.com/davsclaus >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> Claus Ibsen >>>>>>> Apache Camel Committer >>>>>>> >>>>>>> Author of Camel in Action: http://www.manning.com/ibsen/ >>>>>>> Open Source Integration: http://fusesource.com >>>>>>> Blog: http://davsclaus.blogspot.com/ >>>>>>> Twitter: http://twitter.com/davsclaus >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Claus Ibsen >>>>>> Apache Camel Committer >>>>>> >>>>>> Author of Camel in Action: http://www.manning.com/ibsen/ >>>>>> Open Source Integration: http://fusesource.com >>>>>> Blog: http://davsclaus.blogspot.com/ >>>>>> Twitter: http://twitter.com/davsclaus >>>>> >>>>> >>>> >>>> >>>> >>>> -- >>>> Claus Ibsen >>>> Apache Camel Committer >>>> >>>> Author of Camel in Action: http://www.manning.com/ibsen/ >>>> Open Source Integration: http://fusesource.com >>>> Blog: http://davsclaus.blogspot.com/ >>>> Twitter: http://twitter.com/davsclaus >>> >>> >> >> >> >> -- >> Claus Ibsen >> Apache Camel Committer >> >> Author of Camel in Action: http://www.manning.com/ibsen/ >> Open Source Integration: http://fusesource.com >> Blog: http://davsclaus.blogspot.com/ >> Twitter: http://twitter.com/davsclaus > > -- Claus Ibsen Apache Camel Committer Author of Camel in Action: http://www.manning.com/ibsen/ Open Source Integration: http://fusesource.com Blog: http://davsclaus.blogspot.com/ Twitter: http://twitter.com/davsclaus