Package org.projectforge.plugins.teamcal.event

Source Code of org.projectforge.plugins.teamcal.event.TeamEventEditPage

/////////////////////////////////////////////////////////////////////////////
//
// 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);
  }

}
TOP

Related Classes of org.projectforge.plugins.teamcal.event.TeamEventEditPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.