package org.molgenis.core.service;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import org.apache.commons.lang.StringUtils;
import org.molgenis.core.OntologyTerm;
import org.molgenis.core.Publication;
import org.molgenis.core.dto.PublicationDTO;
import org.molgenis.framework.db.Database;
import org.molgenis.framework.db.DatabaseException;
import org.molgenis.services.PubmedService;
import org.molgenis.services.pubmed.Author;
import org.molgenis.services.pubmed.PubmedArticle;
//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PublicationService
{
private Database db;
private EntityManager em;
private final int BATCH_SIZE = 50;
public static final String PUBMED_URL = "http://www.ncbi.nlm.nih.gov/pubmed/";
// @Autowired
public void setDatabase(final Database db)
{
this.db = db;
this.em = db.getEntityManager();
}
public List<PublicationDTO> getAll() throws DatabaseException
{
return this.publicationListToPublicationDTOList(this.db.query(Publication.class).sortASC(Publication.TITLE)
.find());
}
public int insert(final List<PublicationDTO> publicationDTOList)
{
try
{
int count = 0;
for (PublicationDTO publicationDTO : publicationDTOList)
{
Publication publication = this.publicationDTOToPublication(publicationDTO);
this.em.persist(publication.getPubmedID());
this.em.persist(publication);
count += 2;
if (count % BATCH_SIZE == 0)
{
this.em.flush();
this.em.clear();
}
}
this.em.flush();
this.em.clear();
return count;
}
catch (NumberFormatException e)
{
e.printStackTrace();
throw new PublicationServiceException("Not a valid number: " + e.getMessage());
}
catch (Exception e)
{
e.printStackTrace();
throw new PublicationServiceException(e.getMessage());
}
}
public void insert(final PublicationDTO publicationDTO)
{
List<PublicationDTO> publicationDTOList = new ArrayList<PublicationDTO>();
publicationDTOList.add(publicationDTO);
this.insert(publicationDTOList);
}
public List<PublicationDTO> publicationListToPublicationDTOList(final List<Publication> publications)
{
List<PublicationDTO> result = new ArrayList<PublicationDTO>();
for (Publication publication : publications)
result.add(this.publicationToPublicationDTO(publication));
return result;
}
public PublicationDTO publicationToPublicationDTO(final Publication publication)
{
PublicationDTO publicationDTO = new PublicationDTO();
publicationDTO.setId(publication.getId());
publicationDTO.setAuthors(publication.getAuthorList());
publicationDTO.setFirstAuthor(StringUtils.split(publication.getAuthorList(), ",")[0]);
publicationDTO.setJournal(publication.getJournal());
publicationDTO.setName(publication.getName());
publicationDTO.setPubmedId(publication.getName());
publicationDTO.setPubmedUrl(PublicationService.PUBMED_URL + publicationDTO.getPubmedId());
// if (publication.getPubmedID_Id() != null)
// {
// try
// {
// OntologyTerm pubmedId = this.db.findById(OntologyTerm.class,
// publication.getPubmedID_Id());
// publicationVO.setPubmedId(pubmedId.getName());
// publicationVO.setPubmedUrl(PublicationService.PUBMED_URL +
// pubmedId.getName());
// }
// catch (DatabaseException e)
// {
// publicationVO.setPubmedId("NA");
// }
// }
publicationDTO.setStatus(publication.getStatus_Name());
publicationDTO.setTitle(publication.getTitle());
publicationDTO.setYear(publication.getYear());
return publicationDTO;
}
public Publication publicationDTOToPublication(final PublicationDTO publicationDTO)
{
Publication publication = new Publication();
publication.setAuthorList(publicationDTO.getAuthors());
publication.setJournal(publicationDTO.getJournal());
publication.setName(publicationDTO.getName());
publication.setTitle(publicationDTO.getTitle());
publication.setYear(publicationDTO.getYear());
OntologyTerm ontologyTerm = new OntologyTerm();
ontologyTerm.setName(publicationDTO.getPubmedId());
publication.setPubmedID(ontologyTerm);
return publication;
}
public PublicationDTO pubmedArticleToPublicationDTO(final PubmedArticle pubmedArticle)
{
List<Author> authorList = pubmedArticle.MedlineCitation.article.Authors;
List<String> authors = new ArrayList<String>();
for (Author author : authorList)
authors.add(author.toInitials());
PublicationDTO publicationDTO = new PublicationDTO();
publicationDTO.setAuthors(StringUtils.join(authors, "; "));
publicationDTO.setName(pubmedArticle.MedlineCitation.PMID);
publicationDTO.setPubmedId(pubmedArticle.MedlineCitation.PMID);
publicationDTO.setTitle(pubmedArticle.MedlineCitation.article.ArticleTitle);
publicationDTO.setJournal(pubmedArticle.MedlineCitation.article.Journal.Title);
publicationDTO.setYear(pubmedArticle.MedlineCitation.article.Journal.JournalIssue.PubDate.Year);
if (publicationDTO.getYear() == null) publicationDTO.setYear("");
return publicationDTO;
}
public Publication pubmedArticleToPublication(final PubmedArticle pubmedArticle)
{
List<Author> authorList = pubmedArticle.MedlineCitation.article.Authors;
List<String> authors = new ArrayList<String>();
for (Author author : authorList)
authors.add(author.toInitials());
Publication publication = new Publication();
publication.setAuthorList(StringUtils.join(authors, "; "));
publication.setName(pubmedArticle.MedlineCitation.PMID);
publication.setTitle(pubmedArticle.MedlineCitation.article.ArticleTitle);
publication.setJournal(pubmedArticle.MedlineCitation.article.Journal.Title);
publication.setYear(pubmedArticle.MedlineCitation.article.Journal.JournalIssue.PubDate.Year);
if (publication.getYear() == null) publication.setYear("");
// OntologyTerm ontologyTerm = new OntologyTerm();
// ontologyTerm.setName(pubmedArticle.MedlineCitation.PMID);
// publication.setPubmedID(ontologyTerm);
return publication;
}
public List<PublicationDTO> pubmedIdListToPublicationDTOList(final List<String> pubmedStringList)
{
try
{
PubmedService pubmedService = new PubmedService();
List<Integer> pubmedIdList = new ArrayList<Integer>();
for (String pubmed : pubmedStringList)
pubmedIdList.add(Integer.parseInt(pubmed));
List<PubmedArticle> pubmedArticles = pubmedService.getPubmedArticlesForIds(pubmedIdList);
List<PublicationDTO> publicationDTOList = new ArrayList<PublicationDTO>();
for (PubmedArticle pubmedArticle : pubmedArticles)
{
PublicationDTO publicationDTO = this.pubmedArticleToPublicationDTO(pubmedArticle);
publicationDTOList.add(publicationDTO);
}
return publicationDTOList;
}
catch (Exception e)
{
e.printStackTrace();
throw new PublicationServiceException(e.getMessage());
}
}
public List<Publication> pubmedIdListToPublicationList(final List<String> pubmedStringList)
{
try
{
PubmedService pubmedService = new PubmedService();
List<Integer> pubmedIdList = new ArrayList<Integer>();
for (String pubmed : pubmedStringList)
{
if (StringUtils.isEmpty(pubmed)) continue;
pubmedIdList.add(Integer.parseInt(pubmed));
}
List<PubmedArticle> pubmedArticles = pubmedService.getPubmedArticlesForIds(pubmedIdList);
List<Publication> publicationList = new ArrayList<Publication>();
for (PubmedArticle pubmedArticle : pubmedArticles)
{
Publication publication = this.pubmedArticleToPublication(pubmedArticle);
publicationList.add(publication);
}
return publicationList;
}
catch (Exception e)
{
e.printStackTrace();
throw new PublicationServiceException(e.getClass().getSimpleName() + ": " + e.getMessage());
}
}
public List<Publication> pubmedIdListToPublicationListLocal(final List<String> pubmedStringList)
{
try
{
List<Integer> pubmedIdList = new ArrayList<Integer>();
for (String pubmed : pubmedStringList)
{
if (StringUtils.isEmpty(pubmed)) continue;
pubmedIdList.add(Integer.parseInt(pubmed));
}
List<Publication> publicationList = new ArrayList<Publication>();
for (Integer pubmedId : pubmedIdList)
{
Publication publication = new Publication();
publication.setName(pubmedId.toString());
publication.setTitle("The Pubmed article formerly known as " + pubmedId);
publicationList.add(publication);
}
return publicationList;
}
catch (Exception e)
{
e.printStackTrace();
throw new PublicationServiceException(e.getClass().getSimpleName() + ": " + e.getMessage());
}
}
}