hs.hsadmin/hsarback/src/de/hsadmin/mods/email/EMailAlias.java
2011-03-24 17:18:30 +00:00

198 lines
5.1 KiB
Java

package de.hsadmin.mods.email;
import static javax.persistence.GenerationType.SEQUENCE;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import de.hsadmin.core.model.AbstractEntity;
import de.hsadmin.core.model.AbstractModuleImpl;
import de.hsadmin.core.model.EntityInfo;
import de.hsadmin.core.model.FieldValidation;
import de.hsadmin.core.model.SearchFilter;
import de.hsadmin.mods.pac.Pac;
import de.hsadmin.mods.user.UnixUser;
/**
* Entity class for email aliases.
*
*/
@javax.persistence.Entity(name = "EMailAliases")
@Table(name = "emailalias")
@SequenceGenerator(name = "EMailAliasesSeqGen", sequenceName = "emailalias_emailalias_id_seq")
@EntityInfo(name = "E-Mail-Alias")
@SearchFilter("obj.pac = :loginUserPac OR obj.pac.customer.name = :loginUserName")
public class EMailAlias extends AbstractEntity implements Serializable {
private static final long serialVersionUID = -4711415079723587161L;
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "EMailAliasesSeqGen")
@Column(name = "emailalias_id", columnDefinition = "integer", insertable=false, updatable=false)
private long id;
@ManyToOne()
@JoinColumn(name = "pac_id", columnDefinition = "integer")
private Pac pac;
@FieldValidation("[a-z0-9\\_\\-\\.\\+]*")
@Column(updatable=false)
private String name;
@FieldValidation("[a-zA-Z0-9\\_\\-\\.\\|\\\"\\/\\@\\,\\+\\ ]*")
@Column
private String target;
public EMailAlias() {
}
public EMailAlias(Pac pac, String name, String target) {
this.pac = pac;
this.name = name;
this.target = target;
}
@Override
public void initialize(EntityManager em, UnixUser loginUser) {
pac = loginUser.getPac();
name = pac.getName() + "-";
target = "";
}
@Override
public void complete(EntityManager em, UnixUser loginUser) {
if (pac == null && name != null && name.length() > 0) {
// TODO: it's ugly having this code here, needs refactoring
String pacName = name.substring(0, 5);
try {
// get the entities name (query part from FROM to WHERE)
Entity entityAnnot = Pac.class.getAnnotation(Entity.class);
String queryString = "SELECT obj FROM " + entityAnnot.name() + " obj WHERE " + Pac.createQueryFromStringKey(pacName);
// set parameters
Query query = em.createQuery(queryString);
AbstractModuleImpl.setQueryParameter(query, queryString, "loginUser", loginUser);
AbstractModuleImpl.setQueryParameter(query, queryString, "loginUserName", loginUser.getName());
AbstractModuleImpl.setQueryParameter(query, queryString, "loginUserPac", loginUser.getPac());
pac = (Pac) query.getSingleResult();
} catch (NoResultException exc) {
throw new SecurityException("packet '" + pacName + "' not found or access denied");
}
}
}
public static String createQueryFromStringKey(String humanKey) {
return "name='" + humanKey + "'";
}
@Override
public String createStringKey() {
return name;
}
@Override
public long id() {
return id;
}
public long getId() {
return id;
}
protected void setId(long id) {
this.id = id;
}
public Pac getPac() {
return pac;
}
public void setPac(Pac pac) {
this.pac = pac;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
@Override
public boolean isNew() {
return id == 0;
}
@Override
public String getHiveName() {
if (isNew())
return null;
else
return getPac().getHiveName();
}
@Override
public UnixUser owningUser(EntityManager em) {
return pac.owningUser(em);
}
public AbstractEntity merge(EntityManager em, UnixUser loginUser) {
EMailAlias attachedEntity = em.find(getClass(), id());
Pac attachedPacket = attachedEntity.getPac();
if (pac.getId() != attachedPacket.getId())
throw new SecurityException(
"changing the Packet of an EMailAlias is not allowed");
if (!name.equals(attachedPacket.getName())
&& !name.startsWith(attachedPacket.getName() + "-"))
throw new SecurityException(
"changing the Packet of an EMailAlias is not allowed");
attachedEntity.setName(name);
attachedEntity.setTarget(target);
return attachedEntity;
}
@Override
public boolean isReadAllowedFor(UnixUser loginUser) {
return loginUser.hasPacAdminRoleFor(getPac());
}
@Override
public boolean isWriteAllowedFor(UnixUser loginUser) {
String pacName = pac.getName();
if (!name.equals(pacName) && !name.startsWith(pacName + "-"))
return false;
return loginUser.hasPacAdminRoleFor(getPac());
}
public static String restriction() {
return
// all aliases of all pacs of customer
"obj.pac.customer.name=:loginUserName OR " +
// all aliases of packet admin
"obj.pac.name=:loginUserName";
}
}