package com.idega.core.contact.data;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.logging.Level;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
import com.idega.business.IBORuntimeException;
import com.idega.core.data.GenericTypeBMPBean;
import com.idega.core.user.data.User;
import com.idega.data.IDOCompositePrimaryKeyException;
import com.idega.data.IDOEntity;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.data.IDOQuery;
import com.idega.data.query.Column;
import com.idega.data.query.InCriteria;
import com.idega.data.query.MatchCriteria;
import com.idega.data.query.SelectQuery;
import com.idega.data.query.Table;
import com.idega.user.data.Group;
import com.idega.user.data.GroupBMPBean;
import com.idega.user.data.UserBMPBean;
import com.idega.util.CoreConstants;
import com.idega.util.ListUtil;
import com.idega.util.StringUtil;
/**
* Title: IW Core
* Description:
* Copyright: Copyright (c) 2001
* Company: idega.is
* @author 2000 - idega team - <a href="mailto:gummi@idega.is">Gu?mundur ?g?st S?mundsson</a>
* @version 1.0
*/
public class EmailBMPBean
extends ContactBmpBean
implements com.idega.core.contact.data.Email, com.idega.core.contact.data.EmailDataView{
private static final long serialVersionUID = -6649005980606226999L;
public final static String SQL_TABLE_NAME = "IC_EMAIL";
public final static String SQL_COLUMN_EMAIL = "ADDRESS";
public final static String SQL_COLUMN_TYPE = "IC_EMAIL_TYPE_ID";
public final static String SQL_COLUMN_EMAIL_ID = "IC_EMAIL_ID";
public EmailBMPBean()
{
super();
}
public EmailBMPBean(int id) throws SQLException
{
super(id);
}
@Override
public void initializeAttributes()
{
this.addAttribute(this.getIDColumnName());
this.addAttribute(getColumnNameAddress(), "Email address", true, true, String.class, 255);
addManyToOneRelationship(getColumnNameEmailTypeId(), "Type", EmailType.class);
this.addManyToManyRelationShip(User.class, "ic_user_email");
super.initializeAttributes();
}
@Override
public void remove() throws RemoveException {
try {
idoRemoveFrom(User.class);
} catch (Exception e) {
}
super.remove();
}
@Override
public String getEntityName()
{
return SQL_TABLE_NAME;
}
public static String getColumnNameAddress()
{
return SQL_COLUMN_EMAIL;
}
public static String getColumnNameEmailId()
{
return SQL_COLUMN_EMAIL_ID;
}
public static String getColumnNameEmailTypeId()
{
return SQL_COLUMN_TYPE;
}
public void setEmailAddress(String address)
{
setColumn(getColumnNameAddress(), address);
}
public String getEmailAddress()
{
return getStringColumnValue(getColumnNameAddress());
}
public String getEmailAddressMailtoFormatted()
{
return getEmailAddressMailtoFormattedWithSubject(null);
}
public String getEmailAddressMailtoFormattedWithSubject(String subject) {
String emailAddress = getStringColumnValue(getColumnNameAddress());
if (emailAddress != null && !emailAddress.equals("")) {
String subjectString = "";
if (subject != null && !subject.equals("")) {
subjectString = "?subject="+subject;
}
emailAddress = "<a href=\"mailto:"+emailAddress+ subjectString +"\">"+emailAddress+"</a>";
}
return emailAddress;
}
public void setEmailType(EmailType emailType) {
setColumn(getColumnNameEmailTypeId(), emailType);
}
public EmailType getEmailType() {
return (EmailType) getColumnValue(getColumnNameEmailTypeId());
}
public void setEmailTypeId(int id)
{
setColumn(getColumnNameEmailTypeId(), id);
}
public int getEmailTypeId()
{
return getIntColumnValue(getColumnNameEmailTypeId());
}
/**
*
* @param user
* @return
* @throws FinderException
* @throws RemoteException
*
*/
public Collection<Object> ejbFindEmailsForUser(com.idega.user.data.User user) throws FinderException
{
Object userId = user.getPrimaryKey();
return executeQuery(com.idega.user.data.User.class, UserBMPBean.SQL_RELATION_EMAIL, userId);
}
/**
*
* @param iUserId
* @return
* @throws FinderException
*
*/
public Collection<Object> ejbFindEmailsForUser(int iUserId) throws FinderException
{
Object userId = new Integer(iUserId);
return executeQuery(com.idega.user.data.User.class, UserBMPBean.SQL_RELATION_EMAIL, userId);
}
public Object ejbFindEmailForUser(com.idega.user.data.User user, EmailType emailType) throws FinderException {
return findEmailForUser(user, emailType.getUniqueName());
}
public Object ejbFindEmailForGroup(Group group, EmailType emailType) throws FinderException {
return findEmailForGroup(group, emailType.getUniqueName());
}
/**
* Just a shortcut for the main email type.
*
* @param user
* @return
* @throws FinderException
* @throws RemoteException
*/
public Object ejbFindMainEmailForUser(com.idega.user.data.User user) throws FinderException {
return findEmailForUser(user,EmailTypeBMPBean.MAIN_EMAIL);
}
/**
* Just a shortcut for the main email type.
*
* @param user
* @return
* @throws FinderException
* @throws RemoteException
*/
public Object ejbFindMainEmailForGroup(Group group) throws FinderException {
return findEmailForGroup(group, EmailTypeBMPBean.MAIN_EMAIL);
}
private Object findEmailForGroup(Group group, String uniqueNameOfEmailType) throws FinderException {
return findEmailForUserOrGroup(Group.class, GroupBMPBean.SQL_RELATION_EMAIL, group, uniqueNameOfEmailType);
}
private Object findEmailForUser(com.idega.user.data.User user, String uniqueNameOfEmailType) throws FinderException {
return findEmailForUserOrGroup(com.idega.user.data.User.class, UserBMPBean.SQL_RELATION_EMAIL, user, uniqueNameOfEmailType);
}
private Object findEmailForUserOrGroup(Class userOrGroupClass, String relationTableName, IDOEntity userOrGroup, String uniqueNameOfEmailType) throws FinderException {
Object userOrGroupId = userOrGroup.getPrimaryKey();
Object pk = null;
try {
pk = executeQuery(userOrGroupClass, relationTableName, userOrGroupId, uniqueNameOfEmailType);
}
catch (FinderException ex) {
pk = null;
}
if (pk != null) {
return pk;
}
// nothing found?
// repairing email stuff - that usually done only one time per user
// choose the latest email (that is the email with the greatest primary key) that has no email type
// try to trepair data only for main email type
if (! EmailTypeBMPBean.MAIN_EMAIL.equals(uniqueNameOfEmailType)) {
throw new FinderException();
}
Collection coll = executeQuery(userOrGroupClass, relationTableName, userOrGroupId);
// if coll is null there are not any emails
if (coll == null || coll.isEmpty()) {
throw new FinderException();
}
Email resultEmail = null;
Integer resultEmailPrimaryKey = null;
EmailHome home = (EmailHome) getEJBLocalHome();
Iterator allEmailsIterator = coll.iterator();
while (allEmailsIterator.hasNext()) {
Integer anEmailPrimaryKey = (Integer) allEmailsIterator.next();
Email anEmail = home.findByPrimaryKey(anEmailPrimaryKey);
EmailType emailType = anEmail.getEmailType();
// do not find emails with a set type
if (emailType == null) {
// choose the one with the greatest primary key
if (resultEmailPrimaryKey == null || ( anEmailPrimaryKey.compareTo(resultEmailPrimaryKey)) > 0) {
resultEmailPrimaryKey = anEmailPrimaryKey;
resultEmail = anEmail;
}
}
}
// hopefully we found something - maybe not
if (resultEmail == null) {
// that means there are only emails with a different type than "main" - quite strange....
throw new FinderException();
}
// the found email has no type yet
// set the type to main email
EmailTypeHome emailTypeHome;
try {
emailTypeHome = (EmailTypeHome) IDOLookup.getHome(EmailType.class);
EmailType mainEmailType = emailTypeHome.findMainEmailType();
resultEmail.setEmailType(mainEmailType);
resultEmail.store();
return resultEmailPrimaryKey;
}
catch (IDOLookupException e) {
e.printStackTrace();
throw new IBORuntimeException();
}
catch (RemoteException e) {
e.printStackTrace();
throw new IBORuntimeException();
}
catch (FinderException e) {
// ! main email type is always set !
e.printStackTrace();
throw new IBORuntimeException();
}
}
private Collection executeQuery(Class userOrGroupClass, String relationTableName, Object userOrGroupId) throws FinderException {
IDOQuery query = getFromQuery(relationTableName);
appendWhere(query, userOrGroupClass, userOrGroupId);
return idoFindPKsByQuery(query);
}
private Object executeQuery(Class userOrGroupClass, String relationTableName, Object userOrGroupId, String uniqueNameOfEmailType) throws FinderException {
IDOQuery query = getFromQuery(relationTableName);
query.append(",");
Table emailTypeTable = new Table(EmailType.class);
query.append(emailTypeTable).append(" type ");
appendWhere(query, userOrGroupClass, userOrGroupId);
String emailTypePrimaryKey = null;
String emailTypeUniqueName = GenericTypeBMPBean.getColumnNameUniqueName();
try {
emailTypePrimaryKey = emailTypeTable.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName();
}
catch (IDOCompositePrimaryKeyException e) {
throw new FinderException(e.getMessage());
}
query.appendAnd();
query.append(" email.").append(getColumnNameEmailTypeId()).appendEqualSign().append("type.").append(emailTypePrimaryKey);
query.appendAnd();
query.append("type.").append(emailTypeUniqueName).appendEqualSign().appendQuoted(uniqueNameOfEmailType);
return idoFindOnePKByQuery(query);
}
private IDOQuery getFromQuery(String relationTableName) {
IDOQuery query = idoQuery();
query.appendSelect();
query.append("email.*");
query.append(" from ");
query.append(getTableName()).append(" email,");
query.append(relationTableName).append(" iue ");
return query;
}
private void appendWhere(IDOQuery query, Class userOrGroupClass, Object userOrGroupId) throws FinderException {
Table userOrGroupTable = new Table(userOrGroupClass);
String userOrGroupPrimaryKey = null;
try {
userOrGroupPrimaryKey = userOrGroupTable.getEntityDefinition().getPrimaryKeyDefinition().getField().getSQLFieldName();
}
catch (IDOCompositePrimaryKeyException e) {
throw new FinderException(e.getMessage());
}
query.appendWhere();
query.append(" email.").append(getIDColumnName()).appendEqualSign().append("iue.").append(getIDColumnName());
query.appendAnd();
query.append("iue.").append(userOrGroupPrimaryKey).appendEqualSign().append(userOrGroupId);
}
public Collection<Integer> ejbFindMainEmailsForUsers(Collection<com.idega.user.data.User> users) throws FinderException {
Table emails = new Table(this);
SelectQuery query = new SelectQuery(emails);
Table emailTypes = new Table(EmailType.class);
query.addColumn(new Column(emails, getIDColumnName()));
query.addJoin(emails, SQL_COLUMN_TYPE, emailTypes, SQL_COLUMN_TYPE);
query.addCriteria(new MatchCriteria(emailTypes, GenericTypeBMPBean.getColumnNameUniqueName(), MatchCriteria.EQUALS, EmailTypeBMPBean.MAIN_EMAIL));
Table usersEmails = new Table(UserBMPBean.SQL_RELATION_EMAIL);
query.addJoin(emails, getIDColumnName(), usersEmails, getIDColumnName());
Table usersTable = new Table(com.idega.user.data.User.class);
query.addJoin(usersEmails, com.idega.user.data.User.FIELD_USER_ID, usersTable, com.idega.user.data.User.FIELD_USER_ID);
query.addCriteria(new InCriteria(usersTable, com.idega.user.data.User.FIELD_USER_ID, users));
return idoFindPKsByQuery(query);
}
/**
*
* @param emailAddress is {@link Collection} of {@link Email#getEmailAddress()},
* not <code>null</code>;
* @return {@link Collection} of {@link Email#getPrimaryKey()} or
* {@link Collections#emptyList()} on failure;
* @author <a href="mailto:martynas@idega.is">Martynas StakÄ—</a>
*/
public Collection<Object> ejbFindByEmailAddress(
Collection<String> emailAddress) {
if (ListUtil.isEmpty(emailAddress)) {
return Collections.emptyList();
}
IDOQuery query = idoQuery();
query.appendSelectAllFrom(this);
query.appendWhere().append(SQL_COLUMN_EMAIL);
query.appendInForStringCollectionWithSingleQuotes(emailAddress);
try {
return idoFindPKsByQuery(query);
} catch (FinderException e) {
java.util.logging.Logger.getLogger(getClass().getName()).log(
Level.WARNING,
"Failed to get primary keys for " + this.getClass().getName() +
" by primary keys: " + query.toString());
}
return Collections.emptyList();
}
/**
*
* @param emailAddress is {@link Email#getEmailAddress()}, not <code>null</code>;
* @return {@link Collection} of {@link Email#getPrimaryKey()}s similar to given one, or
* {@link Collections#emptyList()} on failure;
* @author <a href="mailto:martynas@idega.is">Martynas StakÄ—</a>
*/
public Collection<Object> ejbFindByEmailAddressPart(String emailAddress) {
if (StringUtil.isEmpty(emailAddress)) {
return Collections.emptyList();
}
IDOQuery query = idoQuery();
query.appendSelectAllFrom(this)
.appendWhere(SQL_COLUMN_EMAIL)
.appendLike().append(CoreConstants.QOUTE_SINGLE_MARK).append(CoreConstants.PERCENT)
.append(emailAddress)
.append(CoreConstants.PERCENT).append(CoreConstants.QOUTE_SINGLE_MARK);
try {
return idoFindPKsByQuery(query);
} catch (FinderException e) {
java.util.logging.Logger.getLogger(getClass().getName()).log(
Level.WARNING,
"Failed to get primary keys for " + this.getClass().getName() +
" by primary keys: " + query.toString());
}
return Collections.emptyList();
}
}