com.nuevebit.miroculus.mrna.cli.DatabasePopulator.java Source code

Java tutorial

Introduction

Here is the source code for com.nuevebit.miroculus.mrna.cli.DatabasePopulator.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nuevebit.miroculus.mrna.cli;

import com.nuevebit.miroculus.mrna.core.Author;
import com.nuevebit.miroculus.mrna.core.AuthorRepository;
import com.nuevebit.miroculus.mrna.core.CorrelationDiscovery;
import com.nuevebit.miroculus.mrna.core.CorrelationDiscoveryRepository;
import com.nuevebit.miroculus.mrna.core.DiscoveryMethod;
import com.nuevebit.miroculus.mrna.core.DiscoveryMethodRepository;
import com.nuevebit.miroculus.mrna.core.Disease;
import com.nuevebit.miroculus.mrna.core.DiseaseRepository;
import com.nuevebit.miroculus.mrna.core.MiRNA;
import com.nuevebit.miroculus.mrna.core.MiRNARepository;
import com.nuevebit.miroculus.mrna.core.Publication;
import com.nuevebit.miroculus.mrna.core.PublicationRepository;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.io.IOUtils;
import org.springframework.transaction.annotation.Transactional;

/**
 * This class handles persistence of the provided CSV and downloaded json with
 * mortality rates.
 *
 * @author emerino
 */
@Named
@Singleton
public class DatabasePopulator {

    @Inject
    private MiRNARepository miRNARepository;

    @Inject
    private DiseaseRepository diseaseRepository;

    @Inject
    private CorrelationDiscoveryRepository correlationDiscoveryRepository;

    @Inject
    private DiscoveryMethodRepository discoveryMethodRepository;

    @Inject
    private AuthorRepository authorRepository;

    @Inject
    private PublicationRepository publicationRepository;

    @Transactional(rollbackFor = Exception.class)
    public void populate() throws IOException {
        String csv = IOUtils.toString(DatabasePopulator.class.getResourceAsStream("/microRNAs.csv"));

        InputStream mortalityRatesStream = DatabasePopulator.class
                .getResourceAsStream("/disease_mortality_rates.txt");

        populate(csv, mortalityRatesStream);
    }

    /**
     * Retrieve information from CSV and json files, and populate db with this
     * data.
     *
     * @param csv the CSV file as a string
     * @param mortalityRates a list of mortality rates separated by lines
     */
    @Transactional(rollbackFor = Exception.class)
    public void populate(String csv, InputStream mortalityRates) throws IOException {

        // populate the information in the CSV string
        parseCSV(csv);

        // now that we have all the diseases registered, lets try to find
        // their mortality rate
        parseMortalityRates(mortalityRates);
    }

    private void parseMortalityRates(InputStream mortalityRates) throws IOException {

        List<String> lines = IOUtils.readLines(mortalityRates);

        for (String line : lines) {
            String[] parts = line.split("=");
            String diseaseName = parts[0];
            double rate = Double.valueOf(parts[1]);

            Disease disease = diseaseRepository.findByName(diseaseName);
            disease.setMortalityRate(rate);

            //diseaseRepository.save(disease);
        }
    }

    private void parseCSV(String csv) throws IOException {
        CSVParser csvParser = CSVParser.parse(csv, CSVFormat.EXCEL);

        Iterator<CSVRecord> records = csvParser.iterator();
        // ignore headers
        records.next();

        // read line by line
        while (records.hasNext()) {
            CSVRecord record = records.next();

            // normalize the name (remove *)
            String miRNAName = MiRNA.normalizeName(record.get(0));
            MiRNA miRNA = miRNARepository.findByName(miRNAName);

            if (miRNA == null) { // primera vez que se agrega
                miRNA = miRNARepository.save(new MiRNA(miRNAName));
            }

            String diseaseName = record.get(1).toLowerCase().trim();
            Disease disease = diseaseRepository.findByName(diseaseName);

            if (disease == null) {
                disease = diseaseRepository.save(new Disease(diseaseName));
                disease.setMortalityRate(0d);
            }

            String authorName = record.get(4).trim();
            Author author = authorRepository.findByName(authorName);

            if (author == null) {
                author = authorRepository.save(new Author(authorName));
            }

            String publicationTitle = record.get(6).trim();
            String publicationJournal = record.get(5).trim();

            Publication pub = publicationRepository.findByNameAndJournal(publicationTitle, publicationJournal);

            if (pub == null) {
                pub = new Publication(publicationTitle, publicationJournal);
                pub.setAuthor(author);
                String year = record.get(7);
                pub.setYear(Integer.valueOf(year));
                pub.setDescription(record.get(9).trim());

                pub = publicationRepository.save(pub);

            }

            String methodName = record.get(8).trim();
            DiscoveryMethod method = discoveryMethodRepository.findByName(methodName);

            if (method == null) {
                method = discoveryMethodRepository.save(new DiscoveryMethod(methodName));
            }

            CorrelationDiscovery correlation = new CorrelationDiscovery(miRNA, disease,
                    Integer.valueOf(record.get(2)));

            correlation.setPublication(pub);
            correlation.setMethod(method);

            // save the found correlation
            correlationDiscoveryRepository.save(correlation);
        }
    }
}