/*
* Copyright (c) 2012. The Genome Analysis Centre, Norwich, UK
* MISO project contacts: Robert Davey, Mario Caccamo @ TGAC
* *********************************************************************
*
* This file is part of MISO.
*
* MISO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MISO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MISO. If not, see <http://www.gnu.org/licenses/>.
*
* *********************************************************************
*/
package uk.ac.tgac.bbsrc.miso.external.ajax;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sourceforge.fluxion.ajax.Ajaxified;
import net.sourceforge.fluxion.ajax.util.JSONUtils;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
/**
* Created by IntelliJ IDEA.
* User: bianx
* To change this template use File | Settings | File Templates.
*/
@Ajaxified
public class ExternalSectionControllerHelperService {
public JSONObject loginDisplayProjects(HttpSession session, JSONObject json) {
JSONObject response = new JSONObject();
JSONArray jarray = new JSONArray();
String username = json.getString("username");
String shapassword = json.getString("shapassword");
String apiKey = null;
StringBuilder b = new StringBuilder();
try {
apiKey = generatePrivateUserKey((username + "::" + shapassword).getBytes("UTF-8"));
String signature = calculateHMAC("/miso/rest/external/projects?x-url=/miso/rest/external/projects@x-user=" + username, apiKey);
HttpClient client = new DefaultHttpClient();
String getURL = "http://hostname-here/miso/rest/external/projects";
HttpGet get = new HttpGet(getURL);
get.setHeader("x-user", username);
get.setHeader("x-signature", signature);
get.setHeader("x-url", "/miso/rest/external/projects");
HttpResponse responseGet = client.execute(get);
HttpEntity resEntityGet = responseGet.getEntity();
if (resEntityGet != null) {
BufferedReader rd = new BufferedReader(new InputStreamReader(resEntityGet.getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
jarray = JSONArray.fromObject(line);
}
}
// request done
for (JSONObject jproject : (Iterable<JSONObject>) jarray) {
b.append("<a class=\"dashboardresult\" onclick=\"showProjectStatus('" + jproject.getString("id") + "');\" href=\"javascript:void(0);\"><div onMouseOver=\"this.className='dashboardhighlight'\" onMouseOut=\"this.className='dashboard'\" class=\"dashboard\">");
b.append("Name: <b>" + jproject.getString("name") + "</b><br/>");
b.append("Alias: <b>" + jproject.getString("alias") + "</b><br/>");
b.append("</div></a>");
}
response.put("html", b.toString());
return response;
}
catch (Exception e) {
System.out.println(e.getMessage());
return JSONUtils.SimpleJSONError("Failed: Problem with Login.");
}
}
public JSONObject projectStatus(HttpSession session, JSONObject json) {
JSONObject jsonObject = new JSONObject();
try {
String projectId = json.getString("projectId");
JSONObject projectJSON = null;
StringBuilder projectSb = new StringBuilder();
StringBuilder sampleQcSb = new StringBuilder();
JSONArray sampleArray = new JSONArray();
JSONArray runsArray = new JSONArray();
String username = json.getString("username");
String shapassword = json.getString("shapassword");
String apiKey = null;
//request step 2
apiKey = generatePrivateUserKey((username + "::" + shapassword).getBytes("UTF-8"));
String signature = calculateHMAC("/miso/rest/external/project/" + projectId + "?x-url=/miso/rest/external/project/" + projectId + "@x-user=" + username, apiKey);
HttpClient client = new DefaultHttpClient();
String getURL = "http://hostname-here/miso/rest/external/project/" + projectId;
HttpGet get = new HttpGet(getURL);
get.setHeader("x-user", username);
get.setHeader("x-signature", signature);
get.setHeader("x-url", "/miso/rest/external/project/" + projectId);
HttpResponse responseGet = client.execute(get);
HttpEntity resEntityGet = responseGet.getEntity();
if (resEntityGet != null) {
BufferedReader rd = new BufferedReader(new InputStreamReader(resEntityGet.getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
projectJSON = JSONObject.fromObject(line);
}
}
if (projectJSON.getString("id").equals(projectId)) {
JSONObject j = projectJSON;
projectSb.append("<div class='report'>");
projectSb.append("<b>Project Name: </b> " + j.getString("name"));
projectSb.append("<br/><br/>");
projectSb.append("<b>Project Alias: </b> " + j.getString("alias"));
projectSb.append("<br/><br/>");
projectSb.append("<b>Project Description: </b> " + j.getString("description"));
projectSb.append("<br/><br/>");
projectSb.append("<b>Progress: </b> " + j.getString("progress"));
projectSb.append("<br/><br/>");
if (j.getJSONArray("overviews").size() > 0) {
for (JSONObject joverview : (Iterable<JSONObject>) j.getJSONArray("overviews")) {
projectSb.append("<div><ol id=\"progress\">\n" +
" <li class=\"sample-qc-step\">\n");
projectSb.append("<div class=\"");
if (joverview.getBoolean("allSampleQcPassed") && joverview.getBoolean("libraryPreparationComplete")) {
projectSb.append("left mid-progress-done");
}
else if (joverview.getBoolean("allSampleQcPassed")) {
projectSb.append("left-progress-done");
}
else {
projectSb.append("left");
}
projectSb.append("\">\n");
projectSb.append(" <span>Sample QCs</span>\n" +
" </div>\n" +
" </li>\n" +
"\n" +
" <li class=\"lib-prep-step\">\n");
projectSb.append("<div class=\"");
if (joverview.getBoolean("libraryPreparationComplete") && joverview.getBoolean("allLibrariesQcPassed")) {
projectSb.append("mid-progress-done");
}
else if (joverview.getBoolean("libraryPreparationComplete")) {
projectSb.append("left-progress-done");
}
else {
projectSb.append("");
}
projectSb.append("\">\n");
projectSb.append(" <span>Libraries prepared</span>\n" +
" </div>\n" +
" </li>\n" +
"\n" +
" <li class=\"lib-qc-step\">\n");
projectSb.append("<div class=\"");
if (joverview.getBoolean("allLibrariesQcPassed") && joverview.getBoolean("allPoolsConstructed")) {
projectSb.append("mid-progress-done");
}
else if (joverview.getBoolean("allLibrariesQcPassed")) {
projectSb.append("left-progress-done");
}
else {
projectSb.append("");
}
projectSb.append("\">\n");
projectSb.append(" <span>Library QCs</span>\n" +
" </div>\n" +
" </li>\n" +
"\n" +
" <li class=\"pools-step\">\n");
projectSb.append("<div class=\"");
if (joverview.getBoolean("allPoolsConstructed") && joverview.getBoolean("allRunsCompleted")) {
projectSb.append("mid-progress-done");
}
else if (joverview.getBoolean("allPoolsConstructed")) {
projectSb.append("left-progress-done");
}
else {
projectSb.append("");
}
projectSb.append("\">\n");
projectSb.append(" <span>Pools Constructed</span>\n" +
" </div>\n" +
" </li>\n" +
"\n" +
" <li class=\"runs-step\">\n");
projectSb.append("<div class=\"");
if (joverview.getBoolean("allRunsCompleted") && joverview.getBoolean("primaryAnalysisCompleted")) {
projectSb.append("mid-progress-done");
}
else if (joverview.getBoolean("allRunsCompleted")) {
projectSb.append("left-progress-done");
}
else {
projectSb.append("");
}
projectSb.append("\">\n");
projectSb.append(" <span>Runs Completed</span>\n" +
" </div>\n" +
" </li>\n" +
"\n" +
" <li class=\"primary-analysis-step\">\n");
projectSb.append("<div class=\"");
if (joverview.getBoolean("primaryAnalysisCompleted")) {
projectSb.append("right mid-progress-done");
}
else {
projectSb.append("right");
}
projectSb.append("\">\n");
projectSb.append(" <span>Primary Analysis</span>\n" +
" </div>\n" +
" </li>\n" +
" </ol></div>\n" +
" <p style=\"clear:both\"/>");
}
}
if (j.getJSONArray("samples").size() > 0) {
int sampleQCPassed = 0;
for (JSONObject jsample : (Iterable<JSONObject>) j.getJSONArray("samples")) {
if ("true".equals(jsample.getString("qcPassed"))) {
sampleQCPassed++;
}
}
sampleQcSb.append("Sample QC Passed: " + sampleQCPassed + " out of " + j.getJSONArray("samples").size() + ".<br/><br/>");
sampleArray = listSamplesDataTable(j.getJSONArray("samples"));
}
if (j.getJSONArray("runs").size() > 0) {
runsArray = listRunsDataTable(j.getJSONArray("runs"));
}
}
jsonObject.put("projectJson", projectSb.toString());
jsonObject.put("sampleQcJson", sampleQcSb.toString());
jsonObject.put("samplesArray", sampleArray);
jsonObject.put("runsArray", runsArray);
return jsonObject;
}
catch (Exception e) {
return JSONUtils.SimpleJSONError("Failed: " + e.getMessage());
}
}
public JSONArray listSamplesDataTable(JSONArray array) {
try {
JSONArray jsonArray = new JSONArray();
for (JSONObject jsample : (Iterable<JSONObject>) array) {
jsonArray.add("['" +
jsample.getString("alias") + "','" +
jsample.getString("sampleType") + "','" +
jsample.getString("qcPassed") + "','" +
jsample.getString("sampleQubit") + " ng/μl" + "','" +
jsample.getString("receivedDate") + "']");
}
return jsonArray;
}
catch (Exception e) {
JSONArray jsonArray = new JSONArray();
return jsonArray;
}
}
public JSONArray listRunsDataTable(JSONArray array) {
try {
JSONArray jsonArray = new JSONArray();
for (JSONObject jrun : (Iterable<JSONObject>) array) {
StringBuilder runsamples = new StringBuilder();
if (jrun.getJSONArray("samples").size() > 0) {
runsamples.append("<div class=\"samplelist\">" + jrun.getJSONArray("samples").size() + " Samples:");
runsamples.append("<ul>");
for (JSONObject jrunsample : (Iterable<JSONObject>) jrun.getJSONArray("samples")) {
runsamples.append("<li>" + jrunsample.getString("sampleAlias") + "</li>");
}
}
runsamples.append("</ul></div>");
jsonArray.add("['" +
jrun.getString("name") + "','" +
jrun.getString("status") + "','" +
jrun.getString("startDate") + "','" +
jrun.getString("completionDate") + "','" +
jrun.getString("platformType") + "','" +
runsamples.toString() +
"']");
}
return jsonArray;
}
catch (Exception e) {
JSONArray jsonArray = new JSONArray();
return jsonArray;
}
}
public static String generatePrivateUserKey(byte[] data) throws NoSuchAlgorithmException {
SecretKeySpec signingKey = new SecretKeySpec(data, "DSA");
return Base64.encodeBase64URLSafeString(signingKey.getEncoded());
}
public static String calculateHMAC(String data, String key) throws java.security.SignatureException {
String result;
try {
//get an hmac_sha1 key from the raw key bytes
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
// get an hmac_sha1 Mac instance and initialize with the signing key
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
// compute the hmac on input data bytes
byte[] rawHmac = mac.doFinal(data.getBytes());
// base64-encode the hmac
result = Base64.encodeBase64URLSafeString(rawHmac);
//result = Base64.encodeBase64String(rawHmac);
}
catch (Exception e) {
throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
}
return result;
}
}