edu.vt.vbi.patric.portlets.FIGfam.java Source code

Java tutorial

Introduction

Here is the source code for edu.vt.vbi.patric.portlets.FIGfam.java

Source

/**
 * ****************************************************************************
 * Copyright 2014 Virginia Polytechnic Institute and State University
 * <p/>
 * 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
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * 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 edu.vt.vbi.patric.portlets;

import com.google.gson.Gson;
import com.google.gson.internal.LinkedTreeMap;
import edu.vt.vbi.ci.util.CommandResults;
import edu.vt.vbi.ci.util.ExecUtilities;
import edu.vt.vbi.patric.beans.Genome;
import edu.vt.vbi.patric.beans.Taxonomy;
import edu.vt.vbi.patric.common.DataApiHandler;
import edu.vt.vbi.patric.common.ExcelHelper;
import edu.vt.vbi.patric.common.SessionHandler;
import edu.vt.vbi.patric.common.SiteHelper;
import edu.vt.vbi.patric.dao.ResultType;
import edu.vt.vbi.patric.proteinfamily.FIGfamData;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectReader;
import org.codehaus.jackson.map.ObjectWriter;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.portlet.*;
import java.io.*;
import java.util.*;

public class FIGfam extends GenericPortlet {

    private static final Logger LOGGER = LoggerFactory.getLogger(FIGfam.class);

    private final boolean removeAfterClusterComputed = true;

    private ObjectReader jsonReader;

    private ObjectWriter jsonWriter;

    @Override
    public void init() throws PortletException {
        super.init();

        ObjectMapper objectMapper = new ObjectMapper();
        jsonReader = objectMapper.reader(Map.class);
        jsonWriter = objectMapper.writerWithType(Map.class);
    }

    public boolean isLoggedIn(PortletRequest request) {

        String sessionId = request.getPortletSession(true).getId();
        Gson gson = new Gson();
        LinkedTreeMap sessionMap = gson.fromJson(SessionHandler.getInstance().get(sessionId), LinkedTreeMap.class);

        return sessionMap.containsKey("authorizationToken");
    }

    public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException {
        response.setContentType("text/html");

        String mode = request.getParameter("display_mode");

        SiteHelper.setHtmlMetaElements(request, response, "Protein Families");

        PortletRequestDispatcher prd;
        if ((mode != null) && (mode.equals("result"))) {

            String contextType = request.getParameter("context_type");
            if (contextType == null) {
                contextType = "";
            }
            String contextId = request.getParameter("context_id");
            if (contextId == null) {
                contextId = "";
            }

            Map<String, String> key = null;
            String pk = request.getParameter("param_key");
            String keyword = "";

            if (pk != null && !pk.isEmpty()) {
                key = jsonReader.readValue(SessionHandler.getInstance().get(SessionHandler.PREFIX + pk));
            }

            if (key == null) {
                key = new HashMap<>();
                key.put("keyword", "");
                key.put("genera", "");
                key.put("genomeIds", "");
            } else {
                keyword = key.get("keyword");
            }

            String familyType = request.getParameter("family_type");
            if (familyType == null)
                familyType = "figfam"; // TODO: change to plfam later
            String genomeFilter = request.getParameter("genome_filter");
            if (genomeFilter == null)
                genomeFilter = "";

            request.setAttribute("contextType", contextType);
            request.setAttribute("contextId", contextId);
            request.setAttribute("pk", pk);
            request.setAttribute("keyword", keyword);
            request.setAttribute("key", key);
            request.setAttribute("familyType", familyType);
            request.setAttribute("genomeFilter", genomeFilter);

            prd = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/proteinfamily_tab.jsp");
        } else if ((mode != null) && (mode.equals("treeSee"))) {
            prd = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/msa.jsp");
        } else {

            boolean isLoggedIn = isLoggedIn(request);

            String cType = request.getParameter("context_type");
            String cId = request.getParameter("context_id");
            String familyType = request.getParameter("family_type");
            if (familyType == null)
                familyType = "figfam";

            String taxonName = "";
            int taxonId = -1;

            if (cId == null || cId.equals("")) {
                taxonId = 131567;
                taxonName = "cellular organism";
            } else {
                DataApiHandler dataApi = new DataApiHandler(request);
                if (cType.equals("taxon")) {
                    Taxonomy taxonomy = dataApi.getTaxonomy(Integer.parseInt(cId));
                    taxonId = taxonomy.getId();
                    taxonName = taxonomy.getTaxonName();

                } else if (cType.equals("genome")) {
                    Genome genome = dataApi.getGenome(cId);
                    taxonId = genome.getTaxonId();
                    taxonName = genome.getGenomeName();
                }
            }

            request.setAttribute("isLoggedIn", isLoggedIn);
            request.setAttribute("taxonName", taxonName);
            request.setAttribute("taxonId", taxonId);
            request.setAttribute("familyType", familyType);

            // Protein Family Sorter Tool Landing Page
            prd = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/proteinfamily_tool.jsp");
        }
        prd.include(request, response);
    }

    private void getGenomeIds(ResourceRequest request, Map<String, String> key) throws IOException {
        String result = request.getParameter("genomeIds");

        DataApiHandler dataApi = new DataApiHandler(request);
        FIGfamData access = new FIGfamData(dataApi);
        if (result != null && !result.equals("")) {
            key.put("genomeIds", result);
        } else {
            String cType = request.getParameter("cType");
            if ((cType != null) && (cType.equals("taxon"))) {
                String cId = request.getParameter("cId");
                if (cId == null || cId.equals("")) {
                    cId = "2";
                }
                result = access.getGenomeIdsForTaxon(request);
                Taxonomy taxonomy = dataApi.getTaxonomy(Integer.parseInt(cId));
                key.put("genera", taxonomy.getTaxonName());
                // key.put("genera", access.getTaxonName(cId));
            }
            key.put("genomeIds", result);
        }
    }

    private void getTaxonIds(ResourceRequest request, PrintWriter writer) throws IOException {
        String cId = request.getParameter("taxonId");
        if ((cId != null) && (0 < cId.length())) {
            DataApiHandler dataApi = new DataApiHandler(request);
            FIGfamData access = new FIGfamData(dataApi);
            writer.write(access.getGenomeIdsForTaxon(request));
        }
    }

    private void setKeyValues(String name, ResourceRequest request, Map key) {
        String result = request.getParameter(name);
        if (result == null) {
            result = "";
        }
        key.put(name, result);
    }

    private String getKeyValue(String name, Map key) {
        if (key != null && key.containsKey(name) && key.get(name) != null) {
            return (String) key.get(name);
        } else {
            return "";
        }
    }

    // async requests and responses are processed here
    public void serveResource(ResourceRequest request, ResourceResponse resp) throws PortletException, IOException {
        resp.setContentType("text/html");
        String callType = request.getParameter("callType");

        if (callType != null) {
            switch (callType) {
            case "toSorter": {
                Map<String, String> key = new HashMap<>();
                // Added by OralDALAY

                if (request.getParameter("keyword") != null && !request.getParameter("keyword").equals(""))
                    key.put("keyword", request.getParameter("keyword"));

                if (request.getParameter("familyType") != null && !request.getParameter("familyType").equals(""))
                    key.put("familyType", request.getParameter("familyType"));

                getGenomeIds(request, key);

                long pk = (new Random()).nextLong();
                SessionHandler.getInstance().set(SessionHandler.PREFIX + pk, jsonWriter.writeValueAsString(key));

                PrintWriter writer = resp.getWriter();
                writer.write("" + pk);
                writer.close();
                break;
            }
            case "getGenomeDetails": {
                resp.setContentType("application/json");
                PrintWriter writer = resp.getWriter();
                FIGfamData access = new FIGfamData();
                access.getGenomeDetails(request, writer);
                writer.close();
                break;
            }
            case "getTaxonIds": {
                PrintWriter writer = resp.getWriter();
                getTaxonIds(request, writer);
                writer.close();
                break;
            }
            case "toAligner": {
                Map<String, String> key = new HashMap<>();
                setKeyValues("featureIds", request, key);
                setKeyValues("figfamId", request, key);
                setKeyValues("product", request, key);

                long pk = (new Random()).nextLong();
                SessionHandler.getInstance().set(SessionHandler.PREFIX + pk, jsonWriter.writeValueAsString(key));

                PrintWriter writer = resp.getWriter();
                writer.write("" + pk);
                writer.close();
                break;
            }
            case "toDetails": {
                Map<String, String> key = new HashMap<>();
                setKeyValues("genomeIds", request, key);
                setKeyValues("figfamIds", request, key);

                long pk = (new Random()).nextLong();
                SessionHandler.getInstance().set(SessionHandler.PREFIX + pk, jsonWriter.writeValueAsString(key));

                PrintWriter writer = resp.getWriter();
                writer.write("" + pk);
                writer.close();
                break;
            }
            case "getJsp":
                String jspName = request.getParameter("JSP_NAME");
                jspName = "/WEB-INF/jsp/" + jspName + ".jsp";
                resp.setContentType("text/html");
                PortletContext context = this.getPortletContext();
                PortletRequestDispatcher reqDispatcher = context.getRequestDispatcher(jspName);
                reqDispatcher.include(request, resp);
                break;
            case "getFeatureIds": {
                PrintWriter writer = resp.getWriter();
                FIGfamData access = new FIGfamData();
                access.getFeatureIds(request, writer, request.getParameter("keyword"));
                writer.close();
                break;
            }
            case "getGroupStats": {
                resp.setContentType("application/json");
                PrintWriter writer = resp.getWriter();
                FIGfamData access = new FIGfamData();
                access.getGroupStats(request, writer);
                writer.close();
                break;
            }
            case "getLocusTags": {
                PrintWriter writer = resp.getWriter();
                FIGfamData access = new FIGfamData();
                access.getLocusTags(request, writer);
                writer.close();
                break;
            }
            case "getSessionId": {
                PrintWriter writer = resp.getWriter();
                PortletSession session = request.getPortletSession(true);
                writer.write(session.getId());
                writer.close();
                break;
            }
            case "saveState": {
                String keyType = request.getParameter("keyType");
                // ResultType key = new ResultType();
                Map<String, String> key = new HashMap<>();
                setKeyValues("pageAt", request, key);
                setKeyValues("syntonyId", request, key);
                setKeyValues("regex", request, key);
                setKeyValues("filter", request, key);
                setKeyValues("perfectFamMatch", request, key);
                setKeyValues("minnumber_of_members", request, key);
                setKeyValues("maxnumber_of_members", request, key);
                setKeyValues("minnumber_of_species", request, key);
                setKeyValues("maxnumber_of_species", request, key);
                setKeyValues("ClusterRowOrder", request, key);
                setKeyValues("ClusterColumnOrder", request, key);
                setKeyValues("heatmapAxis", request, key);
                setKeyValues("colorScheme", request, key);
                setKeyValues("heatmapState", request, key);
                setKeyValues("steps", request, key);

                long pk = (new Random()).nextLong();
                SessionHandler.getInstance().set(SessionHandler.PREFIX + pk, jsonWriter.writeValueAsString(key));

                PrintWriter writer = resp.getWriter();
                writer.write("" + pk);
                writer.close();
                break;
            }
            case "getState": {
                PrintWriter writer = resp.getWriter();

                String keyType = request.getParameter("keyType");
                String pk = request.getParameter("random");
                if ((pk != null) && (keyType != null)) {
                    Map<String, String> key = jsonReader
                            .readValue(SessionHandler.getInstance().get(SessionHandler.PREFIX + pk));

                    writer.write(getKeyValue("pageAt", key));
                    writer.write("\t" + getKeyValue("syntonyId", key));
                    writer.write("\t" + getKeyValue("regex", key));
                    writer.write("\t" + getKeyValue("filter", key));
                    writer.write("\t" + getKeyValue("perfectFamMatch", key));
                    writer.write("\t" + getKeyValue("minnumber_of_members", key));
                    writer.write("\t" + getKeyValue("maxnumber_of_members", key));
                    writer.write("\t" + getKeyValue("minnumber_of_species", key));
                    writer.write("\t" + getKeyValue("maxnumber_of_species", key));
                    writer.write("\t" + getKeyValue("steps", key));
                    writer.write("\t" + getKeyValue("ClusterRowOrder", key));
                    writer.write("\t" + getKeyValue("ClusterColumnOrder", key));
                    writer.write("\t" + getKeyValue("heatmapAxis", key));
                    writer.write("\t" + getKeyValue("colorScheme", key));
                    writer.write("\t" + getKeyValue("heatmapState", key));
                    writer.close();
                }
                break;
            }
            case "doClustering": {
                PrintWriter writer = resp.getWriter();
                String data = request.getParameter("data");
                String g = request.getParameter("g");
                String e = request.getParameter("e");
                String m = request.getParameter("m");
                String ge = request.getParameter("ge");
                String pk = request.getParameter("pk");
                String action = request.getParameter("action");

                String tmpDir = System.getProperty("java.io.tmpdir", "/tmp");
                String filename = tmpDir + "/tmp_" + pk + ".txt";
                String output_filename = tmpDir + "/cluster_tmp_" + pk;
                try {
                    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(filename, true)));
                    out.write(data);
                    out.close();
                } catch (Exception es) {
                    LOGGER.error(es.getMessage(), es);
                }

                if (action.equals("Run"))
                    writer.write(doCLustering(filename, output_filename, g, e, m, ge).toString());

                writer.close();
                break;
            }
            case "getSyntonyOrder": {
                PrintWriter writer = resp.getWriter();
                FIGfamData access = new FIGfamData();
                JSONArray json = access.getSyntonyOrder(request);
                json.writeJSONString(writer);
                writer.close();
                break;
            }
            case "DetailsFromMain": {
                processDetailFromMain(request, resp);
                break;
            }
            case "GetMainTable": {
                processGetMainTable(request, resp);
                break;
            }
            default: {
                PrintWriter writer = resp.getWriter();
                writer.write(callType);
                writer.close();
                break;
            }
            }
        }
    }

    private void processDetailFromMain(ResourceRequest request, ResourceResponse response) throws IOException {
        final String familyType = request.getParameter("familyType");
        final String familyId = familyType + "_id";

        DataApiHandler dataApi = new DataApiHandler(request);
        FIGfamData figfamData = new FIGfamData(dataApi);

        String fileName = "ProteinFamilyFeatures";
        String fileFormat = request.getParameter("detailsType");

        List<String> tableHeader = new ArrayList<>();
        List<String> tableField = new ArrayList<>();

        JSONArray tableSource = figfamData.getDetails(request);

        tableHeader.addAll(Arrays.asList("Group Id", "Genome Name", "Accession", "PATRIC ID", "RefSeq Locus Tag",
                "Alt Locus Tag", "Start", "End", "Length(NT)", "Strand", "Length(AA)", "Gene Symbol",
                "Product Description"));
        tableField.addAll(Arrays.asList(familyId, "genome_name", "accession", "patric_id", "refseq_locus_tag",
                "alt_locus_tag", "start", "end", "na_length", "strand", "aa_length", "gene", "product"));

        ExcelHelper excel = new ExcelHelper("xssf", tableHeader, tableField, tableSource);
        excel.buildSpreadsheet();

        if (fileFormat.equalsIgnoreCase("xlsx")) {
            response.setContentType("application/octetstream");
            response.addProperty("Content-Disposition",
                    "attachment; filename=\"" + fileName + "." + fileFormat + "\"");

            excel.writeSpreadsheettoBrowser(response.getPortletOutputStream());
        } else if (fileFormat.equalsIgnoreCase("txt")) {
            response.setContentType("application/octetstream");
            response.addProperty("Content-Disposition",
                    "attachment; filename=\"" + fileName + "." + fileFormat + "\"");

            response.getWriter().write(excel.writeToTextFile());
        }
    }

    private void processGetMainTable(ResourceRequest request, ResourceResponse response) throws IOException {
        String fileName = request.getParameter("OrthoFileName");
        String fileType = request.getParameter("OrthoFileType");
        String data = request.getParameter("data");

        if (fileType.equals("xls") || fileType.equals("xlsx")) {

            List<String> tableHeader = new ArrayList<>();
            List<String> tableField = new ArrayList<>();
            List<ResultType> tableSource = new ArrayList<>();

            BufferedReader br = new BufferedReader(new StringReader(data));
            String line;
            boolean isHeader = true;
            while ((line = br.readLine()) != null) {
                String[] tabs = line.split("\t");

                if (isHeader) {
                    isHeader = false;
                    tableHeader.addAll(Arrays.asList(tabs));

                    for (String tab : tabs) {
                        tableField.add(tab.replaceAll(" ", "_").toLowerCase());
                    }
                } else {
                    ResultType row = new ResultType();
                    for (int i = 0; i < tabs.length; i++) {
                        row.put(tableField.get(i), tabs[i]);
                    }
                    tableSource.add(row);
                }
            }

            ExcelHelper excel = new ExcelHelper("xssf", tableHeader, tableField, tableSource);
            excel.buildSpreadsheet();

            response.setContentType("application/octetstream");
            response.addProperty("Content-Disposition",
                    "attachment; filename=\"" + fileName + "." + fileType + "\"");

            excel.writeSpreadsheettoBrowser(response.getPortletOutputStream());
        } else if (fileType.equals("txt")) {
            response.setContentType("application/octetstream");
            response.addProperty("Content-Disposition",
                    "attachment; filename=\"" + fileName + "." + fileType + "\"");

            response.getWriter().write(data);
        }
    }

    @SuppressWarnings("unchecked")
    public JSONObject doCLustering(String filename, String outputfilename, String g, String e, String m, String ge)
            throws IOException {

        JSONObject output = new JSONObject();

        String exec = "runMicroArrayClustering.sh " + filename + " " + outputfilename + " "
                + ((g.equals("1")) ? ge : "0") + " " + ((e.equals("1")) ? ge : "0") + " " + m;

        LOGGER.debug("doClustering() {}", exec);

        CommandResults callClustering = ExecUtilities.exec(exec);

        if (callClustering.getStdout()[0].equals("done")) {

            BufferedReader in = new BufferedReader(new FileReader(outputfilename + ".cdt"));
            String strLine;
            int count = 0;
            JSONArray rows = new JSONArray();
            while ((strLine = in.readLine()) != null) {
                String[] tabs = strLine.split("\t");
                if (count == 0) {
                    JSONArray columns = new JSONArray();
                    for (int i = 4; i < tabs.length; i++) {
                        columns.add(tabs[i].split("-")[0]);
                    }
                    output.put("columns", columns);
                }
                if (count >= 3) {
                    rows.add(tabs[1].split("-")[0]);
                }
                count++;
            }
            in.close();
            output.put("rows", rows);
        }

        if (removeAfterClusterComputed) {
            exec = "rm " + filename + " " + outputfilename + "*";
            ExecUtilities.exec(exec);
        }

        return output;
    }
}