You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ge...@apache.org on 2008/05/19 19:29:38 UTC

svn commit: r657874 - in /activemq/camel/trunk/components/camel-scala: ./ src/main/scala/org/apache/camel/scala/ src/main/scala/org/apache/camel/scala/builder/ src/main/scala/org/apache/camel/scala/dsl/ src/test/scala/org/apache/camel/scala/ src/test/s...

Author: gertv
Date: Mon May 19 10:29:37 2008
New Revision: 657874

URL: http://svn.apache.org/viewvc?rev=657874&view=rev
Log:
CAMEL-463: Adding Scala DSL support for throttler/delayer/load balancer

Added:
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayerType.scala
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SLoadBalanceType.scala
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottlerType.scala
    activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/DelayerTest.scala
    activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/LoadBalancerTest.scala
    activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala
Removed:
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/RichChoice.scala
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/RichProcessor.scala
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/RichUriString.scala
Modified:
    activemq/camel/trunk/components/camel-scala/   (props changed)
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/builder/RouteBuilder.scala
    activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/ScalaDsl.scala
    activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/RichMockEndpoint.scala
    activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/SplitterRouteBuilderTest.scala

Propchange: activemq/camel/trunk/components/camel-scala/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon May 19 10:29:37 2008
@@ -5,3 +5,5 @@
 target
 .settings
 eclipse-classes
+.manager
+velocity.log

Added: activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala?rev=657874&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala (added)
+++ activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala Mon May 19 10:29:37 2008
@@ -0,0 +1,32 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.scala;
+
+/**
+ * Represents a period (expressed in milliseconds) in time
+ */
+class Period(var milliseconds : Long) {
+
+  /**
+   * Convert the current value from seconds -> milliseconds
+   */
+  def seconds = {
+    milliseconds *= 1000
+    this
+  }
+  
+}

Modified: activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala?rev=657874&r1=657873&r2=657874&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala (original)
+++ activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala Mon May 19 10:29:37 2008
@@ -22,5 +22,6 @@
 trait Preamble {
 
   implicit def exchangeWrapper(exchange: Exchange[T] forSome {type T}) = new RichExchange(exchange)
+  implicit def intToPeriod(int: Int) : Period = new Period(int)
 
 }

Modified: activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/builder/RouteBuilder.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/builder/RouteBuilder.scala?rev=657874&r1=657873&r2=657874&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/builder/RouteBuilder.scala (original)
+++ activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/builder/RouteBuilder.scala Mon May 19 10:29:37 2008
@@ -60,5 +60,8 @@
   def otherwise = stack.top.otherwise
   def multicast = stack.top.multicast
   def process(function: Exchange => Unit) = stack.top.process(function)
+  def throttle(count: Int) = stack.top.throttle(count)
+  def loadbalance = stack.top.loadbalance
+  def delay(delay: Period) = stack.top.delay(delay)
 
 }

Added: activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayerType.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayerType.scala?rev=657874&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayerType.scala (added)
+++ activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayerType.scala Mon May 19 10:29:37 2008
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.scala.dsl;
+
+import org.apache.camel.model.DelayerType
+import org.apache.camel.scala.builder.RouteBuilder
+
+/**
+ * Scala enrichment for Camel's DelayerType
+ */
+class SDelayerType(val target: DelayerType)(implicit val builder: RouteBuilder) extends ScalaDsl with Wrapper[DelayerType] {
+ 
+  val unwrap = target
+
+  def ms = this
+  def milliseconds = ms
+    
+  def sec = {
+    valueInMs *= 1000
+    this
+  }
+  def seconds = sec
+  
+  def min = {
+    valueInMs *= (60 * 1000)
+    this
+  }
+  def minutes = min
+  
+  def valueInMs : Long = target.getDelay().asInstanceOf[Long]
+  def valueInMs_=(period: Long) = target.setDelay(period)
+}

Added: activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SLoadBalanceType.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SLoadBalanceType.scala?rev=657874&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SLoadBalanceType.scala (added)
+++ activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SLoadBalanceType.scala Mon May 19 10:29:37 2008
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.scala.dsl;
+
+import org.apache.camel.model.LoadBalanceType
+import org.apache.camel.scala.builder.RouteBuilder
+
+/**
+ * Scala enrichment for Camel's LoadBalanceType
+ */
+class SLoadBalanceType(val target: LoadBalanceType)(implicit val builder: RouteBuilder) extends ScalaDsl with Wrapper[LoadBalanceType] {
+ 
+  val unwrap = target
+  
+  def roundrobin = {
+    target.roundRobin
+    this;
+  }
+  
+}

Added: activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottlerType.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottlerType.scala?rev=657874&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottlerType.scala (added)
+++ activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottlerType.scala Mon May 19 10:29:37 2008
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.scala.dsl;
+
+import org.apache.camel.model.ThrottlerType
+import org.apache.camel.scala.builder.RouteBuilder
+
+/**
+ * Scala enrichment for Camel's ThrottlerType
+ */
+class STrottlerType(val target: ThrottlerType)(implicit val builder: RouteBuilder) extends ScalaDsl with Wrapper[ThrottlerType] {
+ 
+  val unwrap = target
+  
+  /**
+   * Time period in milliseconds
+   */
+  def per(period: Int) = {
+    target.setTimePeriodMillis(period)
+    this
+  }
+  
+  def ms = this
+  def milliseconds = ms
+    
+  def sec = {
+    valueInMs *= 1000
+    this
+  }
+  def seconds = sec
+  
+  def min = {
+    valueInMs *= (60 * 1000)
+    this
+  }
+  def minutes = min
+
+  def valueInMs = target.getTimePeriodMillis()
+  def valueInMs_=(period: Long) = target.setTimePeriodMillis(period)
+}

Modified: activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/ScalaDsl.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/ScalaDsl.scala?rev=657874&r1=657873&r2=657874&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/ScalaDsl.scala (original)
+++ activemq/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/ScalaDsl.scala Mon May 19 10:29:37 2008
@@ -69,5 +69,11 @@
     target.process(new ScalaProcessor(function))
     this
   }
+  
+  def throttle(count: Int) = new STrottlerType(target.throttler(count))
+  
+  def loadbalance = new SLoadBalanceType(target.loadBalance)
+  
+  def delay(period: Period) = new SDelayerType(target.delayer(period.milliseconds))
 
 }

Modified: activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/RichMockEndpoint.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/RichMockEndpoint.scala?rev=657874&r1=657873&r2=657874&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/RichMockEndpoint.scala (original)
+++ activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/RichMockEndpoint.scala Mon May 19 10:29:37 2008
@@ -18,7 +18,7 @@
 
 import org.apache.camel.component.mock.MockEndpoint
 
-class RichMockEndpoint(endpoint: MockEndpoint) {
+class RichMockEndpoint(val endpoint: MockEndpoint) {
 
   def received(messages: AnyRef*) {
     val list = new java.util.ArrayList[AnyRef](messages.length)

Added: activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/DelayerTest.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/DelayerTest.scala?rev=657874&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/DelayerTest.scala (added)
+++ activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/DelayerTest.scala Mon May 19 10:29:37 2008
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.scala.dsl;
+ 
+import org.w3c.dom.Document
+import scala.builder.RouteBuilder
+
+/**
+ * Test case for message delayer
+ */
+class DelayerTest extends ScalaTestSupport {
+  
+  def testSimpleDelayer = {
+    "mock:a" expect { _.count = 0 }      
+    "seda:a" ! "any given message"   
+    "mock:a" assert()
+    //messages should only arrive after waiting a while 
+    "mock:a" expect { _.count = 1 }
+    "mock:a" expect { _.setResultWaitTime(1500)}
+    "mock:a" assert();
+  }
+  
+  def testBlockDelayer = {
+    "mock:b" expect { _.count = 1 }
+    "mock:c" expect { _.count = 0 }
+    "seda:b" ! "any given message"   
+    "mock:b" assert()
+    "mock:c" assert()
+    //messages should only arrive after waiting a while 
+    "mock:c" expect { _.count = 1 }
+    "mock:c" expect { _.setResultWaitTime(1500)}
+    "mock:b" assert()
+    "mock:c" assert()
+  }    
+  val builder =
+    new RouteBuilder {
+       //START SNIPPET: simple
+       "seda:a" delay(1 seconds) to ("mock:a")
+       //END SNIPPET: simple
+       
+       //START SNIPPET: block
+       "seda:b" ==> {
+         to ("mock:b")
+         delay(1 seconds) {
+           to ("mock:c")
+         }
+       }
+       //END SNIPPET: block
+    }
+
+}

Added: activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/LoadBalancerTest.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/LoadBalancerTest.scala?rev=657874&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/LoadBalancerTest.scala (added)
+++ activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/LoadBalancerTest.scala Mon May 19 10:29:37 2008
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.scala.dsl;
+ 
+import org.w3c.dom.Document
+import scala.builder.RouteBuilder
+
+/**
+ * Test case for message load balancer
+ */
+class LoadBalancerTest extends ScalaTestSupport {
+  
+  def testSimpleTrottler = {
+    "mock:a" expect { _.received("message 1", "message 4") } 
+    "mock:b" expect { _.received("message 2", "message 5") }
+    "mock:c" expect { _.received("message 3", "message 6") }
+    for (id <- 1 to 6) "direct:a" ! "message " + id   
+    "mock:a" assert()
+    "mock:b" assert()
+    "mock:c" assert()
+  }
+    
+  val builder =
+    new RouteBuilder {
+       //START SNIPPET: loadbalance
+       "direct:a" ==> {
+         loadbalance roundrobin {
+           to ("mock:a")
+           to ("mock:b")
+           to ("mock:c")
+         }
+       }
+       //END SNIPPET: loadbalance
+    }
+
+}

Modified: activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/SplitterRouteBuilderTest.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/SplitterRouteBuilderTest.scala?rev=657874&r1=657873&r2=657874&view=diff
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/SplitterRouteBuilderTest.scala (original)
+++ activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/SplitterRouteBuilderTest.scala Mon May 19 10:29:37 2008
@@ -56,6 +56,6 @@
          }
        }
        //END SNIPPET: block
-    }.print
+    }
 
 }

Added: activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala
URL: http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala?rev=657874&view=auto
==============================================================================
--- activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala (added)
+++ activemq/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala Mon May 19 10:29:37 2008
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.scala.dsl;
+ 
+import org.w3c.dom.Document
+import scala.builder.RouteBuilder
+
+/**
+ * Test case for message throttler
+ */
+class ThrottlerTest extends ScalaTestSupport {
+  
+  def testSimpleTrottler = {
+    "mock:a" expect { _.count = 3 } 
+    "mock:a" expect { _.setResultWaitTime(1000) }  
+    for (id <- 1 to 6) "seda:a" ! id   
+    "mock:a" assert()
+  }
+  
+  def testBlockTrottler = {
+    "mock:b" expect { _.count = 6 }
+    "mock:c" expect { _.count = 3 } 
+    "mock:c" expect { _.setResultWaitTime(1000) }  
+    for (id <- 1 to 6) "seda:b" ! id   
+    "mock:b" assert()
+  }
+  
+  val builder =
+    new RouteBuilder {
+       //START SNIPPET: simple
+       "seda:a" throttle 3 per 2 seconds to ("mock:a")
+       //END SNIPPET: simple
+       
+       //START SNIPPET: block
+       "seda:b" ==> {
+         to ("mock:b")
+         throttle(3) per 2 seconds {
+           to ("mock:c")
+         }
+       }
+       //END SNIPPET: block
+    }
+
+}