PageRenderTime 27ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/pride-inspector/branches/development/src/main/java/uk/ac/ebi/pride/gui/task/impl/OpenValidPrideExperimentTask.java

http://pride-toolsuite.googlecode.com/
Java | 361 lines | 226 code | 53 blank | 82 comment | 30 complexity | 6b9eb166de76fa7dda0ee751b226c672 MD5 | raw file
  1. package uk.ac.ebi.pride.gui.task.impl;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import uk.ac.ebi.pride.data.controller.impl.PrideDBAccessControllerImpl;
  5. import uk.ac.ebi.pride.gui.GUIUtilities;
  6. import uk.ac.ebi.pride.gui.PrideInspectorContext;
  7. import uk.ac.ebi.pride.gui.component.dialog.TaskDialog;
  8. import uk.ac.ebi.pride.gui.component.reviewer.PrivateDownloadSelectionPane;
  9. import uk.ac.ebi.pride.gui.desktop.Desktop;
  10. import uk.ac.ebi.pride.gui.task.TaskAdapter;
  11. import uk.ac.ebi.pride.gui.task.TaskEvent;
  12. import uk.ac.ebi.pride.gui.task.TaskListener;
  13. import uk.ac.ebi.pride.gui.utils.DefaultGUIBlocker;
  14. import uk.ac.ebi.pride.gui.utils.GUIBlocker;
  15. import javax.swing.*;
  16. import java.awt.*;
  17. import java.awt.event.ActionEvent;
  18. import java.awt.event.ActionListener;
  19. import java.io.File;
  20. import java.util.*;
  21. import java.util.List;
  22. /**
  23. * Open only valid pride experiment, show warning message to invalid accessions.
  24. * <p/>
  25. * User: rwang
  26. * Date: 06/01/11
  27. * Time: 14:12
  28. */
  29. public class OpenValidPrideExperimentTask extends TaskAdapter<Void, Void> implements TaskListener<List<Map<String, String>>, String> {
  30. private static final Logger logger = LoggerFactory.getLogger(PrideDBAccessControllerImpl.class);
  31. /**
  32. * This defines the default experiment accession to open
  33. */
  34. private List<Comparable> experimentAccessions;
  35. /**
  36. * User name
  37. */
  38. private String username;
  39. /**
  40. * Password
  41. */
  42. private String password;
  43. /**
  44. * Reference to PRIDE context
  45. */
  46. PrideInspectorContext context;
  47. /**
  48. * Open a connection to pride database
  49. *
  50. * @param expAccs experiment accession
  51. * @param username pride user name
  52. * @param password pride password
  53. */
  54. public OpenValidPrideExperimentTask(List<Comparable> expAccs, String username, String password) {
  55. String msg = "Validate and loading PRIDE Experiments";
  56. this.setName(msg);
  57. this.setDescription(msg);
  58. this.experimentAccessions = expAccs;
  59. this.username = username;
  60. this.password = password;
  61. context = ((PrideInspectorContext) Desktop.getInstance().getDesktopContext());
  62. }
  63. @Override
  64. @SuppressWarnings("unchecked")
  65. protected Void doInBackground() throws Exception {
  66. boolean emptySetOfAccs = (experimentAccessions == null || experimentAccessions.isEmpty());
  67. boolean emptyUserCredentials = (username == null || password == null);
  68. // check a list of valid public experiments
  69. List<Comparable> vpubExps = validatePublicExperiments();
  70. // open valid public experiments
  71. openValidPublicExperiments(vpubExps);
  72. if (emptySetOfAccs && !emptyUserCredentials) {
  73. openAllPrivateExperiments();
  74. } else if (!emptySetOfAccs && !experimentAccessions.isEmpty()) {
  75. if (emptyUserCredentials) {
  76. username = context.getProperty("default.pride.username");
  77. password = context.getProperty("default.pride.password");
  78. }
  79. openRemainingExperiments(experimentAccessions);
  80. }
  81. return null;
  82. }
  83. /**
  84. * Validate public experiments and return the results
  85. *
  86. * @return List<Comparable> a list of public experiments
  87. * @throws Exception exception while initializing data access controller
  88. */
  89. private List<Comparable> validatePublicExperiments() throws Exception {
  90. List<Comparable> results = new ArrayList<Comparable>();
  91. // it is possible for experimentAccessions be null
  92. // this is means download all the private experiment for the given user
  93. if (experimentAccessions != null) {
  94. // get a list of available public experiments from pride public instance
  95. PrideDBAccessControllerImpl controller = new PrideDBAccessControllerImpl();
  96. Collection<Comparable> fullExpAccs = controller.getExperimentAccs();
  97. // get a list of experiments which are too big to open
  98. List<Comparable> tooLargeToOpen = getLargeExperimentAccs();
  99. // retain only the available public experiments
  100. fullExpAccs.retainAll(experimentAccessions);
  101. fullExpAccs.removeAll(tooLargeToOpen);
  102. // remove all valid public experiments from the original list
  103. experimentAccessions.removeAll(fullExpAccs);
  104. results.addAll(fullExpAccs);
  105. }
  106. return results;
  107. }
  108. /**
  109. * Open all the valid public experiments
  110. *
  111. * @param vpubExps a list of valid public experiments
  112. */
  113. private void openValidPublicExperiments(List<Comparable> vpubExps) {
  114. for (Comparable vpubExp : vpubExps) {
  115. OpenPrideDatabaseTask prideDBTask = new OpenPrideDatabaseTask(vpubExp);
  116. prideDBTask.setGUIBlocker(new DefaultGUIBlocker(prideDBTask, GUIBlocker.Scope.NONE, null));
  117. context.addTask(prideDBTask);
  118. }
  119. }
  120. /**
  121. * Open all the remaing experiments, they could be public or private
  122. */
  123. private void openRemainingExperiments(List<Comparable> remainingExps) {
  124. OpenReviewerConnectionTask task = new OpenReviewerConnectionTask(username, password, remainingExps);
  125. task.addTaskListener(this);
  126. task.setGUIBlocker(new DefaultGUIBlocker(task, GUIBlocker.Scope.NONE, null));
  127. context.addTask(task);
  128. }
  129. /**
  130. * Open all the private experiment associated with the user
  131. */
  132. private void openAllPrivateExperiments() {
  133. OpenReviewerConnectionTask task = new OpenReviewerConnectionTask(username, password);
  134. task.addTaskListener(this);
  135. task.setGUIBlocker(new DefaultGUIBlocker(task, GUIBlocker.Scope.NONE, null));
  136. context.addTask(task);
  137. }
  138. /**
  139. * Show warning dialog
  140. */
  141. private void showWarning() {
  142. String warningMsg = buildWarningMessage();
  143. showWarningDialog(warningMsg);
  144. }
  145. /**
  146. * Get a list of experiment accessions which are too big to open in pride inspector
  147. *
  148. * @return List<Comparable> a list of experiment accessions
  149. */
  150. private List<Comparable> getLargeExperimentAccs() {
  151. List<Comparable> accs = new ArrayList<Comparable>();
  152. String accStr = context.getProperty("large.pride.experiments");
  153. if (accStr != null && !"".equals(accStr.trim())) {
  154. String[] parts = accStr.split(",");
  155. for (String part : parts) {
  156. accs.add(part.trim());
  157. }
  158. }
  159. return accs;
  160. }
  161. /**
  162. * Create a warning message
  163. *
  164. * @return String warning message
  165. */
  166. private String buildWarningMessage() {
  167. StringBuilder str = new StringBuilder();
  168. StringTokenizer st = new StringTokenizer(context.getProperty("invalid.experiment.accession"), "\n");
  169. while (st.hasMoreTokens()) {
  170. String s = st.nextToken();
  171. if (s.contains("[insert]")) {
  172. str.append(experimentAccessions.toString());
  173. } else {
  174. str.append(s);
  175. }
  176. }
  177. return str.toString();
  178. }
  179. /**
  180. * show a warning dialog for invalid pride accessions
  181. *
  182. * @param warningMsg warning message to show
  183. */
  184. private void showWarningDialog(String warningMsg) {
  185. JDialog dialog = new JDialog(Desktop.getInstance().getMainComponent());
  186. dialog.setAlwaysOnTop(true);
  187. dialog.setSize(new Dimension(400, 200));
  188. // set display location
  189. Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
  190. dialog.setLocation((d.width - dialog.getWidth()) / 2, (d.height - dialog.getHeight()) / 2);
  191. dialog.setTitle("Experiment Not Found");
  192. JPanel mainPanel = new JPanel(new BorderLayout());
  193. JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
  194. panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
  195. JLabel label = new JLabel(warningMsg);
  196. panel.add(label);
  197. mainPanel.add(panel, BorderLayout.CENTER);
  198. JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
  199. buttonPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, Color.gray));
  200. buttonPanel.setBackground(Color.white);
  201. JButton closeButton = new JButton("Close");
  202. closeButton.addActionListener(new CloseListener(dialog));
  203. buttonPanel.add(closeButton);
  204. mainPanel.add(buttonPanel, BorderLayout.SOUTH);
  205. dialog.add(mainPanel);
  206. dialog.setVisible(true);
  207. }
  208. @Override
  209. public void succeed(TaskEvent<List<Map<String, String>>> listTaskEvent) {
  210. List<Map<String, String>> metaData = listTaskEvent.getValue();
  211. // iterate to get all the accessions and sum of sizes
  212. Map<Comparable, Double> accs = new LinkedHashMap<Comparable, Double>();
  213. List<Map<String, String>> validMetaData = new ArrayList<Map<String, String>>();
  214. double sumOfSize = 0;
  215. for (Map<String, String> exp : metaData) {
  216. String accession = exp.get("Accession");
  217. if (experimentAccessions == null || experimentAccessions.contains(accession)) {
  218. double size = Double.valueOf(exp.get("Size"));
  219. accs.put(accession, size);
  220. sumOfSize += size /(1024 * 1024);
  221. validMetaData.add(exp);
  222. }
  223. }
  224. // get download size threshold
  225. double downloadThreshold = Double.parseDouble(context.getProperty("download.size.threshold"));
  226. if (sumOfSize > downloadThreshold) {
  227. // open a download window
  228. JDialog dialog = new JDialog();
  229. dialog.setAlwaysOnTop(true);
  230. ImageIcon icon = GUIUtilities.loadImageIcon(context.getProperty("pride.inspector.logo.small.icon"));
  231. dialog.setIconImage(icon.getImage());
  232. dialog.setTitle("About to download large experiments");
  233. dialog.setSize(new Dimension(650, 600));
  234. dialog.setLayout(new BorderLayout());
  235. // set display location
  236. Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
  237. dialog.setLocation((d.width - dialog.getWidth()) / 2, (d.height - dialog.getHeight()) / 2);
  238. // add a warning message
  239. JPanel msgPanel = new JPanel(new BorderLayout());
  240. msgPanel.setBorder(BorderFactory.createTitledBorder("Warning"));
  241. JLabel warningMsg = new JLabel("<html>Experiments require download, the size of this download is over <b><i>"
  242. + Math.round(downloadThreshold) + "M</i></b>. <br/> To continue, select experiments from below and click the Download button.<html>");
  243. warningMsg.setIcon(GUIUtilities.loadIcon(context.getProperty("download.warning.icon.small")));
  244. Font originalFont = warningMsg.getFont();
  245. Font newFont = originalFont.deriveFont(14.0f);
  246. warningMsg.setFont(newFont);
  247. msgPanel.add(warningMsg, BorderLayout.CENTER);
  248. dialog.add(msgPanel, BorderLayout.NORTH);
  249. // add a experiment selection pane
  250. PrivateDownloadSelectionPane selectionPane = new PrivateDownloadSelectionPane(dialog, true, username, password);
  251. selectionPane.addExperimentMetaData(validMetaData);
  252. dialog.add(selectionPane, BorderLayout.CENTER);
  253. dialog.setAlwaysOnTop(true);
  254. dialog.setVisible(true);
  255. } else {
  256. // download directly
  257. // create a dialog to show progress
  258. TaskDialog dialog = new TaskDialog(Desktop.getInstance().getMainComponent(), "Download PRIDE Experiment", "Downloading...Please be aware that this may take a few minutes");
  259. dialog.setAlwaysOnTop(true);
  260. dialog.setVisible(true);
  261. DownloadExperimentTask downloadTask = new DownloadExperimentTask(accs, new File(System.getProperty("java.io.tmpdir")), username, password, true);
  262. downloadTask.addTaskListener(dialog);
  263. downloadTask.setGUIBlocker(new DefaultGUIBlocker(downloadTask, GUIBlocker.Scope.NONE, null));
  264. context.addTask(downloadTask);
  265. }
  266. // remove private experiments from experiment accession list
  267. if (experimentAccessions != null) {
  268. experimentAccessions.removeAll(accs.keySet());
  269. if (experimentAccessions.size() > 0) {
  270. showWarning();
  271. }
  272. }
  273. }
  274. @Override
  275. public void started(TaskEvent<Void> event) {
  276. }
  277. @Override
  278. public void process(TaskEvent<List<String>> listTaskEvent) {
  279. }
  280. @Override
  281. public void finished(TaskEvent<Void> event) {
  282. }
  283. @Override
  284. public void failed(TaskEvent<Throwable> event) {
  285. }
  286. @Override
  287. public void cancelled(TaskEvent<Void> event) {
  288. }
  289. @Override
  290. public void interrupted(TaskEvent<InterruptedException> iex) {
  291. }
  292. @Override
  293. public void progress(TaskEvent<Integer> progress) {
  294. }
  295. /**
  296. * Action listener to close a dialog
  297. */
  298. private static class CloseListener implements ActionListener {
  299. private JDialog dialog;
  300. private CloseListener(JDialog dialog) {
  301. this.dialog = dialog;
  302. }
  303. @Override
  304. public void actionPerformed(ActionEvent e) {
  305. dialog.setVisible(false);
  306. }
  307. }
  308. }