Author: gertv
Date: Thu Jul 21 14:39:39 2011
New Revision: 1149199
URL: http://svn.apache.org/viewvc?rev=1149199&view=rev
Log:
Allow InterceptStrategy instances to be added/removed at runtime
Modified:
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/BreadcrumbStrategy.scala
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/GlobalInterceptStrategy.scala
servicemix/smx5/trunk/core/src/test/scala/org/apache/servicemix/core/BreadcrumbStrategyTest.scala
Modified:
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/BreadcrumbStrategy.scala
URL:
http://svn.apache.org/viewvc/servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/BreadcrumbStrategy.scala?rev=1149199&r1=1149198&r2=1149199&view=diff
==============================================================================
---
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/BreadcrumbStrategy.scala
(original)
+++
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/BreadcrumbStrategy.scala
Thu Jul 21 14:39:39 2011
@@ -28,19 +28,15 @@ class BreadcrumbStrategy extends Interce
import BreadcrumbStrategy.{hasBreadCrumb, addBreadCrumb}
- def wrapProcessorInInterceptors(context: CamelContext, definition:
ProcessorDefinition[_], target: Processor, nextTarget: Processor) : Processor =
{
- new ProcessorWrapper(target)
- }
-
- class ProcessorWrapper(target: Processor) extends Processor {
- def process(exchange: Exchange) {
- if (!hasBreadCrumb(exchange)) {
- addBreadCrumb(exchange)
+ def wrapProcessorInInterceptors(context: CamelContext, definition:
ProcessorDefinition[_], target: Processor, nextTarget: Processor) : Processor =
+ new Processor() {
+ def process(exchange: Exchange) {
+ if (!hasBreadCrumb(exchange)) {
+ addBreadCrumb(exchange)
+ }
+ target.process(exchange)
}
- target.process(exchange)
}
- }
-
}
object BreadcrumbStrategy {
Modified:
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/GlobalInterceptStrategy.scala
URL:
http://svn.apache.org/viewvc/servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/GlobalInterceptStrategy.scala?rev=1149199&r1=1149198&r2=1149199&view=diff
==============================================================================
---
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/GlobalInterceptStrategy.scala
(original)
+++
servicemix/smx5/trunk/core/src/main/scala/org/apache/servicemix/core/GlobalInterceptStrategy.scala
Thu Jul 21 14:39:39 2011
@@ -16,28 +16,52 @@
*/
package org.apache.servicemix.core
-import collection.mutable.MutableList
-import org.apache.camel.spi.InterceptStrategy
+import collection.mutable.ListBuffer
import org.apache.camel.model.ProcessorDefinition
-import org.apache.camel.{Processor, CamelContext}
+import org.apache.camel.{Exchange, Processor, CamelContext}
+import org.apache.camel.spi.InterceptStrategy
class GlobalInterceptStrategy extends InterceptStrategy {
- var strategies = new MutableList[InterceptStrategy]
+ val strategies = new ListBuffer[InterceptStrategy]
+ var lastUpdate = System.nanoTime();
def addStrategy(strategy : InterceptStrategy) {
strategies += strategy
+ lastUpdate = System.nanoTime()
}
def removeStrategy(strategy : InterceptStrategy) {
- strategies.filterNot( _ == strategy)
+ strategies -= strategy
+ lastUpdate = System.nanoTime()
}
- def wrapProcessorInInterceptors(context: CamelContext, definition:
ProcessorDefinition[_], target: Processor, nextTarget: Processor) : Processor =
{
- var t = target
- for( strategy <- strategies ) {
- t = strategy.wrapProcessorInInterceptors(context, definition, t,
nextTarget)
+ def configure(context: CamelContext, definition: ProcessorDefinition[_],
target: Processor, nextTarget: Processor) =
+ strategies.foldLeft(target){ (processor: Processor, strategy:
InterceptStrategy) =>
+ strategy.wrapProcessorInInterceptors(context, definition, processor,
nextTarget)
+ }
+
+ def wrapProcessorInInterceptors(context: CamelContext, definition:
ProcessorDefinition[_], target: Processor, nextTarget: Processor) : Processor =
+ new GlobalInterceptProcessor(context, definition, target, nextTarget, this)
+
+
+ class GlobalInterceptProcessor(context:CamelContext, definition:
ProcessorDefinition[_], target: Processor,
+ nextTarget: Processor, globals:
GlobalInterceptStrategy) extends Processor {
+
+ var currentProcessor = globals.configure(context, definition, target,
nextTarget)
+ var lastUpdate = System.nanoTime();
+
+ def processor = {
+ if (lastUpdate < globals.lastUpdate) {
+ // global interceptor list has been updated - recreating the processor
first
+ currentProcessor = globals.configure(context, definition, target,
nextTarget)
+ }
+ currentProcessor
}
- t
+
+ def process(exchange: Exchange) {
+ processor.process(exchange)
+ }
+
}
}
\ No newline at end of file
Modified:
servicemix/smx5/trunk/core/src/test/scala/org/apache/servicemix/core/BreadcrumbStrategyTest.scala
URL:
http://svn.apache.org/viewvc/servicemix/smx5/trunk/core/src/test/scala/org/apache/servicemix/core/BreadcrumbStrategyTest.scala?rev=1149199&r1=1149198&r2=1149199&view=diff
==============================================================================
---
servicemix/smx5/trunk/core/src/test/scala/org/apache/servicemix/core/BreadcrumbStrategyTest.scala
(original)
+++
servicemix/smx5/trunk/core/src/test/scala/org/apache/servicemix/core/BreadcrumbStrategyTest.scala
Thu Jul 21 14:39:39 2011
@@ -19,7 +19,6 @@ package org.apache.servicemix.core
import _root_.scala.Predef._
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
-import org.scalatest.{BeforeAndAfterAll, FunSuite}
import collection.immutable.List
import org.apache.camel.component.mock.MockEndpoint
import org.apache.camel.scala.dsl.builder.{RouteBuilderSupport, RouteBuilder}
@@ -28,9 +27,11 @@ import scala.collection.JavaConversions.
import org.apache.camel.impl.{DefaultCamelContext, DefaultProducerTemplate}
import org.apache.servicemix.core.BreadcrumbStrategy.{hasBreadCrumb,
getBreadCrumb}
+import org.scalatest.Assertions._
+import org.scalatest.{BeforeAndAfterEach, BeforeAndAfterAll, FunSuite}
@RunWith(classOf[JUnitRunner])
-class BreadcrumbStrategyTest extends FunSuite with RouteBuilderSupport with
BeforeAndAfterAll {
+class BreadcrumbStrategyTest extends FunSuite with RouteBuilderSupport with
BeforeAndAfterAll with BeforeAndAfterEach {
val messages = List("<gingerbread/>", "<cakes/>", "<sugar/>")
@@ -39,7 +40,6 @@ class BreadcrumbStrategyTest extends Fun
lazy val context = {
val result = new DefaultCamelContext()
result.addInterceptStrategy(globals)
- globals.addStrategy(new BreadcrumbStrategy)
result.addRoutes(createRouteBuilder())
result.start()
result
@@ -57,6 +57,8 @@ class BreadcrumbStrategyTest extends Fun
}
test("add breadcrumbs to message headers") {
+ globals.addStrategy(new BreadcrumbStrategy)
+
for (body <- messages) {
template.sendBody("direct:test", body)
}
@@ -76,6 +78,53 @@ class BreadcrumbStrategyTest extends Fun
assert(hansels == gretels, "Gretel should be able to find all of Hansel's
bread crumbs")
}
+ test("bread crumb strategy can be disabled if necessary") {
+ val breadcrumbs = new BreadcrumbStrategy
+ globals.addStrategy(breadcrumbs)
+
+ for (body <- messages) {
+ template.sendBody("direct:test", body)
+ }
+
+ val hansel = getMockEndpoint("mock:hansel")
+ hansel.expectedMessageCount(messages.size)
+
+ val gretel = getMockEndpoint("mock:gretel")
+ gretel.expectedMessageCount(messages.size)
+
+ List(hansel, gretel).foreach(_.assertIsSatisfied())
+
+ val hansels = for (exchange <- hansel.getExchanges) yield
getBreadCrumb(exchange)
+ assert(hansels.toSet.size == messages.size, "We should have distinct
breadcrumbs per message")
+
+ val gretels = for (exchange <- gretel.getExchanges) yield
getBreadCrumb(exchange)
+ assert(hansels == gretels, "Gretel should be able to find all of Hansel's
bread crumbs")
+
+ // let's now disable the bread crumbs and just continue with same
context/processors/...
+ globals.removeStrategy(breadcrumbs)
+ MockEndpoint.resetMocks(context)
+
+ for (body <- messages) {
+ template.sendBody("direct:test", body)
+ }
+
+ hansel.expectedMessageCount(messages.size)
+
+ gretel.expectedMessageCount(messages.size)
+
+ List(hansel, gretel).foreach(_.assertIsSatisfied())
+
+ for (exchange <- hansel.getExchanges)
+ assert(!hasBreadCrumb(exchange), "There should be no more bread crumbs
here")
+
+ for (exchange <- gretel.getExchanges)
+ assert(!hasBreadCrumb(exchange), "There should be no more bread crumbs
here")
+ }
+
+ override protected def afterEach() = {
+ MockEndpoint.resetMocks(context)
+ globals.strategies.clear()
+ }
def getMockEndpoint(name: String) = context.getEndpoint(name,
classOf[MockEndpoint])