/**
* =============================================================================
*
* ORCID (R) Open Source
* http://orcid.org
*
* Copyright (c) 2012-2014 ORCID, Inc.
* Licensed under an MIT-Style License (MIT)
* http://orcid.org/open-source-license
*
* This copyright and license information (including a link to the full license)
* shall be included in its entirety in all copies or substantial portion of
* the software.
*
* =============================================================================
*/
package org.orcid.core.manager.impl;
import java.util.Date;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.orcid.core.constants.EmailConstants;
import org.orcid.core.manager.EmailManager;
import org.orcid.core.manager.NotificationManager;
import org.orcid.core.manager.SourceManager;
import org.orcid.core.manager.read_only.impl.EmailManagerReadOnlyImpl;
import org.orcid.jaxb.model.record_v2.Email;
import org.orcid.jaxb.model.record_v2.Emails;
import org.orcid.persistence.dao.ProfileDao;
import org.orcid.persistence.jpa.entities.EmailEntity;
import org.orcid.persistence.jpa.entities.IndexingStatus;
import org.orcid.persistence.jpa.entities.SourceEntity;
import org.orcid.pojo.ajaxForm.PojoUtil;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
/**
*
* @author Will Simpson
*
*/
public class EmailManagerImpl extends EmailManagerReadOnlyImpl implements EmailManager {
@Resource
private SourceManager sourceManager;
@Resource
private TransactionTemplate transactionTemplate;
@Resource
private ProfileDao profileDao;
@Resource
private NotificationManager notificationManager;
@Override
@Transactional
public void removeEmail(String orcid, String email) {
emailDao.removeEmail(orcid, email);
}
@Override
@Transactional
public void removeEmail(String orcid, String email, boolean removeIfPrimary) {
emailDao.removeEmail(orcid, email, removeIfPrimary);
}
@Override
public void addSourceToEmail(String email, String sourceId) {
emailDao.addSourceToEmail(sourceId, email);
}
@Override
public boolean verifyEmail(String email) {
return emailDao.verifyEmail(email);
}
@Override
@Transactional
public boolean verifyPrimaryEmail(String orcid) {
return emailDao.verifyPrimaryEmail(orcid);
}
@Override
@Transactional
public boolean moveEmailToOtherAccount(String email, String origin, String destination) {
boolean moved = emailDao.moveEmailToOtherAccountAsNonPrimary(email, origin, destination);
if (moved) {
profileDao.updateLastModifiedDateAndIndexingStatusWithoutResult(destination, new Date(), IndexingStatus.PENDING);
}
return moved;
}
@Override
public boolean verifySetCurrentAndPrimary(String orcid, String email) {
if (PojoUtil.isEmpty(orcid) || PojoUtil.isEmpty(email)) {
throw new IllegalArgumentException("orcid or email param is empty or null");
}
return emailDao.verifySetCurrentAndPrimary(orcid, email);
}
/***
* Indicates if the given email address could be auto deprecated given the
* ORCID rules. See
* https://trello.com/c/ouHyr0mp/3144-implement-new-auto-deprecate-workflow-
* for-members-unclaimed-ids
*
* @param email
* Email address
* @return true if the email exists in a non claimed record and the client
* source of the record allows auto deprecating records
*/
@Override
public boolean isAutoDeprecateEnableForEmail(String email) {
if (PojoUtil.isEmpty(email)) {
return false;
}
return emailDao.isAutoDeprecateEnableForEmail(email);
}
@Override
@Transactional
public void updateEmails(HttpServletRequest request, String orcid, Emails emails) {
Email currentPrimaryEmail = findPrimaryEmail(orcid);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
boolean primaryFound = false;
Email newPrimaryEmail = null;
if (emails != null && !emails.getEmails().isEmpty()) {
for (Email email : emails.getEmails()) {
emailDao.updateEmail(orcid, email.getEmail(), email.isCurrent(), email.getVisibility());
if (email.isPrimary()) {
if (primaryFound) {
throw new IllegalArgumentException("More than one primary email specified");
} else {
primaryFound = true;
newPrimaryEmail = email;
}
emailDao.updatePrimary(orcid, email.getEmail());
}
}
}
if(!StringUtils.equals(currentPrimaryEmail.getEmail(), newPrimaryEmail.getEmail())) {
notificationManager.sendEmailAddressChangedNotification(orcid, newPrimaryEmail.getEmail(), currentPrimaryEmail.getEmail());
if (!newPrimaryEmail.isVerified()) {
notificationManager.sendVerificationEmail(orcid, newPrimaryEmail.getEmail());
request.getSession().setAttribute(EmailConstants.CHECK_EMAIL_VALIDATED, false);
}
}
}
});
}
@Override
@Transactional
public void addEmail(HttpServletRequest request, String orcid, Email email) {
SourceEntity sourceEntity = sourceManager.retrieveSourceEntity();
String sourceId = sourceEntity.getSourceProfile() == null ? null : sourceEntity.getSourceProfile().getId();
String clientSourceId = sourceEntity.getSourceClient() == null ? null : sourceEntity.getSourceClient().getId();
Email currentPrimaryEmail = findPrimaryEmail(orcid);
// Create the new email
emailDao.addEmail(orcid, email.getEmail(), email.getVisibility(), sourceId, clientSourceId);
// if primary email changed send notification.
if (email.isPrimary() && !StringUtils.equals(currentPrimaryEmail.getEmail(), email.getEmail())) {
request.getSession().setAttribute(EmailConstants.CHECK_EMAIL_VALIDATED, false);
notificationManager.sendEmailAddressChangedNotification(orcid, email.getEmail(), currentPrimaryEmail.getEmail());
}
// send verifcation email for new address
notificationManager.sendVerificationEmail(orcid, email.getEmail());
}
@Override
public void update(EmailEntity emailEntity) {
emailDao.merge(emailEntity);
}
}