Changeset 366
- Timestamp:
- 04/12/06 12:03:31
- Files:
-
- trunk/calendar3/appcommon/src/org/bedework/appcommon/TimeView.java (modified) (7 diffs)
- trunk/calendar3/calFacade/src/org/bedework/calfacade/BwDateTime.java (modified) (2 diffs)
- trunk/calendar3/calFacade/src/org/bedework/calfacade/BwFreeBusy.java (modified) (3 diffs)
- trunk/calendar3/calFacade/src/org/bedework/calfacade/CalFacadeUtil.java (modified) (2 diffs)
- trunk/calendar3/caldav/src/edu/rpi/cct/uwcal/caldav/calquery/FreeBusyQuery.java (modified) (1 diff)
- trunk/calendar3/calsvc/src/org/bedework/calsvc/CalSvc.java (modified) (6 diffs)
- trunk/calendar3/calsvci/src/org/bedework/calsvci/CalSvcI.java (modified) (3 diffs)
- trunk/calendar3/webclient/src/org/bedework/webclient/BwFreeBusyAction.java (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/calendar3/appcommon/src/org/bedework/appcommon/TimeView.java
r314 r366 107 107 */ 108 108 private TimeViewDailyInfo[] tvdis; 109 109 110 110 //private static final TimezoneCache tzcache = new TimezoneCache(false); 111 111 … … 162 162 return cal.getTimezones(); 163 163 } 164 164 165 165 /** 166 166 * @return CalSvcI … … 278 278 */ 279 279 public Collection getDaysEvents(MyCalendarVO date) throws Throwable { 280 ArrayList al = new ArrayList();281 280 CalTimezones tzcache = cal.getTimezones(); 282 // Dur oneDay = new Dur(1, 0, 0, 0);283 long millis = System.currentTimeMillis();284 285 //tzcache.setSysTimezones(cal.getTimezones());286 BwDateTime startDt = CalFacadeUtil.getDateTime(date.getDateDigits(),287 tzcache);288 289 BwDateTime endDt = startDt.getNextDay(tzcache);290 String start = startDt.getDate();291 String end = endDt.getDate();292 293 if (debug) {294 debugMsg("Did UTC stuff in " + (System.currentTimeMillis() - millis));295 }296 297 281 //if (debug) { 298 282 // debugMsg("Get days events in range " + start + " to " + end); … … 307 291 } 308 292 293 ArrayList al = new ArrayList(); 294 // Dur oneDay = new Dur(1, 0, 0, 0); 295 long millis = System.currentTimeMillis(); 296 297 //tzcache.setSysTimezones(cal.getTimezones()); 298 BwDateTime startDt = CalFacadeUtil.getDateTime(date.getDateDigits(), 299 tzcache); 300 301 BwDateTime endDt = startDt.getNextDay(tzcache); 302 String start = startDt.getDate(); 303 String end = endDt.getDate(); 304 305 if (debug) { 306 debugMsg("Did UTC stuff in " + (System.currentTimeMillis() - millis)); 307 } 308 309 309 Iterator it = events.iterator(); 310 310 while (it.hasNext()) { … … 319 319 2. ((evStart >= :start) and (evStart < :end)) or 320 320 3. ((evEnd > :start) and (evEnd <= :end))) 321 321 322 322 XXX followed caldav which might be wrong. Try 323 323 3. ((evEnd > :start) and (evEnd < :end))) … … 440 440 gtpi.multi = !gtpi.last.isSameDate(gtpi.first); 441 441 gtpi.currentDay = new MyCalendarVO(gtpi.first.getTime(), 442 calInfo.getLocale());442 calInfo.getLocale()); 443 443 gtpi.year = String.valueOf(gtpi.currentDay.getYear()); 444 444 445 445 Locale loc = Locale.getDefault(); // XXX Locale 446 446 gtpi.todaysMonth = new MyCalendarVO( // XXX Expensive?? 447 new Date(System.currentTimeMillis()), 447 new Date(System.currentTimeMillis()), 448 448 loc).getTwoDigitMonth(); 449 449 … … 451 451 debugMsg("getFirstDayOfWeek() = " + getFirstDayOfWeek()); 452 452 debugMsg("gtpi.first.getFirstDayOfWeek() = " + 453 calInfo.getFirstDayOfWeek());453 calInfo.getFirstDayOfWeek()); 454 454 } 455 455 trunk/calendar3/calFacade/src/org/bedework/calfacade/BwDateTime.java
r172 r366 97 97 * complications to dates, the end date is specified as non-inclusive 98 98 * but there are a number of boundary problems to watch out for. 99 * 99 * 100 100 * <p>For date only values this field has a zero time appended so that simple 101 101 * string comparisons will work. … … 206 206 } 207 207 208 public BwDateTime copy(CalTimezones timezones) throws CalFacadeException { 209 return makeDateTime(makeDtEnd(), timezones); 210 } 211 208 212 /** Make a DtStart from this object 209 213 * trunk/calendar3/calFacade/src/org/bedework/calfacade/BwFreeBusy.java
r2 r366 55 55 56 56 import java.io.Serializable; 57 import java.util.ArrayList; 57 58 import java.util.Collection; 58 59 import java.util.Iterator; 59 import java.util.Vector;60 60 61 61 /** Class representing free busy time. Used in icalendar objects … … 74 74 /** Collection of FreeBusyComponentVO 75 75 */ 76 private Vectortimes;76 private Collection times; 77 77 78 78 /** Constructor … … 139 139 /** Get the free busy times 140 140 * 141 * @return Collection of FreeBusyComponentVO141 * @return Collection of BwFreeBusyComponent 142 142 */ 143 143 public Collection getTimes() { 144 144 if (times == null) { 145 times = new Vector();145 times = new ArrayList(); 146 146 } 147 147 return times; trunk/calendar3/calFacade/src/org/bedework/calfacade/CalFacadeUtil.java
r273 r366 55 55 56 56 import org.bedework.calfacade.ifs.CalTimezones; 57 import org.bedework.calfacade.svc.EventInfo; 57 58 58 59 import net.fortuna.ical4j.model.Parameter; … … 607 608 return tzid; 608 609 } 610 611 /** This class defines the events and the period of interest and can be passed 612 * repeatedly to getPeriodsEvents. 613 * 614 * <p>The end datetime will be updated ready for the next call. If endDt is 615 * non-null on entry it will be used to set the startDt. 616 */ 617 public static class GetPeriodsPars { 618 /** Event Info objects to extract from */ 619 public Collection events; 620 /* Start of period - updated at each call from endDt */ 621 public BwDateTime startDt; 622 /** Duration of period */ 623 public BwDuration dur; 624 /** */ 625 public CalTimezones tzcache; 626 627 /** On return has the end date of the period. */ 628 public BwDateTime endDt; 629 } 630 631 /** Select the events in the collection which fall within the period 632 * defined by the start and duration. 633 * 634 * @param pars GetPeriodsPars object 635 * @return Collection of EventInfo being one days events or empty for no events. 636 * @throws Throwable 637 */ 638 public static Collection getPeriodsEvents(GetPeriodsPars pars) throws CalFacadeException { 639 ArrayList al = new ArrayList(); 640 //long millis = System.currentTimeMillis(); 641 642 if (pars.endDt != null) { 643 pars.startDt = pars.endDt.copy(pars.tzcache); 644 } 645 pars.endDt = pars.startDt.addDuration(pars.dur, pars.tzcache); 646 String start = pars.startDt.getDate(); 647 String end = pars.endDt.getDate(); 648 649 //if (debug) { 650 // debugMsg("Did UTC stuff in " + (System.currentTimeMillis() - millis)); 651 //} 652 653 Iterator it = pars.events.iterator(); 654 while (it.hasNext()) { 655 EventInfo ei = (EventInfo)it.next(); 656 BwEvent ev = ei.getEvent(); 657 658 String evStart = ev.getDtstart().getDate(); 659 String evEnd = ev.getDtend().getDate(); 660 661 /* Event is within range if: 662 1. (((evStart <= :start) and (evEnd > :start)) or 663 2. ((evStart >= :start) and (evStart < :end)) or 664 3. ((evEnd > :start) and (evEnd <= :end))) 665 666 XXX followed caldav which might be wrong. Try 667 3. ((evEnd > :start) and (evEnd < :end))) 668 */ 669 670 int evstSt = evStart.compareTo(start); 671 int evendSt = evEnd.compareTo(start); 672 673 //debugMsg(" event " + evStart + " to " + evEnd); 674 675 if (((evstSt <= 0) && (evendSt > 0)) || 676 ((evstSt >= 0) && (evStart.compareTo(end) < 0)) || 677 //((evendSt > 0) && (evEnd.compareTo(end) <= 0))) { 678 ((evendSt > 0) && (evEnd.compareTo(end) < 0))) { 679 // Passed the tests. 680 /* 681 if (debug) { 682 debugMsg("Event passed range " + start + "-" + end + 683 " with dates " + evStart + "-" + evEnd + 684 ": " + ev.getSummary()); 685 }*/ 686 al.add(ei); 687 } 688 } 689 690 return al; 691 } 609 692 } 610 693 trunk/calendar3/caldav/src/edu/rpi/cct/uwcal/caldav/calquery/FreeBusyQuery.java
r310 r366 147 147 try { 148 148 BwFreeBusy fb = svci.getFreeBusy(null, new BwUser(user), 149 tr.getStart(), tr.getEnd() );149 tr.getStart(), tr.getEnd(), null); 150 150 151 151 if (debug) { trunk/calendar3/calsvc/src/org/bedework/calsvc/CalSvc.java
r365 r366 56 56 57 57 import org.bedework.calenv.CalEnv; 58 import org.bedework.calfacade.CalFacadeUtil.GetPeriodsPars; 58 59 import org.bedework.calfacade.base.BwOwnedDbentity; 59 60 import org.bedework.calfacade.base.BwShareableDbentity; … … 62 63 import org.bedework.calfacade.BwCategory; 63 64 import org.bedework.calfacade.BwDateTime; 65 import org.bedework.calfacade.BwDuration; 64 66 import org.bedework.calfacade.BwEvent; 65 67 import org.bedework.calfacade.BwEventAlarm; … … 1012 1014 1013 1015 public BwFreeBusy getFreeBusy(BwCalendar cal, BwPrincipal who, 1014 BwDateTime start, BwDateTime end) 1016 BwDateTime start, BwDateTime end, 1017 BwDuration granularity) 1015 1018 throws CalFacadeException { 1016 1019 if (!(who instanceof BwUser)) { … … 1031 1034 subs = new ArrayList(); 1032 1035 subs.add(sub); 1033 } else if ( !currentUser().equals(who)) {1036 } else if (currentUser().equals(who)) { 1034 1037 subs = getSubscriptions(); 1035 1038 } else { … … 1038 1041 1039 1042 BwFreeBusy fb = new BwFreeBusy(who, start, end); 1043 Collection events = new TreeSet(); 1040 1044 1041 1045 Iterator subit = subs.iterator(); … … 1050 1054 CalFacadeDefs.retrieveRecurExpanded); 1051 1055 1052 try { 1053 /* For the moment just build a single FreeBusyComponentVO 1056 // Filter out transparent events 1057 Iterator it = evs.iterator(); 1058 1059 while (it.hasNext()) { 1060 EventInfo ei = (EventInfo)it.next(); 1061 BwEvent ev = ei.getEvent(); 1062 1063 // XXX Need to add sub.ignoreTransparency 1064 if (BwEvent.transparencyTransparent.equals(ev.getTransparency())) { 1065 continue; 1066 } 1067 1068 events.add(ei); 1069 } 1070 } 1071 1072 try { 1073 if (granularity != null) { 1074 // chunked. 1075 GetPeriodsPars gpp = new GetPeriodsPars(); 1076 1077 gpp.events = events; 1078 gpp.startDt = start; 1079 gpp.dur = granularity; 1080 gpp.tzcache = getTimezones(); 1081 1082 /* For the moment just build a single BwFreeBusyComponent 1054 1083 */ 1055 1084 BwFreeBusyComponent fbc = new BwFreeBusyComponent(); 1056 1085 1057 Iterator it = evs.iterator(); 1058 1059 TreeSet eventPeriods = new TreeSet(); 1060 1061 while (it.hasNext()) { 1062 EventInfo ei = (EventInfo)it.next(); 1063 BwEvent ev = ei.getEvent(); 1064 1065 // XXX Need to add sub.ignoreTransparency 1066 if (BwEvent.transparencyTransparent.equals(ev.getTransparency())) { 1067 continue; 1086 int limit = 10000; // XXX do this better 1087 while (gpp.startDt.before(end)) { 1088 if (debug) { 1089 trace("gpp.startDt=" + gpp.startDt + " end=" + end); 1068 1090 } 1069 1070 // Ignore if times were specified and this event is outside the times 1071 1072 BwDateTime estart = ev.getDtstart(); 1073 BwDateTime eend = ev.getDtend(); 1074 1075 /* Don't report out of the requested period */ 1076 1077 String dstart; 1078 String dend; 1079 1080 if (estart.before(start)) { 1081 dstart = start.getDtval(); 1082 } else { 1083 dstart = estart.getDtval(); 1091 if (limit < 0) { 1092 throw new CalFacadeException("org.bedework.svci.limit.exceeded"); 1084 1093 } 1085 1086 if (eend.after(end)) { 1087 dend = end.getDtval(); 1088 } else { 1089 dend = eend.getDtval(); 1094 limit--; 1095 1096 Collection periodEvents = CalFacadeUtil.getPeriodsEvents(gpp); 1097 1098 if (periodEvents.size() != 0) { 1099 // Some events fall in the period. Add an entry. 1100 1101 fbc.addPeriod(new Period(new DateTime(gpp.startDt.getDtval()), 1102 new DateTime(gpp.endDt.getDtval()))); 1090 1103 } 1091 1092 eventPeriods.add(new EventPeriod(new DateTime(dstart),1093 new DateTime(dend)));1094 1104 } 1095 1096 /* iterate through the sorted periods combining them where they are 1097 adjacent or overlap */ 1098 1099 Period p = null; 1100 1101 it = eventPeriods.iterator(); 1102 while (it.hasNext()) { 1103 EventPeriod ep = (EventPeriod)it.next(); 1104 1105 if (p == null) { 1106 p = new Period(ep.start, ep.end); 1107 } else if (ep.start.after(p.getEnd())) { 1108 // Non adjacent periods 1109 fbc.addPeriod(p); 1110 p = new Period(ep.start, ep.end); 1111 } else if (ep.end.after(p.getEnd())) { 1112 // Extend the current period 1113 p = new Period(p.getStart(), ep.end); 1114 } // else it falls within the existing period 1105 fb.addTime(fbc); 1106 1107 return fb; 1108 } 1109 1110 /* For the moment just build a single BwFreeBusyComponent 1111 */ 1112 BwFreeBusyComponent fbc = new BwFreeBusyComponent(); 1113 1114 Iterator it = events.iterator(); 1115 1116 TreeSet eventPeriods = new TreeSet(); 1117 1118 while (it.hasNext()) { 1119 EventInfo ei = (EventInfo)it.next(); 1120 BwEvent ev = ei.getEvent(); 1121 1122 // Ignore if times were specified and this event is outside the times 1123 1124 BwDateTime estart = ev.getDtstart(); 1125 BwDateTime eend = ev.getDtend(); 1126 1127 /* Don't report out of the requested period */ 1128 1129 String dstart; 1130 String dend; 1131 1132 if (estart.before(start)) { 1133 dstart = start.getDtval(); 1134 } else { 1135 dstart = estart.getDtval(); 1115 1136 } 1116 1137 1117 if (p != null) { 1138 if (eend.after(end)) { 1139 dend = end.getDtval(); 1140 } else { 1141 dend = eend.getDtval(); 1142 } 1143 1144 eventPeriods.add(new EventPeriod(new DateTime(dstart), 1145 new DateTime(dend))); 1146 } 1147 1148 /* iterate through the sorted periods combining them where they are 1149 adjacent or overlap */ 1150 1151 Period p = null; 1152 1153 it = eventPeriods.iterator(); 1154 while (it.hasNext()) { 1155 EventPeriod ep = (EventPeriod)it.next(); 1156 1157 if (p == null) { 1158 p = new Period(ep.start, ep.end); 1159 } else if (ep.start.after(p.getEnd())) { 1160 // Non adjacent periods 1118 1161 fbc.addPeriod(p); 1119 } 1120 1121 fb.addTime(fbc); 1122 } catch (Throwable t) { 1123 throw new CalFacadeException(t); 1124 } 1162 p = new Period(ep.start, ep.end); 1163 } else if (ep.end.after(p.getEnd())) { 1164 // Extend the current period 1165 p = new Period(p.getStart(), ep.end); 1166 } // else it falls within the existing period 1167 } 1168 1169 if (p != null) { 1170 fbc.addPeriod(p); 1171 } 1172 1173 fb.addTime(fbc); 1174 } catch (Throwable t) { 1175 throw new CalFacadeException(t); 1125 1176 } 1126 1177 trunk/calendar3/calsvci/src/org/bedework/calsvci/CalSvcI.java
r356 r366 59 59 import org.bedework.calfacade.BwCategory; 60 60 import org.bedework.calfacade.BwDateTime; 61 import org.bedework.calfacade.BwDuration; 61 62 import org.bedework.calfacade.BwEvent; 62 63 import org.bedework.calfacade.BwEventAlarm; … … 796 797 * ==================================================================== */ 797 798 798 /** Get the free busy for the given principal. 799 /** Get the free busy for the given principal. A granularity of null results 800 * in a list of busy periods. Otherwise the start to end time is divided up 801 * into granularity sized chunks which will only be reported if one or more 802 * events fall in the segment. 799 803 * 800 804 * @param cal Calendar to provide free-busy for. Null for default … … 803 807 * @param start 804 808 * @param end 809 * @param granularity BwDuration object defining how to divide free/busy 810 * null for one big glob. or set to e.g. 1 hour for 811 * hourly chunks. 805 812 * @return BwFreeBusy 806 813 * @throws CalFacadeException 807 814 */ 808 815 public abstract BwFreeBusy getFreeBusy(BwCalendar cal, BwPrincipal who, 809 BwDateTime start, BwDateTime end) 816 BwDateTime start, BwDateTime end, 817 BwDuration granularity) 810 818 throws CalFacadeException; 811 819 trunk/calendar3/webclient/src/org/bedework/webclient/BwFreeBusyAction.java
r365 r366 57 57 //import org.bedework.calfacade.BwDateTime; 58 58 import org.bedework.appcommon.MyCalendarVO; 59 import org.bedework.calfacade.BwDuration; 59 60 import org.bedework.calfacade.BwFreeBusy; 60 import org.bedework.calfacade.BwFreeBusyComponent;61 61 import org.bedework.calfacade.BwUser; 62 62 import org.bedework.calfacade.CalFacadeUtil; … … 64 64 import org.bedework.calsvci.CalSvcI; 65 65 66 67 68 66 import java.util.Calendar; 69 67 import java.util.Date; 70 import java.util.Iterator;71 68 import javax.servlet.http.HttpServletRequest; 72 69 … … 128 125 } 129 126 130 int intunit = Calendar.HOUR;131 127 String intunitStr = getReqPar(request, "intunit"); 128 BwDuration dur = new BwDuration(); 132 129 133 130 if (intunitStr != null) { 134 131 if ("minutes".equals(intunitStr)) { 135 intunit = Calendar.MINUTE;132 dur.setMinutes(interval); 136 133 } else if ("hours".equals(intunitStr)) { 137 intunit = Calendar.HOUR;134 dur.setHours(interval); 138 135 } else if ("days".equals(intunitStr)) { 139 intunit = Calendar.DAY_OF_MONTH;136 dur.setDays(interval); 140 137 } else if ("weeks".equals(intunitStr)) { 141 intunit = Calendar.WEEK_OF_YEAR; 142 } else if ("months".equals(intunitStr)) { 143 intunit = Calendar.MONTH; 138 dur.setWeeks(interval); 144 139 } else { 145 140 form.getErr().emit("org.bedework.client.error.badintervalunit"); 146 141 return "error"; 147 142 } 143 } else { 144 dur.setHours(interval); 148 145 } 149 146 … … 151 148 CalTimezones tzs = svci.getTimezones(); 152 149 153 BwFreeBusy fb = null; 154 while (start.before(end)) { 155 Date sdt = start.getTime(); 156 start.add(intunit, interval); 150 Date sdt = start.getTime(); 151 Date edt = end.getTime(); 157 152 158 if (debug) { 159 debugMsg("getFreeBusy for start = " + sdt + 160 " end = " + start.getTime()); 161 } 162 BwFreeBusy fb1 = svci.getFreeBusy(null, user, 163 CalFacadeUtil.getDateTime(sdt, false, true, tzs), 164 CalFacadeUtil.getDateTime(start.getTime(), false, true, 165 tzs)); 166 167 if (fb == null) { 168 fb = fb1; 169 } else { 170 Iterator it = fb1.iterateTimes(); 171 while (it.hasNext()) { 172 BwFreeBusyComponent fbc = (BwFreeBusyComponent)it.next(); 173 174 if (!fbc.getEmpty()) { 175 fb.addTime(fbc); 176 } 177 } 178 } 153 if (debug) { 154 debugMsg("getFreeBusy for start = " + sdt + 155 " end = " + edt); 179 156 } 180 181 fb.setEnd(CalFacadeUtil.getDateTime(end.getTime(), false, false, tzs)); 157 BwFreeBusy fb = svci.getFreeBusy(null, user, 158 CalFacadeUtil.getDateTime(sdt, false, false, tzs), 159 CalFacadeUtil.getDateTime(edt, false, false, tzs), 160 dur); 182 161 183 162 form.assignFreeBusy(fb);
