Search in sources :

Example 6 with DtStart

use of net.fortuna.ical4j.model.property.DtStart in project bw-calendar-engine by Bedework.

the class BwUpdates method validateDates.

private UpdateResult validateDates(final EventInfo ei) throws WebdavException {
    DatesState ds = (DatesState) state.get(DatesState.stateName);
    if (ds == null) {
        return UpdateResult.getOkResult();
    }
    BwEvent ev = ei.getEvent();
    boolean task = ev.getEntityType() == IcalDefs.entityTypeTodo;
    PropertyInfoIndex endPi;
    ChangeTable chg = ei.getChangeset(userHref);
    if (task) {
        endPi = PropertyInfoIndex.DUE;
    } else {
        endPi = PropertyInfoIndex.DTEND;
    }
    try {
        boolean scheduleReply = ev.getScheduleMethod() == ScheduleMethods.methodTypeReply;
        if (ds.start == null) {
            if (!scheduleReply && !task) {
                return new UpdateResult("org.bedework.error.nostartdate");
            }
            /* A todo can have no date and time. set start to now, end to
         * many years from now and the noStart flag.
         *
         * Such an entry has to appear only on the current day.
         */
            if (ds.end != null) {
                ds.start = ds.end;
            } else {
                Date now = new Date(new java.util.Date().getTime());
                DtStart dtStart = new DtStart(now);
                dtStart.getParameters().add(Value.DATE);
                ds.start = BwDateTime.makeBwDateTime(dtStart);
            }
            if (!ev.getNoStart() || !CalFacadeUtil.eqObjval(ev.getDtstart(), ds.start)) {
                chg.changed(PropertyInfoIndex.DTSTART, ev.getDtstart(), null);
                ev.setDtstart(ds.start);
                ev.setNoStart(true);
            }
        } else if (ev.getNoStart() || !ds.start.equals(ev.getDtstart())) {
            chg.changed(PropertyInfoIndex.DTSTART, ev.getDtstart(), ds.start);
            ev.setNoStart(false);
            ev.setDtstart(ds.start);
        }
        char endType = StartEndComponent.endTypeNone;
        if (ds.end != null) {
            if ((ev.getEndType() != StartEndComponent.endTypeDate) || !CalFacadeUtil.eqObjval(ev.getDtend(), ds.end)) {
                chg.changed(endPi, ev.getDtend(), ds.end);
                endType = StartEndComponent.endTypeDate;
                ev.setDtend(ds.end);
            }
        } else if (scheduleReply || task) {
            // about 10 years
            Dur years = new Dur(520);
            Date now = new Date(new java.util.Date().getTime());
            DtEnd dtEnd = new DtEnd(new Date(years.getTime(now)));
            dtEnd.getParameters().add(Value.DATE);
            ds.end = BwDateTime.makeBwDateTime(dtEnd);
            if (!CalFacadeUtil.eqObjval(ev.getDtend(), ds.end)) {
                chg.changed(endPi, ev.getDtend(), ds.end);
                ev.setDtend(ds.end);
            }
        }
        /**
         * If we were given a duration store it in the event and calculate
         *          an end to the event - which we should not have been given.
         */
        if (ds.duration != null) {
            if (endType != StartEndComponent.endTypeNone) {
                if (ev.getEntityType() == IcalDefs.entityTypeFreeAndBusy) {
                // Apple is sending both - duration indicates the minimum
                // freebusy duration. Ignore for now.
                } else {
                    return new UpdateResult(CalFacadeException.endAndDuration);
                }
            }
            endType = StartEndComponent.endTypeDuration;
            if (!ds.duration.equals(ev.getDuration())) {
                chg.changed(PropertyInfoIndex.DURATION, ev.getDuration(), ds.duration);
                ev.setDuration(ds.duration);
            }
            ev.setDtend(BwDateTime.makeDateTime(ev.getDtstart().makeDtStart(), ev.getDtstart().getDateType(), new Dur(ds.duration)));
        } else if (!scheduleReply && (endType == StartEndComponent.endTypeNone) && !task) {
            /* No duration and no end specified.
         * Set the end values to the start values + 1 for dates
         */
            boolean dateOnly = ev.getDtstart().getDateType();
            Dur dur;
            if (dateOnly) {
                // 1 day
                dur = new Dur(1, 0, 0, 0);
            } else {
                // No duration
                dur = new Dur(0, 0, 0, 0);
            }
            BwDateTime bwDtEnd = BwDateTime.makeDateTime(ev.getDtstart().makeDtStart(), dateOnly, dur);
            if (!CalFacadeUtil.eqObjval(ev.getDtend(), bwDtEnd)) {
                chg.changed(endPi, ev.getDtend(), bwDtEnd);
                ev.setDtend(bwDtEnd);
            }
        }
        if ((endType != StartEndComponent.endTypeDuration) && (ev.getDtstart() != null) && (ev.getDtend() != null)) {
            // Calculate a duration
            String durVal = BwDateTime.makeDuration(ev.getDtstart(), ev.getDtend()).toString();
            if (!durVal.equals(ev.getDuration())) {
                chg.changed(PropertyInfoIndex.DURATION, ev.getDuration(), durVal);
                ev.setDuration(durVal);
            }
        }
        ev.setEndType(endType);
        return UpdateResult.getOkResult();
    } catch (CalFacadeException cfe) {
        throw new WebdavException(cfe);
    }
}
Also used : Dur(net.fortuna.ical4j.model.Dur) BwDateTime(org.bedework.calfacade.BwDateTime) WebdavException(org.bedework.webdav.servlet.shared.WebdavException) BwEvent(org.bedework.calfacade.BwEvent) Date(net.fortuna.ical4j.model.Date) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) PropertyInfoIndex(org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex) DtStart(net.fortuna.ical4j.model.property.DtStart) ChangeTable(org.bedework.calfacade.util.ChangeTable) DatesState(org.bedework.caldav.bwserver.stdupdaters.DateDatetimePropUpdater.DatesState) UpdateResult(org.bedework.caldav.server.sysinterface.SysIntf.UpdateResult) DtEnd(net.fortuna.ical4j.model.property.DtEnd)

Example 7 with DtStart

use of net.fortuna.ical4j.model.property.DtStart in project bw-calendar-engine by Bedework.

the class InReply method updateOrganizerCopy.

private boolean updateOrganizerCopy(final EventInfo colEi, final EventInfo inBoxEi, final String attUri, final ScheduleResult sr) throws CalFacadeException {
    final BwEvent inBoxEv = inBoxEi.getEvent();
    final BwEvent calEv = colEi.getEvent();
    final ChangeTable chg = calEv.getChangeset(getPrincipalHref());
    /* Only set true if the inbox copy needs to stay as notification.
     * Do not set true for status updates
     */
    boolean changed = false;
    if (debug) {
        trace("Update for attendee " + attUri);
    }
    if (inBoxEv.getScheduleMethod() != ScheduleMethods.methodTypeReply) {
        sr.errorCode = CalFacadeException.schedulingBadMethod;
        return false;
    }
    /* If the incoming sequence is less than that in the organizers event
     * then ignore the incoming reply?
     */
    /* Update the participation status from the incoming attendee */
    BwAttendee calAtt;
    final ChangeTableEntry cte = chg.getEntry(PropertyIndex.PropertyInfoIndex.ATTENDEE);
    if (!inBoxEv.getSuppressed()) {
        calAtt = calEv.findAttendee(attUri);
        if (calAtt == null) {
            if (debug) {
                trace("Not an attendee of " + calEv);
            }
            sr.errorCode = CalFacadeException.schedulingUnknownAttendee;
            sr.extraInfo = attUri;
            return false;
        }
        // For a recurring instance we replace or we update all recurring instances.
        final boolean recurringInstance = (calEv instanceof BwEventProxy);
        final BwAttendee att = inBoxEv.findAttendee(attUri);
        if (calAtt.changedBy(att)) {
            changed = true;
            if (recurringInstance) {
                calEv.removeAttendee(att);
                calAtt = (BwAttendee) att.clone();
            } else {
                att.copyTo(calAtt);
            }
            cte.addChangedValue(calAtt);
        }
        calAtt.setScheduleStatus(getRstat(inBoxEv));
        if (recurringInstance) {
            calEv.addAttendee(calAtt);
        }
        // XXX Ensure no name change
        if (calEv instanceof BwEventProxy) {
            final BwEventProxy pr = (BwEventProxy) calEv;
            final BwEventAnnotation ann = pr.getRef();
            ann.setName(null);
        }
    }
    /* The above changed the master - now we need to update or add any overrides
     */
    if (calEv.getRecurring() && (inBoxEi.getOverrides() != null)) {
        for (final EventInfo oei : inBoxEi.getOverrides()) {
            final BwEvent oev = oei.getEvent();
            final EventInfo cei = colEi.findOverride(oev.getRecurrenceId());
            /*
        if (cei == null) {
          // Organizer must have deleted the override.
          if (debug) {
            trace("Skipping missing override " + oev.getRecurrenceId());
          }
          continue;
        }*/
            final BwEvent ocalEv = cei.getEvent();
            if (((BwEventProxy) ocalEv).getRef().unsaved()) {
                // New Override
                try {
                    final String rid = oev.getRecurrenceId();
                    Date dt = new DateTime(rid);
                    if (calEv.getDtstart().getDateType()) {
                        // RECUR - fix all day recurrences sometime
                        if (rid.length() > 8) {
                            // Try to fix up bad all day recurrence ids. - assume a local timezone
                            ((DateTime) dt).setTimeZone(null);
                            dt = new Date(dt.toString().substring(0, 8));
                        }
                    }
                    final DtStart st = new DtStart(dt);
                    final String tzid = calEv.getDtstart().getTzid();
                    if (tzid != null) {
                        final TimeZone tz = Timezones.getTz(tzid);
                        st.setTimeZone(tz);
                    }
                    ocalEv.setDtstart(BwDateTime.makeBwDateTime(st));
                    ocalEv.setDuration(calEv.getDuration());
                    ocalEv.setDtend(ocalEv.getDtstart().addDur(new Dur(calEv.getDuration())));
                } catch (final CalFacadeException cfe) {
                    throw cfe;
                } catch (final Throwable t) {
                    throw new CalFacadeException(t);
                }
            }
            final BwAttendee ovatt = oev.findAttendee(attUri);
            calAtt = ocalEv.findAttendee(attUri);
            if (calAtt == null) {
                // Organizer must have removed the attendee.
                if (debug) {
                    trace("Skipping override " + attUri + " is not attending");
                }
                continue;
            }
            if (calAtt.changedBy(ovatt)) {
                changed = true;
                ocalEv.removeAttendee(ovatt);
                calAtt = (BwAttendee) ovatt.clone();
                calAtt.setScheduleStatus(getRstat(oev));
                ocalEv.addAttendee(calAtt);
                cte.addChangedValue(calAtt);
            }
        }
    }
    final boolean noinvites = !changed;
    colEi.setReplyUpdate(true);
    /* Update the organizer copy. This will broadcast the changes tp all
     * attendees
     */
    getSvc().getEventsHandler().update(colEi, noinvites, attUri);
    return changed;
}
Also used : Dur(net.fortuna.ical4j.model.Dur) EventInfo(org.bedework.calfacade.svc.EventInfo) BwEvent(org.bedework.calfacade.BwEvent) BwEventProxy(org.bedework.calfacade.BwEventProxy) Date(net.fortuna.ical4j.model.Date) DateTime(net.fortuna.ical4j.model.DateTime) BwDateTime(org.bedework.calfacade.BwDateTime) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) TimeZone(net.fortuna.ical4j.model.TimeZone) DtStart(net.fortuna.ical4j.model.property.DtStart) BwEventAnnotation(org.bedework.calfacade.BwEventAnnotation) ChangeTable(org.bedework.calfacade.util.ChangeTable) ChangeTableEntry(org.bedework.calfacade.util.ChangeTableEntry) BwAttendee(org.bedework.calfacade.BwAttendee)

Example 8 with DtStart

use of net.fortuna.ical4j.model.property.DtStart in project ofbiz-framework by apache.

the class ICalConverter method fromDtStart.

protected static Timestamp fromDtStart(PropertyList propertyList) {
    DtStart iCalObj = (DtStart) propertyList.getProperty(DtStart.DTSTART);
    if (iCalObj == null) {
        return null;
    }
    Date date = iCalObj.getDate();
    return new Timestamp(date.getTime());
}
Also used : DtStart(net.fortuna.ical4j.model.property.DtStart) Timestamp(java.sql.Timestamp) Date(java.util.Date)

Example 9 with DtStart

use of net.fortuna.ical4j.model.property.DtStart in project ofbiz-framework by apache.

the class ICalRecurConverter method visit.

@Override
public void visit(TemporalExpressions.Frequency expr) {
    if (this.dateStart == null) {
        this.dateStart = new DtStart(new net.fortuna.ical4j.model.Date(expr.getStartDate()));
    }
    int freqCount = expr.getFreqCount();
    int freqType = expr.getFreqType();
    switch(freqType) {
        case Calendar.SECOND:
            this.state.addRecur((new Recur(Recur.SECONDLY, freqCount)));
            break;
        case Calendar.MINUTE:
            this.state.addRecur((new Recur(Recur.MINUTELY, freqCount)));
            break;
        case Calendar.HOUR:
            this.state.addRecur((new Recur(Recur.HOURLY, freqCount)));
            break;
        case Calendar.DAY_OF_MONTH:
            this.state.addRecur((new Recur(Recur.DAILY, freqCount)));
            break;
        case Calendar.MONTH:
            this.state.addRecur((new Recur(Recur.MONTHLY, freqCount)));
            break;
        case Calendar.YEAR:
            this.state.addRecur((new Recur(Recur.YEARLY, freqCount)));
            break;
        default:
            break;
    }
}
Also used : DtStart(net.fortuna.ical4j.model.property.DtStart) RDate(net.fortuna.ical4j.model.property.RDate) ExDate(net.fortuna.ical4j.model.property.ExDate) Recur(net.fortuna.ical4j.model.Recur)

Example 10 with DtStart

use of net.fortuna.ical4j.model.property.DtStart in project ofbiz-framework by apache.

the class ICalRecurConverter method convert.

@SuppressWarnings("unchecked")
public static void convert(TemporalExpression expr, PropertyList eventProps) {
    ICalRecurConverter converter = new ICalRecurConverter();
    expr.accept(converter);
    DtStart dateStart = (DtStart) eventProps.getProperty(Property.DTSTART);
    if (converter.dateStart != null) {
        if (dateStart != null) {
            eventProps.remove(dateStart);
        }
        dateStart = converter.dateStart;
        eventProps.add(dateStart);
    }
    if (dateStart != null && converter.exRuleList.size() > 0) {
        // iCalendar quirk - if exclusions exist, then the start date must be excluded also
        ExDate exdate = new ExDate();
        exdate.getDates().add(dateStart.getDate());
        converter.exDateList.add(exdate);
    }
    eventProps.addAll(converter.incDateList);
    eventProps.addAll(converter.incRuleList);
    eventProps.addAll(converter.exDateList);
    eventProps.addAll(converter.exRuleList);
}
Also used : DtStart(net.fortuna.ical4j.model.property.DtStart) ExDate(net.fortuna.ical4j.model.property.ExDate)

Aggregations

DtStart (net.fortuna.ical4j.model.property.DtStart)21 DateTime (net.fortuna.ical4j.model.DateTime)10 DtEnd (net.fortuna.ical4j.model.property.DtEnd)10 BwDateTime (org.bedework.calfacade.BwDateTime)10 Date (net.fortuna.ical4j.model.Date)9 PropertyList (net.fortuna.ical4j.model.PropertyList)8 CalFacadeException (org.bedework.calfacade.exc.CalFacadeException)8 Calendar (net.fortuna.ical4j.model.Calendar)6 Dur (net.fortuna.ical4j.model.Dur)6 VEvent (net.fortuna.ical4j.model.component.VEvent)6 Duration (net.fortuna.ical4j.model.property.Duration)6 ExDate (net.fortuna.ical4j.model.property.ExDate)6 Summary (net.fortuna.ical4j.model.property.Summary)6 Uid (net.fortuna.ical4j.model.property.Uid)6 BwEvent (org.bedework.calfacade.BwEvent)6 TimeZone (net.fortuna.ical4j.model.TimeZone)5 Date (java.util.Date)4 Parameter (net.fortuna.ical4j.model.Parameter)4 Property (net.fortuna.ical4j.model.Property)4 Description (net.fortuna.ical4j.model.property.Description)4