package ca.intelliware.ihtsdo.mlds.domain; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Type; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import com.fasterxml.jackson.annotation.JsonGetter; import com.fasterxml.jackson.annotation.JsonIgnore; /** * Persistent tokens are used by Spring Security to automatically log in users. * * @see ca.intelliware.ihtsdo.mlds.security.CustomPersistentRememberMeServices */ @Entity @Table(name = "T_PERSISTENT_TOKEN") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class PersistentToken implements Serializable { private static final long serialVersionUID = 1L; private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormat.forPattern("d MMMM yyyy"); private static final int MAX_USER_AGENT_LEN = 255; @Id private String series; @JsonIgnore @NotNull @Column(name = "token_value") private String tokenValue; @JsonIgnore @Column(name = "token_date") @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate") private LocalDate tokenDate; //an IPV6 address max length is 39 characters @Size(min = 0, max = 39) @Column(name = "ip_address") private String ipAddress; @Column(name = "user_agent") private String userAgent; @JsonIgnore @ManyToOne @JoinColumn(name="user_id") private User user; public String getSeries() { return series; } public void setSeries(String series) { this.series = series; } public String getTokenValue() { return tokenValue; } public void setTokenValue(String tokenValue) { this.tokenValue = tokenValue; } public LocalDate getTokenDate() { return tokenDate; } public void setTokenDate(LocalDate tokenDate) { this.tokenDate = tokenDate; } @JsonGetter public String getFormattedTokenDate() { return DATE_TIME_FORMATTER.print(this.tokenDate); } public String getIpAddress() { return ipAddress; } public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; } public String getUserAgent() { return userAgent; } public void setUserAgent(String userAgent) { if (userAgent.length() >= MAX_USER_AGENT_LEN) { this.userAgent = userAgent.substring(0, MAX_USER_AGENT_LEN - 1); } else { this.userAgent = userAgent; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } PersistentToken that = (PersistentToken) o; if (!series.equals(that.series)) { return false; } return true; } @Override public int hashCode() { return series.hashCode(); } @Override public String toString() { return "PersistentToken{" + "series='" + series + '\'' + ", tokenValue='" + tokenValue + '\'' + ", tokenDate=" + tokenDate + ", ipAddress='" + ipAddress + '\'' + ", userAgent='" + userAgent + '\'' + "}"; } }