Fair enough, let's do that. I think beforeWrap is actually better though. And then we document how it could/should be used.
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