package net.sf.gazpachoquest.domain.support; import java.lang.reflect.ParameterizedType; import javax.persistence.FetchType; import javax.persistence.ManyToOne; import javax.persistence.MappedSuperclass; import javax.persistence.Transient; import net.sf.gazpachoquest.domain.user.Role; import net.sf.gazpachoquest.domain.user.User; import net.sf.gazpachoquest.types.Perm; @MappedSuperclass public abstract class AbstractPermission<T extends Securizable> extends AbstractPersistable implements Permission<T> { @ManyToOne(fetch = FetchType.LAZY, optional = false) protected User user; @ManyToOne(fetch = FetchType.LAZY, optional = false) protected Role role; protected Integer mask; protected T target; protected AbstractPermission() { super(); } protected AbstractPermission(Integer id, User user, Role role, Integer mask, T target) { super(); super.setId(id); this.user = user; this.role = role; this.mask = mask; this.target = target; } @Override public User getUser() { return user; } protected void setUser(User user) { this.user = user; } @Override public Integer getMask() { return mask; } public void setMask(Integer mask) { this.mask = mask; } @Override public Role getRole() { return role; } public void setRole(Role role) { this.role = role; } @Override public T getTarget() { return target; } public void setTarget(T target) { this.target = target; } @Transient public String getLiteral() { ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); Class<T> targetClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0]; return new StringBuilder().append(targetClass.getSimpleName().toLowerCase()).append(":") .append(Perm.getLiteral(mask)).append(":").append(this.target.getId()).toString(); } }