2 * Copyright 2011-2012 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
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.
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.
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.
36 package gr.grnet.aquarium.charging
38 import gr.grnet.aquarium.event.model.resource.ResourceEventModel
39 import gr.grnet.aquarium.AquariumInternalError
42 * An discrete charging behavior indicates that a resource should be charged directly
43 * at each resource state change, i.e. the charging is not dependent on
44 * the time the resource.
46 * Example oneoff resources might be individual charges applied to various
47 * actions (e.g. the fact that a user has created an account) or resources
48 * that should be charged per volume once (e.g. the allocation of a volume)
50 * @author Christos KK Loverdos <loverdos@gmail.com>
52 final class DiscreteChargingBehavior
53 extends ChargingBehavior(
54 ChargingBehaviorAliases.discrete,
55 Set(ChargingBehaviorNameInput, UnitPriceInput, CurrentValueInput)) {
57 def computeNewAccumulatingAmount(oldAmount: Double, newEventValue: Double, details: Map[String, String]): Double = {
58 oldAmount + newEventValue
61 def getResourceInstanceInitialAmount: Double = {
66 * This is called when we have the very first event for a particular resource instance, and we want to know
67 * if it is billable or not.
69 def isBillableFirstEvent(event: ResourceEventModel) = {
70 false // nope, we definitely need a previous one.
73 // FIXME: Check semantics of this. I just put false until thorough study
74 def mustGenerateDummyFirstEvent = false
76 def supportsImplicitEvents = {
80 def mustConstructImplicitEndEventFor(resourceEvent: ResourceEventModel) = {
84 def constructImplicitEndEventFor(resourceEvent: ResourceEventModel, occurredMillis: Long) = {
85 throw new AquariumInternalError("constructImplicitEndEventFor() Not compliant with %s".format(this))
89 object DiscreteChargingBehavior {
90 private[this] final val TheOne = new DiscreteChargingBehavior
92 def apply(): DiscreteChargingBehavior = TheOne