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 }