b5fa6e25c973fa8c3e3e82e1b8d24d130a530033
[aquarium] / src / main / scala / gr / grnet / aquarium / logic / accounting / algorithm / SimpleExecutableChargingBehaviorAlgorithm$.scala
1 /*
2  * Copyright 2011-2012 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above
13  *      copyright notice, this list of conditions and the following
14  *      disclaimer in the documentation and/or other materials
15  *      provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * The views and conclusions contained in the software and
31  * documentation are those of the authors and should not be
32  * interpreted as representing official policies, either expressed
33  * or implied, of GRNET S.A.
34  */
35
36 package gr.grnet.aquarium.logic.accounting.algorithm
37
38
39 import com.ckkloverdos.maybe.Maybe
40 import gr.grnet.aquarium.logic.accounting.dsl._
41 import gr.grnet.aquarium.AquariumException
42 import gr.grnet.aquarium.charging.{CurrentValueInput, TimeDeltaInput, OldTotalAmountInput, UnitPriceInput, ChargingBehaviorNames, ChargingBehaviorNameInput, ChargingInput}
43
44 /**
45  * An executable charging algorithm with some simple implementation.
46  *
47  * @author Christos KK Loverdos <loverdos@gmail.com>
48  */
49 object SimpleExecutableChargingBehaviorAlgorithm extends ExecutableChargingBehaviorAlgorithm {
50
51   @inline private[this]
52   def hrs(millis: Double) = millis / 1000 / 60 / 60
53
54   def apply(vars: Map[ChargingInput, Any]): Double = {
55     vars.apply(ChargingBehaviorNameInput) match {
56       case ChargingBehaviorNames.continuous ⇒
57         val unitPrice = vars(UnitPriceInput).asInstanceOf[Double]
58         val oldTotalAmount = vars(OldTotalAmountInput).asInstanceOf[Double]
59         val timeDelta = vars(TimeDeltaInput).asInstanceOf[Double]
60
61         hrs(timeDelta) * oldTotalAmount * unitPrice
62
63       case ChargingBehaviorNames.discrete ⇒
64         val unitPrice = vars(UnitPriceInput).asInstanceOf[Double]
65         val currentValue = vars(CurrentValueInput).asInstanceOf[Double]
66
67         currentValue * unitPrice
68
69       case ChargingBehaviorNames.onoff ⇒
70         val unitPrice = vars(UnitPriceInput).asInstanceOf[Double]
71         val timeDelta = vars(TimeDeltaInput).asInstanceOf[Double]
72
73         hrs(timeDelta) * unitPrice
74
75       case ChargingBehaviorNames.once ⇒
76         val currentValue = vars(CurrentValueInput).asInstanceOf[Double]
77         currentValue
78
79       case name ⇒
80         throw new AquariumException("Unknown cost policy %s".format(name))
81     }
82   }
83
84   override def toString = "SimpleExecutableCostPolicyAlgorithm(%s)".format(
85     Map(
86       ChargingBehaviorNames.continuous -> "hrs(timeDelta) * oldTotalAmount * unitPrice",
87       ChargingBehaviorNames.discrete   -> "currentValue * unitPrice",
88       ChargingBehaviorNames.onoff      -> "hrs(timeDelta) * unitPrice",
89       ChargingBehaviorNames.once       -> "currentValue"))
90 }