/******************************************************************************* * Copyright 2014 Virginia Polytechnic Institute and State University * * 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 edu.vt.vbi.patric.portlets; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Random; import javax.portlet.GenericPortlet; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; import javax.portlet.PortletRequestDispatcher; import javax.portlet.PortletSession; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; import javax.portlet.UnavailableException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import edu.vt.vbi.ci.util.CommandResults; import edu.vt.vbi.ci.util.ExecUtilities; import edu.vt.vbi.patric.common.SiteHelper; import edu.vt.vbi.patric.dao.HibernateHelper; import edu.vt.vbi.patric.dao.ResultType; import edu.vt.vbi.patric.proteinfamily.FIGfamData; public class FIGfam extends GenericPortlet { public void init(PortletConfig portletConfig) throws UnavailableException, PortletException { super.init(portletConfig); String k = "PATRIC_DB.cfg.xml"; HibernateHelper.buildSessionFactory(k, k); FIGfamData.setSessionFactory(HibernateHelper.getSessionFactory(k)); } public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException { response.setContentType("text/html"); String mode = request.getParameter("display_mode"); new SiteHelper().setHtmlMetaElements(request, response, "Protein Families"); PortletRequestDispatcher prd = null; if ((mode != null) && (mode.equals("result"))) { 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 { // Protein Family Sorter Tool Landing Page prd = getPortletContext().getRequestDispatcher("/WEB-INF/jsp/proteinfamily_tool.jsp"); } prd.include(request, response); } private void getGenomeIds(ResourceRequest req, ResultType key) { String result = req.getParameter("genomeIds"); FIGfamData access = new FIGfamData(); if (result != null && !result.equals("")) { key.put("genomeIds", result); } else { String cType = req.getParameter("cType"); if ((cType != null) && (cType.equals("taxon"))) { String cId = req.getParameter("cId"); if (cId == null || cId.equals("")) { cId = "2"; } result = access.getGenomeIdsForTaxon(cId); key.put("genera", access.getTaxonName(cId)); } key.put("genomeIds", result); } } private void getTaxonIds(ResourceRequest req, PrintWriter writer) { String cId = req.getParameter("taxonId"); if ((cId != null) && (0 < cId.length())) { // String keyword = req.getParameter("keyword"); FIGfamData access = new FIGfamData(); writer.write(access.getGenomeIdsForTaxon(cId)); } } private void setKeyValues(String name, ResourceRequest req, ResultType key) { String result = req.getParameter(name); if (result == null) { result = ""; } key.put(name, result); } private String getKeyValue(String name, ResultType key) { String result = key.get(name); if (result == null) { result = ""; } return result; } // async requests and responses are processed here public void serveResource(ResourceRequest req, ResourceResponse resp) throws PortletException, IOException { resp.setContentType("text/html"); String callType = req.getParameter("callType"); // System.out.println(callType); if (callType != null) { if (callType.equals("toSorter")) { ResultType key = new ResultType(); // Added by OralDALAY if (req.getParameter("keyword") != null && !req.getParameter("keyword").equals("")) key.put("keyword", req.getParameter("keyword")); getGenomeIds(req, key); Random g = new Random(); int random = g.nextInt(); PortletSession sess = req.getPortletSession(true); sess.setAttribute("key" + random, key); PrintWriter writer = resp.getWriter(); writer.write("" + random); writer.close(); } else if (callType.equals("getGenomeDetails")) { resp.setContentType("application/json"); PrintWriter writer = resp.getWriter(); FIGfamData access = new FIGfamData(); access.getGenomeDetails(req, writer); writer.close(); } else if (callType.equals("getTaxonIds")) { PrintWriter writer = resp.getWriter(); getTaxonIds(req, writer); writer.close(); } else if (callType.equals("toAligner")) { ResultType key = new ResultType(); setKeyValues("featureIds", req, key); setKeyValues("figfamId", req, key); setKeyValues("product", req, key); Random g = new Random(); int random = g.nextInt(); PortletSession sess = req.getPortletSession(true); sess.setAttribute("key" + random, key, PortletSession.APPLICATION_SCOPE); PrintWriter writer = resp.getWriter(); writer.write("" + random); writer.close(); } else if (callType.equals("toDetails")) { ResultType key = new ResultType(); setKeyValues("genomeIds", req, key); setKeyValues("figfamIds", req, key); Random g = new Random(); int random = g.nextInt(); PortletSession sess = req.getPortletSession(true); sess.setAttribute("key" + random, key, PortletSession.APPLICATION_SCOPE); PrintWriter writer = resp.getWriter(); writer.write("" + random); writer.close(); } else if (callType.equals("getJsp")) { String jspName = req.getParameter("JSP_NAME"); jspName = "/WEB-INF/jsp/" + jspName + ".jsp"; resp.setContentType("text/html"); PortletContext context = this.getPortletContext(); PortletRequestDispatcher reqDispatcher = context.getRequestDispatcher(jspName); reqDispatcher.include(req, resp); } else if (callType.equals("getFeatureIds")) { PrintWriter writer = resp.getWriter(); FIGfamData access = new FIGfamData(); access.getFeatureIds(req, writer, req.getParameter("keyword")); writer.close(); } else if (callType.equals("getGroupStats")) { resp.setContentType("application/json"); PrintWriter writer = resp.getWriter(); FIGfamData access = new FIGfamData(); access.getGroupStats(req, writer); writer.close(); } else if (callType.equals("getLocusTags")) { PrintWriter writer = resp.getWriter(); FIGfamData access = new FIGfamData(); access.getLocusTags(req, writer); writer.close(); } else if (callType.equals("getSessionId")) { PrintWriter writer = resp.getWriter(); PortletSession sess = req.getPortletSession(true); writer.write(sess.getId()); writer.close(); } else if (callType.equals("saveState")) { String keyType = req.getParameter("keyType"); ResultType key = new ResultType(); setKeyValues("pageAt", req, key); setKeyValues("syntonyId", req, key); setKeyValues("regex", req, key); setKeyValues("filter", req, key); setKeyValues("perfectFamMatch", req, key); setKeyValues("minnumber_of_members", req, key); setKeyValues("maxnumber_of_members", req, key); setKeyValues("minnumber_of_species", req, key); setKeyValues("maxnumber_of_species", req, key); setKeyValues("ClusterRowOrder", req, key); setKeyValues("ClusterColumnOrder", req, key); setKeyValues("heatmapAxis", req, key); setKeyValues("colorScheme", req, key); setKeyValues("heatmapState", req, key); setKeyValues("steps", req, key); Random g = new Random(); int random = 0; while (random == 0) { random = g.nextInt(); } PortletSession sess = req.getPortletSession(true); sess.setAttribute(keyType + random, key); PrintWriter writer = resp.getWriter(); writer.write("" + random); writer.close(); } else if (callType.equals("getState")) { PrintWriter writer = resp.getWriter(); PortletSession sess = req.getPortletSession(true); String keyType = req.getParameter("keyType"); String random = req.getParameter("random"); if ((random != null) && (keyType != null)) { ResultType key = (ResultType) (sess.getAttribute(keyType + random)); 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(); } } else if (callType.equals("doClustering")) { PrintWriter writer = resp.getWriter(); String data = req.getParameter("data"); String g = req.getParameter("g"); String e = req.getParameter("e"); String m = req.getParameter("m"); String ge = req.getParameter("ge"); String pk = req.getParameter("pk"); String action = req.getParameter("action"); String folder = "/tmp/"; String filename = folder + "tmp_" + pk + ".txt"; String output_filename = folder + "cluster_tmp_" + pk; try { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(filename, true))); out.write(data); out.close(); } catch (Exception es) {// Catch exception if any System.err.println("Error: " + es.getMessage()); } if (action.equals("Run")) writer.write(doCLustering(filename, output_filename, g, e, m, ge).toString()); writer.close(); } else if (callType.equals("getSyntonyOrder")) { PrintWriter writer = resp.getWriter(); FIGfamData access = new FIGfamData(); JSONArray json = access.getSyntonyOrder(req); long start_ms = System.currentTimeMillis(); json.writeJSONString(writer); long end_ms = System.currentTimeMillis(); System.out.println("ProteinFamily::getSyntonyOrder::Writing response time - " + (end_ms - start_ms)); } else { PrintWriter writer = resp.getWriter(); writer.write(callType); writer.close(); } } } @SuppressWarnings("unchecked") public JSONObject doCLustering(String filename, String outputfilename, String g, String e, String m, String ge) throws IOException { boolean remove = true; JSONObject output = new JSONObject(); String exec = "sh /opt/jboss-patric/runMicroArrayClustering.sh " + filename + " " + outputfilename + " " + ((g.equals("1")) ? ge : "0") + " " + ((e.equals("1")) ? ge : "0") + " " + m; System.out.print(exec); CommandResults callClustering = ExecUtilities.exec(exec); if (callClustering.getStdout()[0].toString().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 (remove) { exec = "rm " + filename + " " + outputfilename; callClustering = ExecUtilities.exec(exec); } return output; } }