Implement Continuous behavior with the new scheme
[aquarium] / src / main / scala / gr / grnet / aquarium / charging / ChargingBehavior.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.charging
37
38 import gr.grnet.aquarium.policy.{ResourceType, EffectivePriceTable, FullPriceTable}
39 import gr.grnet.aquarium.event.model.resource.ResourceEventModel
40 import gr.grnet.aquarium.logic.accounting.dsl.Timeslot
41 import gr.grnet.aquarium.Aquarium
42 import gr.grnet.aquarium.computation.BillingMonthInfo
43 import gr.grnet.aquarium.charging.state.{WorkingResourceInstanceChargingState, AgreementHistoryModel, WorkingResourcesChargingState}
44 import gr.grnet.aquarium.charging.wallet.WalletEntry
45 import scala.collection.mutable
46
47 /**
48  * A charging behavior indicates how charging for a resource will be done
49  * wrt the various states a resource instance can be in.
50  *
51  * @author Christos KK Loverdos <loverdos@gmail.com>
52  */
53
54 trait ChargingBehavior {
55   def selectorLabelsHierarchy: List[String]
56
57   /**
58    * Provides some initial charging details that will be part of the mutable charging state
59    * ([[gr.grnet.aquarium.charging.state.WorkingResourcesChargingState]]).
60    */
61   def initialChargingDetails: Map[String, Any]
62
63   def computeSelectorPath(
64       workingChargingBehaviorDetails: mutable.Map[String, Any],
65       workingResourceInstanceChargingState: WorkingResourceInstanceChargingState,
66       currentResourceEvent: ResourceEventModel,
67       referenceTimeslot: Timeslot,
68       totalCredits: Double
69   ): List[String]
70
71   def selectEffectivePriceTable(
72       fullPriceTable: FullPriceTable,
73       workingChargingBehaviorDetails: mutable.Map[String, Any],
74       workingResourceInstanceChargingState: WorkingResourceInstanceChargingState,
75       currentResourceEvent: ResourceEventModel,
76       referenceTimeslot: Timeslot,
77       totalCredits: Double
78   ): EffectivePriceTable
79
80   /**
81    *
82    * @return The number of wallet entries recorded and the credit difference generated during processing (these are
83    *         the credits to subtract from the total credits).
84    */
85   def processResourceEvent(
86       aquarium: Aquarium,
87       currentResourceEvent: ResourceEventModel,
88       resourceType: ResourceType,
89       billingMonthInfo: BillingMonthInfo,
90       workingResourcesChargingState: WorkingResourcesChargingState,
91       userAgreements: AgreementHistoryModel,
92       totalCredits: Double,
93       walletEntryRecorder: WalletEntry ⇒ Unit
94   ): (Int, Double)
95
96   def computeCreditsToSubtract(
97       workingResourceInstanceChargingState: WorkingResourceInstanceChargingState,
98       oldCredits: Double,
99       timeDeltaMillis: Long,
100       unitPrice: Double
101   ): (Double /* credits */, String /* explanation */)
102
103   /**
104    * Given the charging state of a resource instance and the details of the incoming message, compute the new
105    * accumulating amount.
106    */
107   def computeNewAccumulatingAmount(
108       workingResourceInstanceChargingState: WorkingResourceInstanceChargingState,
109       eventDetails: Map[String, String]
110   ): Double
111 }