package controller;
import gui.ErrorDialog;
import gui.GUI;
import gui.UploadFileRow;
import gui.UploadTab;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import model.ErrorLogger;
import model.GenomizerModel;
import util.AnnotationDataType;
import util.AnnotationDataValue;
import util.ExperimentData;
import util.GenomeReleaseData;
import util.RequestException;
import communication.HTTPURLUpload;
public class UploadTabController {
private final GenomizerModel model;
private final UploadTab uploadTab;
private final JFileChooser fileChooser;
GUI view;
public UploadTabController(GUI view, GenomizerModel model,
JFileChooser fileChooser) {
this.view = view;
this.model = model;
this.fileChooser = fileChooser;
this.uploadTab = view.getUploadTab();
uploadTab
.addAddToExistingExpButtonListener(AddToExistingExpButtonListener());
uploadTab.addNewExpButtonListener(NewExpButtonListener());
uploadTab.getNewExpPanel().addSelectButtonListener(
SelectFilesToNewExpListener());
uploadTab.getNewExpPanel().addUploadButtonListener(uploadExpListener());
uploadTab.getNewExpPanel().addUploadSelectedFilesListener(
uploadSelectedFilesListener());
uploadTab.getNewExpPanel().addSpeciesSelectedListener(
SpeciesSelectedListener());
updateProgress();
}
/**
* Display a fileChooser, and let the user enter the files to upload. Used
* for NewExp. TODO: Same code as for oldexp?
*/
public ActionListener SelectFilesToNewExpListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
fileChooser.setMultiSelectionEnabled(true);
int ret = fileChooser.showOpenDialog(new JPanel());
File[] files;
if (ret == JFileChooser.APPROVE_OPTION) {
files = fileChooser.getSelectedFiles();
} else {
return;
}
uploadTab.getNewExpPanel().createUploadFileRow(files);
uploadTab.getNewExpPanel().enableUploadButton(true);
}
};
}
public ActionListener AddToExistingExpButtonListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
String expID = uploadTab.getSearchText();
if (expID.length() > 0) {
try {
ExperimentData ed = model
.retrieveExperiment(expID);
String species = null;
boolean existingSpecies = false;
for (AnnotationDataValue adv : ed
.getAnnotations()) {
if (adv.getName().equalsIgnoreCase(
"species")) {
species = adv.getValue();
existingSpecies = true;
}
}
if (existingSpecies) {
uploadTab.addExistingExpPanel(ed,
model.getAnnotations());
GenomeReleaseData[] grd = model
.getSpeciesGenomeReleases(species);
uploadTab.setGenomeReleases(grd);
} else {
JOptionPane.showMessageDialog(null,
"Missing species in experiment.",
"ERROR", JOptionPane.ERROR_MESSAGE);
}
} catch (NullPointerException e) {
ErrorLogger.log(e);
JOptionPane
.showMessageDialog(
null,
"Couldn't find or retrieve experiment.",
"ERROR",
JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(null,
"Please fill in experiment name.", "ERROR",
JOptionPane.ERROR_MESSAGE);
}
};
}.start();
}
};
}
/**
* Get the annotations and create a new NewExp Panel with them.
*
* TODO: Threads, creates new panel from non-EDT, getAnnot is connectoin...
*/
public ActionListener NewExpButtonListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
uploadTab.getNewExpPanel().setSelectButtonEnabled(true);
AnnotationDataType[] annotations = model
.getAnnotations();
uploadTab.addNewExpPanel(annotations);
};
}.start();
}
};
}
public ActionListener uploadExpListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
JButton newExpButton = uploadTab.getNewExpButton();
newExpButton.setEnabled(false);
uploadTab.getUploadToNewExpPanel().toggleFields(false);
// uploadTab
String expName = uploadTab.getNewExpPanel()
.getNewExpID();
AnnotationDataValue[] annotations = uploadTab
.getNewExpPanel().getUploadAnnotations();
ArrayList<File> files = uploadTab.getNewExpPanel()
.getUploadFiles();
HashMap<String, String> types = uploadTab
.getNewExpPanel().getTypes();
try {
if (uploadTab.getUploadToNewExpPanel()
.getIsNewExp()) {
model.addNewExperiment(expName, annotations);
} else {
// TODO Ska anv�ndas n�r edit annot
// implementerats
model.changeExperiment(expName, annotations);
}
uploadTab.getUploadToNewExpPanel()
.setSelectButtonEnabled(false);
uploadTab.getUploadToNewExpPanel()
.enableUploadButton(false);
uploadTab.setFileRowsEnabled(false);
int count = 0;
for (File f : files) {
model.uploadFile(expName, f,
types.get(f.getName()), false,
uploadTab.getGenomeVersion(f));
uploadTab.getNewExpPanel().deleteFileRow(f);
for (HTTPURLUpload upload : model
.getOngoingUploads()) {
if (f.getName()
.equals(upload.getFileName())) {
model.getOngoingUploads()
.remove(upload);
}
}
count++;
view.setStatusPanel("Upload " + count + "/"
+ files.size() + " done.");
// TODO: Decide whether to refresh this
// view part -
// view.getQuerySearchTab().refresh();
// TODO Beh�vs nog inte
}
uploadTab.getUploadToNewExpPanel()
.enableUploadButton(true);
uploadTab.getUploadToNewExpPanel()
.setSelectButtonEnabled(true);
uploadTab.setFileRowsEnabled(true);
String status = "Changes to experiment \"" + expName
+ "\" completed.";
view.setStatusPanel(status);
view.setStatusPanelColor("success");
} catch (RequestException e) {
new ErrorDialog(
"Could not upload file to experiment", e)
.showDialog();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
newExpButton.setEnabled(true);
uploadTab.getUploadToNewExpPanel().toggleFields(true);
};
}.start();
}
};
}
public ActionListener uploadSelectedFilesListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
JButton newExpButton = uploadTab.getNewExpButton();
newExpButton.setEnabled(false);
uploadTab.getUploadToNewExpPanel().toggleFields(false);
String expName = uploadTab.getNewExpPanel()
.getNewExpID();
AnnotationDataValue[] annotations = uploadTab
.getNewExpPanel().getUploadAnnotations();
ArrayList<File> files = uploadTab.getNewExpPanel()
.getSelectedFilesToUpload();
if (files != null && files.size() > 0
&& annotations != null && expName != null) {
HashMap<String, String> types = uploadTab
.getNewExpPanel().getTypes();
try {
model.addNewExperiment(expName, annotations);
uploadTab.getUploadToNewExpPanel()
.setSelectButtonEnabled(false);
uploadTab.setFileRowsEnabled(false);
uploadTab.getUploadToNewExpPanel()
.enableUploadButton(false);
int count = 0;
for (File f : files) {
model.uploadFile(expName, f,
types.get(f.getName()), false,
uploadTab.getGenomeVersion(f));
uploadTab.getNewExpPanel().deleteFileRow(f);
for (HTTPURLUpload upload : model
.getOngoingUploads()) {
if (f.getName().equals(
upload.getFileName())) {
model.getOngoingUploads().remove(
upload);
}
}
count++;
view.setStatusPanel("Upload " + count + "/"
+ files.size() + " done.");
}
// Shown when all files have been uploaded to
// experiment.
uploadTab.getUploadToNewExpPanel()
.enableUploadButton(true);
uploadTab.getUploadToNewExpPanel()
.setSelectButtonEnabled(true);
uploadTab.setFileRowsEnabled(true);
String status = "Upload to new experiment \""
+ expName + "\" complete.";
view.setStatusPanel(status);
view.setStatusPanelColor("success");
} catch (RequestException e) {
new ErrorDialog(
"Could not upload file to experiment",
e).showDialog();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
JOptionPane.showMessageDialog(null,
"No files selected.");
}
newExpButton.setEnabled(true);
uploadTab.getUploadToNewExpPanel().toggleFields(true);
};
}.start();
}
};
}
public ActionListener SpeciesSelectedListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
String species = uploadTab.getNewExpPanel()
.getSelectedSpecies();
if (species.equals("")) {
uploadTab
.setGenomeReleases(new GenomeReleaseData[] {});
return;
}
// TODO: Thread, although connection here, should not
// below.
GenomeReleaseData[] grd = model
.getSpeciesGenomeReleases(species);
uploadTab.setGenomeReleases(grd);
};
}.start();
}
};
}
/**
* Method updating the progress of ongoing uploads. OO Now adding to the
* ticker updater thread.
*/
private void updateProgress() {
Runnable task = new Runnable() {
@Override
public void run() {
for (File key : uploadTab.getNewExpPanel().getFileRows()
.keySet()) {
UploadFileRow row = uploadTab.getNewExpPanel()
.getFileRows().get(key);
for (HTTPURLUpload upload : model.getOngoingUploads()) {
if (upload.getFileName().equals(row.getFileName())) {
row.updateProgressBar(upload.getCurrentProgress());
}
}
}
}
};
model.addTickingTask(task);
}
}