/**
* =============================================================================
*
* 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.List;
import java.util.Map;
import javax.annotation.Resource;
import org.orcid.core.exception.OrcidClientGroupManagementException;
import org.orcid.core.locale.LocaleManager;
import org.orcid.core.manager.ClientDetailsManager;
import org.orcid.core.manager.EmailManager;
import org.orcid.core.manager.EncryptionManager;
import org.orcid.core.manager.MembersManager;
import org.orcid.core.manager.OrcidClientGroupManager;
import org.orcid.core.manager.ProfileEntityCacheManager;
import org.orcid.core.manager.ProfileEntityManager;
import org.orcid.core.manager.ThirdPartyLinkManager;
import org.orcid.jaxb.model.clientgroup.MemberType;
import org.orcid.jaxb.model.clientgroup.OrcidClient;
import org.orcid.jaxb.model.clientgroup.OrcidClientGroup;
import org.orcid.jaxb.model.message.ErrorDesc;
import org.orcid.persistence.dao.ProfileDao;
import org.orcid.persistence.jpa.entities.ClientDetailsEntity;
import org.orcid.persistence.jpa.entities.ClientSecretEntity;
import org.orcid.persistence.jpa.entities.ProfileEntity;
import org.orcid.pojo.ajaxForm.Client;
import org.orcid.pojo.ajaxForm.Member;
import org.orcid.pojo.ajaxForm.PojoUtil;
import org.orcid.pojo.ajaxForm.Text;
import org.orcid.utils.OrcidStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
public class MembersManagerImpl implements MembersManager {
private static final Logger LOGGER = LoggerFactory.getLogger(MembersManagerImpl.class);
@Resource
private LocaleManager localeManager;
@Resource
EmailManager emailManager;
@Resource
ProfileEntityManager profileEntityManager;
@Resource
OrcidClientGroupManager orcidClientGroupManager;
@Resource
ClientDetailsManager clientDetailsManager;
@Resource(name = "profileEntityCacheManager")
ProfileEntityCacheManager profileEntityCacheManager;
@Resource
private ThirdPartyLinkManager thirdPartyLinkManager;
@Resource
private EncryptionManager encryptionManager;
@Resource
private ProfileDao profileDao;
@Override
public Member createMember(Member newMember) {
OrcidClientGroup orcidClientGroup = newMember.toOrcidClientGroup();
orcidClientGroup = orcidClientGroupManager.createGroup(orcidClientGroup);
newMember.setGroupOrcid(Text.valueOf(orcidClientGroup.getGroupOrcid()));
return newMember;
}
@Override
public Member updateMemeber(Member member) {
OrcidClientGroup orcidClientGroup = member.toOrcidClientGroup();
orcidClientGroupManager.updateGroup(orcidClientGroup);
clearCache();
return member;
}
@Override
@Transactional
public Member getMember(String memberId) {
Member member = new Member();
String orcid = memberId;
if (!OrcidStringUtils.isValidOrcid(memberId)) {
Map<String, String> ids = emailManager.findOricdIdsByCommaSeparatedEmails(memberId);
//Check if it is using the email
if (ids != null && ids.containsKey(memberId)) {
orcid = ids.get(memberId);
} else {
//Check if can find it by name
try {
orcid = profileEntityManager.findByCreditName(memberId);
} catch (Exception e) {
member.getErrors().add(getMessage("manage_member.email_not_found"));
orcid = null;
}
}
}
if(PojoUtil.isEmpty(orcid)) {
member.getErrors().add(getMessage("manage_member.email_not_found"));
} else {
if (profileEntityManager.orcidExists(orcid)) {
MemberType groupType = profileEntityManager.getGroupType(orcid);
if (groupType != null) {
ProfileEntity memberProfile = profileDao.find(orcid);
member = Member.fromProfileEntity(memberProfile);
List<ClientDetailsEntity> clients = clientDetailsManager.findByGroupId(orcid);
member.setClients(Client.valueOf(clients));
} else {
member.getErrors().add(getMessage("manage_members.orcid_is_not_a_member"));
}
} else {
member.getErrors().add(getMessage("manage_members.orcid_doesnt_exists"));
}
}
return member;
}
@Override
public Client getClient(String clientId) {
Client result = new Client();
ClientDetailsEntity clientDetailsEntity = clientDetailsManager.findByClientId(clientId);
if (clientDetailsEntity != null) {
result = Client.valueOf(clientDetailsEntity);
//Set member name
result.setMemberName(Text.valueOf(clientDetailsManager.getMemberName(clientId)));
//Set client secret
if(clientDetailsEntity.getClientSecrets() != null) {
for(ClientSecretEntity secret : clientDetailsEntity.getClientSecrets()) {
if(secret.isPrimary()) {
result.setClientSecret(Text.valueOf(encryptionManager.decryptForInternalUse(secret.getClientSecret())));
}
}
}
} else {
result.getErrors().add(getMessage("admin.edit_client.invalid_orcid"));
}
return result;
}
@Override
public Client updateClient(Client client) {
OrcidClient result = null;
try {
result = orcidClientGroupManager.updateClient(client.toOrcidClient());
clearCache();
} catch (OrcidClientGroupManagementException e) {
LOGGER.error(e.getMessage());
result = new OrcidClient();
result.setErrors(new ErrorDesc(getMessage("manage.developer_tools.group.unable_to_update")));
}
return Client.valueOf(result);
}
private String getMessage(String message) {
return localeManager.resolveMessage(message);
}
/**
* Since the groups have changed, the cache version must be updated on
* database and all caches have to be evicted.
* */
public void clearCache() {
// Updates cache database version
thirdPartyLinkManager.updateDatabaseCacheVersion();
// Evict current cache
thirdPartyLinkManager.evictAll();
}
}