Author: davsclaus
Date: Sun May  1 09:41:21 2011
New Revision: 1098233

URL: http://svn.apache.org/viewvc?rev=1098233&view=rev
Log:
CAMEL-3439: Improved period DSL in camel-scala. Thanks to Pavel for patch.

Modified:
    
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Frequency.scala
    
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala
    
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala
    
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/RichInt.scala
    
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayDefinition.scala
    
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottleDefinition.scala
    
camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala

Modified: 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Frequency.scala
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Frequency.scala?rev=1098233&r1=1098232&r2=1098233&view=diff
==============================================================================
--- 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Frequency.scala
 (original)
+++ 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Frequency.scala
 Sun May  1 09:41:21 2011
@@ -23,10 +23,7 @@ package org.apache.camel.scala
  * @param period the time period for this frequency
  */
 class Frequency(val count: Int, val period: Period) {
-  
-  def seconds = {
-    period.seconds
-    this
-  }
-  
+
+
+
 }

Modified: 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala?rev=1098233&r1=1098232&r2=1098233&view=diff
==============================================================================
--- 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala
 (original)
+++ 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Period.scala
 Sun May  1 09:41:21 2011
@@ -14,19 +14,78 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.scala;
+package org.apache.camel.scala
 
 /**
  * Represents a period (expressed in milliseconds) in time
  */
-class Period(var milliseconds : Long) {
+abstract class Period {
+  protected def ref: SimplePeriod
+
+  def milliseconds: Long
+
+  def ms = this
 
-  /**
-   * Convert the current value from seconds -> milliseconds
-   */
   def seconds = {
-    milliseconds *= 1000
+    ref.milliseconds *= 1000
+    this
+  }
+
+  def seconds(other: Long): CompositePeriod = {
+    seconds
+    new CompositePeriod(this, new SimplePeriod(other))
+  }
+
+  def second = seconds
+
+  def second(other: Long) = seconds(other)
+
+  def minutes = {
+    ref.milliseconds *= 60
+    seconds
+    this
+  }
+
+  def minutes(other: Long): CompositePeriod = {
+    minutes
+    new CompositePeriod(this, new SimplePeriod(other))
+  }
+
+  def minute = minutes
+
+  def minute(other: Long) = minutes(other)
+
+  def hours = {
+    ref.milliseconds *= 60
+    minutes
     this
   }
-  
+
+  def hours(other: Long): CompositePeriod = {
+    hours
+    new CompositePeriod(this, new SimplePeriod(other))
+  }
+
+  def hour = hours
+
+  def hour(other: Long) = hours(other)
+
+  override def equals(other: Any) = other.asInstanceOf[Period].milliseconds == 
milliseconds
+}
+
+/**
+ * Single period is just a holder for milliseconds
+ */
+class SimplePeriod(var milliseconds: Long) extends Period {
+  def ref = this
+}
+
+/**
+ * Composite period is a combination of "left" and "right" period; it allows 
composing DSL like
+ * "2 hours 15 minutes"
+ */
+class CompositePeriod(val left: Period, val right: SimplePeriod) extends 
Period {
+  def ref = right;
+
+  def milliseconds = left.milliseconds + right.milliseconds
 }

Modified: 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala?rev=1098233&r1=1098232&r2=1098233&view=diff
==============================================================================
--- 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala
 (original)
+++ 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/Preamble.scala
 Sun May  1 09:41:21 2011
@@ -24,5 +24,6 @@ trait Preamble {
 
   implicit def exchangeWrapper(exchange: Exchange) = new RichExchange(exchange)
   implicit def enrichInt(int: Int) = new RichInt(int)
+  implicit def int2Period(value: Int) = new SimplePeriod(value)
 
 }

Modified: 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/RichInt.scala
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/RichInt.scala?rev=1098233&r1=1098232&r2=1098233&view=diff
==============================================================================
--- 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/RichInt.scala
 (original)
+++ 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/RichInt.scala
 Sun May  1 09:41:21 2011
@@ -21,10 +21,6 @@ package org.apache.camel.scala
  */
 class RichInt(val int: Int) {
 
-  def ms = new Period(int)
-
-  def seconds = new Period(int).seconds
-  
-  def per(period: Int) = new Frequency(int, new Period(period))
+  def per(period: Period) = new Frequency(int, period)
 
 }

Modified: 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayDefinition.scala
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayDefinition.scala?rev=1098233&r1=1098232&r2=1098233&view=diff
==============================================================================
--- 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayDefinition.scala
 (original)
+++ 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SDelayDefinition.scala
 Sun May  1 09:41:21 2011
@@ -16,9 +16,7 @@
  */
 package org.apache.camel.scala.dsl;
 
-import org.apache.camel.builder.ExpressionBuilder
 import org.apache.camel.model.DelayDefinition
-import org.apache.camel.model.language.ExpressionDefinition
 import org.apache.camel.scala.dsl.builder.RouteBuilder
 
 /**
@@ -26,22 +24,4 @@ import org.apache.camel.scala.dsl.builde
  */
 case class SDelayDefinition(override val target: DelayDefinition)(implicit val 
builder: RouteBuilder) extends SAbstractDefinition[DelayDefinition] {
  
-  def ms = this
-  def milliseconds = ms
-    
-  def sec = {
-    valueInMs *= 1000
-    this
-  }
-  def seconds = sec
-  
-  def min = {
-    valueInMs *= (60 * 1000)
-    this
-  }
-  def minutes = min
-
-  // we need this to match the valueInMs_= for now, can be removed once Scala 
2.8.0 is out
-  def valueInMs : Long = 0
-  def valueInMs_=(period: Long) = target.delay(period)
 }

Modified: 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottleDefinition.scala
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottleDefinition.scala?rev=1098233&r1=1098232&r2=1098233&view=diff
==============================================================================
--- 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottleDefinition.scala
 (original)
+++ 
camel/trunk/components/camel-scala/src/main/scala/org/apache/camel/scala/dsl/SThrottleDefinition.scala
 Sun May  1 09:41:21 2011
@@ -24,29 +24,4 @@ import org.apache.camel.scala.dsl.builde
  */
 case class SThrottleDefinition(override val target: 
ThrottleDefinition)(implicit val builder: RouteBuilder) extends 
SAbstractDefinition[ThrottleDefinition] {
  
-  /**
-   * Time period in milliseconds
-   */
-  def per(period: Long) = {
-    target.setTimePeriodMillis(period)
-    this
-  }
-  
-  def ms = this
-  def milliseconds = ms
-    
-  def sec = {
-    valueInMs = valueInMs.longValue * 1000
-    this
-  }
-  def seconds = sec
-  
-  def min = {
-    valueInMs = valueInMs.longValue * (60 * 1000)
-    this
-  }
-  def minutes = min
-
-  def valueInMs = target.getTimePeriodMillis()
-  def valueInMs_=(period: Long) = target.setTimePeriodMillis(period)
 }

Modified: 
camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala?rev=1098233&r1=1098232&r2=1098233&view=diff
==============================================================================
--- 
camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala
 (original)
+++ 
camel/trunk/components/camel-scala/src/test/scala/org/apache/camel/scala/dsl/ThrottlerTest.scala
 Sun May  1 09:41:21 2011
@@ -17,7 +17,6 @@
 package org.apache.camel
 package scala.dsl
  
-import org.w3c.dom.Document
 import builder.RouteBuilder
 
 /**
@@ -25,17 +24,17 @@ import builder.RouteBuilder
  */
 class ThrottlerTest extends ScalaTestSupport {
   
-  def testSimpleTrottler = {
+  def testSimpleThrottler = {
     "mock:a" expect { _.count = 3 } 
-    "mock:a" expect { _.setResultWaitTime(1000) }  
+    "mock:a" expect { _.setResultWaitTime(1000) }
     for (id <- 1 to 6) "seda:a" ! id   
     "mock:a" assert()
   }
   
-  def testBlockTrottler = {
+  def testBlockThrottler = {
     "mock:b" expect { _.count = 6 }
     "mock:c" expect { _.count = 3 } 
-    "mock:c" expect { _.setResultWaitTime(1000) }  
+    "mock:c" expect { _.setResultWaitTime(1000) }
     for (id <- 1 to 6) "seda:b" ! id   
     "mock:b" assert()
   }
@@ -43,13 +42,13 @@ class ThrottlerTest extends ScalaTestSup
   val builder =
     new RouteBuilder {
        //START SNIPPET: simple
-       "seda:a" throttle (3 per 2 seconds) to ("mock:a")
+       "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) {
+         throttle (3 per (2 seconds)) {
            to ("mock:c")
          }
        }


Reply via email to