Event.java

package com.tradecloud.domain.event;

import com.tradecloud.common.base.PersistenceBase;

import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlElement;
import java.util.Date;
import java.util.List;

@MappedSuperclass
public class Event extends PersistenceBase {

    /**
     * UID.
     */
    private static final long serialVersionUID = 1L;

    /**
     * User name of the logged in user that cause this event to be logged.
     */
    @NotNull
    @XmlElement
    private String username;

    /**
     * Event create date/time stamp.
     */
    @XmlElement
    @Temporal(TemporalType.TIMESTAMP)
    @NotNull
    protected Date createDateTime;

    /**
     * Explanation or reason for the need for an event. Not required but some of
     * the events require a reason to be given.
     */
    @XmlElement
    @Size(max = 500)
    private String reason;

    @XmlElement
    @Size(max = 500)
    private String instruction;

    private Date eventDate;

    public Event() {
        createDateTime = new Date();
    }

    public Event(String username) {
        this.username = username;
        createDateTime = new Date();
    }

    public String getInstruction() {
        return instruction;
    }

    public void setInstruction(String instruction) {
        this.instruction = instruction;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Date getCreateDateTime() {
        return createDateTime;
    }

    public void setCreateDateTime(Date createDateTime) {
        this.createDateTime = createDateTime;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public static <X extends Event> X getLastEvent(List<X> events) {
        return events == null || events.isEmpty() ? null : events.get(events.size() - 1);
    }

    public static <X extends EnumTypedEvent> X getFirstEvent(List<X> events, EventType eventType) {
        for (X event : events) {
            if (event.getEventType().equals(eventType)) {
                return event;
            }
        }
        return null;
    }

    public Date getEventDate() {
        return eventDate;
    }

    public void setEventDate(Date eventDate) {
        this.eventDate = eventDate;
    }
}