/*
* 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.bbsrc.tgac.miso.spring.ajax;
import com.eaglegenomics.simlims.core.manager.SecurityManager;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import uk.ac.bbsrc.tgac.miso.core.data.Experiment;
import uk.ac.bbsrc.tgac.miso.core.data.Kit;
import uk.ac.bbsrc.tgac.miso.core.data.impl.kit.*;
import uk.ac.bbsrc.tgac.miso.core.data.type.KitType;
import uk.ac.bbsrc.tgac.miso.core.manager.RequestManager;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* uk.ac.bbsrc.tgac.miso.spring.ajax
* <p/>
* Info
*
* @author Rob Davey
* @since 0.0.2
*/
@Ajaxified
public class ExperimentControllerHelperService {
protected static final Logger log = LoggerFactory.getLogger(PoolControllerHelperService.class);
@Autowired
private SecurityManager securityManager;
@Autowired
private RequestManager requestManager;
public JSONObject lookupKitByIdentificationBarcode(HttpSession session, JSONObject json) {
try {
if (json.has("barcode")) {
String barcode = json.getString("barcode");
Kit kit = requestManager.getKitByIdentificationBarcode(barcode);
if (kit != null) {
return JSONUtils.SimpleJSONResponse(kit.toString());
}
else {
//new kit?
Pattern ls454KitPattern = Pattern.compile("([\\d]{11})([\\d]{8})([\\d]{6})"); //05365473001 93765920 102010
Pattern illuminaKitPattern = Pattern.compile("([A-Z0-9]{3}-[\\d]{7})"); // RGT-0520823 - outer kit barcode // 15003926 - partNumber // 5454482 - lotNumber
Pattern solidKitPattern = Pattern.compile("foo"); //05365473001 93765920 102010
if (ls454KitPattern.matcher(barcode).matches()) {
return JSONUtils.SimpleJSONResponse("Looks like a 454 kit");
}
else if (illuminaKitPattern.matcher(barcode).matches()) {
return JSONUtils.SimpleJSONResponse("Looks like an Illumina kit");
}
else if (solidKitPattern.matcher(barcode).matches()) {
return JSONUtils.SimpleJSONResponse("Looks like a SOLiD kit");
}
else {
return JSONUtils.SimpleJSONError("Unrecognised barcode");
}
}
}
}
catch (Exception e) {
log.debug("Failed to lookup kit: ", e);
return JSONUtils.SimpleJSONError("Failed to lookup kit");
}
return JSONUtils.SimpleJSONError("Cannot process kit barcode");
}
public JSONObject lookupKitByLotNumber(HttpSession session, JSONObject json) {
try {
if (json.has("lotNumber")) {
String lotNumber = json.getString("lotNumber");
//String platform = json.getString("platform");
Kit kit = requestManager.getKitByLotNumber(lotNumber);
if (kit != null) {
return JSONUtils.SimpleJSONResponse(kit.toString());
}
else {
Pattern ls454KitPattern = Pattern.compile("([\\d]{11})([\\d]{8})([\\d]{6})"); //05365473001 93765920 102010
Matcher ls454Matcher = ls454KitPattern.matcher(lotNumber);
Pattern illuminaKitPattern = Pattern.compile("([0-9]{7})"); // 5454482 - lotNumber
Matcher illuminaMatcher = illuminaKitPattern.matcher(lotNumber);
Pattern solidKitPattern = Pattern.compile("foo"); //05365473001 93765920 102010
Matcher solidMatcher = solidKitPattern.matcher(lotNumber);
if (ls454Matcher.matches()) {
log.info("Looks like a 454 kit - getting lot number");
lotNumber = ls454Matcher.group(2);
}
else if (illuminaMatcher.matches()) {
log.info("Looks like an Illumina kit - getting lot number");
lotNumber = illuminaMatcher.group(1);
}
else if (solidMatcher.matches()) {
log.info("Looks like a SOLiD kit - getting lot number");
lotNumber = solidMatcher.group(1);
}
else {
return JSONUtils.SimpleJSONError("Unrecognised barcode");
}
}
}
}
catch (Exception e) {
log.debug("Failed to lookup kit: ", e);
return JSONUtils.SimpleJSONError("Failed to lookup kit");
}
return JSONUtils.SimpleJSONError("Cannot process kit barcode");
}
public JSONObject lookupKitDescriptorByPartNumber(HttpSession session, JSONObject json) {
try {
if (json.has("partNumber")) {
String partNumber = json.getString("partNumber");
//String platform = json.getString("platform");
Pattern fullLs454KitPattern = Pattern.compile("([\\d]{11})([\\d]{8})([\\d]{6})"); //05365473001 93765920 102010
Matcher fullLs454Matcher = fullLs454KitPattern.matcher(partNumber);
Pattern ls454KitPattern = Pattern.compile("([\\d]{11})"); //05365473001 93765920 102010
Matcher ls454Matcher = ls454KitPattern.matcher(partNumber);
Pattern illuminaKitPattern = Pattern.compile("([0-9]{8})"); // 15003926 - partNumber
Matcher illuminaMatcher = illuminaKitPattern.matcher(partNumber);
Pattern solidKitPattern = Pattern.compile("foo"); //05365473001 93765920 102010
Matcher solidMatcher = solidKitPattern.matcher(partNumber);
if (fullLs454Matcher.matches()) {
log.info("Looks like a 454 kit - getting part number");
partNumber = fullLs454Matcher.group(1);
}
else if (ls454Matcher.matches()) {
log.info("Looks like an 454 kit - getting part number");
partNumber = ls454Matcher.group(1);
}
else if (illuminaMatcher.matches()) {
log.info("Looks like an Illumina kit - getting part number");
partNumber = illuminaMatcher.group(1);
}
else if (solidMatcher.matches()) {
log.info("Looks like a SOLiD kit - getting part number");
partNumber = solidMatcher.group(1);
}
else {
return null;
}
KitDescriptor kitDescriptor = requestManager.getKitDescriptorByPartNumber(partNumber);
if (kitDescriptor != null) {
Map<String, Object> m = new HashMap<String, Object>();
m.put("id", kitDescriptor.getKitDescriptorId());
m.put("name", kitDescriptor.getName());
return JSONUtils.JSONObjectResponse(m);
}
}
}
catch (Exception e) {
log.debug("Failed to lookup kit: ", e);
return JSONUtils.SimpleJSONError("Failed to lookup kit");
}
return JSONUtils.SimpleJSONError("Cannot process kit barcode");
}
//library
public JSONObject getLibraryKitDescriptors(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
String multiplexed = json.getString("multiplexed");
Experiment e = requestManager.getExperimentById(new Long(experimentId));
Collection<KitDescriptor> kits = requestManager.listKitDescriptorsByType(KitType.LIBRARY);
StringBuilder lkits = new StringBuilder();
lkits.append("[");
int count = 0;
for (KitDescriptor k : kits) {
if (e.getPlatform().getPlatformType().equals(k.getPlatformType())) {
lkits.append("{'name':'"+k.getName()+"', 'id':'"+k.getKitDescriptorId()+"', 'partNumber':'"+k.getPartNumber()+"'}");
if (count < kits.size()) lkits.append(",");
count++;
}
}
lkits.append("]");
StringBuilder mkits = null;
if (multiplexed.equals("true")) {
mkits = new StringBuilder();
Collection<KitDescriptor> mkitds = requestManager.listKitDescriptorsByType(KitType.MULTIPLEXING);
mkits.append("[");
count = 0;
for (KitDescriptor k : mkitds) {
if (e.getPlatform().getPlatformType().equals(k.getPlatformType())) {
mkits.append("{'name':'"+k.getName()+"', 'id':'"+k.getKitDescriptorId()+"', 'partNumber':'"+k.getPartNumber()+"'}");
if (count < mkitds.size()) mkits.append(",");
count++;
}
}
mkits.append("]");
}
//return JSONUtils.JSONObjectResponse("{'experimentId':'"+experimentId+"', 'multiplexed':'"+multiplexed+"', "+sb.toString()+"}");
Map<String, Object> m = new HashMap<String, Object>();
m.put("experimentId", experimentId);
m.put("multiplexed", multiplexed);
m.put("libraryKitDescriptors", JSONArray.fromObject(lkits.toString()));
if (mkits != null) {
m.put("multiplexKitDescriptors", JSONArray.fromObject(mkits.toString()));
}
return JSONUtils.JSONObjectResponse(m);
}
}
catch (Exception e) {
log.debug("Failed to generate kit selection: ", e);
return JSONUtils.SimpleJSONError("Failed to generate kit selection");
}
return JSONUtils.SimpleJSONError("Cannot select library kits");
}
public JSONObject addLibraryKit(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
String kitDescriptor = json.getString("kitDescriptor");
String lotNumber = json.getString("lotNumber");
LibraryKit lk = new LibraryKit();
KitDescriptor kd = requestManager.getKitDescriptorById(new Long(kitDescriptor));
lk.setKitDescriptor(kd);
lk.setLotNumber(lotNumber);
if (!json.has("kitDate") || json.getString("kitDate").equals("")) {
lk.setKitDate(new Date());
}
Experiment e = requestManager.getExperimentById(new Long(experimentId));
e.addKit(lk);
requestManager.saveExperiment(e);
Integer newStock = kd.getStockLevel()-1;
kd.setStockLevel(newStock);
requestManager.saveKitDescriptor(kd);
}
return JSONUtils.SimpleJSONResponse("Saved kit!");
}
catch (IOException e) {
e.printStackTrace();
return JSONUtils.SimpleJSONError("Failed to save library kit");
}
}
// empcr
public JSONObject getEmPcrKitDescriptors(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
Experiment e = requestManager.getExperimentById(new Long(experimentId));
Collection<KitDescriptor> kits = requestManager.listKitDescriptorsByType(KitType.EMPCR);
StringBuilder sb = new StringBuilder();
sb.append("[");
int count = 0;
for (KitDescriptor k : kits) {
if (e.getPlatform().getPlatformType().equals(k.getPlatformType())) {
sb.append("{'name':'"+k.getName()+"', 'id':'"+k.getKitDescriptorId()+"', 'partNumber':'"+k.getPartNumber()+"'}");
if (count < kits.size()) sb.append(",");
count++;
}
}
sb.append("]");
//return JSONUtils.JSONObjectResponse("{'experimentId':'"+experimentId+"', "+sb.toString()+"}");
Map<String, Object> m = new HashMap<String, Object>();
m.put("experimentId", experimentId);
m.put("emPcrKitDescriptors", JSONArray.fromObject(sb.toString()));
return JSONUtils.JSONObjectResponse(m);
}
}
catch (Exception e) {
log.debug("Failed to generate kit selection: ", e);
return JSONUtils.SimpleJSONError("Failed to generate kit selection");
}
return JSONUtils.SimpleJSONError("Cannot select EmPCR kits");
}
public JSONObject addEmPcrKit(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
String kitDescriptor = json.getString("kitDescriptor");
String lotNumber = json.getString("lotNumber");
EmPcrKit lk = new EmPcrKit();
KitDescriptor kd = requestManager.getKitDescriptorById(new Long(kitDescriptor));
lk.setKitDescriptor(kd);
lk.setLotNumber(lotNumber);
if (!json.has("kitDate") || json.getString("kitDate").equals("")) {
lk.setKitDate(new Date());
}
Experiment e = requestManager.getExperimentById(new Long(experimentId));
e.addKit(lk);
requestManager.saveExperiment(e);
Integer newStock = kd.getStockLevel()-1;
kd.setStockLevel(newStock);
requestManager.saveKitDescriptor(kd);
}
return JSONUtils.SimpleJSONResponse("Saved kit!");
}
catch (IOException e) {
e.printStackTrace();
return JSONUtils.SimpleJSONError("Failed to save EmPCR kit");
}
}
//clustering
public JSONObject getClusteringKitDescriptors(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
Experiment e = requestManager.getExperimentById(new Long(experimentId));
Collection<KitDescriptor> kits = requestManager.listKitDescriptorsByType(KitType.CLUSTERING);
StringBuilder sb = new StringBuilder();
sb.append("[");
int count = 0;
for (KitDescriptor k : kits) {
if (e.getPlatform().getPlatformType().equals(k.getPlatformType())) {
sb.append("{'name':'"+k.getName()+"', 'id':'"+k.getKitDescriptorId()+"', 'partNumber':'"+k.getPartNumber()+"'}");
if (count < kits.size()) sb.append(",");
count++;
}
}
sb.append("]");
//return JSONUtils.JSONObjectResponse("{'experimentId':'"+experimentId+"', "+sb.toString()+"}");
Map<String, Object> m = new HashMap<String, Object>();
m.put("experimentId", experimentId);
m.put("clusteringKitDescriptors", JSONArray.fromObject(sb.toString()));
return JSONUtils.JSONObjectResponse(m);
}
}
catch (Exception e) {
log.debug("Failed to generate kit selection: ", e);
return JSONUtils.SimpleJSONError("Failed to generate kit selection");
}
return JSONUtils.SimpleJSONError("Cannot select clustering kits");
}
public JSONObject addClusteringKit(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
String kitDescriptor = json.getString("kitDescriptor");
String lotNumber = json.getString("lotNumber");
ClusterKit lk = new ClusterKit();
KitDescriptor kd = requestManager.getKitDescriptorById(new Long(kitDescriptor));
lk.setKitDescriptor(kd);
lk.setLotNumber(lotNumber);
if (!json.has("kitDate") || json.getString("kitDate").equals("")) {
lk.setKitDate(new Date());
}
Experiment e = requestManager.getExperimentById(new Long(experimentId));
e.addKit(lk);
requestManager.saveExperiment(e);
Integer newStock = kd.getStockLevel()-1;
kd.setStockLevel(newStock);
requestManager.saveKitDescriptor(kd);
}
return JSONUtils.SimpleJSONResponse("Saved kit!");
}
catch (IOException e) {
e.printStackTrace();
return JSONUtils.SimpleJSONError("Failed to save clustering kit");
}
}
//sequencing
public JSONObject getSequencingKitDescriptors(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
Experiment e = requestManager.getExperimentById(new Long(experimentId));
Collection<KitDescriptor> kits = requestManager.listKitDescriptorsByType(KitType.SEQUENCING);
StringBuilder sb = new StringBuilder();
sb.append("[");
int count = 0;
for (KitDescriptor k : kits) {
if (e.getPlatform().getPlatformType().equals(k.getPlatformType())) {
sb.append("{'name':'"+k.getName()+"', 'id':'"+k.getKitDescriptorId()+"', 'partNumber':'"+k.getPartNumber()+"'}");
if (count < kits.size()) sb.append(",");
count++;
}
}
sb.append("]");
//return JSONUtils.JSONObjectResponse("{'experimentId':'"+experimentId+"', "+sb.toString()+"}");
Map<String, Object> m = new HashMap<String, Object>();
m.put("experimentId", experimentId);
m.put("sequencingKitDescriptors", JSONArray.fromObject(sb.toString()));
return JSONUtils.JSONObjectResponse(m);
}
}
catch (Exception e) {
log.debug("Failed to generate kit selection: ", e);
return JSONUtils.SimpleJSONError("Failed to generate kit selection");
}
return JSONUtils.SimpleJSONError("Cannot select sequencing kits");
}
public JSONObject addSequencingKit(HttpSession session, JSONObject json) {
try {
if (json.has("experimentId")) {
String experimentId = json.getString("experimentId");
String kitDescriptor = json.getString("kitDescriptor");
String lotNumber = json.getString("lotNumber");
SequencingKit lk = new SequencingKit();
KitDescriptor kd = requestManager.getKitDescriptorById(new Long(kitDescriptor));
lk.setKitDescriptor(kd);
lk.setLotNumber(lotNumber);
if (!json.has("kitDate") || json.getString("kitDate").equals("")) {
lk.setKitDate(new Date());
}
Experiment e = requestManager.getExperimentById(new Long(experimentId));
e.addKit(lk);
requestManager.saveExperiment(e);
Integer newStock = kd.getStockLevel()-1;
kd.setStockLevel(newStock);
requestManager.saveKitDescriptor(kd);
}
return JSONUtils.SimpleJSONResponse("Saved kit!");
}
catch (IOException e) {
e.printStackTrace();
return JSONUtils.SimpleJSONError("Failed to save sequencing kit");
}
}
public JSONObject listExperimentsDataTable(HttpSession session, JSONObject json) {
try {
JSONObject j = new JSONObject();
JSONArray jsonArray = new JSONArray();
for (Experiment experiment : requestManager.listAllExperiments()) {
jsonArray.add("['" + experiment.getName() + "','" +
experiment.getAlias() + "','" +
experiment.getDescription() + "','" +
experiment.getPlatform().getPlatformType().getKey() + " "+ experiment.getPlatform().getInstrumentModel()+ "','" +
"<a href=\"/miso/experiment/" + experiment.getId() + "\"><span class=\"ui-icon ui-icon-pencil\"></span></a>" + "']");
}
j.put("experimentsArray", jsonArray);
return j;
}
catch (IOException e) {
log.debug("Failed", e);
return JSONUtils.SimpleJSONError("Failed: " + e.getMessage());
}
}
public void setSecurityManager(SecurityManager securityManager) {
this.securityManager = securityManager;
}
public void setRequestManager(RequestManager requestManager) {
this.requestManager = requestManager;
}
}