package com.sap.pto.dao.entities; import java.util.ArrayList; import java.util.List; import java.util.Locale; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import org.apache.commons.lang3.RandomStringUtils; import org.eclipse.persistence.annotations.Index; @Table(name = "Leagues") @NamedQueries({ @NamedQuery(name = League.QUERY_BYKEY, query = "SELECT l FROM League l WHERE l.accessKey = :key"), @NamedQuery(name = League.QUERY_BYOWNER, query = "SELECT l FROM League l WHERE l.owner = :owner"), @NamedQuery(name = League.QUERY_BYUSER, query = "SELECT distinct l FROM League l left join l.members lm WHERE lm.user = :user") }) @Entity public class League extends BasicEntity { public static final String QUERY_BYKEY = "findLeagueByKey"; public static final String QUERY_BYOWNER = "findLeagueByOwner"; public static final String QUERY_BYUSER = "findLeagueByUser"; public enum Visibility { PRIVATE } @Id @GeneratedValue(strategy = GenerationType.TABLE) private long id; private String name; @Index private String accessKey = RandomStringUtils.randomAlphanumeric(12).toLowerCase(Locale.ENGLISH); // TODO: check for collisions before storing @Index private User owner; private Visibility visibility; @Index @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "LEAGUE_ID") private List<LeagueMember> members = new ArrayList<LeagueMember>(); public League() { // just needed for JPA } public League(User owner, String name) { this.owner = owner; this.name = name; } public long getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAccessKey() { return accessKey; } public User getOwner() { return owner; } public void setOwner(User owner) { this.owner = owner; } public Visibility getVisibility() { return visibility; } public void setVisibility(Visibility visibility) { this.visibility = visibility; } public List<LeagueMember> getMembers() { return members; } public List<User> getUsers() { List<User> users = new ArrayList<User>(); users.add(owner); for (LeagueMember member : members) { users.add(member.getUser()); } return users; } public void setMembers(List<LeagueMember> members) { this.members = members; } @Override public String toString() { return "League [name=" + name + ", owner=" + owner + "]"; } }