use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class BwObjectFilter method match.
/* ====================================================================
* matching methods
* ==================================================================== */
@Override
public boolean match(final Object o, final String userHref) throws WebdavException {
ObjectFilter of = getEntity();
Object ent = of.getEntity();
boolean not = of.getNot();
String val = null;
Integer ival = null;
if (ent instanceof BwCalendar) {
val = ((BwCalendar) ent).getPath();
} else if (ent instanceof String) {
val = (String) ent;
} else if (ent instanceof Integer) {
ival = (Integer) ent;
} else {
throw new WebdavException("Unmatchable filter");
}
BwEvent ev = null;
if (o instanceof BwEvent) {
ev = (BwEvent) o;
}
if (of instanceof EntityTypeFilter) {
if (ev == null) {
return false;
}
if (not) {
return ev.getEntityType() != ival;
}
return ev.getEntityType() == ival;
}
PropertyInfoIndex pii = of.getPropertyIndex();
BwIcalPropertyInfoEntry pi = BwIcalPropertyInfo.getPinfo(pii);
if (pi.getParam()) {
pii = of.getParentPropertyIndex();
}
switch(pii) {
case CLASS:
if (ev.getClassification() == null) {
return false;
}
return stringMatch(ev.getClassification(), val);
case CREATED:
return stringMatch(ev.getCreated(), val);
case DESCRIPTION:
for (BwLongString ls : ev.getDescriptions()) {
if (stringMatch(ls.getValue(), val)) {
return true;
}
}
return false;
case DTSTAMP:
return stringMatch(ev.getDtstamp(), val);
case DTEND:
/* Event only */
case DUE:
/* Todo only */
return matchDateTime(pi, ev.getDtend(), val);
case DTSTART:
return matchDateTime(pi, ev.getDtstart(), val);
case DURATION:
return stringMatch(ev.getDuration(), val);
case GEO:
if (ev.getGeo() == null) {
return false;
}
return stringMatch(ev.getGeo().toString(), val);
case LAST_MODIFIED:
return stringMatch(ev.getLastmod(), val);
case LOCATION:
if (ev.getLocation() == null) {
return false;
}
return stringMatch(ev.getLocation().getAddress().getValue(), val);
case ORGANIZER:
if (ev.getOrganizer() == null) {
return false;
}
return stringMatch(ev.getOrganizer().getOrganizerUri(), val);
case PRIORITY:
if (ev.getPriority() == null) {
return false;
}
return stringMatch(String.valueOf(ev.getPriority()), val);
case RECURRENCE_ID:
if (ev.getRecurrenceId() == null) {
return false;
}
return stringMatch(ev.getRecurrenceId(), val);
case SEQUENCE:
return stringMatch(String.valueOf(ev.getSequence()), val);
case STATUS:
if (ev.getStatus() == null) {
return false;
}
return stringMatch(ev.getStatus(), val);
case SUMMARY:
for (BwString s : ev.getSummaries()) {
if (stringMatch(s.getValue(), val)) {
return true;
}
}
return false;
case UID:
return stringMatch(ev.getUid(), val);
case URL:
if (ev.getLink() == null) {
return false;
}
return stringMatch(ev.getLink(), val);
case TRANSP:
try {
if (ev.getPeruserTransparency(userHref) == null) {
return false;
}
return stringMatch(ev.getPeruserTransparency(userHref), val);
} catch (Throwable t) {
throw new WebdavException(t);
}
case COMPLETED:
if (ev.getCompleted() == null) {
return false;
}
return stringMatch(ev.getCompleted(), val);
case PERCENT_COMPLETE:
if (ev.getPercentComplete() == null) {
return false;
}
return stringMatch(String.valueOf(ev.getPercentComplete()), val);
case ATTACH:
break;
case ATTENDEE:
break;
case CATEGORIES:
for (BwCategory cat : ev.getCategories()) {
if (stringMatch(cat.getWordVal(), val)) {
return true;
}
}
return false;
case COMMENT:
for (BwString s : ev.getComments()) {
if (stringMatch(s.getValue(), val)) {
return true;
}
}
return false;
case CONTACT:
for (BwContact c : ev.getContacts()) {
if (stringMatch(c.getCn().getValue(), val)) {
return true;
}
}
return false;
case EXDATE:
for (BwDateTime dt : ev.getExdates()) {
if (stringMatch(dt.getDtval(), val)) {
return true;
}
}
return false;
case EXRULE:
for (String s : ev.getExrules()) {
if (stringMatch(s, val)) {
return true;
}
}
return false;
case REQUEST_STATUS:
for (BwRequestStatus rs : ev.getRequestStatuses()) {
if (stringMatch(rs.getCode(), val)) {
return true;
}
}
return false;
case RELATED_TO:
if (ev.getRelatedTo() == null) {
return false;
}
return stringMatch(ev.getRelatedTo().getValue(), val);
case RESOURCES:
for (BwString s : ev.getResources()) {
if (stringMatch(s.getValue(), val)) {
return true;
}
}
return false;
case RDATE:
for (BwDateTime dt : ev.getRdates()) {
if (stringMatch(dt.getDtval(), val)) {
return true;
}
}
return false;
case RRULE:
for (String s : ev.getRrules()) {
if (stringMatch(s, val)) {
return true;
}
}
return false;
case FREEBUSY:
break;
case TZID:
break;
case TZNAME:
break;
case TZOFFSETFROM:
break;
case TZOFFSETTO:
break;
case TZURL:
break;
case ACTION:
break;
case REPEAT:
break;
case TRIGGER:
break;
case COLLECTION:
return stringMatch(ev.getColPath(), val);
case CREATOR:
return stringMatch(ev.getCreatorHref(), val);
case OWNER:
return stringMatch(ev.getOwnerHref(), val);
case ENTITY_TYPE:
break;
}
return false;
}
use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class ToXEvent method toComponent.
/**
* Make a BaseComponentType component from a BwEvent object. This may produce a
* VEvent, VTodo or VJournal.
*
* @param val
* @param isOverride - true if event object is an override
* @param pattern - if non-null limit returned components and values to those
* supplied in the pattern.
* @return JAXBElement<? extends BaseComponentType>
* @throws CalFacadeException
*/
public static JAXBElement<? extends BaseComponentType> toComponent(final BwEvent val, final boolean isOverride, final boolean wrapXprops, final BaseComponentType pattern) throws CalFacadeException {
if (val == null) {
return null;
}
boolean isInstance = false;
try {
JAXBElement<? extends BaseComponentType> el;
boolean freeBusy = false;
boolean todo = false;
int entityType = val.getEntityType();
if (entityType == IcalDefs.entityTypeEvent) {
el = of.createVevent(new VeventType());
} else if (entityType == IcalDefs.entityTypeTodo) {
el = of.createVtodo(new VtodoType());
todo = true;
} else if (entityType == IcalDefs.entityTypeJournal) {
el = of.createVjournal(new VjournalType());
} else if (entityType == IcalDefs.entityTypeFreeAndBusy) {
el = of.createVfreebusy(new VfreebusyType());
freeBusy = true;
} else {
throw new CalFacadeException("org.bedework.invalid.entity.type", String.valueOf(entityType));
}
BaseComponentType comp = el.getValue();
Class masterClass = comp.getClass();
comp.setProperties(new ArrayOfProperties());
List<JAXBElement<? extends BasePropertyType>> pl = comp.getProperties().getBasePropertyOrTzid();
if (emit(pattern, masterClass, RecurrenceIdPropType.class)) {
String strval = val.getRecurrenceId();
if ((strval != null) && (strval.length() > 0)) {
isInstance = true;
// DORECUR - we should be restoring to original form.
/* Try using timezone from dtstart so we can more often be in same form
* as original.
*/
BwDateTime dts = val.getDtstart();
RecurrenceIdPropType ri = new RecurrenceIdPropType();
String tzid = null;
if (dts.getDateType()) {
// RECUR - fix all day recurrences sometime
if (strval.length() > 8) {
// Try to fix up bad all day recurrence ids. - assume a local timezone
strval = strval.substring(0, 8);
}
ri.setDate(XcalUtil.fromDtval(strval));
} else {
if (!val.getForceUTC()) {
if ((dts != null) && !dts.isUTC()) {
tzid = dts.getTzid();
}
}
XcalUtil.initDt(ri, strval, tzid);
}
pl.add(of.createRecurrenceId(ri));
}
}
/* ------------------- Alarms -------------------- */
processEventAlarm(val, comp, pattern, masterClass);
/* ------------------- Attachments -------------------- */
if (emit(pattern, masterClass, AttachPropType.class)) {
if (val.getNumAttachments() > 0) {
for (BwAttachment att : val.getAttachments()) {
// pl.add(setAttachment(att));
}
}
}
/* ------------------- Attendees -------------------- */
if (emit(pattern, masterClass, AttendeePropType.class)) {
if (val.getNumAttendees() > 0) {
for (BwAttendee att : val.getAttendees()) {
pl.add(of.createAttendee(makeAttendee(att)));
}
}
}
if (emit(pattern, masterClass, CategoriesPropType.class)) {
if (val.getNumCategories() > 0) {
// LANG - filter on language - group language in one cat list?
for (BwCategory cat : val.getCategories()) {
CategoriesPropType c = new CategoriesPropType();
c.getText().add(cat.getWord().getValue());
pl.add(of.createCategories((CategoriesPropType) langProp(c, cat.getWord())));
}
}
}
if (emit(pattern, masterClass, ClassPropType.class)) {
String pval = val.getClassification();
if (pval != null) {
ClassPropType c = new ClassPropType();
c.setText(pval);
pl.add(of.createClass(c));
}
}
if (emit(pattern, masterClass, CommentPropType.class)) {
if (val.getNumComments() > 0) {
for (BwString str : val.getComments()) {
CommentPropType c = new CommentPropType();
c.setText(str.getValue());
pl.add(of.createComment((CommentPropType) langProp(c, str)));
}
}
}
if (emit(pattern, masterClass, CompletedPropType.class)) {
if ((entityType == IcalDefs.entityTypeTodo) && (val.getCompleted() != null)) {
CompletedPropType c = new CompletedPropType();
c.setUtcDateTime(XcalUtil.getXMlUTCCal(val.getCompleted()));
pl.add(of.createCompleted(c));
}
}
if (emit(pattern, masterClass, ContactPropType.class)) {
if (val.getNumContacts() > 0) {
for (BwContact ctct : val.getContacts()) {
// LANG
ContactPropType c = new ContactPropType();
c.setText(ctct.getCn().getValue());
pl.add(of.createContact((ContactPropType) langProp(uidProp(altrepProp(c, ctct.getLink()), ctct.getUid()), ctct.getCn())));
}
}
}
if (emit(pattern, masterClass, CreatedPropType.class)) {
CreatedPropType created = new CreatedPropType();
created.setUtcDateTime(XcalUtil.getXMlUTCCal(val.getCreated()));
pl.add(of.createCreated(created));
}
if (emit(pattern, masterClass, DescriptionPropType.class)) {
BwStringBase bwstr = val.findDescription(null);
if (bwstr != null) {
DescriptionPropType desc = new DescriptionPropType();
if (bwstr.getValue().contains("Â")) {
warn("Odd character  in description: " + bwstr.getValue());
}
desc.setText(bwstr.getValue());
pl.add(of.createDescription((DescriptionPropType) langProp(desc, bwstr)));
}
}
if ((todo && emit(pattern, masterClass, DuePropType.class)) || (!todo && emit(pattern, masterClass, DtendPropType.class))) {
if (val.getEndType() == BwEvent.endTypeDate) {
if (todo) {
DuePropType due = (DuePropType) makeDateDatetime(new DuePropType(), val.getDtend(), freeBusy | val.getForceUTC());
pl.add(of.createDue(due));
} else {
DtendPropType dtend = (DtendPropType) makeDateDatetime(new DtendPropType(), val.getDtend(), freeBusy | val.getForceUTC());
pl.add(of.createDtend(dtend));
}
} else if (val.getEndType() == BwEvent.endTypeDuration) {
DurationPropType dur = new DurationPropType();
dur.setDuration(val.getDuration());
pl.add(of.createDuration(dur));
}
}
if (emit(pattern, masterClass, DtstampPropType.class)) {
DtstampPropType dtstamp = new DtstampPropType();
dtstamp.setUtcDateTime(XcalUtil.getXMlUTCCal(val.getDtstamp()));
pl.add(of.createDtstamp(dtstamp));
}
if (emit(pattern, masterClass, DtstartPropType.class)) {
if ((val.getNoStart() == null) || !val.getNoStart()) {
DtstartPropType dtstart = (DtstartPropType) makeDateDatetime(new DtstartPropType(), val.getDtstart(), freeBusy | val.getForceUTC());
pl.add(of.createDtstart(dtstart));
}
}
if (emit(pattern, masterClass, FreebusyPropType.class)) {
if (entityType == IcalDefs.entityTypeFreeAndBusy) {
Collection<BwFreeBusyComponent> fbps = val.getFreeBusyPeriods();
if (fbps != null) {
for (BwFreeBusyComponent fbc : fbps) {
FreebusyPropType fb = new FreebusyPropType();
/*
int type = fbc.getType();
FbtypeValueType fbtype;
if (type == BwFreeBusyComponent.typeBusy) {
fbtype = FbtypeValueType.BUSY;
} else if (type == BwFreeBusyComponent.typeFree) {
fbtype = FbtypeValueType.FREE;
} else if (type == BwFreeBusyComponent.typeBusyUnavailable) {
fbtype = FbtypeValueType.BUSY_UNAVAILABLE;
} else if (type == BwFreeBusyComponent.typeBusyTentative) {
fbtype = FbtypeValueType.BUSY_TENTATIVE;
} else {
fbtype = FbtypeValueType.BUSY;
// throw new CalFacadeException("Bad free-busy type " + type);
}
ArrayOfParameters pars = getAop(fb);
FbtypeParamType f = new FbtypeParamType();
f.setText(fbtype.name());
*/
ArrayOfParameters pars = getAop(fb);
FbtypeParamType f = new FbtypeParamType();
f.setText(BwFreeBusyComponent.fbtypes[fbc.getType()]);
JAXBElement<FbtypeParamType> param = of.createFbtype(f);
pars.getBaseParameter().add(param);
List<PeriodType> pdl = fb.getPeriod();
for (Period p : fbc.getPeriods()) {
PeriodType np = new PeriodType();
np.setStart(XcalUtil.getXMlUTCCal(p.getStart().toString()));
np.setEnd(XcalUtil.getXMlUTCCal(p.getEnd().toString()));
pdl.add(np);
}
pl.add(of.createFreebusy(fb));
}
}
}
}
if (emit(pattern, masterClass, GeoPropType.class)) {
BwGeo geo = val.getGeo();
if (geo != null) {
GeoPropType g = new GeoPropType();
g.setLatitude(geo.getLatitude().floatValue());
g.setLatitude(geo.getLongitude().floatValue());
pl.add(of.createGeo(g));
}
}
if (emit(pattern, masterClass, LastModifiedPropType.class)) {
LastModifiedPropType lm = new LastModifiedPropType();
lm.setUtcDateTime(XcalUtil.getXMlUTCCal(val.getLastmod()));
pl.add(of.createLastModified(lm));
}
if (emit(pattern, masterClass, LocationPropType.class)) {
BwLocation loc = val.getLocation();
if (loc != null) {
LocationPropType l = new LocationPropType();
l.setText(loc.getAddress().getValue());
pl.add(of.createLocation((LocationPropType) langProp(uidProp(l, loc.getUid()), loc.getAddress())));
}
}
if (emit(pattern, masterClass, OrganizerPropType.class)) {
BwOrganizer org = val.getOrganizer();
if (org != null) {
pl.add(of.createOrganizer(makeOrganizer(org)));
}
}
if (emit(pattern, masterClass, PercentCompletePropType.class)) {
Integer pc = val.getPercentComplete();
if (pc != null) {
PercentCompletePropType p = new PercentCompletePropType();
p.setInteger(BigInteger.valueOf(pc));
pl.add(of.createPercentComplete(p));
}
}
if (emit(pattern, masterClass, PriorityPropType.class)) {
Integer prio = val.getPriority();
if (prio != null) {
PriorityPropType p = new PriorityPropType();
p.setInteger(BigInteger.valueOf(prio));
pl.add(of.createPriority(p));
}
}
if (emit(pattern, masterClass, RelatedToPropType.class)) {
BwRelatedTo relto = val.getRelatedTo();
if (relto != null) {
RelatedToPropType rt = new RelatedToPropType();
rt.setUid(relto.getValue());
if (relto.getRelType() != null) {
ArrayOfParameters pars = getAop(rt);
ReltypeParamType r = new ReltypeParamType();
r.setText(relto.getRelType());
JAXBElement<ReltypeParamType> param = of.createReltype(r);
pars.getBaseParameter().add(param);
}
pl.add(of.createRelatedTo(rt));
}
}
if (emit(pattern, masterClass, ResourcesPropType.class)) {
if (val.getNumResources() > 0) {
/* This event has a resource */
ResourcesPropType r = new ResourcesPropType();
List<String> rl = r.getText();
for (BwString str : val.getResources()) {
// LANG
rl.add(str.getValue());
}
pl.add(of.createResources(r));
}
}
if (emit(pattern, masterClass, SequencePropType.class)) {
if (val.getSequence() > 0) {
SequencePropType s = new SequencePropType();
s.setInteger(BigInteger.valueOf(val.getSequence()));
pl.add(of.createSequence(s));
}
}
if (emit(pattern, masterClass, StatusPropType.class)) {
String status = val.getStatus();
if ((status != null) && !status.equals(BwEvent.statusMasterSuppressed)) {
StatusPropType s = new StatusPropType();
s.setText(status);
pl.add(of.createStatus(s));
}
}
if (emit(pattern, masterClass, SummaryPropType.class)) {
BwString bwstr = val.findSummary(null);
if (bwstr != null) {
SummaryPropType s = new SummaryPropType();
s.setText(bwstr.getValue());
s = (SummaryPropType) langProp(s, bwstr);
pl.add(of.createSummary(s));
}
}
if (emit(pattern, masterClass, TranspPropType.class)) {
String strval = val.getTransparency();
if ((strval != null) && (strval.length() > 0)) {
TranspPropType t = new TranspPropType();
t.setText(strval);
pl.add(of.createTransp(t));
}
}
if (emit(pattern, masterClass, UidPropType.class)) {
UidPropType uid = new UidPropType();
uid.setText(val.getUid());
pl.add(of.createUid(uid));
}
if (emit(pattern, masterClass, UrlPropType.class)) {
String strval = val.getLink();
if (strval != null) {
// Possibly drop this if we do it on input and check all data
strval = strval.trim();
}
if ((strval != null) && (strval.length() > 0)) {
UrlPropType u = new UrlPropType();
u.setUri(strval);
pl.add(of.createUrl(u));
}
}
if (emit(pattern, masterClass, XBedeworkCostPropType.class)) {
if (val.getCost() != null) {
XBedeworkCostPropType c = new XBedeworkCostPropType();
c.setText(val.getCost());
pl.add(of.createXBedeworkCost(c));
}
}
if (val.getNumXproperties() > 0) {
try {
xpropertiesToXcal(pl, val.getXproperties(), pattern, masterClass, wrapXprops);
} catch (Throwable t) {
// XXX For the moment swallow these.
error(t);
}
}
if (!isInstance && !isOverride && val.testRecurring()) {
doRecurring(pattern, masterClass, val, pl);
}
return el;
} catch (final CalFacadeException cfe) {
throw cfe;
} catch (final Throwable t) {
throw new CalFacadeException(t);
}
}
use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class VEventUtil method toIcalComponent.
/**
* Make an Icalendar component from a BwEvent object. This may produce a
* VEvent, VTodo, VJournal or VPoll.
*
* @param ei the event
* @param isOverride - true if event object is an override
* @param tzreg - timezone registry
* @param currentPrincipal - href for current authenticated user
* @return Component
* @throws CalFacadeException
*/
public static Component toIcalComponent(final EventInfo ei, final boolean isOverride, final TimeZoneRegistry tzreg, final String currentPrincipal) throws CalFacadeException {
if ((ei == null) || (ei.getEvent() == null)) {
return null;
}
final BwEvent val = ei.getEvent();
boolean isInstance = false;
try {
Component xcomp = null;
Calendar cal = null;
final List<BwXproperty> xcompProps = val.getXproperties(BwXproperty.bedeworkIcal);
if (!Util.isEmpty(xcompProps)) {
final BwXproperty xcompProp = xcompProps.get(0);
final String xcompPropVal = xcompProp.getValue();
if (xcompPropVal != null) {
final StringBuilder sb = new StringBuilder();
final Icalendar ic = new Icalendar();
try {
sb.append("BEGIN:VCALENDAR\n");
sb.append(Version.VERSION_2_0.toString());
sb.append("\n");
sb.append(xcompPropVal);
if (!xcompPropVal.endsWith("\n")) {
sb.append("\n");
}
sb.append("END:VCALENDAR\n");
CalendarBuilder bldr = new CalendarBuilder(new CalendarParserImpl(), ic);
UnfoldingReader ufrdr = new UnfoldingReader(new StringReader(sb.toString()), true);
cal = bldr.build(ufrdr);
} catch (Throwable t) {
error(t);
error("Trying to parse:\n" + xcompPropVal);
}
}
}
Component comp;
PropertyList pl = new PropertyList();
boolean freeBusy = false;
boolean vavail = false;
boolean todo = false;
boolean vpoll = false;
int entityType = val.getEntityType();
if (entityType == IcalDefs.entityTypeEvent) {
comp = new VEvent(pl);
} else if (entityType == IcalDefs.entityTypeTodo) {
comp = new VToDo(pl);
todo = true;
} else if (entityType == IcalDefs.entityTypeJournal) {
comp = new VJournal(pl);
} else if (entityType == IcalDefs.entityTypeFreeAndBusy) {
comp = new VFreeBusy(pl);
freeBusy = true;
} else if (entityType == IcalDefs.entityTypeVavailability) {
comp = new VAvailability(pl);
vavail = true;
} else if (entityType == IcalDefs.entityTypeAvailable) {
comp = new Available(pl);
} else if (entityType == IcalDefs.entityTypeVpoll) {
comp = new VPoll(pl);
vpoll = true;
} else {
throw new CalFacadeException("org.bedework.invalid.entity.type", String.valueOf(entityType));
}
if (cal != null) {
xcomp = cal.getComponent(comp.getName());
}
Property prop;
/* ------------------- RecurrenceID --------------------
* Done early so we know if this is an instance.
*/
String strval = val.getRecurrenceId();
if ((strval != null) && (strval.length() > 0)) {
isInstance = true;
pl.add(new RecurrenceId(makeZonedDt(val, strval)));
}
/* ------------------- Alarms -------------------- */
VAlarmUtil.processEventAlarm(val, comp, currentPrincipal);
/* ------------------- Attachments -------------------- */
if (val.getNumAttachments() > 0) {
for (BwAttachment att : val.getAttachments()) {
pl.add(setAttachment(att));
}
}
/* ------------------- Attendees -------------------- */
if (!vpoll && (val.getNumAttendees() > 0)) {
for (BwAttendee att : val.getAttendees()) {
prop = setAttendee(att);
mergeXparams(prop, xcomp);
pl.add(prop);
}
}
if (val.getNumCategories() > 0) {
// LANG - filter on language - group language in one cat list?
for (BwCategory cat : val.getCategories()) {
prop = new Categories();
TextList cl = ((Categories) prop).getCategories();
cl.add(cat.getWord().getValue());
pl.add(langProp(prop, cat.getWord()));
}
}
/* ------------------- Class -------------------- */
final String pval = val.getClassification();
if (pval != null) {
pl.add(new Clazz(pval));
}
if (val.getNumComments() > 0) {
for (final BwString str : val.getComments()) {
pl.add(langProp(new Comment(str.getValue()), str));
}
}
if ((todo || vpoll) && (val.getCompleted() != null)) {
prop = new Completed(new DateTime(val.getCompleted()));
pl.add(prop);
}
if (val.getNumContacts() > 0) {
for (final BwContact c : val.getContacts()) {
// LANG
prop = new Contact(c.getCn().getValue());
final String l = c.getLink();
if (l != null) {
prop.getParameters().add(new AltRep(l));
}
pl.add(langProp(uidProp(prop, c.getUid()), c.getCn()));
}
}
if (val.getCost() != null) {
IcalUtil.addXproperty(pl, BwXproperty.bedeworkCost, null, val.getCost());
}
/* ------------------- Created -------------------- */
prop = new Created(val.getCreated());
// if (pars.includeDateTimeProperty) {
// prop.getParameters().add(Value.DATE_TIME);
// }
pl.add(prop);
if (val.getDeleted()) {
IcalUtil.addXproperty(pl, BwXproperty.bedeworkDeleted, null, String.valueOf(val.getDeleted()));
}
/* ------------------- Description -------------------- */
BwStringBase bwstr = val.findDescription(null);
if (bwstr != null) {
pl.add(langProp(new Description(bwstr.getValue()), bwstr));
}
if (val.getEndType() == StartEndComponent.endTypeDate) {
if (todo) {
Due due = val.getDtend().makeDue(tzreg);
if (freeBusy | val.getForceUTC()) {
due.setUtc(true);
}
pl.add(due);
} else {
DtEnd dtend = val.getDtend().makeDtEnd(tzreg);
if (freeBusy | val.getForceUTC()) {
dtend.setUtc(true);
}
pl.add(dtend);
}
} else if (val.getEndType() == StartEndComponent.endTypeDuration) {
addProperty(comp, new Duration(new Dur(val.getDuration())));
}
/* ------------------- DtStamp -------------------- */
prop = new DtStamp(new DateTime(val.getDtstamp()));
// if (pars.includeDateTimeProperty) {
// prop.getParameters().add(Value.DATE_TIME);
// }
pl.add(prop);
if (!val.getNoStart()) {
DtStart dtstart = val.getDtstart().makeDtStart(tzreg);
if (freeBusy | val.getForceUTC()) {
dtstart.setUtc(true);
}
pl.add(dtstart);
}
if (freeBusy) {
Collection<BwFreeBusyComponent> fbps = val.getFreeBusyPeriods();
if (fbps != null) {
for (BwFreeBusyComponent fbc : fbps) {
FreeBusy fb = new FreeBusy();
int type = fbc.getType();
if (type == BwFreeBusyComponent.typeBusy) {
addParameter(fb, FbType.BUSY);
} else if (type == BwFreeBusyComponent.typeFree) {
addParameter(fb, FbType.FREE);
} else if (type == BwFreeBusyComponent.typeBusyUnavailable) {
addParameter(fb, FbType.BUSY_UNAVAILABLE);
} else if (type == BwFreeBusyComponent.typeBusyTentative) {
addParameter(fb, FbType.BUSY_TENTATIVE);
} else {
throw new CalFacadeException("Bad free-busy type " + type);
}
PeriodList pdl = fb.getPeriods();
for (Period p : fbc.getPeriods()) {
// XXX inverse.ca plugin cannot handle durations.
Period np = new Period(p.getStart(), p.getEnd());
pdl.add(np);
}
pl.add(fb);
}
}
}
if (!vpoll) {
BwGeo bwgeo = val.getGeo();
if (bwgeo != null) {
Geo geo = new Geo(bwgeo.getLatitude(), bwgeo.getLongitude());
pl.add(geo);
}
}
/* ------------------- LastModified -------------------- */
prop = new LastModified(new DateTime(val.getLastmod()));
// if (pars.includeDateTimeProperty) {
// prop.getParameters().add(Value.DATE_TIME);
// }
pl.add(prop);
if (!vpoll) {
final BwLocation loc = val.getLocation();
if (loc != null) {
prop = new Location(loc.getCombinedValues());
pl.add(langProp(uidProp(prop, loc.getUid()), loc.getAddress()));
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationAddr, null, loc.getAddressField());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationRoom, null, loc.getRoomField());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationAccessible, null, String.valueOf(loc.getAccessible()));
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationSfield1, null, loc.getSubField1());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationSfield2, null, loc.getSubField2());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationGeo, null, loc.getGeouri());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationStreet, null, loc.getStreet());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationCity, null, loc.getCity());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationState, null, loc.getState());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationZip, null, loc.getZip());
IcalUtil.addXproperty(pl, BwXproperty.xBedeworkLocationLink, null, loc.getLink());
}
}
/* ------------------- Organizer -------------------- */
BwOrganizer org = val.getOrganizer();
if (org != null) {
prop = setOrganizer(org);
mergeXparams(prop, xcomp);
pl.add(prop);
}
if (todo) {
Integer pc = val.getPercentComplete();
if (pc != null) {
pl.add(new PercentComplete(pc.intValue()));
}
}
/* ------------------- Priority -------------------- */
Integer prio = val.getPriority();
if (prio != null) {
pl.add(new Priority(prio.intValue()));
}
/* ------------------- RDate -below------------------- */
/* ------------------- RelatedTo -------------------- */
/* We encode related to (maybe) as triples - reltype, value-type, value */
String[] info = null;
BwRelatedTo relto = val.getRelatedTo();
if (relto != null) {
info = new String[3];
info[0] = relto.getRelType();
// default
info[1] = "";
info[2] = relto.getValue();
} else {
String relx = val.getXproperty(BwXproperty.bedeworkRelatedTo);
if (relx != null) {
info = Util.decodeArray(relx);
}
}
if (info != null) {
int i = 0;
while (i < info.length) {
RelatedTo irelto;
String reltype = info[i];
String valtype = info[i + 1];
String relval = info[i + 2];
ParameterList rtpl = null;
if (reltype.length() > 0) {
rtpl = new ParameterList();
rtpl.add(new RelType(reltype));
}
if (valtype.length() > 0) {
if (rtpl == null) {
rtpl = new ParameterList();
}
rtpl.add(new Value(valtype));
}
if (rtpl != null) {
irelto = new RelatedTo(rtpl, relval);
} else {
irelto = new RelatedTo(relval);
}
pl.add(irelto);
i += 3;
}
}
if (val.getNumResources() > 0) {
/* This event has a resource */
prop = new Resources();
TextList rl = ((Resources) prop).getResources();
for (BwString str : val.getResources()) {
// LANG
rl.add(str.getValue());
}
pl.add(prop);
}
if (val.getSequence() > 0) {
pl.add(new Sequence(val.getSequence()));
}
/* ------------------- Status -------------------- */
String status = val.getStatus();
if ((status != null) && !status.equals(BwEvent.statusMasterSuppressed)) {
pl.add(new Status(status));
}
/* ------------------- Summary -------------------- */
bwstr = val.findSummary(null);
if (bwstr != null) {
pl.add(langProp(new Summary(bwstr.getValue()), bwstr));
}
if (!todo && !vpoll) {
strval = val.getPeruserTransparency(currentPrincipal);
if ((strval != null) && (strval.length() > 0)) {
pl.add(new Transp(strval));
}
}
/* ------------------- Uid -------------------- */
pl.add(new Uid(val.getUid()));
/* ------------------- Url -------------------- */
strval = val.getLink();
if (strval != null) {
// Possibly drop this if we do it on input and check all data
strval = strval.trim();
}
if ((strval != null) && (strval.length() > 0)) {
URI uri = Util.validURI(strval);
if (uri != null) {
pl.add(new Url(uri));
}
}
if (val.getNumXproperties() > 0) {
try {
IcalUtil.xpropertiesToIcal(pl, val.getXproperties());
} catch (Throwable t) {
// XXX For the moment swallow these.
error(t);
}
}
if (!vpoll && !isInstance && !isOverride && val.testRecurring()) {
doRecurring(val, pl);
}
if (vavail) {
if (ei.getNumContainedItems() > 0) {
final VAvailability va = (VAvailability) comp;
for (final EventInfo aei : ei.getContainedItems()) {
va.getAvailable().add((Available) toIcalComponent(aei, false, tzreg, currentPrincipal));
}
}
/* ----------- Vavailability - busyType ----------------- */
String s = val.getBusyTypeString();
if (s != null) {
pl.add(new BusyType(s));
}
}
if (vpoll) {
final Integer ival = val.getPollWinner();
if (ival != null) {
pl.add(new PollWinner(ival));
}
strval = val.getPollAcceptResponse();
if ((strval != null) && (strval.length() > 0)) {
pl.add(new AcceptResponse(strval));
}
strval = val.getPollMode();
if ((strval != null) && (strval.length() > 0)) {
pl.add(new PollMode(strval));
}
strval = val.getPollProperties();
if ((strval != null) && (strval.length() > 0)) {
pl.add(new PollProperties(strval));
}
final Map<String, VVoter> vvoters = parseVpollVvoters(val);
for (final VVoter vv : vvoters.values()) {
((VPoll) comp).getVoters().add(vv);
}
final Map<Integer, Component> comps = parseVpollCandidates(val);
for (final Component candidate : comps.values()) {
((VPoll) comp).getCandidates().add(candidate);
}
}
return comp;
} catch (final CalFacadeException cfe) {
throw cfe;
} catch (final Throwable t) {
throw new CalFacadeException(t);
}
}
use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class Calendars method getCategorySet.
@Override
public Set<BwCategory> getCategorySet(final String href) throws CalFacadeException {
/* The set of categories referenced by the alias and its parents */
final Collection<BwCalendar> cols;
cols = decomposeVirtualPath(href);
if (Util.isEmpty(cols)) {
if (debug) {
debug("No collections for vpath " + href);
}
return null;
}
/* For each entry in the returned list add any category to the set.
*
* For the last alias entry in the list work up to the root adding any
* categories in.
*/
BwCalendar curCol = null;
final Set<BwCategory> cats = new TreeSet<>();
for (final BwCalendar col : cols) {
int numCats = 0;
final Set<BwCategory> colCats = col.getCategories();
if (!Util.isEmpty(colCats)) {
cats.addAll(colCats);
numCats = colCats.size();
}
if (debug) {
debug("For col " + col.getPath() + " found " + numCats);
}
if (col.getAlias()) {
curCol = col;
}
}
while (curCol != null) {
try {
curCol = get(curCol.getColPath());
if (curCol != null) {
if (!Util.isEmpty(curCol.getCategories())) {
cats.addAll(curCol.getCategories());
}
}
} catch (final CalFacadeAccessException cfae) {
// We'll assume that's OK. We'll get that for /user at least.
break;
}
}
return cats;
}
use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class Events method add.
@Override
public UpdateResult add(final EventInfo ei, final boolean noInvites, final boolean schedulingInbox, final boolean autoCreateCollection, final boolean rollbackOnError) throws CalFacadeException {
try {
if (getPrincipalInfo().getSubscriptionsOnly()) {
throw new CalFacadeForbidden("User has read only access");
}
final UpdateResult updResult = ei.getUpdResult();
updResult.adding = true;
updResult.hasChanged = true;
final BwEvent event = ei.getEvent();
adjustEntities(ei);
final BwPreferences prefs = getSvc().getPrefsHandler().get();
if (prefs != null) {
final Collection<BwCategory> cats = getSvc().getCategoriesHandler().get(prefs.getDefaultCategoryUids());
for (final BwCategory cat : cats) {
event.addCategory(cat);
}
}
final RealiasResult raResp = reAlias(event);
if (raResp.getStatus() != ok) {
throw new CalFacadeException(CalFacadeException.badRequest, "Status: " + raResp.getStatus() + " message: " + raResp.getMessage());
}
// Or just validate?
assignGuid(event);
updateEntities(updResult, event);
BwCalendar cal = validate(event, true, schedulingInbox, autoCreateCollection);
BwEventProxy proxy = null;
BwEvent override = null;
if (event instanceof BwEventProxy) {
proxy = (BwEventProxy) event;
override = proxy.getRef();
setupSharableEntity(override, getPrincipal().getPrincipalRef());
} else {
setupSharableEntity(event, getPrincipal().getPrincipalRef());
if (ei.getNumContainedItems() > 0) {
for (final EventInfo aei : ei.getContainedItems()) {
final BwEvent av = aei.getEvent();
av.setParent(event);
setupSharableEntity(av, getPrincipal().getPrincipalRef());
}
}
}
final BwCalendar undereffedCal = cal;
if (cal.getInternalAlias()) {
/* Resolve the alias and put the event in it's proper place */
// XXX This is probably OK for non-public admin
final boolean setCats = getSvc().getPars().getPublicAdmin();
if (!setCats) {
cal = getCols().resolveAlias(cal, true, false);
} else {
while (true) {
final Set<BwCategory> cats = cal.getCategories();
for (final BwCategory cat : cats) {
event.addCategory(cat);
}
if (!cal.getInternalAlias()) {
break;
}
cal = getCols().resolveAlias(cal, false, false);
}
}
event.setColPath(cal.getPath());
}
if (!cal.getCalendarCollection()) {
throw new CalFacadeAccessException();
}
if (!event.getPublick() && Util.isEmpty(event.getAlarms())) {
setDefaultAlarms(ei, undereffedCal);
}
boolean schedulingObject = false;
if (cal.getCollectionInfo().scheduling && (event.getOrganizerSchedulingObject() || event.getAttendeeSchedulingObject())) {
schedulingObject = true;
}
final Integer maxAttendees = getSvc().getAuthProperties().getMaxAttendeesPerInstance();
if ((maxAttendees != null) && !Util.isEmpty(event.getAttendees()) && (event.getAttendees().size() > maxAttendees)) {
throw new CalFacadeException(CalFacadeException.schedulingTooManyAttendees);
}
event.setDtstamps(getCurrentTimestamp());
if (schedulingObject) {
event.updateStag(getCurrentTimestamp());
}
/* All Overrides go in same calendar and have same name */
final Collection<BwEventProxy> overrides = ei.getOverrideProxies();
if (overrides != null) {
for (final BwEventProxy ovei : overrides) {
setScheduleState(ovei, true, schedulingInbox);
if ((maxAttendees != null) && !Util.isEmpty(ovei.getAttendees()) && (ovei.getAttendees().size() > maxAttendees)) {
throw new CalFacadeException(CalFacadeException.schedulingTooManyAttendees);
}
ovei.setDtstamps(getCurrentTimestamp());
if (cal.getCollectionInfo().scheduling && (ovei.getOrganizerSchedulingObject() || ovei.getAttendeeSchedulingObject())) {
schedulingObject = true;
}
if (schedulingObject) {
ovei.updateStag(getCurrentTimestamp());
}
final BwEventAnnotation ann = ovei.getRef();
ann.setColPath(event.getColPath());
ann.setName(event.getName());
}
}
if (event.getOrganizerSchedulingObject()) {
// Set RSVP on all attendees with PARTSTAT = NEEDS_ACTION
for (final BwAttendee att : event.getAttendees()) {
if (att.getPartstat() == IcalDefs.partstatValNeedsAction) {
att.setRsvp(true);
}
}
}
UpdateEventResult uer = getCal().addEvent(ei, schedulingInbox, rollbackOnError);
if (ei.getNumContainedItems() > 0) {
for (final EventInfo oei : ei.getContainedItems()) {
oei.getEvent().setName(event.getName());
final UpdateEventResult auer = getCal().addEvent(oei, schedulingInbox, rollbackOnError);
if (auer.errorCode != null) {
// ?
}
}
}
updResult.failedOverrides = uer.failedOverrides;
if (!noInvites) {
if (event.getAttendeeSchedulingObject()) {
// Attendee replying?
updResult.reply = true;
}
if (cal.getCollectionInfo().scheduling && schedulingObject) {
final SchedulingIntf sched = (SchedulingIntf) getSvc().getScheduler();
sched.implicitSchedule(ei, false);
/* We assume we don't need to update again to set attendee status
* Trying to do an update results in duplicate key errors.
*
* If it turns out the scgedule status is not getting persisted in the
* calendar entry then we need to find a way to set just that value in
* already persisted entity.
*/
}
}
return updResult;
} catch (final Throwable t) {
if (debug) {
error(t);
}
getSvc().rollbackTransaction();
if (t instanceof CalFacadeException) {
throw (CalFacadeException) t;
}
throw new CalFacadeException(t);
}
}
Aggregations