source: trunk/grails-app/domain/dbnp/studycapturing/Event.groovy @ 416

Last change on this file since 416 was 416, checked in by duh, 9 years ago
  • updated Events to handle constraints properly
  • updated event wizard
  • Property svn:keywords set to Date Author Rev
File size: 3.2 KB
Line 
1package dbnp.studycapturing
2
3import groovy.time.*
4
5/**
6 * The Event class describes an actual event, as it has happened to a certain subject. Often, the same event occurs
7 * to multiple subjects at the same time. That is why the actual description of the event is factored out into a more
8 * general EventDescription class. Events that also lead to sample(s) should be instantiated as SamplingEvents.
9 *
10 * Revision information:
11 * $Rev: 416 $
12 * $Author: duh $
13 * $Date: 2010-05-12 13:38:46 +0000 (wo, 12 mei 2010) $
14 */
15class Event extends TemplateEntity implements Serializable {
16        Date startTime
17        Date endTime
18
19        /**
20         * Constraints
21         */
22        static constraints = {
23                endTime(validator: { fields, obj, errors ->
24                        def error = false
25
26                        // endTime must be >= the startTime
27                        if ( fields && fields.compareTo(obj.startTime) < 0 ) {
28                                error = true
29                                errors.rejectValue(
30                                        'endTime',
31                                        'event.endTime.greaterThanStartTime',
32                                        ['endTime', fields] as Object[],
33                                        'End time should be greater than or equal to the Start Time'
34                                )
35                        }
36
37                        return (!error)
38                })
39        }
40
41        /**
42         * return the domain fields for this domain class
43         * @return List
44         */
45        List<TemplateField> giveDomainFields() {
46                [
47                        new TemplateField(
48                                name: 'startTime',
49                                type: TemplateFieldType.DATE),
50                        new TemplateField(
51                                name: 'endTime',
52                                type: TemplateFieldType.DATE)
53                ]
54        }
55
56        /**
57         * get the event duration
58         * @return Duration
59         */
60        static def getDuration(date1, date2) {
61                def timeMillis = (date2.getTime() - date1.getTime()).abs()
62                def days = (timeMillis / (1000 * 60 * 60 * 24)).toInteger()
63                def hours = (timeMillis / (1000 * 60 * 60)).toInteger()
64                def minutes = (timeMillis / (1000 * 60)).toInteger()
65                def seconds = (timeMillis / 1000).toInteger()
66                def millis = (timeMillis % 1000).toInteger()
67
68                return new Duration(days, hours, minutes, seconds, millis)
69        }
70
71        def getDuration() {
72                return getDuration(startTime, endTime)
73        }
74
75        /**
76         * get a prettified duration
77         * @return String
78         */
79        static def getPrettyDuration(duration) {
80                def handleNumerus = {number, string ->
81                        return number.toString() + (number == 1 ? string : string + 's')
82                }
83                if (duration.getYears() > 0) return handleNumerus(duration.getYears(), " year")
84                if (duration.getMonths() > 0) return handleNumerus(duration.getMonths(), " month")
85                if (duration.getDays() > 0) return handleNumerus(duration.getDays(), " day")
86                if (duration.getHours() > 0) return handleNumerus(duration.getHours(), " hour")
87                if (duration.getMinutes() > 0) return handleNumerus(duration.getMinutes(), " minute")
88                return handleNumerus(duration.getSeconds(), " second")
89        }
90
91        def getPrettyDuration() {
92                getPrettyDuration(getDuration())
93        }
94
95        static def getPrettyDuration(date1, date2) {
96                return getPrettyDuration(getDuration(date1, date2))
97        }
98
99        def getDurationString() {
100                def d = getDuration()
101                return "${d.days} days, ${d.hours} hrs, ${d.minutes} min, ${d.seconds} sec."
102        }
103
104        def getShortDuration() {
105                def d = getDuration()
106                def days = d.days
107                def hours = d.hours - (24 * days)
108                def minutes = d.minutes - (24 * 60 * days) - (60 * hours)
109                return "${days}d ${hours}:${minutes}"
110        }
111
112        def isSamplingEvent() {
113                return (this instanceof SamplingEvent)
114        }
115
116        def String toString() {
117                return fieldExists('Description') ? getFieldValue('Description') : ""
118        }
119}
Note: See TracBrowser for help on using the repository browser.