Search in sources :

Example 11 with PropertyInfoIndex

use of org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex in project bw-calendar-engine by Bedework.

the class EntityBuilder method restoreAttendees.

private Set<BwAttendee> restoreAttendees(final boolean vpoll) throws CalFacadeException {
    final PropertyInfoIndex pi;
    if (vpoll) {
        pi = PropertyInfoIndex.VOTER;
    } else {
        pi = PropertyInfoIndex.ATTENDEE;
    }
    final List<Object> vals = getFieldValues(pi);
    if (Util.isEmpty(vals)) {
        return null;
    }
    final Set<BwAttendee> atts = new TreeSet<>();
    for (final Object o : vals) {
        try {
            pushFields(o);
            final BwAttendee att = new BwAttendee();
            if (pushFields(PropertyInfoIndex.PARAMETERS)) {
                try {
                    att.setRsvp(getBool(ParameterInfoIndex.RSVP));
                    att.setCn(getString(ParameterInfoIndex.CN));
                    att.setPartstat(getString(ParameterInfoIndex.PARTSTAT));
                    att.setScheduleStatus(getString(ParameterInfoIndex.SCHEDULE_STATUS));
                    att.setCuType(getString(ParameterInfoIndex.CUTYPE));
                    att.setDelegatedFrom(getString(ParameterInfoIndex.DELEGATED_FROM));
                    att.setDelegatedTo(getString(ParameterInfoIndex.DELEGATED_TO));
                    att.setDir(getString(ParameterInfoIndex.DIR));
                    att.setLanguage(getString(ParameterInfoIndex.LANGUAGE));
                    att.setMember(getString(ParameterInfoIndex.MEMBER));
                    att.setRole(getString(ParameterInfoIndex.ROLE));
                    att.setSentBy(getString(ParameterInfoIndex.SENT_BY));
                    if (vpoll) {
                        att.setStayInformed(getBool(ParameterInfoIndex.STAY_INFORMED));
                    }
                } finally {
                    popFields();
                }
            }
            att.setAttendeeUri(getString(PropertyInfoIndex.URI));
            atts.add(att);
        } catch (final IndexException ie) {
            throw new CalFacadeException(ie);
        } finally {
            popFields();
        }
    }
    return atts;
}
Also used : PropertyInfoIndex(org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex) IndexException(org.bedework.util.indexing.IndexException) TreeSet(java.util.TreeSet) BwAttendee(org.bedework.calfacade.BwAttendee) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException)

Example 12 with PropertyInfoIndex

use of org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex in project bw-calendar-engine by Bedework.

the class CoreEvents method getEvents.

@Override
public Collection<CoreEventInfo> getEvents(final Collection<BwCalendar> calendars, final FilterBase filter, final BwDateTime startDate, final BwDateTime endDate, final List<BwIcalPropertyInfoEntry> retrieveList, final DeletedState delState, RecurringRetrievalMode recurRetrieval, final boolean freeBusy) throws CalFacadeException {
    /* Ensure dates are limited explicitly or implicitly */
    recurRetrieval = defaultRecurringRetrieval(recurRetrieval, startDate, endDate);
    if (debug) {
        trace("getEvents for start=" + startDate + " end=" + endDate);
    }
    FilterBase fltr = filter;
    if (!Util.isEmpty(calendars)) {
        FilterBase colfltr = null;
        for (final BwCalendar c : calendars) {
            colfltr = FilterBase.addOrChild(colfltr, new BwCollectionFilter(null, c));
        }
        fltr = FilterBase.addAndChild(fltr, colfltr);
    }
    int desiredAccess = privRead;
    if (freeBusy) {
        // DORECUR - freebusy events must have enough info for expansion
        desiredAccess = privReadFreeBusy;
    }
    final List<PropertyInfoIndex> properties = new ArrayList<>(2);
    properties.add(PropertyInfoIndex.DTSTART);
    properties.add(PropertyInfoIndex.UTC);
    final List<SortTerm> sort = new ArrayList<>(1);
    sort.add(new SortTerm(properties, true));
    String start = null;
    String end = null;
    if (startDate != null) {
        start = startDate.getDate();
    }
    if (endDate != null) {
        end = endDate.getDate();
    }
    final SearchResult sr = // query
    getIndexer(null).search(// query
    null, false, fltr, sort, // defaultFilterContext
    null, start, end, -1, delState, recurRetrieval);
    final List<SearchResultEntry> sres = sr.getIndexer().getSearchResult(sr, 0, -1, desiredAccess);
    final TreeSet<CoreEventInfo> ceis = new TreeSet<>();
    for (final SearchResultEntry sre : sres) {
        final Object o = sre.getEntity();
        if (!(o instanceof EventInfo)) {
            continue;
        }
        final EventInfo ei = (EventInfo) o;
        final BwEvent ev = ei.getEvent();
        restoreCategories(ev);
        final CoreEventInfo cei = postGetEvent(ev, null, ei.getCurrentAccess());
        if (cei == null) {
            continue;
        }
        ceis.add(cei);
    }
    return buildVavail(ceis);
}
Also used : SortTerm(org.bedework.calfacade.filter.SortTerm) CoreEventInfo(org.bedework.calcorei.CoreEventInfo) EventInfo(org.bedework.calfacade.svc.EventInfo) CoreEventInfo(org.bedework.calcorei.CoreEventInfo) ArrayList(java.util.ArrayList) SearchResult(org.bedework.calfacade.indexing.SearchResult) BwEvent(org.bedework.calfacade.BwEvent) BwCalendar(org.bedework.calfacade.BwCalendar) BwCollectionFilter(org.bedework.calfacade.filter.BwCollectionFilter) PropertyInfoIndex(org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex) TreeSet(java.util.TreeSet) FilterBase(org.bedework.caldav.util.filter.FilterBase) SearchResultEntry(org.bedework.calfacade.indexing.SearchResultEntry)

Example 13 with PropertyInfoIndex

use of org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex in project bw-calendar-engine by Bedework.

the class InRequest method updateAttendeeFields.

private boolean updateAttendeeFields(final EventInfo ourCopy, final EventInfo inBoxEi, final String attUri) throws CalFacadeException {
    BwEvent ourEv = ourCopy.getEvent();
    BwEvent inEv = inBoxEi.getEvent();
    boolean flagNeedsReply = false;
    ChangeTable chg = ourCopy.getChangeset(getPrincipalHref());
    for (PropertyInfoIndex ipi : PropertyInfoIndex.values()) {
        BwIcalPropertyInfoEntry bipie = BwIcalPropertyInfo.getPinfo(ipi);
        if (bipie == null) {
            continue;
        }
        if ((ourEv.getEntityType() == IcalDefs.entityTypeEvent) && !bipie.getEventProperty()) {
            continue;
        }
        if ((ourEv.getEntityType() == IcalDefs.entityTypeTodo) && !bipie.getTodoProperty()) {
            continue;
        }
        switch(ipi) {
            case UNKNOWN_PROPERTY:
                break;
            case CLASS:
                if (chg.changed(ipi, ourEv.getClassification(), inEv.getClassification())) {
                    ourEv.setClassification(inEv.getClassification());
                }
                break;
            case COMPLETED:
                /* Todo only */
                if (chg.changed(ipi, ourEv.getCompleted(), inEv.getCompleted())) {
                    ourEv.setCompleted(inEv.getCompleted());
                }
                break;
            case CREATED:
                break;
            case DESCRIPTION:
                /*
          for (BwLongString s: inEv.getDescriptions()) {
            chg.addValue(Property.DESCRIPTION, s);
          }
          */
                if (chg.changed(ipi, ourEv.getDescription(), inEv.getDescription())) {
                    ourEv.setDescription(inEv.getDescription());
                }
                break;
            case DTEND:
            /* Event only */
            case DUE:
                /* Todo only */
                BwDateTime dt = inEv.getDtend();
                if (!CalFacadeUtil.eqObjval(ourEv.getDtend(), dt)) {
                    ourEv.setDtend(dt);
                    chg.changed(ipi, ourEv.getDtend(), dt);
                }
                char c = inEv.getEndType();
                if (c != ourEv.getEndType()) {
                    ourEv.setEndType(c);
                    chg.changed(PropertyInfoIndex.END_TYPE, ourEv.getEndType(), c);
                }
                break;
            case DTSTAMP:
                break;
            case DTSTART:
                dt = inEv.getDtstart();
                if (!CalFacadeUtil.eqObjval(ourEv.getDtstart(), dt)) {
                    ourEv.setDtstart(dt);
                    chg.changed(ipi, ourEv.getDtstart(), dt);
                }
                break;
            case DURATION:
                if (chg.changed(ipi, ourEv.getDuration(), inEv.getDuration())) {
                    ourEv.setDuration(inEv.getDuration());
                }
                break;
            case GEO:
                if (chg.changed(ipi, ourEv.getGeo(), inEv.getGeo())) {
                    ourEv.setGeo(inEv.getGeo());
                }
                break;
            case LAST_MODIFIED:
                break;
            case LOCATION:
                if (chg.changed(ipi, ourEv.getLocation(), inEv.getLocation())) {
                    ourEv.setLocation((BwLocation) inEv.getLocation().clone());
                }
                break;
            case ORGANIZER:
                if (chg.changed(ipi, ourEv.getOrganizer(), inEv.getOrganizer())) {
                    ourEv.setOrganizer((BwOrganizer) inEv.getOrganizer().clone());
                }
                break;
            case PRIORITY:
                if (chg.changed(ipi, ourEv.getPriority(), inEv.getPriority())) {
                    ourEv.setPriority(inEv.getPriority());
                }
                break;
            case RECURRENCE_ID:
                break;
            case SEQUENCE:
                if (chg.changed(ipi, ourEv.getSequence(), inEv.getSequence())) {
                    ourEv.setSequence(inEv.getSequence());
                }
                break;
            case STATUS:
                if (chg.changed(ipi, ourEv.getStatus(), inEv.getStatus())) {
                    ourEv.setStatus(inEv.getStatus());
                }
                break;
            case SUMMARY:
                /*
          for (BwString s: inEv.getSummaries()) {
            chg.addValue(Property.SUMMARY, s);
          }
          */
                if (chg.changed(ipi, ourEv.getSummary(), inEv.getSummary())) {
                    ourEv.setSummary(inEv.getSummary());
                }
                break;
            case PERCENT_COMPLETE:
                /* Todo only */
                if (chg.changed(ipi, ourEv.getPercentComplete(), inEv.getPercentComplete())) {
                    ourEv.setPercentComplete(inEv.getPercentComplete());
                }
                break;
            case UID:
                break;
            case URL:
                if (chg.changed(ipi, ourEv.getLink(), inEv.getLink())) {
                    ourEv.setLink(inEv.getLink());
                }
                break;
            case TRANSP:
                /* Event only - done with attendee */
                break;
            case ATTACH:
                break;
            case ATTENDEE:
                String transparency = ourEv.getTransparency();
                BwAttendee ourAtt = null;
                for (BwAttendee inAtt : inEv.getAttendees()) {
                    BwAttendee att = (BwAttendee) inAtt.clone();
                    att.setScheduleStatus(null);
                    String inAttUri = att.getAttendeeUri();
                    BwAttendee evAtt = ourEv.findAttendee(inAttUri);
                    if (inAttUri.equals(attUri)) {
                        // It's ours
                        ourAtt = att;
                        if ((att.getPartstat() == null) || att.getPartstat().equals(IcalDefs.partstatValNeedsAction)) {
                            transparency = IcalDefs.transparencyTransparent;
                            // Apple ical seems to expect an x-prop.
                            flagNeedsReply = true;
                        }
                    // att.setScheduleStatus(IcalDefs.deliveryStatusSuccess);
                    }
                    /* See if it's in the current set and if anything significant changed

            for (BwAttendee calAtt: ourEv.getAttendees()) {
              if (calAtt.getAttendeeUri().equals(inAttUri)) {
                if (calAtt.changedBy(inAtt, false)) {
                  ourEv.setSignificantChange(true);
                }
              }
            }*/
                    final ChangeTableEntry cte = chg.getEntry(PropertyInfoIndex.ATTENDEE);
                    if (evAtt != null) {
                        cte.addChangedValue(att);
                    } else {
                        cte.addAddedValue(att);
                    }
                }
                if (ourAtt == null) {
                    // Error?
                    if (debug) {
                        trace("InSchedule - no attendee for " + ourEv.getOwnerHref());
                    }
                    return false;
                }
                if (chg.changed(PropertyInfoIndex.TRANSP, ourEv.getTransparency(), transparency)) {
                    ourEv.setTransparency(transparency);
                }
                break;
            case CATEGORIES:
                if (!Util.isEmpty(inEv.getCategories())) {
                    for (BwCategory cat : inEv.getCategories()) {
                        chg.addValue(ipi, cat);
                    }
                }
                break;
            case COMMENT:
                for (BwString s : inEv.getComments()) {
                    chg.addValue(ipi, s);
                }
                break;
            case CONTACT:
                for (final BwContact ct : inEv.getContacts()) {
                    chg.addValue(ipi, ct.clone());
                }
                break;
            case EXDATE:
                // Don't updaye exdate - we add cancelled overrides
                break;
            case EXRULE:
                // Only for master events
                if (ourEv instanceof BwEventProxy) {
                    break;
                }
                for (final String s : inEv.getExrules()) {
                    chg.addValue(ipi, s);
                }
                break;
            case REQUEST_STATUS:
                break;
            case RELATED_TO:
                if (chg.changed(ipi, ourEv.getRelatedTo(), inEv.getRelatedTo())) {
                    ourEv.setRelatedTo(inEv.getRelatedTo());
                }
                break;
            case RESOURCES:
                for (BwString bs : inEv.getResources()) {
                    chg.addValue(ipi, bs);
                }
                break;
            case RDATE:
                // Only for master events
                if (ourEv instanceof BwEventProxy) {
                    break;
                }
                for (BwDateTime bdt : inEv.getRdates()) {
                    chg.addValue(ipi, bdt);
                }
                break;
            case RRULE:
                // Only for master events
                if (ourEv instanceof BwEventProxy) {
                    break;
                }
                for (String s : inEv.getRrules()) {
                    chg.addValue(ipi, s);
                }
                break;
            case XPROP:
                for (BwXproperty x : inEv.getXproperties()) {
                    chg.addValue(ipi, x);
                }
                break;
            case FREEBUSY:
            case TZID:
            case TZNAME:
            case TZOFFSETFROM:
            case TZOFFSETTO:
            case TZURL:
            case ACTION:
            case REPEAT:
            case TRIGGER:
                break;
            // non ical
            case COLLECTION:
            // non ical
            case COST:
            // non ical
            case CREATOR:
            // non ical
            case OWNER:
            case // non ical
            ENTITY_TYPE:
                break;
            case // Component
            VALARM:
                break;
            // Param
            case LANG:
            case // Param
            TZIDPAR:
                break;
            case PUBLISH_URL:
            case POLL_ITEM_ID:
            case END_TYPE:
            case ETAG:
            case HREF:
            case XBEDEWORK_COST:
            case CALSCALE:
            case METHOD:
            case PRODID:
            case VERSION:
            case ACL:
            case AFFECTS_FREE_BUSY:
            case ALIAS_URI:
            case ATTENDEE_SCHEDULING_OBJECT:
            case CALTYPE:
            case COL_PROPERTIES:
            case COLPATH:
            case CTOKEN:
            case DISPLAY:
            case DOCTYPE:
            case EVENTREG_END:
            case EVENTREG_MAX_TICKETS:
            case EVENTREG_MAX_TICKETS_PER_USER:
            case EVENTREG_START:
            case EVENTREG_WAIT_LIST_LIMIT:
            case FILTER_EXPR:
            case IGNORE_TRANSP:
            case IMAGE:
            case INDEX_END:
            case INDEX_START:
            case INSTANCE:
            case LAST_REFRESH:
            case LAST_REFRESH_STATUS:
            case LOCATION_UID:
            case LOCATION_STR:
                break;
            default:
                warn("Not handling icalendar property " + ipi);
        }
    // switch
    }
    if (chg.changed(PropertyInfoIndex.COST, ourEv.getCost(), inEv.getCost())) {
        ourEv.setCost(inEv.getCost());
    }
    /* Now see if we need to flag a schedule-tag change. We do so only if
     * a. A property other than the attendee changed
     * b. An attendee was added or removed
     */
    Collection<ChangeTableEntry> changes = chg.getEntries();
    ChangeTableEntry attChanges = null;
    ourEv.setSignificantChange(false);
    for (ChangeTableEntry cte : changes) {
        if (!cte.getChanged()) {
            continue;
        }
        if (cte.getIndex() == PropertyInfoIndex.ATTENDEE) {
            attChanges = cte;
            continue;
        }
        ourEv.setSignificantChange(true);
    }
    if (debug) {
        trace("After change check getSignificantChange=" + ourEv.getSignificantChange());
    }
    if (flagNeedsReply) {
    // Apple ical seems to expect an x-prop.
    // chg.addValue(PropertyInfoIndex.XPROP,
    // new BwXproperty(BwXproperty.appleNeedsReply,
    // null, "TRUE"));
    }
    chg.processChanges(ourEv, true);
    if (debug) {
        trace(chg.toString());
    }
    /* The attendee change entry will now reflect the changes made to the
     * attendee list. See if any significant change was made there.
     */
    if (attChanges != null) {
        if (!Util.isEmpty(attChanges.getAddedValues()) || !Util.isEmpty(attChanges.getRemovedValues())) {
            ourEv.setSignificantChange(true);
        } else {
        /* TODO - go through the changed entries and look for our entry. See
         * if we are being asked to reply - this can probably be done earlier.
         */
        }
    }
    if (debug) {
        trace("After attendee change check getSignificantChange=" + ourEv.getSignificantChange());
    }
    return true;
}
Also used : BwDateTime(org.bedework.calfacade.BwDateTime) BwCategory(org.bedework.calfacade.BwCategory) BwEvent(org.bedework.calfacade.BwEvent) BwString(org.bedework.calfacade.BwString) BwString(org.bedework.calfacade.BwString) BwContact(org.bedework.calfacade.BwContact) BwEventProxy(org.bedework.calfacade.BwEventProxy) PropertyInfoIndex(org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex) BwIcalPropertyInfoEntry(org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry) BwXproperty(org.bedework.calfacade.BwXproperty) ChangeTable(org.bedework.calfacade.util.ChangeTable) ChangeTableEntry(org.bedework.calfacade.util.ChangeTableEntry) BwAttendee(org.bedework.calfacade.BwAttendee)

Example 14 with PropertyInfoIndex

use of org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex in project bw-calendar-engine by Bedework.

the class ESQueryFilter method makePropertyRef.

/**
 * @param pis list of indexes
 * @return dot delimited property reference
 */
public static String makePropertyRef(final PropertyInfoIndex... pis) {
    String delim = "";
    final StringBuilder sb = new StringBuilder();
    for (final PropertyInfoIndex pi : pis) {
        sb.append(delim);
        sb.append(getJname(pi));
        delim = ".";
    }
    return sb.toString();
}
Also used : PropertyInfoIndex(org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex)

Example 15 with PropertyInfoIndex

use of org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex in project bw-calendar-engine by Bedework.

the class ESQueryFilter method makePropertyRef.

/**
 * @param pis the refs
 * @return dot delimited property reference
 */
public static String makePropertyRef(final List<PropertyInfoIndex> pis, final int numElements) {
    String delim = "";
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i <= numElements; i++) {
        final PropertyInfoIndex pi = pis.get(i);
        sb.append(delim);
        sb.append(getJname(pi));
        delim = ".";
    }
    return sb.toString();
}
Also used : PropertyInfoIndex(org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex)

Aggregations

PropertyInfoIndex (org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex)19 ArrayList (java.util.ArrayList)6 BwEvent (org.bedework.calfacade.BwEvent)5 CalFacadeException (org.bedework.calfacade.exc.CalFacadeException)5 BwIcalPropertyInfoEntry (org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry)5 ChangeTable (org.bedework.calfacade.util.ChangeTable)5 BwCategory (org.bedework.calfacade.BwCategory)4 Iterator (java.util.Iterator)3 BwAttendee (org.bedework.calfacade.BwAttendee)3 BwCalendar (org.bedework.calfacade.BwCalendar)3 BwDateTime (org.bedework.calfacade.BwDateTime)3 TreeSet (java.util.TreeSet)2 Date (net.fortuna.ical4j.model.Date)2 Parameter (net.fortuna.ical4j.model.Parameter)2 Attach (net.fortuna.ical4j.model.property.Attach)2 DateListProperty (net.fortuna.ical4j.model.property.DateListProperty)2 DateProperty (net.fortuna.ical4j.model.property.DateProperty)2 EntityTypeFilter (org.bedework.caldav.util.filter.EntityTypeFilter)2 ObjectFilter (org.bedework.caldav.util.filter.ObjectFilter)2 BwContact (org.bedework.calfacade.BwContact)2