Search in sources :

Example 6 with BwIcalPropertyInfoEntry

use of org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry in project bw-calendar-engine by Bedework.

the class Filters method joinPass.

/**
 * Pass 1 is the join pass and assumes we have added the select and from
 * clauses. It gives the method the opportunity to add any join clauses.
 *
 * @param retrieveListFields
 * @throws CalFacadeException
 */
public void joinPass(final List<BwIcalPropertyInfoEntry> retrieveListFields) throws CalFacadeException {
    if (getFilter() == null) {
        return;
    }
    joinDone.clear();
    if (!Util.isEmpty(retrieveListFields)) {
        for (BwIcalPropertyInfoEntry ipie : retrieveListFields) {
            if (!ipie.getMultiValued()) {
                // No join needed
                continue;
            }
            String fname = ipie.getDbFieldName();
            if (joinDone.get(fname) != null) {
                // Already done
                continue;
            }
            joinDone.put(fname, fname);
            selectClause.append(" left outer join ");
            selectClause.append(masterName);
            selectClause.append(".");
            selectClause.append(fname);
            selectClause.append(" as joined_");
            selectClause.append(fname);
            selectClause.append(" ");
        }
    }
    addJoins(getFilter());
}
Also used : BwIcalPropertyInfoEntry(org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry)

Example 7 with BwIcalPropertyInfoEntry

use of org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry in project bw-calendar-engine by Bedework.

the class Filters method addJoins.

/*
  private String makeUtcformat(String dt) {
    int len = dt.length();

    if (len == 16) {
      return dt;
    }

    if (len == 15) {
      return dt + "Z";
    }

    if (len == 8) {
      return dt + "T000000Z";
    }

    throw new RuntimeException("Bad date " + dt);
  }*/
private void addJoins(final FilterBase f) throws CalFacadeException {
    if ((f instanceof AndFilter) || (f instanceof OrFilter)) {
        for (FilterBase flt : f.getChildren()) {
            addJoins(flt);
        }
        return;
    }
    if (!(f instanceof PropertyFilter)) {
        return;
    }
    if (f instanceof PresenceFilter) {
        return;
    }
    if (f instanceof BwHrefFilter) {
        return;
    }
    PropertyFilter pf = (PropertyFilter) f;
    BwIcalPropertyInfoEntry pi = BwIcalPropertyInfo.getPinfo(pf.getPropertyIndex());
    if (pi == null) {
        throw new CalFacadeException("org.bedework.filters.unknownproperty", String.valueOf(pf.getPropertyIndex()));
    }
    if (!pi.getMultiValued()) {
        return;
    }
    if (f instanceof TimeRangeFilter) {
        addThisJoin(pi);
        return;
    }
    if (f instanceof BwObjectFilter) {
        addThisJoin(pi);
        return;
    }
}
Also used : PresenceFilter(org.bedework.caldav.util.filter.PresenceFilter) AndFilter(org.bedework.caldav.util.filter.AndFilter) BwIcalPropertyInfoEntry(org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry) BwHrefFilter(org.bedework.calfacade.filter.BwHrefFilter) EntityTimeRangeFilter(org.bedework.caldav.util.filter.EntityTimeRangeFilter) TimeRangeFilter(org.bedework.caldav.util.filter.TimeRangeFilter) PropertyFilter(org.bedework.caldav.util.filter.PropertyFilter) OrFilter(org.bedework.caldav.util.filter.OrFilter) FilterBase(org.bedework.caldav.util.filter.FilterBase) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) BwObjectFilter(org.bedework.calfacade.filter.BwObjectFilter)

Example 8 with BwIcalPropertyInfoEntry

use of org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry 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 9 with BwIcalPropertyInfoEntry

use of org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry in project bw-calendar-engine by Bedework.

the class ESQueryFilter method makeFilter.

private FilterBuilder makeFilter(final PropertyInfoIndex pii, final String path, final Object val, final OperationType opType) throws CalFacadeException {
    final BwIcalPropertyInfoEntry bwPie = BwIcalPropertyInfo.getPinfo(pii);
    switch(opType) {
        case compare:
            if (bwPie.getAnalyzed()) {
                if (val instanceof Collection) {
                    final String[] vals;
                    try {
                        final Collection valsC = (Collection) val;
                        vals = (String[]) (valsC).toArray(new String[valsC.size()]);
                    } catch (final Throwable t) {
                        throw new CalFacadeException(CalFacadeException.filterBadOperator, "Invalid query. Multi match only allowed on strings");
                    }
                    final MultiMatchQueryBuilder mmqb = new MultiMatchQueryBuilder(path, vals);
                    return new QueryFilterBuilder(mmqb);
                }
                return new QueryFilterBuilder(new MatchQueryBuilder(path, val));
            }
            if (val instanceof Collection) {
                final TermsFilterBuilder tfb = FilterBuilders.termsFilter(path, (Collection) val);
                tfb.execution("or");
                return tfb;
            }
            return new TermFilterBuilder(path, val);
        case timeRange:
            final RangeFilterBuilder rfb = FilterBuilders.rangeFilter(path);
            final TimeRange tr = (TimeRange) val;
            if (tr.getEnd() == null) {
                rfb.gte(tr.getStart().toString());
                return rfb;
            }
            if (tr.getStart() == null) {
                rfb.lt(tr.getEnd().toString());
                return rfb;
            }
            rfb.from(tr.getStart().toString());
            rfb.to(tr.getEnd().toString());
            rfb.includeLower(true);
            rfb.includeUpper(false);
            return rfb;
        case absence:
            return FilterBuilders.missingFilter(path);
        case presence:
            return FilterBuilders.existsFilter(path);
        case prefix:
            return FilterBuilders.prefixFilter(path, (String) val);
        default:
            throw new CalFacadeException(CalFacadeException.filterBadOperator, opType.toString());
    }
}
Also used : RangeFilterBuilder(org.elasticsearch.index.query.RangeFilterBuilder) TermsFilterBuilder(org.elasticsearch.index.query.TermsFilterBuilder) MultiMatchQueryBuilder(org.elasticsearch.index.query.MultiMatchQueryBuilder) QueryFilterBuilder(org.elasticsearch.index.query.QueryFilterBuilder) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) TimeRange(org.bedework.caldav.util.TimeRange) BwIcalPropertyInfoEntry(org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry) TermFilterBuilder(org.elasticsearch.index.query.TermFilterBuilder) Collection(java.util.Collection) MultiMatchQueryBuilder(org.elasticsearch.index.query.MultiMatchQueryBuilder) MatchQueryBuilder(org.elasticsearch.index.query.MatchQueryBuilder)

Example 10 with BwIcalPropertyInfoEntry

use of org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry in project bw-calendar-engine by Bedework.

the class EventQueryBuilder method fields.

public void fields(final List<BwIcalPropertyInfoEntry> retrieveListFields, final String name, final boolean isAnnotation) {
    if (Util.isEmpty(retrieveListFields)) {
        sb.append(name);
        sb.append(" ");
        return;
    }
    String delim = "";
    for (BwIcalPropertyInfoEntry ipie : retrieveListFields) {
        sb.append(delim);
        if (ipie.getMultiValued()) {
            sb.append("joined_");
        } else {
            sb.append(name);
            sb.append(".");
        }
        sb.append(ipie.getDbFieldName());
        delim = ", ";
    }
    if (isAnnotation) {
        sb.append(delim);
        sb.append(name);
        sb.append(".");
        sb.append("override");
        sb.append(delim);
        sb.append(name);
        sb.append(".");
        sb.append("target");
        sb.append(delim);
        sb.append(name);
        sb.append(".");
        sb.append("master");
    }
    sb.append(" ");
}
Also used : BwIcalPropertyInfoEntry(org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry)

Aggregations

BwIcalPropertyInfoEntry (org.bedework.calfacade.ical.BwIcalPropertyInfo.BwIcalPropertyInfoEntry)12 PropertyInfoIndex (org.bedework.util.calendar.PropertyIndex.PropertyInfoIndex)5 CalFacadeException (org.bedework.calfacade.exc.CalFacadeException)4 AndFilter (org.bedework.caldav.util.filter.AndFilter)3 EntityTimeRangeFilter (org.bedework.caldav.util.filter.EntityTimeRangeFilter)3 FilterBase (org.bedework.caldav.util.filter.FilterBase)3 OrFilter (org.bedework.caldav.util.filter.OrFilter)3 PresenceFilter (org.bedework.caldav.util.filter.PresenceFilter)3 PropertyFilter (org.bedework.caldav.util.filter.PropertyFilter)3 TimeRangeFilter (org.bedework.caldav.util.filter.TimeRangeFilter)3 BwCategory (org.bedework.calfacade.BwCategory)3 BwDateTime (org.bedework.calfacade.BwDateTime)3 BwObjectFilter (org.bedework.calfacade.filter.BwObjectFilter)3 ArrayList (java.util.ArrayList)2 BwContact (org.bedework.calfacade.BwContact)2 BwEvent (org.bedework.calfacade.BwEvent)2 BwString (org.bedework.calfacade.BwString)2 BwCategoryFilter (org.bedework.calfacade.filter.BwCategoryFilter)2 BwHrefFilter (org.bedework.calfacade.filter.BwHrefFilter)2 ChangeTable (org.bedework.calfacade.util.ChangeTable)2