package com.idega.notifier.data;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.idega.user.data.User;
import com.idega.user.data.UserBMPBean;
import com.idega.util.CoreConstants;
import com.idega.util.ListUtil;
/**
*
* <p>Entity to report number of new messages in mailbox.</p>
* <p>You can report about problems to:
* <a href="mailto:martynas@idega.is">Martynas StakÄ—</a></p>
*
* @version 1.0.0 Apr 9, 2013
* @author <a href="mailto:martynas@idega.is">Martynas StakÄ—</a>
*/
@Entity
@Table(name = NotificationEntity.TABLE_NAME)
@NamedQueries({
@NamedQuery(
name = NotificationEntity.QUERY_FIND_ALL,
query = "SELECT DISTINCT s FROM NotificationEntity s " +
"LEFT OUTER JOIN FETCH s.receivers"),
@NamedQuery(
name = NotificationEntity.QUERY_FIND_BY_ID,
query = "SELECT DISTINCT s FROM NotificationEntity s " +
"LEFT OUTER JOIN FETCH s.receivers " +
"WHERE s.id =:" +
NotificationEntity.idProp),
@NamedQuery(
name = NotificationEntity.QUERY_FIND_BY_TARGET,
query = "SELECT DISTINCT ne FROM NotificationEntity ne " +
"LEFT OUTER JOIN FETCH ne.receivers AS target " +
"WHERE target.notification = ne " +
"AND target.receiverId =:" +
NotificationReceiverEntity.receiverIdProp + CoreConstants.SPACE +
"AND target.receiverClass =:" + NotificationReceiverEntity.receiverClassProp),
@NamedQuery(
name = NotificationEntity.QUERY_COUNT_BY_TARGET_AND_STATE,
query = "SELECT COUNT(DISTINCT ne) FROM NotificationEntity ne " +
"LEFT OUTER JOIN ne.receivers AS target " +
"WHERE target.notification = ne " +
"AND target.receiverId =:" +
NotificationReceiverEntity.receiverIdProp + CoreConstants.SPACE +
"AND target.receiverClass =:" +
NotificationReceiverEntity.receiverClassProp + CoreConstants.SPACE +
"AND target.read =:" + NotificationReceiverEntity.readProp)
})
public class NotificationEntity implements Serializable {
private static final long serialVersionUID = 2764472085912873052L;
public static final String TABLE_NAME = "ic_notification";
public static final String JOIN_TABLE_NAME = "ic_notification_subscription";
public static final String QUERY_FIND_ALL = "notificationEntity.findAll";
public static final String QUERY_FIND_BY_ID = "notificationEntity.findByID";
public static final String QUERY_FIND_BY_TARGET = "notificationEntity.findByTargetId";
public static final String QUERY_COUNT_BY_TARGET_AND_STATE = "notificationEntity.countByUserIDAndState";
public static final String idProp = "id";
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
public static final String messageProp = "message";
public static final String COLUMN_MESSAGE = "message";
@Column(name = COLUMN_MESSAGE)
private String message;
@OneToMany(mappedBy = NotificationReceiverEntity.notificationProp)
private Set<NotificationReceiverEntity> receivers;
/**
* @return the id
*/
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
/**
* @return the message
*/
public String getMessage() {
return message;
}
/**
* @param message the message to set
*/
public void setMessage(String message) {
this.message = message;
}
public Set<NotificationReceiverEntity> getReceivers() {
return receivers;
}
public void setReceivers(Set<NotificationReceiverEntity> receivers) {
this.receivers = receivers;
}
public boolean addReceiver(NotificationReceiverEntity receiver) {
if (receiver == null) {
return Boolean.FALSE;
}
if (this.receivers == null) {
this.receivers = new HashSet<NotificationReceiverEntity>();
}
return this.receivers.add(receiver);
}
public void removeReceiver(NotificationReceiverEntity target) {
if (target == null) {
return;
}
if (ListUtil.isEmpty(this.receivers)) {
return;
}
this.receivers.remove(target);
}
public void addReceiver(User receiver) {
if (receiver != null) {
addReceiver(new NotificationReceiverEntity(
receiver.getPrimaryKey().toString(),
receiver.getClass()));
}
}
public boolean isReceiver(User user) {
if (user == null) {
return Boolean.FALSE;
}
String userId = user.getPrimaryKey().toString();
for (NotificationReceiverEntity receiver : this.receivers) {
if (!userId.equals(receiver.getReceiverId())) {
continue;
}
if (UserBMPBean.class.toString().equals(receiver.getReceiverClass())) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
public Boolean isRead(User user) {
if (user == null) {
return null;
}
String userId = user.getPrimaryKey().toString();
for (NotificationReceiverEntity receiver : this.receivers) {
if (!userId.equals(receiver.getReceiverId())) {
continue;
}
if (!UserBMPBean.class.toString().equals(receiver.getReceiverClass())) {
continue;
}
return receiver.isRead();
}
return null;
}
}