services.api.ApiServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for services.api.ApiServiceImpl.java

Source

/**
*   Copyright 2014 Torben Werner, Bridget Ryan
*
*   Licensed under the Apache License, Version 2.0 (the "License");
*   you may not use this file except in compliance with the License.
*   You may obtain a copy of the License at
*
*       http://www.apache.org/licenses/LICENSE-2.0
*
*   Unless required by applicable law or agreed to in writing, software
*   distributed under the License is distributed on an "AS IS" BASIS,
*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*   See the License for the specific language governing permissions and
*   limitations under the License.
*/

package services.api;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.annotation.Nullable;
import javax.inject.Inject;

import org.bson.types.ObjectId;
import org.imirp.imirp.data.TargetPredictionResult;
import org.imirp.imirp.db.ImirpDataStore;
import org.imirp.imirp.db.model.ImirpProjectMutationRequest;
import org.imirp.imirp.db.model.MutationResultSet;
import org.imirp.imirp.db.model.Project;
import org.imirp.imirp.mutation.region.MultiSiteMutation;
import org.imirp.imirp.mutation.region.MutationRegion;
import org.imirp.imirp.tsp.Mirbase;
import org.imirp.imirp.tsp.MirbaseScanner;
import org.imirp.imirp.tsp.Species;
import org.imirp.imirp.tsp.MirbaseScanner.ScanResult;
import org.joda.time.DateTime;
import org.joda.time.format.ISODateTimeFormat;

import dto.ProjectDto;
import dto.ProjectSummaryDto;

public class ApiServiceImpl implements ApiService {
    private ImirpDataStore datastore;
    private Mirbase mirbase;
    private MirbaseScanner mirScanner;

    @Inject
    public ApiServiceImpl(ImirpDataStore datstore, Mirbase mirbase, MirbaseScanner mirScanner) {
        this.datastore = datstore;
        this.mirbase = mirbase;
        this.mirScanner = mirScanner;
    }

    @Override
    public ImirpResultsDataDto getProjectResults(ObjectId projectId, Set<String> regionIds, int limitPerRegion) {
        ImirpResultsDataDto data = new ImirpResultsDataDto();
        data.project = getProject(projectId);
        data.activeRequests = getRequestsForProject(projectId, false);
        data.completedRequests = getRequestsForProject(projectId, true);

        for (MutationRegion region : getProjectMutationRegions(projectId)) {
            RegionDetailsDto regionDetails = new RegionDetailsDto();
            regionDetails.sites = region.getMutationSites();
            regionDetails.regionId = region.getRegionId();
            regionDetails.regionStart = region.getRegionStartIndex();
            regionDetails.regionEnd = region.getRegionEndIndex();
            data.addRegion(regionDetails);
            data.addRegionMutants(region.getRegionId(),
                    getMutantsForRegion(projectId, region.getRegionId(), limitPerRegion));
        }

        return data;
    }

    @Override
    public RegionMutantsDto getMutantsForRegion(ObjectId projectId, String regionId, int limit) {
        RegionMutantsDto data = new RegionMutantsDto();
        Iterable<MutationResultSet> storeResults = datastore.getResultSets(projectId, regionId, limit);
        for (MutationResultSet mrs : storeResults) {
            data.add(new MutantDto(mrs.getSequence(), mrs.getId().toString()));
        }

        return data;
    }

    @Override
    public ProjectDto saveNewProject(ProjectDto newProject) {
        final Project newProjectModel = newProject.toModel();
        final Project savedProject = datastore.saveNewProject(newProjectModel);
        return ProjectDto.fromModel(savedProject);
    }

    @Override
    public ProjectsPageDto getProjects(int page, int limit) {
        Iterable<Project> projects = datastore.getProjects(page, limit);
        ArrayList<ProjectDto> projectDtos = new ArrayList<>();
        for (Project project : projects) {
            projectDtos.add(ProjectDto.fromModel(project));
        }

        long numProjects = getProjectCount();
        int numPages = Math.max(1, (int) (numProjects / limit) + (numProjects % limit != 0 ? 1 : 0));
        ProjectsPageDto dto = new ProjectsPageDto(projectDtos, page < 0 ? 0 : page, numPages, numProjects);
        return dto;
    }

    @Override
    public Set<Species> getAvailableSpecies() {
        return mirbase.getSpecies();
    }

    @Override
    public ProjectDto getProject(ObjectId projectId) {
        Project proj = datastore.getProject(projectId);
        return ProjectDto.fromModel(proj);
    }

    @Override
    public long getProjectCount() {
        return datastore.countProjects();
    }

    @Override
    public Iterable<MutationRegion> getProjectMutationRegions(ObjectId projectId) {
        ProjectDto project = getProject(projectId);
        MultiSiteMutation msm = new MultiSiteMutation(project.sequence, project.mutationSites, null);
        return msm.getRegions();
    }

    @Override
    public Set<String> getProjectRegionIds(ObjectId projectId) {
        Set<String> regionIds = new HashSet<>();
        for (MutationRegion region : getProjectMutationRegions(projectId)) {
            regionIds.add(region.getRegionId());
        }
        return regionIds;
    }

    @Override
    public ProjectSummaryDto getProjectSummary(ObjectId projectOId) {
        ProjectSummaryDto summary = new ProjectSummaryDto();
        summary.project = getProject(projectOId);
        Iterable<ImirpProjectMutationRequest> requests = datastore.getMutationRequestsForProject(projectOId);
        summary.requests = new ArrayList<>();
        for (ImirpProjectMutationRequest request : requests) {
            summary.requests.add(request);
        }
        return summary;
    }

    @Override
    public List<ImirpProjectMutationRequest> getRequestsForProject(ObjectId projectId,
            @Nullable Boolean completed) {
        return datastore.getMutationRequestsForProject(projectId, completed);
    }

    @Override
    public List<ImirpProjectMutationRequest> getActiveRequestsForProject(ObjectId projectId) {
        return getRequestsForProject(projectId, false);
    }

    @Override
    public File createMutantAnalysisZip(ObjectId projectOid, String mutantSequence) throws IOException {
        Project project = datastore.getProject(projectOid);

        File zipFile = File.createTempFile(project.name + "imirp_analysis", ".zip");
        try (ZipOutputStream zipStream = new ZipOutputStream(new FileOutputStream(zipFile),
                Charset.forName("UTF-8"))) {
            // Generate the analysis files
            generateAnalysisFiles(project, mutantSequence, zipStream);
        }

        return zipFile;
    }

    @Override
    public File createTargetScanCSV(String sequence, Species species) throws IOException {
        File csvFile = File.createTempFile("results", ".csv");
        ScanResult scanResults = mirScanner.findPredictedTargets(mirbase, species, sequence, true);
        try (PrintWriter writer = new PrintWriter(new FileWriter(csvFile))) {
            writeResultsToCsv(scanResults, writer);
        }
        return csvFile;
    }

    private void generateAnalysisFiles(Project project, String mutantSequence, ZipOutputStream zipStream)
            throws IOException {
        // Project details file
        try (PrintWriter zipWriter = new PrintWriter(zipStream)) {
            zipStream.putNextEntry(new ZipEntry(project.name + "_project_info.txt"));
            writeProjectDetails(project, mutantSequence, zipWriter);
            zipWriter.flush();
            zipStream.closeEntry();

            // Wild results file
            ScanResult wildResults = mirScanner.findPredictedTargets(mirbase, project.species, project.wildSequence,
                    true);
            zipStream.putNextEntry(new ZipEntry(project.name + "_wildtype_results.csv"));
            writeResultsToCsv(wildResults, zipWriter);
            zipWriter.flush();
            zipStream.closeEntry();

            // Mutant results file
            ScanResult mutantResults = mirScanner.findPredictedTargets(mirbase, project.species, mutantSequence,
                    true);
            zipStream.putNextEntry(new ZipEntry(project.name + "_mutant_results.csv"));
            writeResultsToCsv(mutantResults, zipWriter);
            zipWriter.flush();
            zipStream.closeEntry();

            // NEW results file (those not present in the wild results)
            ScanResult newResults = MirbaseScanner.removeResults(mutantResults, wildResults);
            zipStream.putNextEntry(new ZipEntry(project.name + "_new_results.csv"));
            writeResultsToCsv(newResults, zipWriter);
            zipWriter.flush();
            zipStream.closeEntry();
        }
    }

    /**
     * Writes the project details to a .txt file
     */
    private static void writeProjectDetails(Project project, String mutantSequence, PrintWriter zipWriter)
            throws IOException {
        zipWriter.println("Mutant Analysis Generated on: " + ISODateTimeFormat.dateTime().print(new DateTime()));
        zipWriter.println("Project ID: " + project._id.toString());
        zipWriter.println("Project Name: " + project.getName());
        zipWriter.println("Project Description: " + project.getDescription());
        zipWriter.println("Species: " + project.getSpecies().getDisplayName());
        zipWriter.println("Wildtype Sequence: " + project.getWildSequence());
        zipWriter.println("Mutant Sequence: " + mutantSequence);
    }

    /**
     * Writes a ScanResult object to a .csv file
     */
    public static void writeResultsToCsv(ScanResult results, PrintWriter writer) throws IOException {
        writer.println("position,mirna,type,gu");
        for (TargetPredictionResult tpr : results.predictions) {
            writer.print(tpr.position + 1); // Humans expect indexing from position 1 :P
            writer.print(",");
            writer.print(tpr.microRNA);
            writer.print(",");
            writer.print(tpr.type.siteType.name);
            writer.print(",");
            writer.print(tpr.type.guWobble ? "yes" : "no");
            writer.println();
        }
    }
}