org.sakaiproject.signup.restful.SignupEvent.java Source code

Java tutorial

Introduction

Here is the source code for org.sakaiproject.signup.restful.SignupEvent.java

Source

/*
* Licensed to The Apereo Foundation under one or more contributor license
* agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*
* The Apereo Foundation licenses this file to you under the Educational 
* Community 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://opensource.org/licenses/ecl2.txt
* 
* 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.sakaiproject.signup.restful;

import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Stack;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.entity.api.Entity;
import org.sakaiproject.entity.api.ResourceProperties;
import org.sakaiproject.signup.logic.Permission;
import org.sakaiproject.signup.model.MeetingTypes;
import org.sakaiproject.signup.model.SignupAttachment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * <p>
 * This class holds the information of sign-up meeting/event for RESTful and
 * it's a wrapper class for SignupMeeting.
 * </p>
 * 
 * @author Peter Liu
 */
public class SignupEvent implements Entity, MeetingTypes {

    public static final String USER_SIGNUP = "signup";

    public static final String USER_CANCEL_SIGNUP = "cancelSignup";

    public static final String USER_ADD_TO_WAITLIST = "addToWaitList";

    public static final String USER_REMOVE_FROM_WAITLIST = "removeWaitList";

    /* corresponding field name in Json */
    public static final String USER_ACTION_TYPE_FIELD_NAME = "userActionType";
    /* corresponding field name in Json */
    public static final String ALLOCATE_TO_TS_ID_FIELD_NAME = "allocToTSid";
    /* corresponding field name in Json */
    public static final String SITE_ID_FIELD_NAME = "siteId";

    private static final long serialVersionUID = 2L;

    public static final String[] USER_ATION_Types = { USER_SIGNUP, USER_CANCEL_SIGNUP, USER_ADD_TO_WAITLIST,
            USER_REMOVE_FROM_WAITLIST };

    private Long id;

    private Long recurrenceId;

    private String title;

    private String description;

    private String location;

    private String organizerName;

    private Date startTime;

    private Date endTime;

    private Date myStartTime;

    private Date myEndTime;

    private Date signupBegins;

    private Date signupDeadline;

    private String meetingType;

    private String repeatType;

    private boolean allowWaitList;

    private boolean allowComment;

    private boolean eidInputMode;

    private boolean autoReminder;

    private List<SignupTimeslotItem> signupTimeSlotItems;

    private List<SignupSiteItem> signupSiteItems;

    private List<SignupAttachment> signupMainEventAttachItems;

    private Permission permission;

    private String entityID;

    /* keep current user navigation siteId */
    private String siteId;

    private boolean currentUserSignedUp;

    private String allocToTSid;

    private String availableStatus = null;

    private String userActionType;

    private boolean allowAttendance;

    /*max # of slots, which user is allowed to sign-up*/
    private Integer maxNumOfSlots;

    public String getId() {
        if (entityID == null) {
            entityID = id + "";
        }
        return entityID;
    }

    public void setId(String s) {
        entityID = s;
    }

    /**
     * get the unique meeting/event Id, which is generated by DB
     * 
     * @return an unique sequence Id
     */
    public Long getEventId() {
        return id;
    }

    /**
     * this is a setter.
     * 
     * @param id
     *            an unique sequence Id
     */
    public void setEventId(Long id) {
        this.id = id;
    }

    /**
     * get the name of the event/meeting
     * 
     * @return the name of the event/meeting
     */
    public String getTitle() {
        return title;
    }

    /**
     * this is a setter
     * 
     * @param title
     *            a name of the event/meeting
     */
    public void setTitle(String title) {
        this.title = title;
    }

    public String getOrganizerName() {
        return organizerName;
    }

    public void setOrganizerName(String organizerName) {
        this.organizerName = organizerName;
    }

    /**
     * get the location, where the event/meeting occurs
     * 
     * @return the location
     */
    public String getLocation() {
        return location;
    }

    /**
     * this is a setter.
     * 
     * @param location
     *            a location, where the event/meeting occurs
     */
    public void setLocation(String location) {
        this.location = location;
    }

    /**
     * get the description of the event/meeting
     * 
     * @return a description
     */
    public String getDescription() {
        return description;
    }

    /**
     * this is a setter.
     * 
     * @param description
     *            a description of an event/meeting
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * get the end time of an event/meeting
     * 
     * @return an end time of the event/meeting
     */
    public Date getEndTime() {
        return endTime;
    }

    /**
     * this is a setter.
     * 
     * @param endTime
     *            the end time of the event/meeting
     */
    public void setEndTime(Date endTime) {
        this.endTime = truncateSeconds(endTime);
    }

    public String getAvailableStatus() {
        return availableStatus;
    }

    public void setAvailableStatus(String availableStatus) {
        this.availableStatus = availableStatus;
    }

    /**
     * get the event/meeting type (individual,group and announcement)
     * 
     * @return one of the type (individual,group and announcement)
     */
    public String getMeetingType() {
        return meetingType;
    }

    /**
     * this is a setter
     * 
     * @param meetingType
     *            a defined meeting type (individual,group and announcement)
     */
    public void setMeetingType(String meetingType) {
        this.meetingType = meetingType;
    }

    /**
     * This method obtains the number of time slots in the event/meeting
     * 
     * @return the number of time slots
     */
    public int getNoOfTimeSlots() {
        return (signupTimeSlotItems == null) ? 0 : signupTimeSlotItems.size();
    }

    /**
     * get the recurrence Id of the event/meeting
     * 
     * @return the recurrence Id
     */
    public Long getRecurrenceId() {
        return recurrenceId;
    }

    /**
     * this is a setter.
     * 
     * @param recurrenceId
     *            a unique Id
     */
    public void setRecurrenceId(Long recurrenceId) {
        this.recurrenceId = recurrenceId;
    }

    /**
     * get the starting time of the event/meeting
     * 
     * @return the starting date of the event/meeting
     */
    public Date getStartTime() {
        return startTime;
    }

    /**
     * this is a setter
     * 
     * @param startTime
     *            the time when the event/meeting starts
     */
    public void setStartTime(Date startTime) {
        this.startTime = truncateSeconds(startTime);
    }

    /**
     * This is a extra field for JSON object to display the event date. It's the
     * same as startTime and it will make nested JSON object processing much
     * easier.
     * 
     * @return a Date object
     */
    public Date getDate() {
        return getStartTime();
    }

    /**
     * get the signup starting time for the event/meeting
     * 
     * @return a starting time for signup
     */
    public Date getSignupBegins() {
        return signupBegins;
    }

    /**
     * this is a setter
     * 
     * @param signupBegins
     *            a time when the signup process starts
     */
    public void setSignupBegins(Date signupBegins) {
        this.signupBegins = truncateSeconds(signupBegins);
    }

    /**
     * get the time when the signup process stops
     * 
     * @return a date of the signup deadline
     */
    public Date getSignupDeadline() {
        return signupDeadline;
    }

    /**
     * this is a setter
     * 
     * @param signupDeadLine
     *            the time when signup process stops
     */
    public void setSignupDeadline(Date signupDeadLine) {
        this.signupDeadline = truncateSeconds(signupDeadLine);
    }

    public boolean isAllowWaitList() {
        return allowWaitList;
    }

    public void setAllowWaitList(boolean allowWaitList) {
        this.allowWaitList = allowWaitList;
    }

    public boolean isAllowComment() {
        return allowComment;
    }

    public void setAllowComment(boolean allowComment) {
        this.allowComment = allowComment;
    }

    public String getRepeatType() {
        return repeatType;
    }

    public void setRepeatType(String repeatType) {
        this.repeatType = repeatType;
    }

    public boolean isMySignupEvents() {
        if (myStartTime != null && myEndTime != null)
            return true;
        else
            return false;
    }

    public Date getMyStartTime() {
        return myStartTime;
    }

    public void setMyStartTime(Date myStartTime) {
        this.myStartTime = myStartTime;
    }

    public Date getMyEndTime() {
        return myEndTime;
    }

    public void setMyEndTime(Date myEndTime) {
        this.myEndTime = myEndTime;
    }

    /**
     * check if the meeting/event can take attendance
     * 
     * @return true if the meeting/event can take attendance
     */
    public boolean isallowAttendance() {
        return allowAttendance;
    }

    /**
     * this is a setter.
     * 
     * @param allowAttendance
     *            a boolean value
     */
    public void setAllowAttendance(boolean allowAttendance) {
        this.allowAttendance = allowAttendance;
    }

    /**
     * get the maximum nubmer of the attendees, which is allowed in one time
     * slot
     * 
     * @return the maximum nubmer of the attendees
     */
    public int getMaxNumberOfAttendees() {
        if (signupTimeSlotItems == null || signupTimeSlotItems.isEmpty())
            return 0;

        return signupTimeSlotItems.get(0).getMaxNoOfAttendees();
    }

    /**
     * get a list of SignupSiteItem objects, which indicate the scope of the
     * event/meeting
     * 
     * @return a list of SignupSiteItem objects,
     */
    public List<SignupSiteItem> getSignupSiteItems() {
        return signupSiteItems;
    }

    /**
     * this is a setter
     * 
     * @param SignupSiteItem
     *            a SignupSiteItem object
     */
    public void setSignupSiteItems(List<SignupSiteItem> signupSites) {
        this.signupSiteItems = signupSites;
    }

    /**
     * This will test if the event/meeting is started to sign up
     * 
     * @return true if the sign-up begin time is before current time.
     */
    public boolean isStartToSignUp() {
        return signupBegins.before(new Date());
    }

    /**
     * This method will check if the event/meeting is already expired
     * 
     * @return true if the event/meeting is expired
     */
    public boolean isMeetingExpired() {
        Date today = new Date();
        // pastMeeting => today>endDate => value>0
        int value = today.compareTo(endTime);
        return value > 0;
    }

    /**
     * This method will check if the current time has already passed the signup
     * deadline
     * 
     * @return true if the current time has already passed the signup deadline
     */
    public boolean isPassedDeadline() {
        Date today = new Date();
        int value = today.compareTo(signupDeadline);
        return value > 0;
    }

    private Calendar cal = Calendar.getInstance();

    /**
     * This will test if the event/meeting is cross days
     * 
     * @return true if the event/meeting is cross days
     */
    public boolean isMeetingCrossDays() {
        cal.setTime(getStartTime());
        int startingDay = cal.get(Calendar.DAY_OF_YEAR);
        cal.setTime(getEndTime());
        int endingDay = cal.get(Calendar.DAY_OF_YEAR);
        return (startingDay != endingDay);
    }

    public boolean isCurrentUserSignedUp() {
        return currentUserSignedUp;
    }

    public void setCurrentUserSignedUp(boolean currentUserSignedUp) {
        this.currentUserSignedUp = currentUserSignedUp;
    }

    private String[] allowedUserActionTypes;

    public String[] getAllowedUserActionTypes() {
        return this.allowedUserActionTypes;
    }

    public void setAllowedUserActionTypes(String[] types) {
        this.allowedUserActionTypes = types;
    }

    /**
     * get a list of SignupTimeslot objects, which contains the event/meeting
     * segments information
     * 
     * @return a list of SignupTimeslot objects
     */
    public List<SignupTimeslotItem> getSignupTimeSlotItems() {
        return signupTimeSlotItems;
    }

    /**
     * this is a setter.
     * 
     * @param signupTimeSlots
     *            a list of SignupTimeslot objects
     */
    public void setSignupTimeSlotItems(List<SignupTimeslotItem> signupTimeSlotItems) {
        this.signupTimeSlotItems = signupTimeSlotItems;
    }

    /**
     * This method provides the attachments for main Sign-up event page 
     * and is public to whole site.
     * @return   a list of SignupAttachment objects.
     */
    public List<SignupAttachment> getSignupMainEventAttachItems() {
        return signupMainEventAttachItems;
    }

    /**
     * this is a setter. it only holds the attachments,
     *  which belongs to the entire event, not to individual 
     *  time slot or participant
     * 
     * @param SignupAttachment
     *            a list of SignupAttachment objects
     */
    public void setSignupMainEventAttachItems(List<SignupAttachment> signupMainEventAttachItems) {
        this.signupMainEventAttachItems = signupMainEventAttachItems;
    }

    /**
     * get the Permission object, which contains the user's operation
     * permissions on this event/meeting
     * 
     * @return a Permission object
     */
    public Permission getPermission() {
        return permission;
    }

    /**
     * this is a setter
     * 
     * @param permission
     *            a permission object
     */
    public void setPermission(Permission permission) {
        this.permission = permission;
    }

    public String getAllocToTSid() {
        return allocToTSid;
    }

    public void setAllocToTSid(String allocToTSid) {
        this.allocToTSid = allocToTSid;
    }

    /* 'signup', 'cancelSignup','addToWaitList', 'removeWaitList' */
    public String getUserActionType() {
        return userActionType;
    }

    public void setUserActionType(String userActionType) {
        this.userActionType = userActionType;
    }

    public String getSiteId() {
        return siteId;
    }

    public void setSiteId(String siteId) {
        this.siteId = siteId;
    }

    public boolean isEidInputMode() {
        return eidInputMode;
    }

    public void setEidInputMode(boolean eidInputMode) {
        this.eidInputMode = eidInputMode;
    }

    public boolean isAutoReminder() {
        return autoReminder;
    }

    public void setAutoReminder(boolean autoReminder) {
        this.autoReminder = autoReminder;
    }

    /**
     * Set the second value to zero. it only need to accurate to minutes level.
     * Otherwise it may cause one minute shorter display confusion
     * 
     * @param time
     *            a Date object
     * @return a Date object
     */
    private Date truncateSeconds(Date time) {
        /* set second to zero */
        if (time == null)
            return null;

        Calendar cal = Calendar.getInstance();
        cal.setTime(time);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    public ResourceProperties getProperties() {
        // TODO Auto-generated method stub
        return null;
    }

    public String getReference() {
        return ServerConfigurationService.getAccessUrl() + "/signupEvent/" + Entity.SEPARATOR + this.getId();
    }

    public String getReference(String arg0) {
        return getReference();
    }

    public String getServerUrl() {
        return ServerConfigurationService.getServerUrl();
    }

    public String getUrl() {
        return ServerConfigurationService.getAccessUrl() + "/signupEvent/" + this.getId();
    }

    public String getUrl(String arg0) {
        return getUrl();
    }

    public Element toXml(Document doc, Stack stack) {
        Element event = doc.createElement("signupEvent");

        if (stack.isEmpty()) {
            doc.appendChild(event);
        } else {
            ((Element) stack.peek()).appendChild(event);
        }

        stack.push(event);

        event.setAttribute("id", getId());
        event.setAttribute("eventid", getEventId().toString());
        event.setAttribute("title", getTitle());
        event.setAttribute("organizer", this.getOrganizerName());
        event.setAttribute("location", this.getLocation());
        event.setAttribute("event-type", this.getMeetingType());
        event.setAttribute("event-recurrenceId", this.getRecurrenceId().toString());

        if (description != null)
            event.setAttribute("description", description);

        event.setAttribute("start-time", this.getStartTime().toString());
        event.setAttribute("end-time", this.getEndTime().toString());
        event.setAttribute("signup-begin", this.getSignupBegins().toString());
        event.setAttribute("signup-deadline", this.getSignupDeadline().toString());
        // event.setAttribute("repeat-event",
        // Boolean.valueOf(isRecurredMeeting()).toString());
        // properties
        // getProperties().toXml(doc, stack);
        // apppend the options as chidren

        stack.pop();

        return event;
    }

    public String toString() {
        return new ToStringBuilder(this).append(this.id).append(this.organizerName).append(this.title)
                .append(this.location).append(this.startTime).append(this.endTime).append(this.description)
                .toString();
    }

    /* (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        SignupEvent other = (SignupEvent) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    private String userActionWarningMsg;

    public String getUserActionWarningMsg() {
        String msg = this.userActionWarningMsg;
        /* only show once for user */
        this.userActionWarningMsg = null;
        return msg;
    }

    public void setUserActionWarningMsg(String userActionWarningMsg) {
        this.userActionWarningMsg = userActionWarningMsg;
    }

    public Integer getMaxNumOfSlots() {
        return maxNumOfSlots;
    }

    public void setMaxNumOfSlots(Integer maxNumOfSlots) {
        this.maxNumOfSlots = maxNumOfSlots;
    }

}