package edu.ualberta.med.biobank.model; import java.io.Serializable; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.Table; import org.hibernate.annotations.Type; import org.hibernate.validator.constraints.NotEmpty; import edu.ualberta.med.biobank.util.NullHelper; import edu.ualberta.med.biobank.validator.constraint.Unique; import edu.ualberta.med.biobank.validator.group.PrePersist; @Entity @Table(name = "ROLE") @Unique(properties = "name", groups = PrePersist.class) // TODO: check that no Membership uses this role before deleting public class Role extends AbstractBiobankModel { public static final NameComparator NAME_COMPARATOR = new NameComparator(); private static final long serialVersionUID = 1L; private String name; private Set<PermissionEnum> permissions = new HashSet<PermissionEnum>(0); @NotEmpty(message = "{edu.ualberta.med.biobank.model.Role.name.NotEmpty}") @Column(name = "NAME", unique = true, nullable = false) public String getName() { return this.name; } public void setName(String name) { this.name = name; } @ElementCollection(targetClass = PermissionEnum.class, fetch = FetchType.EAGER) @CollectionTable(name = "ROLE_PERMISSION", joinColumns = @JoinColumn(name = "ID")) @Column(name = "PERMISSION_ID", nullable = false) @Type(type = "permissionEnum") public Set<PermissionEnum> getPermissions() { return this.permissions; } public void setPermissions(Set<PermissionEnum> permissions) { this.permissions = permissions; } private static class NameComparator implements Comparator<Role>, Serializable { private static final long serialVersionUID = 1L; @Override public int compare(Role a, Role b) { if (a == null && b == null) return 0; if (a == null ^ b == null) return (a == null) ? -1 : 1; return NullHelper.safeCompareTo(a.getName(), b.getName()); } } }