001    package railo.runtime.type.dt;
002    
003    import railo.runtime.PageContext;
004    import railo.runtime.dump.DumpData;
005    import railo.runtime.dump.DumpProperties;
006    import railo.runtime.dump.DumpTable;
007    import railo.runtime.dump.DumpTablePro;
008    import railo.runtime.dump.SimpleDumpData;
009    import railo.runtime.exp.ExpressionException;
010    import railo.runtime.exp.PageException;
011    import railo.runtime.op.Caster;
012    import railo.runtime.op.Operator;
013    
014    /**
015     * TimeSpan Object, represent a timespan
016     */
017    public final class TimeSpanImpl implements TimeSpan {
018    
019            private double value;
020            private long valueMillis;
021            
022            private int day;
023            private int hour;
024            private int minute;
025            private int second;
026            private int milli;
027            
028    
029            public static TimeSpan fromDays(double value){
030                    return new TimeSpanImpl(value);
031            }
032            public static TimeSpan fromMillis(long value){
033                    return new TimeSpanImpl(value);
034            }
035    
036        private TimeSpanImpl(double valueDays) {
037            this((long)(valueDays*86400000D));
038        }
039            
040        private TimeSpanImpl(long valueMillis) {
041            value=valueMillis/86400000D;
042            long tmp=valueMillis;
043            day=(int) (valueMillis/86400000L);
044                    tmp-=day*86400000;
045                    hour=(int) (tmp/3600000);
046                    tmp-=hour*3600000;
047                    minute=(int) (tmp/60000);
048                    tmp-=minute*60000;
049                    second=(int) (tmp/1000);
050                    tmp-=second*1000;
051                    milli=(int) tmp;
052                    
053                    this.valueMillis=valueMillis;
054                    /*day=(int)value;
055                    double diff=value-day;
056                    diff*=24;
057                    hour=(int)diff;
058                    diff=diff-hour;
059                    diff*=60;
060                    minute=(int)diff;
061                    diff=diff-minute;
062                    diff*=60;
063                    second=(int)diff;
064                    this.value=value;
065                    milli=(int)(valueMillis-((second+(minute*60L)+(hour*3600L)+(day*3600L*24L))*1000));
066                    */
067                    //print.out("a("+hashCode()+"):"+day+":"+hour+":"+minute+":"+second+"+"+milli);
068                    
069                    
070                    //total=(second+(minute*60L)+(hour*3600L)+(day*3600L*24L))*1000;
071                    //total=(second+(minute*60L)+(hour*3600L)+(day*3600L*24L))*1000;
072                    
073        }
074                    
075            /**
076             * constructor of the timespan class
077             * @param day
078             * @param hour
079             * @param minute
080             * @param second
081             */
082            public TimeSpanImpl(int day, int hour, int minute, int second) {
083                    
084                    this.day=day;
085                    this.hour=hour;
086                    this.minute=minute;
087                    this.second=second;
088                    value=day+(((double)hour)/24)+(((double)minute)/24/60)+(((double)second)/24/60/60);
089                    valueMillis=(second+(minute*60L)+(hour*3600L)+(day*3600L*24L))*1000;
090            }
091            
092            /**
093             * constructor of the timespan class
094             * @param day
095             * @param hour
096             * @param minute
097             * @param second
098             */
099            public TimeSpanImpl(int day, int hour, int minute, int second, int millisecond) {
100                    this.day=day;
101                    this.hour=hour;
102                    this.minute=minute;
103                    this.second=second;
104                    this.milli=millisecond;
105                    value=day+(((double)hour)/24)+(((double)minute)/24/60)+(((double)second)/24/60/60)+(((double)millisecond)/24/60/60/1000);
106                    valueMillis=((second+(minute*60L)+(hour*3600L)+(day*3600L*24L))*1000)+millisecond;
107            }
108            
109        /**
110             * @see railo.runtime.op.Castable#castToString()
111             */
112            public String castToString() {
113                    return Caster.toString(value);
114            }
115    
116            /**
117             * @see railo.runtime.op.Castable#castToString(java.lang.String)
118             */
119            public String castToString(String defaultValue) {
120                    return Caster.toString(value);
121            }
122    
123            /**
124             * @see railo.runtime.op.Castable#castToBooleanValue()
125             */
126            public boolean castToBooleanValue() throws ExpressionException {
127                    throw new ExpressionException("can't cast Timespan to boolean");
128            }
129        
130        /**
131         * @see railo.runtime.op.Castable#castToBoolean(java.lang.Boolean)
132         */
133        public Boolean castToBoolean(Boolean defaultValue) {
134            return defaultValue;
135        }
136    
137            /**
138             * @see railo.runtime.op.Castable#castToDoubleValue()
139             */
140            public double castToDoubleValue() {
141                    return value;
142            }
143        
144        /**
145         * @see railo.runtime.op.Castable#castToDoubleValue(double)
146         */
147        public double castToDoubleValue(double defaultValue) {
148            return value;
149        }
150    
151            /**
152             * @see railo.runtime.op.Castable#castToDateTime()
153             */
154            public DateTime castToDateTime() throws ExpressionException {
155                    throw new ExpressionException("can't cast Timespan to date");
156            }
157        
158        /**
159         * @see railo.runtime.op.Castable#castToDateTime(railo.runtime.type.dt.DateTime)
160         */
161        public DateTime castToDateTime(DateTime defaultValue) {
162            return defaultValue;
163        }
164    
165    
166            /**
167             * @see railo.runtime.op.Castable#compare(boolean)
168             */
169            public int compareTo(boolean b) {
170                    return Operator.compare(value, b?1D:0D);
171            }
172    
173            /**
174             * @see railo.runtime.op.Castable#compareTo(railo.runtime.type.dt.DateTime)
175             */
176            public int compareTo(DateTime dt) throws PageException {
177                    return Operator.compare(value, dt.castToDoubleValue());
178            }
179    
180            /**
181             * @see railo.runtime.op.Castable#compareTo(double)
182             */
183            public int compareTo(double d) throws PageException {
184                    return Operator.compare(value, d);
185            }
186    
187            /**
188             * @see railo.runtime.op.Castable#compareTo(java.lang.String)
189             */
190            public int compareTo(String str) throws PageException {
191                    return Operator.compare(value, str);
192            }
193    
194            /**
195             * @see railo.runtime.dump.Dumpable#toDumpData(railo.runtime.PageContext, int)
196             */
197            public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) {
198                    DumpTable table=new DumpTablePro("timespan","#ff9900","#ffcc00","#000000");
199                    if(milli>0)table.appendRow(1, new SimpleDumpData("Timespan"), new SimpleDumpData("createTimeSpan("+day+","+hour+","+minute+","+second+","+milli+")"));
200                    else table.appendRow(1, new SimpleDumpData("Timespan"), new SimpleDumpData("createTimeSpan("+day+","+hour+","+minute+","+second+")"));
201                    
202                    
203                    
204                    return table;
205            }
206            /**
207         * @see railo.runtime.type.dt.TimeSpan#getMillis()
208         */
209            public long getMillis() {
210                    return valueMillis;
211            }
212            public long getMilli() {
213                    return milli;
214            }
215            
216            /**
217         * @see railo.runtime.type.dt.TimeSpan#getSeconds()
218         */
219            public long getSeconds() {
220                    return valueMillis/1000;
221            }
222            
223            /**
224             * @see java.lang.Object#toString()
225             */
226            public String toString() {
227                    if(milli>0)
228                            return "createTimeSpan("+day+","+hour+","+minute+","+second+","+milli+")";
229                    return "createTimeSpan("+day+","+hour+","+minute+","+second+")";
230            }
231    
232        /**
233         * @see railo.runtime.type.dt.TimeSpan#getDay()
234         */
235        public int getDay() {
236            return day;
237        }
238        /**
239         * @see railo.runtime.type.dt.TimeSpan#getHour()
240         */
241        public int getHour() {
242            return hour;
243        }
244        /**
245         * @see railo.runtime.type.dt.TimeSpan#getMinute()
246         */
247        public int getMinute() {
248            return minute;
249        }
250        /**
251         * @see railo.runtime.type.dt.TimeSpan#getSecond()
252         */
253        public int getSecond() {
254            return second;
255        }
256    }