/**
* =============================================================================
*
* 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.io.Writer;
import java.util.List;
import javax.annotation.Resource;
import org.orcid.core.manager.OrgManager;
import org.orcid.core.manager.SourceManager;
import org.orcid.jaxb.model.common_v2.OrganizationHolder;
import org.orcid.jaxb.model.message.Iso3166Country;
import org.orcid.jaxb.model.message.Organization;
import org.orcid.persistence.dao.OrgDao;
import org.orcid.persistence.dao.OrgDisambiguatedDao;
import org.orcid.persistence.jpa.entities.AmbiguousOrgEntity;
import org.orcid.persistence.jpa.entities.OrgDisambiguatedEntity;
import org.orcid.persistence.jpa.entities.OrgEntity;
import org.orcid.persistence.jpa.entities.SourceEntity;
import au.com.bytecode.opencsv.CSVWriter;
/**
*
* @author Will Simpson
*
*/
public class OrgManagerImpl implements OrgManager {
private static final String[] AMBIGUOUS_ORGS_HEADER = new String[] { "id", "source_orcid", "name", "city", "region", "country", "used_count" };
private static final String[] DISAMBIGUATED_ORGS_HEADER = new String[] { "id", "source_id", "source_type", "org_type", "name", "city", "region", "country",
"used_count" };
private static final int CHUNK_SIZE = 10000;
@Resource
private OrgDao orgDao;
@Resource
private OrgDisambiguatedDao orgDisambiguatedDao;
@Resource
private SourceManager sourceManager;
@Override
public List<AmbiguousOrgEntity> getAmbiguousOrgs(int firstResult, int maxResults) {
return orgDao.getAmbiguousOrgs(firstResult, maxResults);
}
@Override
public void writeAmbiguousOrgs(Writer writer) {
@SuppressWarnings("resource")
CSVWriter csvWriter = new CSVWriter(writer);
csvWriter.writeNext(AMBIGUOUS_ORGS_HEADER);
int firstResult = 0;
List<AmbiguousOrgEntity> chunk = null;
do {
chunk = getAmbiguousOrgs(firstResult, CHUNK_SIZE);
for (AmbiguousOrgEntity orgEntity : chunk) {
String[] line = new String[] { String.valueOf(orgEntity.getId()), orgEntity.getSourceOrcid(), orgEntity.getName(), orgEntity.getCity(),
orgEntity.getRegion(), orgEntity.getCountry().value(), String.valueOf(orgEntity.getUsedCount()) };
csvWriter.writeNext(line);
}
firstResult += chunk.size();
} while (!chunk.isEmpty());
}
@Override
public void writeDisambiguatedOrgs(Writer writer) {
@SuppressWarnings("resource")
CSVWriter csvWriter = new CSVWriter(writer);
csvWriter.writeNext(DISAMBIGUATED_ORGS_HEADER);
int firstResult = 0;
List<OrgDisambiguatedEntity> chunk = null;
do {
chunk = orgDisambiguatedDao.getChunk(firstResult, CHUNK_SIZE);
for (OrgDisambiguatedEntity orgEntity : chunk) {
String[] line = new String[] { String.valueOf(orgEntity.getId()), orgEntity.getSourceId(), orgEntity.getSourceType(), orgEntity.getOrgType(),
orgEntity.getName(), orgEntity.getCity(), orgEntity.getRegion(), orgEntity.getCountry().value(), String.valueOf(orgEntity.getPopularity()) };
csvWriter.writeNext(line);
}
firstResult += chunk.size();
} while (!chunk.isEmpty());
}
@Override
public List<OrgEntity> getOrgs(String searchTerm, int firstResult, int maxResults) {
return orgDao.getOrgs(searchTerm, firstResult, maxResults);
}
@Override
public List<OrgEntity> getOrgsByName(String searchTerm) {
return orgDao.getOrgsByName(searchTerm);
}
@Override
public OrgEntity createUpdate(OrgEntity org) {
OrgEntity existingOrg = orgDao.findByNameCityRegionAndCountry(org.getName(), org.getCity(), org.getRegion(), org.getCountry());
if (existingOrg != null) {
return existingOrg;
}
String sourceId = sourceManager.retrieveSourceOrcid();
org.setSource(new SourceEntity(sourceId));
orgDao.persist(org);
return org;
}
@Override
public OrgEntity createUpdate(OrgEntity org, Long orgDisambiguatedId) {
OrgEntity existingOrg = orgDao.findByNameCityRegionAndCountry(org.getName(), org.getCity(), org.getRegion(), org.getCountry());
if (existingOrg != null) {
org = existingOrg;
}
if (org.getOrgDisambiguated() == null) {
OrgDisambiguatedEntity disambiguatedOrg = orgDisambiguatedDao.find(orgDisambiguatedId);
if (disambiguatedOrg == null) {
throw new IllegalArgumentException("No such disambiguated org with id=" + orgDisambiguatedId);
}
org.setOrgDisambiguated(disambiguatedOrg);
}
if (org.getSource() == null) {
org.setSource(new SourceEntity(sourceManager.retrieveSourceOrcid()));
}
return orgDao.merge(org);
}
@Override
public OrgEntity getOrgEntity(OrganizationHolder holder) {
if(holder == null)
return null;
OrgEntity orgEntity = new OrgEntity();
org.orcid.jaxb.model.common_v2.Organization organization = holder.getOrganization();
orgEntity.setName(organization.getName());
org.orcid.jaxb.model.common_v2.OrganizationAddress address = organization.getAddress();
orgEntity.setCity(address.getCity());
orgEntity.setRegion(address.getRegion());
orgEntity.setCountry(Iso3166Country.fromValue(address.getCountry().value()));
if (organization.getDisambiguatedOrganization() != null && organization.getDisambiguatedOrganization().getDisambiguatedOrganizationIdentifier() != null) {
orgEntity.setOrgDisambiguated(orgDisambiguatedDao.findBySourceIdAndSourceType(organization.getDisambiguatedOrganization()
.getDisambiguatedOrganizationIdentifier(), organization.getDisambiguatedOrganization().getDisambiguationSource()));
}
return createUpdate(orgEntity);
}
@Override
public OrgEntity getOrgEntity(Organization org) {
String name = org.getName();
String city = "";
String region = "";
Iso3166Country country = null;
if(org.getAddress() != null) {
city = org.getAddress().getCity();
region = org.getAddress().getRegion();
country = org.getAddress().getCountry();
}
return orgDao.findByNameCityRegionAndCountry(name, city, region, country);
}
}