com.tmathmeyer.sentinel.models.data.Event.java Source code

Java tutorial

Introduction

Here is the source code for com.tmathmeyer.sentinel.models.data.Event.java

Source

/*******************************************************************************
 * Copyright (c) 2013 WPI-Suite
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: Team YOCO (You Only Compile Once)
 ******************************************************************************/
package com.tmathmeyer.sentinel.models.data;

import java.awt.Color;
import java.util.Date;
import java.util.UUID;

import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.joda.time.MutableDateTime;
import org.joda.time.format.DateTimeFormat;

import com.tmathmeyer.sentinel.fs.RangeData;
import com.tmathmeyer.sentinel.models.Model;
import com.tmathmeyer.sentinel.models.client.local.EventClient;
import com.tmathmeyer.sentinel.models.client.net.NetworkCachingClient;
import com.tmathmeyer.sentinel.models.client.net.CategoryClient;
import com.tmathmeyer.sentinel.utils.Months;

/**
 * Basic event class that contains the information required to represent an
 * event on a calendar.
 * 
 */
public class Event implements Model, Displayable, RangeData<Event> {
    private static final long serialVersionUID = 5687571978423959740L;
    private UUID uuid = UUID.randomUUID();
    private String name;
    private String description;
    private Date start;
    private Date end;
    private boolean isProjectEvent;
    private boolean isAllDay;
    private UUID category;
    private String participants;

    @Override
    public Event copyInternal(Event t) {
        name = t.name;
        description = t.description;
        start = t.start;
        end = t.end;
        isProjectEvent = t.isProjectEvent;
        isAllDay = t.isAllDay;
        category = t.category;
        participants = t.participants;
        return this;
    }

    /**
     * 
     * @param name the name of the event
     * @return this event after having it's name set
     */
    public Event addName(String name) {
        setName(name);
        return this;
    }

    /**
     * 
     * @param description the event's description
     * @return this event after having it's description set
     */
    public Event addDescription(String description) {
        setDescription(description);
        return this;
    }

    /**
     * 
     * @param date the starting time
     * @return this event after having its start date set
     */
    public Event addStartTime(DateTime date) {
        setStart(date);
        return this;
    }

    /**
     * 
     * @param date the end time of this event
     * @return this event after having it's end time set
     */
    public Event addEndTime(DateTime date) {
        setEnd(date);
        return this;
    }

    /**
     * 
     * @param pe whether this is a project event
     * @return this event after having it's project flag set
     */
    public Event addIsProjectEvent(boolean pe) {
        setProjectEvent(pe);
        return this;
    }

    /**
     * Create an event with the default characteristics.
     */
    public Event() {
        super();
    }

    @Override
    public void save() {
        // This is never called by the core ?
    }

    @Override
    public void delete() {
        EventClient.getInstance().delete(this);
    }

    @Override
    public Boolean identify(Object o) {
        if (o instanceof String) {
            return getUuid().toString().equals((String) (o));
        } else if (o instanceof UUID) {
            return getUuid().equals((UUID) (o));
        } else if (o instanceof Event) {
            return getUuid().equals(((Event) (o)).getUuid());
        }
        return false;
    }

    @Override
    public UUID getUuid() {
        return uuid;
    }

    /**
     * @param eventID the eventID to set
     */
    public void setUuid(UUID eventID) {
        this.uuid = eventID;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the description
     */
    public String getDescription() {
        return description;
    }

    /**
     * @param description the description to set
     */
    public void setDescription(String description) {
        this.description = description;
    }

    /**
     * @return the start
     */
    public DateTime getStart() {
        return new DateTime(start);
    }

    /**
     * @param start the start to set
     */
    public void setStart(DateTime start) {
        this.start = start.toDate();
    }

    /**
     * @return the end
     */
    public DateTime getEnd() {
        return new DateTime(end);
    }

    /**
     * @param end the end to set
     */
    public void setEnd(DateTime end) {
        this.end = end.toDate();
    }

    /**
     * @return the isProjectEvent
     */
    public boolean isProjectwide() {
        return isProjectEvent;
    }

    /**
     * @param isProjectEvent the isProjectEvent to set
     */
    public void setProjectEvent(boolean isProjectEvent) {
        this.isProjectEvent = isProjectEvent;
    }

    @Override
    public UUID getCategory() {
        return category;
    }

    /**
     * 
     */
    public Event addCategory(UUID category) {
        setCategory(category);
        return this;
    }

    /**
     * @param category the category to set
     */
    public void setCategory(UUID category) {
        this.category = category;
    }

    /**
     * @return the participants
     */
    public String getParticipants() {
        return participants;
    }

    /**
     * @param participants the participants to set
     */
    public void setParticipants(String participants) {
        this.participants = participants;
    }

    /**
     * 
     * @return whether this is an all day event or not
     */
    boolean isAllDay() {
        return isAllDay;
    }

    /**
     * set this event to be all day or not all day
     * 
     * @param isAllDay a boolean representing whether this event is all day
     */
    void setAllDay(boolean isAllDay) {
        this.isAllDay = isAllDay;
    }

    /**
     * returns the category that this event is associated with
     * 
     * @return a Category Object
     */
    public Category getAssociatedCategory() {
        return CategoryClient.getInstance().getCategoryByUUID(category);
    }

    @Override
    public Color getColor() {
        Color fallbackColor = isProjectEvent ? new Color(125, 157, 227) : new Color(227, 125, 147);
        Category cat = CategoryClient.getInstance().getCategoryByUUID(category);
        if (cat == null) {
            return fallbackColor;
        }
        Color eventColor = cat.getColor();
        if (eventColor != null) {
            return eventColor;
        }
        return fallbackColor;
    }

    /**
     * 
     * @return whether this day is a multiday event
     */
    public boolean isMultiDayEvent() {
        return (getEnd().getYear() != getStart().getYear() || getEnd().getDayOfYear() != getStart().getDayOfYear());
    }

    @Override
    public Interval getInterval() {
        return new Interval(getStart(), getEnd());
    }

    /**
     * this is primarily used for multiday events
     * 
     * @param givenDay gets the time that this event starts on a given day
     * @return when this event starts
     */
    public DateTime getStartTimeOnDay(DateTime givenDay) {
        MutableDateTime mDisplayedDay = new MutableDateTime(givenDay);
        mDisplayedDay.setMillisOfDay(1);
        // if it starts before the beginning of the day then its a multi day
        // event, or all day event
        if (this.getStart().isBefore(mDisplayedDay)) {
            mDisplayedDay.setMillisOfDay(0);
            return (mDisplayedDay.toDateTime());
        } else
            return this.getStart();
    }

    /**
     * this is primarily used for multiday events
     * 
     * @param givenDay gets the time that this event ends on a given day
     * @return when this event ends
     */
    public DateTime getEndTimeOnDay(DateTime givenDay) {
        MutableDateTime mDisplayedDay = new MutableDateTime(givenDay);
        ;
        mDisplayedDay.setMillisOfDay(86400000 - 2);
        if (this.getEnd().isAfter(mDisplayedDay)) {
            return mDisplayedDay.toDateTime();
        } else
            return this.getEnd();
    }

    @Override
    public void setTime(DateTime newTime) {
        if (new Interval(new DateTime(this.start), new DateTime(this.end)).contains(newTime)) {
            // this is what stops the events from being dragged to the next day.
            // leaving it in case we might want it later
            // return;
        }

        Interval i;
        int daysBetween = 0;
        if (new DateTime(this.start).isAfter(newTime)) {
            i = new Interval(newTime, new DateTime(this.start));
            daysBetween = 0 - (int) i.toDuration().getStandardDays();
        } else {
            i = new Interval(new DateTime(this.start), newTime);
            daysBetween = (int) i.toDuration().getStandardDays();
        }

        MutableDateTime newEnd = new MutableDateTime(this.end);
        newEnd.addDays(daysBetween);

        MutableDateTime newStart = new MutableDateTime(this.start);
        newStart.addDays(daysBetween);

        this.end = newEnd.toDate();
        this.start = newStart.toDate();

    }

    @Override
    public void update() {
        EventClient.getInstance().update(this);
    }

    @Override
    public String getFormattedHoverTextTime() {
        StringBuilder timeFormat = new StringBuilder()
                .append(getStart().toString(DateTimeFormat.forPattern("h:mma"))).append(" - ")
                .append(getEnd().toString(DateTimeFormat.forPattern("h:mma")));
        return timeFormat.toString();
    }

    @Override
    public String getFormattedDateRange() {
        if (this.isMultiDayEvent()) {
            DateTime s = new DateTime(this.start);
            DateTime e = new DateTime(this.end);
            StringBuilder timeFormat = new StringBuilder().append(s.monthOfYear().getAsShortText()).append(", ")
                    .append(Months.getDescriptiveNumber(s.getDayOfMonth())).append(" - ")
                    .append(e.monthOfYear().getAsShortText()).append(", ")
                    .append(Months.getDescriptiveNumber(e.getDayOfMonth()));
            return timeFormat.toString();
        } else {
            DateTime s = new DateTime(this.start);
            StringBuilder timeFormat = new StringBuilder().append(s.monthOfYear().getAsShortText()).append(", ")
                    .append(Months.getDescriptiveNumber(s.getDayOfMonth()));
            return timeFormat.toString();
        }
    }

    @Override
    public String toString() {
        return new StringBuilder(super.toString()).append("{name: ").append(getName()).append(", from: ")
                .append(getStart().toString()).append(", to: ").append(getEnd().toString()).append("}").toString();
    }

    public static class SerializedAction extends NetworkCachingClient.SerializedAction<Event> {
        public SerializedAction(Event e, UUID eventID, boolean b) {
            object = e;
            uuid = eventID;
            isDeleted = b;
        }
    }

    @Override
    public long getStartUnix() {
        return start.getTime() / 1000l;
    }

    @Override
    public long getEndUnix() {
        return end.getTime() / 1000l;
    }

    @Override
    public int compareTo(RangeData<Event> o) {
        long sdif = getStartUnix() - o.getStartUnix();
        if (sdif == 0) {
            return (int) (getEndUnix() - o.getEndUnix());
        }
        return (int) sdif;
    }

    @Override
    public UUID getUUID() {
        return uuid;
    }

}