Fix json representation of numbers in the default policy
[aquarium] / src / main / scala / gr / grnet / aquarium / policy / EffectiveUnitPrice.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.policy
37
38 import gr.grnet.aquarium.logic.accounting.dsl.Timeslot
39 import collection.mutable
40
41 /**
42  *
43  * @author Christos KK Loverdos <loverdos@gmail.com>
44  * @author Prodromos Gerakios <pgerakios@grnet.gr>
45  */
46
47 case class EffectiveUnitPrice(unitPrice: Double, when: Option[(CronSpec,CronSpec)] = None) {
48
49   /* Split a timeslot T into two *sets* S and S2 consisting of timeslots such that
50    *  (a) each element in S1,S2 is contained in T
51    *  (b) for all x in S1 and y in S2 there is no overlap between x and y.
52    *  (c) the union of all x in S1 and y S2 is T
53    *  (d) the elements of S1 satisfy the cron spec ``when''
54    *  (e) the elements of S2 do NOT satisfy the cron spec ``when''
55    */
56   def splitTimeslot(t:Timeslot) : (List[Timeslot],List[Timeslot])=
57      when match {
58        case None =>
59          (List(t),Nil)
60        case Some((start,end)) =>
61          val result = new mutable.ListBuffer[Timeslot]()
62          var offset = t.from
63          while(start.nextValidDate(t,offset) match {
64            case None =>
65              false
66            case Some(d_start) =>
67              end.nextValidDate(t,d_start) match {
68                case None =>
69                  result += Timeslot(d_start,t.to)
70                  false
71                case Some(d_end) =>
72                  result += Timeslot(d_start,d_end)
73                  offset = d_end
74                  d_end.before(t.to)
75              }
76          }) ()
77          val l = result.toList
78          val l1 = Timeslot mergeOverlaps l
79          val l2 = t nonOverlappingTimeslots l1
80          val l3 = Timeslot mergeOverlaps l2
81          (l1,l3)
82      }
83
84   private def stringOfStartCron = when match {
85     case None => "? ? ? ? ?"
86     case Some((s,_)) => s.toString
87   }
88   private def stringOfEndCron = when match {
89     case None => "? ? ? ? ?"
90     case Some((_,s)) => s.toString
91   }
92   override def toString : String = "EffectiveUnitPrice(%f,%s,%s)".
93                           format(unitPrice,stringOfStartCron,stringOfEndCron)
94  }