package edu.ualberta.med.biobank.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.hibernate.annotations.Type;
@Entity
@Table(name = "PRINCIPAL")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DISCRIMINATOR",
discriminatorType = DiscriminatorType.STRING)
public class Principal extends AbstractBiobankModel {
private static final long serialVersionUID = 1L;
private Set<Membership> memberships = new HashSet<Membership>(0);
private ActivityStatus activityStatus = ActivityStatus.ACTIVE;
// Require at least one membership on creation so there is some loose
// association between the creator and the created user.
// FIXME: move this to group and require at least one group or membership
// for a user.
// @NotEmpty(groups = PreInsert.class, message =
// "{edu.ualberta.med.biobank.model.Principal.memberships.NotEmpty}")
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "principal")
public Set<Membership> getMemberships() {
return this.memberships;
}
public void setMemberships(Set<Membership> memberships) {
this.memberships = memberships;
}
@NotNull(message = "{edu.ualberta.med.biobank.model.Principal.activityStatus.NotNull}")
@Column(name = "ACTIVITY_STATUS_ID", nullable = false)
@Type(type = "activityStatus")
public ActivityStatus getActivityStatus() {
return this.activityStatus;
}
public void setActivityStatus(ActivityStatus activityStatus) {
this.activityStatus = activityStatus;
}
/**
* Return true if this {@link Principal} can be removed by the given
* {@link User}, i.e. if the given {@link User} is of <em>equal</em> or
* greater power.
*
* @param user
* @return true if this {@link Principal} is subordinate to the given
* {@link User}.
*/
@Transient
public boolean isFullyManageable(User user) {
for (Membership membership : getMemberships()) {
if (!membership.isFullyManageable(user)) return false;
}
return true;
}
}