package model;
import java.util.ArrayList;
import java.util.Iterator;
import gui.ErrorDialog;
import gui.processing.ProcessCommand;
import requests.CancelProcessRequest;
import requests.GetGenomeReleasesRequest;
import requests.ProcessCommandRequest;
import requests.ProcessFeedbackRequest;
import requests.RequestFactory;
import responses.ResponseParser;
import util.AnnotationDataType;
import util.AnnotationDataValue;
import util.Constants;
import util.ExperimentData;
import util.FileData;
import util.GenomeReleaseData;
import util.ProcessFeedbackData;
import util.RequestException;
import communication.Connection;
import communication.ConnectionFactory;
public class ProcessModel {
ExperimentData selectedExperiment;
public ProcessModel() {
}
public ProcessFeedbackData[] getProcessFeedback() {
ProcessFeedbackRequest request = RequestFactory
.makeProcessFeedbackRequest();
Connection conn = SessionHandler.getInstance().makeConnection();
try {
conn.sendRequest(request, User.getInstance().getToken(),
Constants.TEXT_PLAIN);
return ResponseParser.parseProcessFeedbackResponse(conn
.getResponseBody());
} catch (RequestException e) {
new ErrorDialog("Couldn't get process feedback", e).showDialog();
return null;
}
}
public void abortProcess(String PID) throws RequestException {
CancelProcessRequest request = RequestFactory
.makeCancelProcessRequest(PID);
Connection conn = SessionHandler.getInstance().makeConnection();
conn.sendRequest(request, User.getInstance().getToken(),
Constants.JSON);
}
/**
* Sends a processing request to the server, with which file the user wants
* to create profile data from. All the commants will get sent.
*
* @param commandList
*
* @throws RequestException
*/
public void startProcessing(String pid, ProcessCommand[] commandList)
throws RequestException {
// TODO Auto-generated method stub
ProcessCommandRequest request = RequestFactory
.makeProcessCommandRequest(pid, commandList);
Connection conn = SessionHandler.getInstance().makeConnection();
conn.sendRequest(request, User.getInstance().getToken(),
Constants.JSON);
}
public void setSelectedExperiment(ExperimentData selectedExperiment) {
this.selectedExperiment = selectedExperiment;
}
public String[] getGenomeReleases() {
// Emergency copypasta from (actual) model version of this method.
// Get all possible genome releases
GenomeReleaseData[] genomeReleases;
try {
GetGenomeReleasesRequest request = RequestFactory
.makeGetGenomeReleaseRequest();
Connection conn = SessionHandler.getInstance().makeConnection();
conn.sendRequest(request, User.getInstance().getToken(),
Constants.TEXT_PLAIN);
genomeReleases = ResponseParser.parseGetGenomeReleaseResponse(conn
.getResponseBody());
} catch (RequestException e) {
new ErrorDialog("Couldn't get genome releases", e).showDialog();
return new String[] {};
}
ArrayList<String> genomeReleaseList = new ArrayList<String>();
// Get annotation specie
String expSpecies = null;
ArrayList<AnnotationDataValue> expAnnots = selectedExperiment.getAnnotations();
for ( AnnotationDataValue annotVal : expAnnots ){
if ( annotVal.getName().equalsIgnoreCase("species") ){
expSpecies = annotVal.getValue();
break;
}
}
if ( expSpecies == null ){
return new String[] {};
}
// Get matching gr versions
String grVersion;
String grSpecies;
for ( GenomeReleaseData grd: genomeReleases ){
grVersion = grd.getVersion();
grSpecies = grd.getSpecies();
if ( grSpecies.equalsIgnoreCase( expSpecies ) ){
if ( ! genomeReleaseList.contains( grVersion )){
genomeReleaseList.add(grVersion);
}
}
}
String[] genomeReleaseStrings = new String[genomeReleaseList.size()];
genomeReleaseStrings = (String[]) genomeReleaseList.toArray(genomeReleaseStrings);
return genomeReleaseStrings;
}
/**
* Get the names of all files in the current experiment. Also provide type
* argument to filter for this.
*
* @return array of String filenames
*/
public String[] getFileNames() {
ArrayList<String> fileNames = new ArrayList<String>();
for (FileData file : selectedExperiment.files) {
fileNames.add(file.getName());
}
return fileNames.toArray(new String[fileNames.size()]);
}
/**
* Get the names of all files in the current experiment. Also provide type
* argument to filter for this.
*
* @param type String to fileter for ("all" or null filter allows all)
* @return array of String filenames
*/
public String[] getFileNames(String type) {
ArrayList<String> fileNames = new ArrayList<String>();
Iterator<FileData> fileIterator = selectedExperiment.files.iterator();
for (FileData file : selectedExperiment.files) {
if (type == null || type.equalsIgnoreCase("all")
|| type.equalsIgnoreCase(file.type)) {
fileNames.add(file.getName());
}
}
return fileNames.toArray(new String[fileNames.size()]);
}
public String getSelectedExperimentName() {
return selectedExperiment.getName();
}
}