///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.plugins.teamcal.event; import java.sql.Timestamp; import java.util.Date; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.apache.log4j.Logger; import org.apache.wicket.markup.html.form.SubmitLink; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.spring.injection.annot.SpringBean; import org.projectforge.common.DateHelper; import org.projectforge.core.ModificationStatus; import org.projectforge.plugins.teamcal.integration.TeamCalCalendarPage; import org.projectforge.registry.Registry; import org.projectforge.timesheet.TimesheetDO; import org.projectforge.timesheet.TimesheetDao; import org.projectforge.user.PFUserContext; import org.projectforge.web.calendar.CalendarPage; import org.projectforge.web.timesheet.TimesheetEditPage; import org.projectforge.web.wicket.AbstractEditPage; import org.projectforge.web.wicket.AbstractSecuredBasePage; import org.projectforge.web.wicket.components.ContentMenuEntryPanel; /** * @author M. Lauterbach (m.lauterbach@micromata.de) * @author K. Reinhard (k.reinhard@micromata.de) * */ public class TeamEventEditPage extends AbstractEditPage<TeamEventDO, TeamEventEditForm, TeamEventDao> { private static final long serialVersionUID = 1221484611148024273L; private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(TeamEventEditPage.class); @SpringBean(name = "teamEventDao") private TeamEventDao teamEventDao; private RecurrencyChangeType recurrencyChangeType; /** * Only given if called by recurrence dialog. */ private TeamEvent eventOfCaller; /** * Used for recurrence events in {@link #onSaveOrUpdate()} and {@link #afterSaveOrUpdate()} */ private TeamEventDO newEvent; private final boolean wasNew = false; /** * @param parameters */ public TeamEventEditPage(final PageParameters parameters) { super(parameters, "plugins.teamcal.event"); super.init(); } /** * @param parameters */ public TeamEventEditPage(final PageParameters parameters, final TeamEventDO event) { super(parameters, "plugins.teamcal.event"); init(event); } /** * @param parameters */ public TeamEventEditPage(final PageParameters parameters, final TeamEvent event, final Timestamp newStartDate, final Timestamp newEndDate, final RecurrencyChangeType recurrencyChangeType) { super(parameters, "plugins.teamcal.event"); Validate.notNull(event); Validate.notNull(recurrencyChangeType); // event contains the new start and/or stop date if modified. if (log.isDebugEnabled() == true) { log.debug("TeamEvent is: newStartDate=" + newStartDate + ", newEndDate=" + newEndDate + ", event=[" + event + "], recurrencyChangeType=[" + recurrencyChangeType + "]"); } this.eventOfCaller = event; this.recurrencyChangeType = recurrencyChangeType; Integer id; if (event instanceof TeamEventDO) { id = ((TeamEventDO) event).getId(); } else { id = ((TeamRecurrenceEvent) event).getMaster().getId(); } final TeamEventDO teamEventDO = teamEventDao.getById(id); if (recurrencyChangeType == RecurrencyChangeType.ALL) { // The user wants to edit all events, so check if the user changes start and/or end date. If so, move the date of the original event. if (newStartDate != null) { final long startDateMove = newStartDate.getTime() - event.getStartDate().getTime(); teamEventDO.setStartDate(new Timestamp(teamEventDO.getStartDate().getTime() + startDateMove)); } if (newEndDate != null) { final long endDateMove = newEndDate.getTime() - event.getEndDate().getTime(); teamEventDO.setEndDate(new Timestamp(teamEventDO.getEndDate().getTime() + endDateMove)); } } else { if (newStartDate != null) { teamEventDO.setStartDate(newStartDate); } else { teamEventDO.setStartDate(new Timestamp(event.getStartDate().getTime())); } if (newEndDate != null) { teamEventDO.setEndDate(newEndDate); } else { teamEventDO.setEndDate(new Timestamp(event.getEndDate().getTime())); } } if (recurrencyChangeType == RecurrencyChangeType.ONLY_CURRENT) { // The user wants to change only the current event, so remove all recurrency fields. teamEventDO.clearAllRecurrenceFields(); } init(teamEventDO); } /** * @see org.projectforge.web.wicket.AbstractEditPage#init(org.projectforge.core.AbstractBaseDO) */ @Override protected void init(final TeamEventDO data) { super.init(data); if (isNew() == false) { @SuppressWarnings("serial") final ContentMenuEntryPanel menu = new ContentMenuEntryPanel(getNewContentMenuChildId(), new Link<Void>(ContentMenuEntryPanel.LINK_ID) { @Override public void onClick() { final TimesheetDO timesheet = new TimesheetDO(); timesheet.setStartDate(getData().getStartDate())// .setStopTime(getData().getEndDate()) // .setLocation(getData().getLocation()); final StringBuffer buf = new StringBuffer(); buf.append(getData().getSubject()); final String note = getData().getNote(); if (StringUtils.isNotBlank(note) == true) { buf.append("\n").append(note); } timesheet.setDescription(buf.toString()); final TimesheetDao timesheetDao = Registry.instance().getDao(TimesheetDao.class); timesheetDao.setUser(timesheet, getUserId()); final TimesheetEditPage timesheetEditPage = new TimesheetEditPage(timesheet); timesheetEditPage.setReturnToPage(getReturnToPage()); setResponsePage(timesheetEditPage); }; }, getString("plugins.teamcal.event.convert2Timesheet")); addContentMenuEntry(menu); } if (isNew() == true) { @SuppressWarnings("serial") final ContentMenuEntryPanel menu = new ContentMenuEntryPanel(getNewContentMenuChildId(), new SubmitLink( ContentMenuEntryPanel.LINK_ID, form) { @Override public void onSubmit() { final TeamEventDO event = getData(); final TimesheetDO timesheet = new TimesheetDO(); if (event != null) { timesheet.setStartDate(event.getStartDate()); timesheet.setStopTime(event.getEndDate()); } if (returnToPage == null) { returnToPage = new TeamCalCalendarPage(new PageParameters()); } setResponsePage(new TimesheetEditPage(timesheet).setReturnToPage(returnToPage)); }; }.setDefaultFormProcessing(false), getString("plugins.teamcal.switchToTimesheetButton")); addContentMenuEntry(menu); } } /** * @return the recurrencyChangeType */ public RecurrencyChangeType getRecurrencyChangeType() { return recurrencyChangeType; } @Override public void setResponsePage() { if (returnToPage == null) { returnToPage = new TeamCalCalendarPage(new PageParameters()); } super.setResponsePage(); if (returnToPage instanceof CalendarPage) { // Display the date of this time sheet in the CalendarPage (useful if the time sheet was moved). if (newEvent != null) { ((CalendarPage) returnToPage).setStartDate(newEvent.getStartDate()); } else if (eventOfCaller != null) { ((CalendarPage) returnToPage).setStartDate(eventOfCaller.getStartDate()); } else { ((CalendarPage) returnToPage).setStartDate(getData().getStartDate()); } } } /** * @see org.projectforge.web.wicket.AbstractEditPage#onDelete() */ @Override public AbstractSecuredBasePage onDelete() { super.onDelete(); // if (getData().getAttendees() != null && getData().getAttendees().isEmpty() == false) { // final TeamEventMailer mailer = TeamEventMailer.getInstance(); // final TeamEventMailValue value = new TeamEventMailValue(getData().getId(), TeamEventMailType.REJECTION, null); // mailer.getQueue().offer(value); // mailer.send(); // } if (recurrencyChangeType == null || recurrencyChangeType == RecurrencyChangeType.ALL) { return null; } final Integer masterId = getData().getId(); // Store the id of the master entry. final TeamEventDO masterEvent = teamEventDao.getById(masterId); if (recurrencyChangeType == RecurrencyChangeType.ALL_FUTURE) { final Date recurrenceUntil = new Date(eventOfCaller.getStartDate().getTime() - 24 * 3600 * 1000); form.recurrenceData.setUntil(recurrenceUntil); // Minus 24 hour. masterEvent.setRecurrence(form.recurrenceData); getBaseDao().update(masterEvent); } else if (recurrencyChangeType == RecurrencyChangeType.ONLY_CURRENT) { // only current date masterEvent.addRecurrenceExDate(eventOfCaller.getStartDate(), PFUserContext.getTimeZone()); getBaseDao().update(masterEvent); } return (AbstractSecuredBasePage) getReturnToPage(); } /** * @see org.projectforge.web.wicket.AbstractEditPage#onSaveOrUpdate() */ @Override public AbstractSecuredBasePage onSaveOrUpdate() { super.onSaveOrUpdate(); // if (isNew()) { // wasNew = true; // if (getData().getAttendees() != null && getData().getAttendees().isEmpty() == false) { // final TeamEventAttendeeDO attendee = new TeamEventAttendeeDO(); // attendee.setUser(PFUserContext.getUser()).setStatus(TeamAttendeeStatus.ACCEPTED); // getData().addAttendee(attendee); // } // final List<FileUpload> fileUploads = form.fileUploadField.getFileUploads(); // if (fileUploads != null) { // for (final FileUpload fileUpload: fileUploads) { // final TeamEventAttachmentDO attachment = new TeamEventAttachmentDO(); // attachment.setFilename(fileUpload.getClientFileName()); // attachment.setContent(fileUpload.getBytes()); // getData().addAttachment(attachment); // } // } else { // getData().getAttachments().clear(); // } // } else { // final TeamEventDO oldData = teamEventDao.getById(getData().getId()); // if (getData().mustIncSequence(oldData) == true) { // getData().incSequence(); // } // // } getData().setRecurrence(form.recurrenceData); if (recurrencyChangeType == null || recurrencyChangeType == RecurrencyChangeType.ALL) { return null; } final Integer masterId = getData().getId(); // Store the id of the master entry. getData().setId(null); // Clone object. final TeamEventDO oldDataObject = getData(); final TeamEventDO masterEvent = teamEventDao.getById(masterId); if (masterEvent == null) { log.error("masterEvent is null?! Do nothing more after saving team event."); return null; } if (eventOfCaller == null) { log.error("eventOfCaller is null?! Do nothing more after saving team event."); return null; } form.setData(masterEvent); if (recurrencyChangeType == RecurrencyChangeType.ALL_FUTURE) { // Set the end date of the master date one day before current date and save this event. final Date recurrenceUntil = new Date(eventOfCaller.getStartDate().getTime() - 24 * 3600 * 1000); newEvent = oldDataObject.clone(); if (log.isDebugEnabled() == true) { log.debug("Recurrency until date of master entry will be set to: " + DateHelper.formatAsUTC(recurrenceUntil)); log.debug("The new event is: " + newEvent); } form.recurrenceData.setUntil(recurrenceUntil); // Minus 24 hour. getData().setRecurrence(form.recurrenceData); return null; } else if (recurrencyChangeType == RecurrencyChangeType.ONLY_CURRENT) { // only current date // Add current date to the master date as exclusion date and save this event (without recurrence settings). masterEvent.addRecurrenceExDate(eventOfCaller.getStartDate(), PFUserContext.getTimeZone()); newEvent = oldDataObject.clone(); newEvent.setRecurrenceDate(eventOfCaller.getStartDate()); newEvent.setRecurrenceReferenceId(masterEvent.getId()); if (log.isDebugEnabled() == true) { log.debug("Recurrency ex date of master entry is now added: " + DateHelper.formatAsUTC(eventOfCaller.getStartDate()) + ". The new string is: " + masterEvent.getRecurrenceExDate()); log.debug("The new event is: " + newEvent); } return null; } return null; } /** * @see org.projectforge.web.wicket.AbstractEditPage#afterUpdate(org.projectforge.core.ModificationStatus) */ @Override public AbstractSecuredBasePage afterUpdate(final ModificationStatus modificationStatus) { if (newEvent != null) { newEvent.setExternalUid(null); // Avoid multiple usage of external uids. newEvent.setSequence(0); teamEventDao.save(newEvent); // if (newEvent.getAttendees() != null && newEvent.getAttendees().isEmpty() == false) { // final TeamEventMailer mailer = TeamEventMailer.getInstance(); // final TeamEventMailValue value = new TeamEventMailValue(newEvent.getId(), TeamEventMailType.UPDATE, getData().getId()); // mailer.getQueue().offer(value); // mailer.send(); // } } return null; } /** * @see org.projectforge.web.wicket.AbstractEditPage#afterSaveOrUpdate() */ @Override public AbstractSecuredBasePage afterSaveOrUpdate() { super.afterSaveOrUpdate(); // if (newEvent == null) { // if (getData().getAttendees() != null && getData().getAttendees().isEmpty() == false) { // final TeamEventMailer mailer = TeamEventMailer.getInstance(); // TeamEventMailValue value = null; // if (wasNew == true) { // value = new TeamEventMailValue(getData().getId(), TeamEventMailType.INVITATION, null); // } else { // value = new TeamEventMailValue(getData().getId(), TeamEventMailType.UPDATE, null); // } // mailer.getQueue().offer(value); // mailer.send(); // } // } return null; } /** * @see org.projectforge.web.wicket.AbstractEditPage#cloneData() */ @Override protected void cloneData() { super.cloneData(); getData().setExternalUid(null); // Avoid multiple usage of external uid. } /** * @see org.projectforge.web.wicket.AbstractEditPage#getBaseDao() */ @Override protected TeamEventDao getBaseDao() { return teamEventDao; } /** * @see org.projectforge.web.wicket.AbstractEditPage#getLogger() */ @Override protected Logger getLogger() { return log; } /** * @see org.projectforge.web.wicket.AbstractEditPage#newEditForm(org.projectforge.web.wicket.AbstractEditPage, * org.projectforge.core.AbstractBaseDO) */ @Override protected TeamEventEditForm newEditForm(final AbstractEditPage< ? , ? , ? > parentPage, final TeamEventDO data) { return new TeamEventEditForm(this, data); } }