use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class CategoryRule method end.
/* (non-Javadoc)
* @see org.apache.commons.digester.Rule#end(java.lang.String, java.lang.String)
*/
@Override
public void end(final String ns, final String name) throws Exception {
final BwCategory entity = (BwCategory) pop();
globals.counts[globals.categories]++;
fixSharableEntity(entity, "Category");
if (entity.getWord() == null) {
error("Missing keyword for category " + entity);
return;
}
if (entity.getUid() == null) {
error("Missing uid for category " + entity);
entity.initUid();
}
try {
globals.rintf.restoreCategory(entity);
} catch (final Throwable t) {
warn("Unable to restore " + entity);
throw new Exception(t);
}
}
use of org.bedework.calfacade.BwCategory 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;
}
use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class ProcessMove method moveEvents.
private boolean moveEvents() throws Throwable {
final String toPath;
final String toOwner;
final String fromPath;
/* Expect from (possibly quoted)
* to (possibly quoted)
* 0 or more categories
*/
try {
final boolean addcats = testToken("addcats");
final boolean setname = testToken("setname");
final Collection<String> aliases = new ArrayList<>();
while (testToken("alias")) {
assertToken('=');
aliases.add(quotedVal());
}
open();
final BwCalendar from = getCal();
if (from == null) {
if (debug) {
debug("No from cal");
}
return false;
}
fromPath = from.getPath();
final BwCalendar to = getCal();
if (to == null) {
if (debug) {
debug("No to cal");
}
return false;
}
toOwner = to.getOwnerHref();
toPath = to.getPath();
close();
/* Get the list of categories */
final Collection<String> catVals = new ArrayList<>();
while (!cmdEnd()) {
final String catVal = wordOrQuotedVal();
if (catVal == null) {
error("Expected a category");
return false;
}
catVals.add(catVal);
}
/* Now we need to move the stuff in batches */
for (; ; ) {
open();
final Collection<BwCategory> cats = getCats(catVals, toOwner, addcats, fromPath);
if (cats == null) {
return false;
}
final Collection<String> names = getSvci().getAdminHandler().getChildEntities(fromPath, 0, batchSize);
if (Util.isEmpty(names)) {
break;
}
info("Move " + names.size() + " events from " + fromPath + " to " + toPath);
final long start = System.currentTimeMillis();
for (final String name : names) {
moveEvent(fromPath, toPath, name, cats, aliases, setname);
}
final long elapsed = System.currentTimeMillis() - start;
info("Move of " + names.size() + " events took " + elapsed / 1000 + "seconds at " + elapsed / names.size() + "millisecs per event");
close();
}
return true;
} finally {
close();
}
}
use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class ProcessMove method moveEvent.
private void moveEvent(final String fromPath, final String toPath, final String name, final Collection<BwCategory> cats, final Collection<String> aliases, final boolean setname) throws Throwable {
final EventInfo ei = getEvent(fromPath, name);
final BwEvent ev = ei.getEvent();
if (debug) {
final StringBuilder sb = new StringBuilder("Moving event ");
sb.append(ev.getUid());
if (ev.getRecurring()) {
sb.append(" recurring");
}
sb.append(" from ");
sb.append(fromPath);
sb.append(" to ");
sb.append(toPath);
debug(sb.toString());
}
ev.setColPath(toPath);
for (final BwCategory cat : cats) {
ev.addCategory(cat);
}
for (final String alias : aliases) {
final BwXproperty x = new BwXproperty();
x.setName(BwXproperty.bedeworkAlias);
x.setValue(alias);
ev.addXproperty(x);
}
if (setname) {
final String nm = ev.getName();
final String nnm = ev.getUid() + ".ics";
if (!nm.equals(nnm)) {
ev.setName(nnm);
}
}
if (ei.getOverrideProxies() != null) {
for (final BwEvent oev : ei.getOverrideProxies()) {
oev.setColPath(toPath);
}
}
try {
getSvci().getEventsHandler().update(ei, false, null);
} catch (final CalFacadeDupNameException cdne) {
pstate.addError("Duplicate name " + ev.getName() + " uid: " + ev.getUid() + " from: " + fromPath);
}
}
use of org.bedework.calfacade.BwCategory in project bw-calendar-engine by Bedework.
the class ProcessSetstatus method setStatusCategory.
private boolean setStatusCategory(final String uid, final String status) throws Throwable {
try {
if (uid == null) {
error("Expected a uid");
return false;
}
open();
final BwCategory ent = getSvci().getCategoriesHandler().getPersistent(uid);
if (ent == null) {
error("No entity with uid " + uid);
return false;
}
ent.setStatus(status);
getSvci().getCategoriesHandler().update(ent);
return true;
} finally {
close();
}
}
Aggregations