package org.jboss.seam.example.seamspace;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import org.hibernate.validator.Email;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Pattern;
import org.jboss.seam.annotations.Name;
/**
* A member account
*
* @author Shane Bryzak
*/
@Entity
@Name("member")
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "membername"))
public class Member implements Serializable
{
private static final long serialVersionUID = 5179242727836683375L;
public enum Gender {
male("Male", "his"),
female("Female", "her");
private String descr;
private String possessive;
Gender(String descr, String possessive) {
this.descr = descr;
this.possessive = possessive;
}
public String getDescr() {
return descr;
}
public String getPossessive() {
return possessive;
}
};
private Integer memberId;
private String memberName;
private String firstName;
private String lastName;
private String email;
private MemberImage picture;
private String tagline;
private Gender gender;
private Date dob;
private String location;
private Date memberSince;
private Set<MemberImage> images;
private Set<MemberFriend> friends;
@Id @GeneratedValue
public Integer getMemberId()
{
return memberId;
}
public void setMemberId(Integer memberId)
{
this.memberId = memberId;
}
@NotNull
@Length(min = 3, max = 40)
@Pattern(regex="[a-zA-Z]?[a-zA-Z0-9_]+",
message="Member name must start with a letter, and only contain letters, numbers or underscores")
public String getMemberName()
{
return memberName;
}
public void setMemberName(String memberName)
{
this.memberName = memberName;
}
@NotNull
@Length(min = 3, max = 40)
@Pattern(regex="[a-zA-Z]+", message="First name must only contain letters")
public String getFirstName()
{
return firstName;
}
public void setFirstName(String firstName)
{
this.firstName = firstName;
}
@NotNull
@Length(min = 3, max = 40)
@Pattern(regex="[a-zA-Z]+", message="Last name must only contain letters")
public String getLastName()
{
return lastName;
}
public void setLastName(String lastName)
{
this.lastName = lastName;
}
@NotNull @Email
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PICTURE_ID")
public MemberImage getPicture()
{
return picture;
}
public void setPicture(MemberImage picture)
{
this.picture = picture;
}
@NotNull
public Date getDob()
{
return dob;
}
public void setDob(Date dob)
{
this.dob = dob;
}
@NotNull
public Gender getGender()
{
return gender;
}
public void setGender(Gender gender)
{
this.gender = gender;
}
public String getLocation()
{
return location;
}
public void setLocation(String location)
{
this.location = location;
}
@NotNull
public Date getMemberSince()
{
return memberSince;
}
public void setMemberSince(Date memberSince)
{
this.memberSince = memberSince;
}
public String getTagline()
{
return tagline;
}
public void setTagline(String tagline)
{
this.tagline = tagline;
}
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
public Set<MemberImage> getImages()
{
return images;
}
public void setImages(Set<MemberImage> images)
{
this.images = images;
}
@OneToMany(mappedBy = "member")
public Set<MemberFriend> getFriends()
{
return friends;
}
public void setFriends(Set<MemberFriend> friends)
{
this.friends = friends;
}
@Transient
public boolean isFriend(Member member)
{
for (MemberFriend f : friends)
{
if (f.getFriend().getMemberId().equals(member.getMemberId())) return true;
}
return false;
}
@Transient
public String getAge()
{
Calendar birthday = new GregorianCalendar();
birthday.setTime(dob);
int by = birthday.get(Calendar.YEAR);
int bm = birthday.get(Calendar.MONTH);
int bd = birthday.get(Calendar.DATE);
Calendar now = new GregorianCalendar();
now.setTimeInMillis(System.currentTimeMillis());
int ny = now.get(Calendar.YEAR);
int nm = now.get(Calendar.MONTH);
int nd = now.get(Calendar.DATE);
int age = ny - by + (nm > bm || (nm == bm && nd >= bd) ? 0 : -1);
return String.format("%d years old", age);
}
}