Search in sources :

Example 11 with BwString

use of org.bedework.calfacade.BwString in project bw-calendar-engine by Bedework.

the class BwStringRule method end.

@Override
public void end(final String ns, final String name) throws Exception {
    if (name.equals("bwstring")) {
        // 3.5 onwards we wrapped with a tag. Do nothing
        return;
    }
    BwString entity = (BwString) pop();
    if (top() instanceof BwRequestStatus) {
        BwRequestStatus rs = (BwRequestStatus) top();
        rs.setDescription(entity);
        return;
    }
    if (top() instanceof BwCategory) {
        BwCategory cat = (BwCategory) top();
        if (name.equals("keyword")) {
            cat.setWord(entity);
        } else if (name.equals("desc")) {
            cat.setDescription(entity);
        } else {
            unknownTag(name);
        }
        return;
    }
    if (top() instanceof BwContact) {
        BwContact ent = (BwContact) top();
        if (name.equals("value")) {
            ent.setCn(entity);
        } else {
            unknownTag(name);
        }
        return;
    }
    if (top() instanceof BwLocation) {
        BwLocation loc = (BwLocation) top();
        if (name.equals("addr")) {
            loc.setAddress(entity);
        } else if (name.equals("subaddr")) {
            loc.setSubaddress(entity);
        } else {
            unknownTag(name);
        }
        return;
    }
    if (top() instanceof BwFilterDef) {
        BwFilterDef f = (BwFilterDef) top();
        if (name.equals("display-name")) {
            f.addDisplayName(entity);
        } else if (name.equals("subaddr")) {
            f.addDescription(new BwLongString(entity.getLang(), entity.getValue()));
        } else {
            unknownTag(name);
        }
        return;
    }
    if (top() instanceof BwAlarm) {
        BwAlarm a = (BwAlarm) top();
        if (name.equals("description")) {
            a.addDescription(entity);
            if (entity.getLang() != null) {
                a.addXproperty(new BwXproperty(entity.getLang(), null, entity.getValue()));
            } else {
                a.addDescription(entity);
            }
            return;
        }
        if (name.equals("summary")) {
            a.addSummary(entity);
        } else {
            unknownTag(name);
        }
        return;
    }
    EventInfo ei = (EventInfo) top();
    BwEvent e = ei.getEvent();
    if (e instanceof BwEventProxy) {
        e = ((BwEventProxy) e).getRef();
    }
    if (name.equals("comment")) {
        e.addComment(entity);
    } else if (name.equals("description")) {
        e.addDescription(new BwLongString(entity.getLang(), entity.getValue()));
    } else if (name.equals("resource")) {
        e.addResource(entity);
    } else if (name.equals("summary")) {
        e.addSummary(entity);
    } else {
        unknownTag(name);
    }
}
Also used : BwLongString(org.bedework.calfacade.BwLongString) BwLocation(org.bedework.calfacade.BwLocation) BwRequestStatus(org.bedework.calfacade.BwRequestStatus) EventInfo(org.bedework.calfacade.svc.EventInfo) BwXproperty(org.bedework.calfacade.BwXproperty) BwCategory(org.bedework.calfacade.BwCategory) BwFilterDef(org.bedework.calfacade.BwFilterDef) BwEvent(org.bedework.calfacade.BwEvent) BwString(org.bedework.calfacade.BwString) BwContact(org.bedework.calfacade.BwContact) BwEventProxy(org.bedework.calfacade.BwEventProxy) BwAlarm(org.bedework.calfacade.BwAlarm)

Example 12 with BwString

use of org.bedework.calfacade.BwString 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 13 with BwString

use of org.bedework.calfacade.BwString in project bw-calendar-engine by Bedework.

the class XbwContactPropUpdater method applyUpdate.

public UpdateResult applyUpdate(final UpdateInfo ui) throws WebdavException {
    try {
        final ChangeTableEntry cte = ui.getCte();
        final BwEvent ev = ui.getEvent();
        final List<BwXproperty> xcontacts = ev.getXproperties(BwXproperty.xBedeworkContact);
        final Set<BwContact> contacts = ev.getContacts();
        final String lang = UpdaterUtil.getLang(ui.getProp());
        final String xval = ((TextPropertyType) ui.getProp()).getText();
        final BwString cstr = new BwString(lang, xval);
        if (ui.isRemove()) {
            if (Util.isEmpty(xcontacts)) {
                // Nothing to remove
                return UpdateResult.getOkResult();
            }
            for (final BwXproperty xp : xcontacts) {
                if (!xp.getValue().equals(xval)) {
                    continue;
                }
                // Found
                ev.removeXproperty(xp);
                cte.addRemovedValue(xp);
                /* Do we have a corresponding contact */
                for (final BwContact c : contacts) {
                    if (c.getCn().equals(cstr)) {
                        ev.removeContact(c);
                        cte.addRemovedValue(c);
                        break;
                    }
                }
                return UpdateResult.getOkResult();
            }
            return UpdateResult.getOkResult();
        }
        if (ui.isAdd()) {
            for (final BwXproperty xp : xcontacts) {
                if (xp.getValue().equals(xval)) {
                    return new UpdateResult("Entity already has " + ui.getPropName() + " property with that value - cannot add");
                }
            }
            /* Add the xprop or a contact */
            if (!checkContact(ui, ev, contacts, lang, xval)) {
                final BwXproperty xp = makeXprop(lang, xval);
                ev.addXproperty(xp);
                cte.addAddedValue(xp);
            }
            return UpdateResult.getOkResult();
        }
        if (ui.isChange()) {
            for (final BwXproperty xp : xcontacts) {
                if (xp.getValue().equals(xval)) {
                    // Found
                    ev.removeXproperty(xp);
                    cte.addRemovedValue(xp);
                    final String nlang = UpdaterUtil.getLang(ui.getUpdprop());
                    final String nxval = ((TextPropertyType) ui.getUpdprop()).getText();
                    if (!checkContact(ui, ev, contacts, nlang, nxval)) {
                        final BwXproperty nxp = makeXprop(nlang, nxval);
                        ev.addXproperty(nxp);
                        cte.addAddedValue(nxp);
                    }
                    return UpdateResult.getOkResult();
                }
            }
        }
        return UpdateResult.getOkResult();
    } catch (final CalFacadeException cfe) {
        throw new WebdavException(cfe);
    }
}
Also used : BwXproperty(org.bedework.calfacade.BwXproperty) WebdavException(org.bedework.webdav.servlet.shared.WebdavException) BwEvent(org.bedework.calfacade.BwEvent) ChangeTableEntry(org.bedework.calfacade.util.ChangeTableEntry) BwContact(org.bedework.calfacade.BwContact) BwString(org.bedework.calfacade.BwString) TextPropertyType(ietf.params.xml.ns.icalendar_2.TextPropertyType) BwString(org.bedework.calfacade.BwString) UpdateResult(org.bedework.caldav.server.sysinterface.SysIntf.UpdateResult) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException)

Example 14 with BwString

use of org.bedework.calfacade.BwString in project bw-calendar-engine by Bedework.

the class XbwWrapperPropUpdater method checkCategory.

/* Return true if value matches a category - which may be added as
   * a result
   */
private boolean checkCategory(final UpdateInfo ui, final BwEvent ev, final Set<BwCategory> cats, final String lang, final String val) throws CalFacadeException {
    final BwString sval = new BwString(lang, val);
    final BwCategory cat = ui.getIcalCallback().findCategory(sval);
    if (cat == null) {
        return false;
    }
    for (final BwCategory c : cats) {
        if (c.getWord().equals(sval)) {
            // Already present
            return true;
        }
    }
    ev.addCategory(cat);
    ui.getCte(PropertyIndex.PropertyInfoIndex.CATEGORIES).addValue(cat);
    return true;
}
Also used : BwCategory(org.bedework.calfacade.BwCategory) BwString(org.bedework.calfacade.BwString)

Example 15 with BwString

use of org.bedework.calfacade.BwString in project bw-calendar-engine by Bedework.

the class CommentPropUpdater method applyUpdate.

public UpdateResult applyUpdate(final UpdateInfo ui) throws WebdavException {
    final ChangeTableEntry cte = ui.getCte();
    final BwEvent ev = ui.getEvent();
    final Set<BwString> comments = ev.getComments();
    final BwString cstr = new BwString(UpdaterUtil.getLang(ui.getProp()), ((TextPropertyType) ui.getProp()).getText());
    if (ui.isAdd()) {
        if (Util.isEmpty(comments)) {
            ev.addComment(cstr);
        } else {
            for (final BwString s : comments) {
                if (s.equals(cstr)) {
                    // Already there
                    return UpdateResult.getOkResult();
                }
            }
            ev.addComment(cstr);
        }
        cte.addAddedValue(cstr);
        return UpdateResult.getOkResult();
    }
    if (ui.isRemove()) {
        if (Util.isEmpty(comments)) {
            // Nothing to remove
            return UpdateResult.getOkResult();
        }
        if (ev.removeComment(cstr)) {
            cte.addRemovedValue(cstr);
        }
        return UpdateResult.getOkResult();
    }
    if (ui.isChange()) {
        // Change a value
        if (Util.isEmpty(comments)) {
            // Nothing to change
            return new UpdateResult("No comment to change");
        }
        for (final BwString s : comments) {
            if (s.equals(cstr)) {
                // Found
                final BwString newcstr = new BwString(UpdaterUtil.getLang(ui.getUpdprop()), ((TextPropertyType) ui.getUpdprop()).getText());
                if (s.update(newcstr)) {
                    cte.addChangedValue(s);
                }
                return UpdateResult.getOkResult();
            }
        }
    }
    return UpdateResult.getOkResult();
}
Also used : BwEvent(org.bedework.calfacade.BwEvent) ChangeTableEntry(org.bedework.calfacade.util.ChangeTableEntry) BwString(org.bedework.calfacade.BwString) UpdateResult(org.bedework.caldav.server.sysinterface.SysIntf.UpdateResult)

Aggregations

BwString (org.bedework.calfacade.BwString)30 BwEvent (org.bedework.calfacade.BwEvent)14 BwCategory (org.bedework.calfacade.BwCategory)11 BwContact (org.bedework.calfacade.BwContact)11 BwLocation (org.bedework.calfacade.BwLocation)9 CalFacadeException (org.bedework.calfacade.exc.CalFacadeException)9 BwAttendee (org.bedework.calfacade.BwAttendee)7 BwXproperty (org.bedework.calfacade.BwXproperty)6 EventInfo (org.bedework.calfacade.svc.EventInfo)6 ChangeTableEntry (org.bedework.calfacade.util.ChangeTableEntry)6 WebdavException (org.bedework.webdav.servlet.shared.WebdavException)5 Period (net.fortuna.ical4j.model.Period)4 UpdateResult (org.bedework.caldav.server.sysinterface.SysIntf.UpdateResult)4 BwDateTime (org.bedework.calfacade.BwDateTime)4 BwFreeBusyComponent (org.bedework.calfacade.BwFreeBusyComponent)4 BwOrganizer (org.bedework.calfacade.BwOrganizer)4 BwRequestStatus (org.bedework.calfacade.BwRequestStatus)4 BwStringBase (org.bedework.calfacade.base.BwStringBase)4 BwLongString (org.bedework.calfacade.BwLongString)3 Parameter (net.fortuna.ical4j.model.Parameter)2