![JAR search and dependency download from the Maven repository](/logo.png)
org.bedework.caldav.bwserver.BwCalDAVEvent Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bw-calendar-engine-caldav Show documentation
Show all versions of bw-calendar-engine-caldav Show documentation
Main calendar engine code for bedework
/* ********************************************************************
Licensed to Jasig under one or more contributor license
agreements. See the NOTICE file distributed with this work
for additional information regarding copyright ownership.
Jasig licenses this file to you under the Apache License,
Version 2.0 (the "License"); you may not use this file
except in compliance with the License. You may obtain a
copy of the License at:
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
package org.bedework.caldav.bwserver;
import org.bedework.access.AccessPrincipal;
import org.bedework.caldav.server.CalDAVEvent;
import org.bedework.caldav.server.Organizer;
import org.bedework.calfacade.BwEvent;
import org.bedework.calfacade.BwEventObj;
import org.bedework.calfacade.BwXproperty;
import org.bedework.calfacade.svc.EventInfo;
import org.bedework.convert.IcalTranslator;
import org.bedework.util.calendar.ScheduleMethods;
import org.bedework.util.misc.Util;
import org.bedework.util.xml.XmlEmit;
import org.bedework.util.xml.tagdefs.AppleServerTags;
import org.bedework.util.xml.tagdefs.CaldavTags;
import org.bedework.util.xml.tagdefs.ICalTags;
import org.bedework.util.xml.tagdefs.WebdavTags;
import org.bedework.webdav.servlet.shared.WebdavException;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.xml.namespace.QName;
/**
*
* @author douglm
*
*/
public class BwCalDAVEvent extends CalDAVEvent {
private final BwSysIntfImpl intf;
private EventInfo evi;
private BwEvent ev;
/**
* @param intf system interface
* @param evi event info
*/
BwCalDAVEvent(final BwSysIntfImpl intf, final EventInfo evi) {
this.intf = intf;
this.evi = evi;
if (evi != null) {
ev = evi.getEvent();
}
}
/* ====================================================================
* Abstract method implementations
* ==================================================================== */
@Override
public boolean getCanShare() {
return false;
}
@Override
public boolean getCanPublish() {
return false;
}
@Override
public boolean isAlias() {
return false;
}
@Override
public String getAliasUri() {
return null;
}
@Override
public BwCalDAVEvent resolveAlias(final boolean resolveSubAlias) {
return this;
}
@Override
public void setProperty(final QName name, final String val) {
}
@Override
public String getProperty(final QName name) {
return null;
}
@Override
public boolean getDeleted() {
return getEv().getDeleted() || getEv().getTombstoned();
}
/* (non-Javadoc)
* @see org.bedework.caldav.server.CalDAVEvent#getScheduleTag()
*/
@Override
public String getScheduleTag() {
return getEv().getStag();
}
/* (non-Javadoc)
* @see org.bedework.caldav.server.CalDAVEvent#getPrevScheduleTag()
*/
@Override
public String getPrevScheduleTag() {
return getEvinfo().getPrevStag();
}
@Override
public boolean getOrganizerSchedulingObject() {
return getEv().getOrganizerSchedulingObject();
}
@Override
public boolean getAttendeeSchedulingObject() {
return getEv().getAttendeeSchedulingObject();
}
@Override
public String getSummary() {
return getEv().getSummary();
}
@Override
public boolean isNew() {
return getEvinfo().getNewEvent();
}
@Override
public int getEntityType() {
return getEv().getEntityType();
}
@Override
public void setOrganizer(final Organizer val) {
final var so = getEv().getSchedulingInfo()
.newSchedulingOwner(val.getOrganizerUri());
so.setName(val.getCn());
// so.setDir(val.getDir());
so.setLanguage(val.getLanguage());
so.setInvitedBy(val.getSentBy());
so.setCalendarAddress(val.getOrganizerUri());
}
@Override
public Organizer getOrganizer() {
final var so = getEv().getSchedulingInfo().getSchedulingOwner();
if (so.noOwner()) {
return null;
}
return new Organizer(so.getName(),
null, //so.getDir(),
so.getLanguage(),
so.getInvitedBy(),
so.getCalendarAddress());
}
@Override
public void setOriginator(final String val) {
getEv().setOriginator(val);
}
@Override
public void setRecipients(final Set val) {
if (getEv().getRecipients() == null) {
getEv().setRecipients(val);
} else {
Util.adjustCollection(val, getEv().getRecipients());
}
}
@Override
public Set getRecipients() {
return getEv().getRecipients();
}
@Override
public void addRecipient(final String val) {
getEv().addRecipient(val);
}
@Override
public Set getAttendeeUris() {
return getEv().getSchedulingInfo()
.getParticipantAddrs();
}
@Override
public void setScheduleMethod(final int val) {
getEv().setScheduleMethod(val);
}
@Override
public int getScheduleMethod() {
return getEv().getScheduleMethod();
}
/* (non-Javadoc)
* @see org.bedework.caldav.server.CalDAVEvent#getUid()
*/
@Override
public String getUid() {
return getEv().getUid();
}
@Override
public boolean generatePropertyValue(final QName tag,
final XmlEmit xml) {
final BwEvent ev = getEv();
/*
if (tag.equals(CaldavTags.scheduleState)) {
xml.openTag(tag);
if (ev.getScheduleState() == BwEvent.scheduleStateNotProcessed) {
xml.emptyTag(CaldavTags.notProcessed);
} else {
xml.emptyTag(CaldavTags.processed);
}
xml.closeTag(tag);
return true;
}
*/
if (tag.equals(CaldavTags.scheduleTag)) {
if (!ev.getOrganizerSchedulingObject() &&
!ev.getAttendeeSchedulingObject()) {
return false;
}
xml.property(tag, ev.getStag());
return true;
}
if (tag.equals(CaldavTags.originator)) {
if (ev.getOriginator() != null) {
xml.openTag(tag);
xml.property(WebdavTags.href, ev.getOriginator());
xml.closeTag(tag);
}
return true;
}
if (tag.equals(CaldavTags.recipient)) {
final Collection r = ev.getRecipients();
if ((r == null) || (r.isEmpty())) {
return true;
}
xml.openTag(tag);
for (final String recip: r) {
xml.property(WebdavTags.href, recip);
}
xml.closeTag(tag);
return true;
}
if (tag.equals(AppleServerTags.scheduleChanges)) {
final List xps =
ev.getXproperties(BwXproperty.bedeworkChanges);
if (Util.isEmpty(xps)) {
return true;
}
final BwXproperty xp = xps.get(0);
final String[] vals = xp.getValue().split(";");
xml.openTag(tag);
xml.property(AppleServerTags.dtstamp, vals[0]);
xml.openTag(AppleServerTags.action);
final QName actionTag;
if ("CANCEL".equals(vals[1])) {
actionTag = AppleServerTags.cancel;
} else if ("CREATE".equals(vals[1])) {
actionTag = AppleServerTags.create;
} else if ("REPLY".equals(vals[1])) {
actionTag = AppleServerTags.reply;
} else { // "UPDATE"
actionTag = AppleServerTags.update;
}
xml.openTag(actionTag);
int i = 2;
while (i < vals.length) {
/* Next is master or rid */
xml.openTag(AppleServerTags.recurrence);
String val = vals[i];
if ("MASTER".equals(val)) {
xml.emptyTag(AppleServerTags.master);
i++;
}
if (val.startsWith("RID=")) {
xml.openTagNoNewline(AppleServerTags.recurrenceid);
xml.value(val);
xml.closeTag(AppleServerTags.recurrenceid);
i++;
}
if ((i < vals.length) && "CHANGES".equals(vals[i])) {
i++;
xml.openTag(AppleServerTags.changes);
while (i < vals.length) {
val = vals[i];
if ("MASTER".equals(val) ||
"CHANGES".equals(val) ||
val.startsWith("RID=")) {
break;
}
xml.startTag(AppleServerTags.changedProperty);
xml.attribute("name", val);
xml.endEmptyTag();
i++;
}
xml.closeTag(AppleServerTags.changes);
}
xml.closeTag(AppleServerTags.recurrence);
}
xml.closeTag(actionTag);
xml.closeTag(AppleServerTags.action);
xml.closeTag(tag);
return true;
}
/* =============== ICalTags follow ================= */
if (tag.equals(ICalTags.action)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.attach)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.attendee)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.categories)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags._class)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.comment)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.completed)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.contact)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.created)) {
xml.property(tag, ev.getCreated());
return true;
}
if (tag.equals(ICalTags.description)) {
if (ev.getDescription() != null) {
xml.property(tag, ev.getDescription());
}
return true;
}
if (tag.equals(ICalTags.dtend)) {
xml.property(tag, ev.getDtend().getDate());
return true;
}
if (tag.equals(ICalTags.dtstamp)) {
xml.property(tag, ev.getDtstamp());
return true;
}
if (tag.equals(ICalTags.dtstart)) {
xml.property(tag, ev.getDtstart().getDate());
return true;
}
/* TODO
if (tag.equals(ICalTags.due)) {
pv.val = ev.
return pv;
}
*/
if (tag.equals(ICalTags.duration)) {
xml.property(tag, ev.getDuration());
return true;
}
if (tag.equals(ICalTags.exdate)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.exrule)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.freebusy)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.geo)) {
// PROPTODO
return true;
}
/*
if (tag.equals(ICalTags.hasRecurrence)) {
pv.val = ev
return pv;
}
if (tag.equals(ICalTags.hasAlarm)) {
pv.val = ev
return pv;
}
if (tag.equals(ICalTags.hasAttachment)) {
pv.val = ev
return pv;
}*/
if (tag.equals(ICalTags.lastModified)) {
xml.property(tag, ev.getLastmod());
return true;
}
if (tag.equals(ICalTags.location)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.organizer)) {
final var owner = ev.getSchedulingInfo()
.getSchedulingOwner()
.getCalendarAddress();
if (owner != null) {
xml.property(tag, owner);
}
return true;
}
if (tag.equals(ICalTags.percentComplete)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.priority)) {
final Integer val = ev.getPriority();
if ((val != null) && (val != 0)) {
xml.property(tag, String.valueOf(val));
}
return true;
}
if (tag.equals(ICalTags.rdate)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.recurrenceId)) {
if (ev.getRecurrenceId() != null) {
xml.property(tag, ev.getRecurrenceId());
}
return true;
}
if (tag.equals(ICalTags.relatedTo)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.repeat)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.resources)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.requestStatus)) {
// PROPTODO
/*
if (ev.getRequestStatus() != null) {
xml.property(tag, ev.getRequestStatus().strVal());
}
*/
return true;
}
if (tag.equals(ICalTags.rrule)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.sequence)) {
xml.property(tag, String.valueOf(ev.getSequence()));
return true;
}
if (tag.equals(ICalTags.status)) {
xml.property(tag, ev.getStatus());
return true;
}
if (tag.equals(ICalTags.summary)) {
xml.property(tag, ev.getSummary());
return true;
}
if (tag.equals(ICalTags.transp)) {
xml.property(tag, ev.getPeruserTransparency(intf.getPrincipal().getPrincipalRef()));
return true;
}
if (tag.equals(ICalTags.trigger)) {
// PROPTODO
return true;
}
if (tag.equals(ICalTags.uid)) {
xml.property(tag, ev.getUid());
return true;
}
if (tag.equals(ICalTags.url)) {
if (ev.getLink() != null) {
xml.property(tag, ev.getLink());
}
return true;
}
if (tag.equals(ICalTags.version)) {
// PROPTODO
return true;
}
return false;
}
@Override
public String toIcalString(final int methodType,
final String contentType) {
try {
if (contentType.equals("text/calendar")) {
return IcalTranslator.freebusyToIcalString(methodType, getEv());
}
if (contentType.equals("application/calendar+json")) {
return intf.toJcal(this,
methodType != ScheduleMethods.methodTypeNone);
}
throw new RuntimeException("Unhandled content type" + contentType);
} catch (final Throwable t) {
throw new RuntimeException(t);
}
}
/* ====================================================================
* Overrides
* ==================================================================== */
@Override
public void setName(final String val) {
getEv().setName(val);
}
@Override
public String getName() {
return getEv().getName();
}
@Override
public void setDisplayName(final String val) {
// No display name
}
@Override
public String getDisplayName() {
return getEv().getSummary();
}
@Override
public void setPath(final String val) {
// Not actually saved
}
@Override
public String getPath() {
return getEv().getColPath() + "/" + getEv().getName();
}
@Override
public void setParentPath(final String val) {
getEv().setColPath(val);
}
@Override
public String getParentPath() {
return getEv().getColPath();
}
@Override
public void setOwner(final AccessPrincipal val) {
getEv().setOwnerHref(val.getPrincipalRef());
}
@Override
public AccessPrincipal getOwner() {
try {
return intf.getPrincipal(getEv().getOwnerHref());
} catch (final WebdavException e) {
throw new RuntimeException(e);
}
}
@Override
public void setCreated(final String val) {
getEv().setCreated(val);
}
@Override
public String getCreated() {
return getEv().getCreated();
}
@Override
public void setLastmod(final String val) {
getEv().setLastmod(val);
}
@Override
public String getLastmod() {
return getEv().getLastmod();
}
@Override
public String getEtag() {
return "\"" + getEv().getCtoken() + "\"";
// return "\"" + getEv().getLastmod() + "-" +
// "0" + // < Should be a sequence - needs to be in event and saved
// "\"";
}
@Override
public String getPreviousEtag() {
return "\"" + getEvinfo().getPrevCtoken() + "\"";
}
@Override
public void setDescription(final String val) {
getEv().setDescription(val);
}
@Override
public String getDescription() {
return getEv().getDescription();
}
/* ====================================================================
* Object methods
* ==================================================================== */
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("BwCalDAVEvent{");
try {
sb.append(getEv().toString());
} catch (final Throwable t) {
sb.append(t);
}
sb.append("}");
return sb.toString();
}
/* ====================================================================
* Private methods
* ==================================================================== */
EventInfo getEvinfo() {
if (evi == null) {
evi = new EventInfo(new BwEventObj());
ev = evi.getEvent();
}
return evi;
}
BwEvent getEv() {
getEvinfo();
return ev;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy