/* * #%L * gitools-ui-app * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program 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. * * This program 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 this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.ui.app.datasources.biomart.wizard; import org.gitools.datasources.biomart.BiomartService; import org.gitools.datasources.biomart.BiomartServiceException; import org.gitools.datasources.biomart.BiomartServiceFactory; import org.gitools.datasources.biomart.restful.model.DatasetInfo; import org.gitools.datasources.biomart.restful.model.MartLocation; import org.gitools.datasources.biomart.settings.BiomartSource; import org.gitools.datasources.biomart.settings.BiomartSourceManager; import org.gitools.ui.core.Application; import org.gitools.ui.core.pages.common.FilteredListPanel; import org.gitools.ui.platform.dialog.ExceptionGlassPane; import org.gitools.ui.platform.dialog.MessageStatus; import org.gitools.ui.platform.wizard.AbstractWizardPage; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.List; /** * @noinspection ALL */ public class BiomartSourcePage extends AbstractWizardPage { // Biomart model wrappers private static class BiomartSourceWrapper { private BiomartSource source; public BiomartSourceWrapper(BiomartSource bs) { this.source = bs; } public BiomartSource getBiomartSource() { return source; } public void setBiomartSource(BiomartSource source) { this.source = source; } @Override public String toString() { return source.getDescription(); } } private static class DatabaseListWrapper { private final MartLocation mart; public DatabaseListWrapper(MartLocation mart) { this.mart = mart; } public MartLocation getMart() { return mart; } @Override public String toString() { return mart.getDisplayName(); } } private static class DatasetListWrapper { private final DatasetInfo dataset; public DatasetListWrapper(DatasetInfo dataset) { this.dataset = dataset; } public DatasetInfo getDataset() { return dataset; } @Override public String toString() { return dataset.getDisplayName(); } } private BiomartService biomartService; private boolean updated; private FilteredListPanel datasetPanel; private MartLocation lastMartSelected; public BiomartSourcePage() { super(); initComponents(); portalCombo.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { updateDatabase(); } } }); databaseList.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { updateDatasets(); } }); datasetPanel = new FilteredListPanel() { @Override protected void selectionChanged() { Object value = datasetPanel.getSelectedValue(); setComplete(value != null); } }; datasetPanel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); dataFilterPanel.setLayout(new BorderLayout()); dataFilterPanel.add(datasetPanel, BorderLayout.CENTER); updated = false; setTitle("Select dataset"); } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { emptyValuesButtonGroup = new javax.swing.ButtonGroup(); jLabel1 = new javax.swing.JLabel(); portalCombo = new javax.swing.JComboBox(); jSplitPane1 = new javax.swing.JSplitPane(); jPanel1 = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); databaseList = new javax.swing.JList(); jPanel2 = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); dataFilterPanel = new javax.swing.JPanel(); setBorder(null); jLabel1.setText("Portal"); jSplitPane1.setDividerLocation(320); jSplitPane1.setContinuousLayout(true); jLabel2.setText("Databases"); jScrollPane1.setViewportBorder(javax.swing.BorderFactory.createEtchedBorder()); databaseList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane1.setViewportView(databaseList); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE).addComponent(jLabel2)).addContainerGap())); jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addComponent(jLabel2).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE))); jSplitPane1.setLeftComponent(jPanel1); jLabel3.setText("Datasets"); javax.swing.GroupLayout dataFilterPanelLayout = new javax.swing.GroupLayout(dataFilterPanel); dataFilterPanel.setLayout(dataFilterPanelLayout); dataFilterPanelLayout.setHorizontalGroup(dataFilterPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 272, Short.MAX_VALUE)); dataFilterPanelLayout.setVerticalGroup(dataFilterPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 328, Short.MAX_VALUE)); javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addComponent(jLabel3).addContainerGap(202, Short.MAX_VALUE)).addComponent(dataFilterPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addComponent(jLabel3).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(dataFilterPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); jSplitPane1.setRightComponent(jPanel2); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(jSplitPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 598, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addComponent(jLabel1).addGap(18, 18, 18).addComponent(portalCombo, 0, 543, Short.MAX_VALUE))).addContainerGap())); layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jLabel1).addComponent(portalCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)).addGap(18, 18, 18).addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 363, Short.MAX_VALUE).addContainerGap())); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JPanel dataFilterPanel; private javax.swing.JList databaseList; private javax.swing.ButtonGroup emptyValuesButtonGroup; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JComboBox portalCombo; // End of variables declaration//GEN-END:variables @Override public JComponent createControls() { return this; } @Override public void updateControls() { if (updated) { return; } List<BiomartSource> sources = BiomartSourceManager.getDefault().getSources(); DefaultComboBoxModel sourcesModel = new DefaultComboBoxModel(); for (BiomartSource source : sources) sourcesModel.addElement(new BiomartSourceWrapper(source)); portalCombo.setModel(sourcesModel); updateDatabase(); //Clear dataset list datasetPanel.setListData(new Object[0]); datasetPanel.resetFilterText(); } void updateDatabase() { if (portalCombo.getSelectedItem() == null) { return; } setMessage(MessageStatus.PROGRESS, "Retrieving databases..."); //Clear database list databaseList.setModel(new DefaultListModel()); datasetPanel.setListData(new Object[0]); datasetPanel.resetFilterText(); BiomartSource bs = getSource(); if (bs == null) { return; } try { biomartService = null; biomartService = BiomartServiceFactory.createService(bs); } catch (BiomartServiceException ex) { ExceptionGlassPane dlg = new ExceptionGlassPane(Application.get(), ex); dlg.setVisible(true); setStatus(MessageStatus.ERROR); setMessage(ex.getMessage()); // TODO close the wizard or throw up the exception (RuntimeException) } if (biomartService == null) { return; } new Thread(new Runnable() { @Override public void run() { try { List<MartLocation> registry = biomartService.getRegistry(); DefaultListModel model = new DefaultListModel(); for (MartLocation mart : registry) if (mart.getVisible() != 0) { model.addElement(new DatabaseListWrapper(mart)); } databaseList.setModel(model); updated = true; setMessage(MessageStatus.INFO, ""); } catch (final Exception ex) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setStatus(MessageStatus.ERROR); setMessage(ex.getMessage()); } }); ExceptionGlassPane dlg = new ExceptionGlassPane(Application.get(), ex); dlg.setVisible(true); } } }).start(); } private void updateDatasets() { // Avoid to process null values or unaltered database selections if (databaseList.getSelectedValue() == null || (lastMartSelected != null && lastMartSelected.getName().equals(getDataBase().getName()))) { return; } setMessage(MessageStatus.PROGRESS, "Retrieving datasets..."); datasetPanel.setListData(new Object[]{}); datasetPanel.resetFilterText(); new Thread(new Runnable() { @Override public void run() { try { lastMartSelected = getDataBase(); List<DatasetInfo> datasets = biomartService.getDatasets(lastMartSelected); List<Object> model = new ArrayList(); for (int i = 0; i < datasets.size(); i++) { DatasetInfo ds = datasets.get(i); if (ds.getVisible() != 0) { model.add(new DatasetListWrapper(ds)); } } datasetPanel.setListData(model.toArray()); updated = true; setMessage(MessageStatus.INFO, ""); } catch (final Exception ex) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setStatus(MessageStatus.ERROR); setMessage(ex.getMessage()); } }); ExceptionGlassPane dlg = new ExceptionGlassPane(Application.get(), ex); dlg.setVisible(true); } } }).start(); } // GETTERS BiomartSource getSource() { return portalCombo.getSelectedItem() != null ? ((BiomartSourceWrapper) portalCombo.getSelectedItem()).getBiomartSource() : null; } public MartLocation getDataBase() { return databaseList.getSelectedValue() != null ? ((DatabaseListWrapper) databaseList.getSelectedValue()).getMart() : null; } public DatasetInfo getDataset() { return datasetPanel.getSelectedValue() != null ? ((DatasetListWrapper) datasetPanel.getSelectedValue()).getDataset() : null; } public BiomartService getBiomartService() { return biomartService; } }