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

Last change on this file since 384 was 384, checked in by keesvb, 11 years ago

FINALLY found a possible way to integrate the domain fields as TemplateFields?, see Event. Also added required attribute for template fields.

  • Property svn:keywords set to Date Author Rev
File size: 3.3 KB
RevLine 
[80]1package dbnp.studycapturing
2
[111]3import groovy.time.*
4
[84]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.
[209]9 *
10 * Revision information:
11 * $Rev: 384 $
12 * $Author: keesvb $
13 * $Date: 2010-04-27 07:13:47 +0000 (di, 27 apr 2010) $
[84]14 */
[345]15class Event extends TemplateEntity implements Serializable {
[80]16
[209]17        static constraints = {
[384]18                startTime(nullable: true)
19                endTime(nullable: true)
[209]20                endTime(validator: {val, obj ->
21           if (val && val.before(obj.startTime)) {
22                return 'endTimeshouldbegreater'
23           }
24        })
25        }
[384]26       
27        Date getStartTime() {
28                getFieldValue('Start time')
29        }
[111]30
[384]31        def setStartTime(Date value) {
32                if (value != null) {
33                        setFieldValue('Start time',value)
34                }
35                return this
36        }
37
38        Date getEndTime() {
39                getFieldValue('End time')
40        }
41
42        def setEndTime(Date value) {
43                if (value != null) {
44                        setFieldValue('End time',value)
45                }
46                return this
47        }
48
[375]49        Map giveDomainFields() {
50                return ['startTime':TemplateFieldType.DATE,'endTime':TemplateFieldType.DATE]
51        }
52
[197]53        // time diff between end and start date
54        // thus, do this manually as follows
[209]55
[384]56        static def getDuration(date1, date2) {
[197]57                def timeMillis = (date2.getTime() - date1.getTime()).abs()
[139]58                def days = (timeMillis / (1000 * 60 * 60 * 24)).toInteger()
59                def hours = (timeMillis / (1000 * 60 * 60)).toInteger()
60                def minutes = (timeMillis / (1000 * 60)).toInteger()
61                def seconds = (timeMillis / 1000).toInteger()
62                def millis = (timeMillis % 1000).toInteger()
[111]63
[139]64                return new Duration(days, hours, minutes, seconds, millis)
65        }
[111]66
[197]67        def getDuration() {
68                return getDuration(startTime, endTime)
69        }
70
71        // return a string that prints the duration sensibly.
72        // the largest date unit (sec, min, h, day, week, month, or year)
73        // is output
[209]74
[384]75        static def getPrettyDuration(duration) {
[209]76                def handleNumerus = {number, string ->
77                        return number.toString() + (number == 1 ? string : string + 's')
78                }
79                if (duration.getYears() > 0) return handleNumerus(duration.getYears(), " year")
80                if (duration.getMonths() > 0) return handleNumerus(duration.getMonths(), " month")
81                if (duration.getDays() > 0) return handleNumerus(duration.getDays(), " day")
82                if (duration.getHours() > 0) return handleNumerus(duration.getHours(), " hour")
83                if (duration.getMinutes() > 0) return handleNumerus(duration.getMinutes(), " minute")
84                return handleNumerus(duration.getSeconds(), " second")
[197]85        }
86
87        // convenience method. gives formatted string output for a duration
[167]88        def getPrettyDuration() {
[209]89                getPrettyDuration(getDuration())
[160]90        }
91
[197]92        // convenience method. gives formatted string output for a duration
[384]93        static def getPrettyDuration(date1, date2) {
[209]94                return getPrettyDuration(getDuration(date1, date2))
[197]95        }
96
[139]97        def getDurationString() {
98                def d = getDuration()
99                return "${d.days} days, ${d.hours} hrs, ${d.minutes} min, ${d.seconds} sec."
100        }
[111]101
[209]102        def getShortDuration() {
103                def d = getDuration()
104                def days = d.days
105                def hours = d.hours - (24 * days)
106                def minutes = d.minutes - (24 * 60 * days) - (60 * hours)
107                return "${days}d ${hours}:${minutes}"
108        }
[139]109
[160]110        def isSamplingEvent() {
[209]111                return (this instanceof SamplingEvent)
112        }
[197]113
[201]114        def String toString() {
[370]115                return fieldExists( 'Description' ) ? getFieldValue( 'Description') : ""
[201]116        }
[288]117
[111]118}
Note: See TracBrowser for help on using the repository browser.