You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2010/07/07 08:36:13 UTC

svn commit: r961251 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/model/ main/java/org/apache/camel/spi/ test/java/org/apache/camel/processor/

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
                 }
             };
         }
+
     }
 }