WIP. Introduce credit distribution type, credit origin and credit amount
[aquarium] / logic / src / main / scala / gr / grnet / aquarium / logic / credits / model / CreditDistributionType.scala
1 package gr.grnet.aquarium.logic.credits.model
2
3 /**
4  * The credit distribution type representation.
5  *
6  * This dictates how credits are distributed at lower level structure parts, for example
7  * how a University distributes credits to its Departments.
8  *
9  * @author Christos KK Loverdos <loverdos@gmail.com>.
10  */
11 sealed trait CreditDistributionType {
12   def name: String
13   def value: Int
14
15   def isUnknown = false
16   def isFixed = isFixedAny || isFixedEqual
17   def isFixedAny = false
18   def isFixedEqual = false
19   def isOnDemandUnlimited = false
20   def isOnDemandMax = false
21 }
22
23 /**
24  *
25  * @author Christos KK Loverdos <loverdos@gmail.com>.
26  */
27 sealed abstract class CreditDistributionTypeSkeleton(_name: String,  _value: Int) extends CreditDistributionType {
28   def name = _name
29   def value = _value
30 }
31
32 /**
33  *
34  * @author Christos KK Loverdos <loverdos@gmail.com>.
35  */
36 case object FixedAnyCreditDistributionType
37   extends CreditDistributionTypeSkeleton(CreditDistributionType.Names.FixedAny, CreditDistributionType.Values.FixedEqual) {
38
39   override def isFixedAny = true
40 }
41
42 /**
43  *
44  * @author Christos KK Loverdos <loverdos@gmail.com>.
45  */
46 case object FixedEqualCreditDistributionType
47   extends CreditDistributionTypeSkeleton(CreditDistributionType.Names.FixedAny, CreditDistributionType.Values.FixedEqual) {
48
49   override def isFixedEqual = true
50 }
51
52 /**
53  *
54  * @author Christos KK Loverdos <loverdos@gmail.com>.
55  */
56 case object OnDemandUnlimitedCreditDistributionType
57   extends CreditDistributionTypeSkeleton(CreditDistributionType.Names.OnDemandUnlimited, CreditDistributionType.Values.OnDemandUnlimited) {
58
59   override def isOnDemandUnlimited = true
60 }
61
62 /**
63  *
64  * @author Christos KK Loverdos <loverdos@gmail.com>.
65  */
66 case object OnDemandMaxCreditDistributionType
67   extends CreditDistributionTypeSkeleton(CreditDistributionType.Names.OnDemandMax, CreditDistributionType.Values.OnDemandMax) {
68
69   override def isOnDemandMax = true
70 }
71
72 /**
73  *
74  * @author Christos KK Loverdos <loverdos@gmail.com>.
75  */
76 case class UnknownCreditDistributionType(reason: Option[String]) extends CreditDistributionTypeSkeleton(CreditDistributionType.Names.Unknown, CreditDistributionType.Values.Unknown) {
77   override def isUnknown = true
78 }
79
80 object CreditDistributionType {
81   object Values {
82     /**
83      * Credits are distributed (pushed) in fixed values and parts can be divided at will.
84      */
85     val FixedAny = 10
86
87     /**
88      * Credits are distributed (pushed) in fixed values and parts can be divided equally.
89      */
90     val FixedEqual = 20
91
92     /**
93      * Credits are distributed (pulled) on demand.
94      */
95     val OnDemandUnlimited = 30
96
97     /**
98      * Credits are distributed (pulled) on demand but up to a maximum value.
99      */
100     val OnDemandMax = 40
101
102     /**
103      * Error indicator
104      */
105     val Unknown = -1
106   }
107
108   object Names {
109     val FixedAny = "FixedAny"
110     val FixedEqual = "FixedEqual"
111     val OnDemandUnlimited = "OnDemandUnlimited"
112     val OnDemandMax = "OnDemandMax"
113     val Unknown = "Unknown"
114
115     val FixedAny_Lower = FixedAny.toLowerCase
116     val FixedEqual_Lower = FixedEqual.toLowerCase
117     val OnDemandUnlimited_Lower = OnDemandUnlimited.toLowerCase
118     val OnDemandMax_Lower = OnDemandMax.toLowerCase
119     val Unknown_Lower = Unknown.toLowerCase
120   }
121
122   def fromValue(value: Int): CreditDistributionType = {
123     value match {
124       case Values.FixedAny          => FixedAnyCreditDistributionType
125       case Values.FixedEqual        => FixedEqualCreditDistributionType
126       case Values.OnDemandUnlimited => OnDemandUnlimitedCreditDistributionType
127       case Values.OnDemandMax       => OnDemandMaxCreditDistributionType
128       case Values.Unknown           => UnknownCreditDistributionType(None)
129       case value                    => UnknownCreditDistributionType(Some("Bad value %s".format(value)))
130     }
131   }
132
133   def fromName(name: String): CreditDistributionType = {
134     name match {
135       case Names.FixedAny          => FixedAnyCreditDistributionType
136       case Names.FixedEqual        => FixedEqualCreditDistributionType
137       case Names.OnDemandUnlimited => OnDemandUnlimitedCreditDistributionType
138       case Names.OnDemandMax       => OnDemandMaxCreditDistributionType
139       case Names.Unknown           => UnknownCreditDistributionType(None)
140       case value                   => UnknownCreditDistributionType(Some("Bad value %s".format(value)))
141     }
142   }
143
144   def fromNameIgnoreCase(name: String): CreditDistributionType = {
145     name match {
146       case null => UnknownCreditDistributionType(Some("null name"))
147       case _    => name.toLowerCase match {
148         case Names.FixedAny_Lower          => FixedAnyCreditDistributionType
149         case Names.FixedEqual_Lower        => FixedEqualCreditDistributionType
150         case Names.OnDemandUnlimited_Lower => OnDemandUnlimitedCreditDistributionType
151         case Names.OnDemandMax_Lower       => OnDemandMaxCreditDistributionType
152         case Names.Unknown_Lower           => UnknownCreditDistributionType(None)
153         case value                         => UnknownCreditDistributionType(Some("Bad value %s".format(value)))
154       }
155     }
156   }
157 }