WIP event handling
[aquarium] / src / main / scala / gr / grnet / aquarium / computation / data / IMStateSnapshot.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.computation.data
37
38 import gr.grnet.aquarium.event.model.im.IMEventModel
39 import gr.grnet.aquarium.util.shortClassNameOf
40 import gr.grnet.aquarium.util.date.MutableDateCalc
41
42 /**
43  *
44  * @author Christos KK Loverdos <loverdos@gmail.com>
45  */
46
47 case class IMStateSnapshot(
48                            /**
49                             * This is the latest processed IMEvent
50                             */
51                            latestIMEvent: IMEventModel,
52
53                            /**
54                             * The earliest activation time, if it exists.
55                             */
56                            userActivationMillis: Option[Long],
57
58                            /**
59                             * This is the recorded role history
60                             */
61                            roleHistory: RoleHistory) {
62
63   /**
64    * True iff the user has ever been activated even once.
65    */
66   def hasBeenActivated: Boolean = {
67     userActivationMillis.isDefined
68   }
69
70   def updateRoleHistoryWithEvent(imEvent: IMEventModel) = {
71     copy(
72       userActivationMillis = if(imEvent.isStateActive) Some(imEvent.occurredMillis) else this.userActivationMillis,
73       latestIMEvent = imEvent,
74       roleHistory   = this.roleHistory.updateWithRole(imEvent.role, imEvent.occurredMillis)
75     )
76   }
77
78   override def toString = {
79     "%s(\n!! %s\n!! %s\n!! %s)".format(
80       shortClassNameOf(this),
81       latestIMEvent,
82       userActivationMillis.map(new MutableDateCalc(_)),
83       roleHistory
84     )
85   }
86 }
87
88 object IMStateSnapshot {
89   def initial(imEvent: IMEventModel): IMStateSnapshot = {
90     IMStateSnapshot(
91       imEvent,
92       if(imEvent.isStateActive) Some(imEvent.occurredMillis) else None,
93       RoleHistory.initial(imEvent.role, imEvent.occurredMillis))
94   }
95 }