Author: davsclaus Date: Wed Jul 7 06:36:13 2010 New Revision: 961251 URL: http://svn.apache.org/viewvc?rev=961251&view=rev Log: CAMEL-2914: Adjusted the DefinitionAwarePolicy slightly to ensure the Policy contract is preserved in the wrap method.
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DefinitionAwarePolicy.java camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java?rev=961251&r1=961250&r2=961251&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/PolicyDefinition.java Wed Jul 7 06:36:13 2010 @@ -23,7 +23,6 @@ import javax.xml.bind.annotation.XmlRoot import javax.xml.bind.annotation.XmlTransient; import org.apache.camel.Processor; -import org.apache.camel.processor.DelegateProcessor; import org.apache.camel.processor.WrapProcessor; import org.apache.camel.spi.DefinitionAwarePolicy; import org.apache.camel.spi.Policy; @@ -122,18 +121,20 @@ public class PolicyDefinition extends Ou @Override public Processor createProcessor(RouteContext routeContext) throws Exception { - DelegateProcessor childProcessor = new DelegateProcessor(); - Policy policy = resolvePolicy(routeContext); ObjectHelper.notNull(policy, "policy", this); - Processor target; + + // before wrap if (policy instanceof DefinitionAwarePolicy) { - target = ((DefinitionAwarePolicy)policy).wrap(routeContext, childProcessor, this); - } else { - target = policy.wrap(routeContext, childProcessor); + DefinitionAwarePolicy aware = (DefinitionAwarePolicy) policy; + aware.beforeWrap(routeContext, this); } - - childProcessor.setProcessor(this.createChildProcessor(routeContext, true)); + + // create processor after the before wrap + Processor childProcessor = this.createChildProcessor(routeContext, true); + + // wrap + Processor target = policy.wrap(routeContext, childProcessor); // wrap the target so it becomes a service and we can manage its lifecycle WrapProcessor wrap = new WrapProcessor(target, childProcessor); Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java?rev=961251&r1=961250&r2=961251&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/model/TransactedDefinition.java Wed Jul 7 06:36:13 2010 @@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlTran import org.apache.camel.Processor; import org.apache.camel.RuntimeCamelException; import org.apache.camel.processor.WrapProcessor; +import org.apache.camel.spi.DefinitionAwarePolicy; import org.apache.camel.spi.Policy; import org.apache.camel.spi.RouteContext; import org.apache.camel.spi.TransactedPolicy; @@ -130,10 +131,19 @@ public class TransactedDefinition extend @Override public Processor createProcessor(RouteContext routeContext) throws Exception { - Processor childProcessor = this.createChildProcessor(routeContext, true); - Policy policy = resolvePolicy(routeContext); ObjectHelper.notNull(policy, "policy", this); + + // before wrap + if (policy instanceof DefinitionAwarePolicy) { + DefinitionAwarePolicy aware = (DefinitionAwarePolicy) policy; + aware.beforeWrap(routeContext, this); + } + + // create processor after the before wrap + Processor childProcessor = this.createChildProcessor(routeContext, true); + + // wrap Processor target = policy.wrap(routeContext, childProcessor); // wrap the target so it becomes a service and we can manage its lifecycle Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DefinitionAwarePolicy.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DefinitionAwarePolicy.java?rev=961251&r1=961250&r2=961251&view=diff ============================================================================== --- camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DefinitionAwarePolicy.java (original) +++ camel/trunk/camel-core/src/main/java/org/apache/camel/spi/DefinitionAwarePolicy.java Wed Jul 7 06:36:13 2010 @@ -16,23 +16,29 @@ */ package org.apache.camel.spi; -import org.apache.camel.Processor; import org.apache.camel.model.ProcessorDefinition; /** - * A strategy capable of applying interceptors to a processor + * A strategy capable of applying interceptors to a processor. + * <p/> + * This <i>aware</i> policy allows you to do any custom work before the processor is wrapped. + * For example to manipulate the {...@link org.apache.camel.model.ProcessorDefinition definiton}. * + * + * @see org.apache.camel.spi.Policy * @version $Revision: 761894 $ */ public interface DefinitionAwarePolicy extends Policy { /** - * Wraps any applicable interceptors around the given processor + * 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 ProcessorDefinition<ProcessorDefinition> - * @param processor the processor to be intercepted - * @return either the original processor or a processor wrapped in one or more interceptors + * @param routeContext the route context + * @param definition the processor definition */ - Processor wrap(RouteContext routeContext, Processor processor, ProcessorDefinition<?> processorDefinition); + void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition); + } Modified: camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java?rev=961251&r1=961250&r2=961251&view=diff ============================================================================== --- camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java (original) +++ camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DefinitionPolicyPerProcessorTest.java Wed Jul 7 06:36:13 2010 @@ -19,12 +19,11 @@ package org.apache.camel.processor; import org.apache.camel.ContextTestSupport; import org.apache.camel.Exchange; import org.apache.camel.Processor; -import org.apache.camel.builder.ExpressionClause; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.JndiRegistry; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.SetBodyDefinition; -import org.apache.camel.model.language.ExpressionDefinition; +import org.apache.camel.model.language.ConstantExpression; import org.apache.camel.spi.DefinitionAwarePolicy; import org.apache.camel.spi.RouteContext; @@ -75,23 +74,16 @@ public class DefinitionPolicyPerProcesso this.name = name; } - public Processor wrap(RouteContext routeContext, final Processor processor) { - throw new UnsupportedOperationException("This method should not be called"); - } - public int getInvoked() { return invoked; } - public Processor wrap(final RouteContext routeContext, - final Processor processor, - final ProcessorDefinition<?> processorDefinition) { - - // alter the child definition - SetBodyDefinition bodyDef = (SetBodyDefinition) processorDefinition.getOutputs().get(0); - ((ExpressionClause<?>)((ExpressionDefinition)bodyDef.getExpression()).getExpressionValue()).constant("body was altered"); + public void beforeWrap(RouteContext routeContext, ProcessorDefinition<?> definition) { + SetBodyDefinition bodyDef = (SetBodyDefinition) definition.getOutputs().get(0); + bodyDef.setExpression(new ConstantExpression("body was altered")); + } - // make sure the normal "wrap" still works. + public Processor wrap(final RouteContext routeContext, final Processor processor) { return new Processor() { public void process(Exchange exchange) throws Exception { invoked++; @@ -100,5 +92,6 @@ public class DefinitionPolicyPerProcesso } }; } + } }