You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by st...@apache.org on 2015/02/17 12:46:42 UTC

[15/50] [abbrv] incubator-taverna-plugin-bioinformatics git commit: taverna-biomart-martservice/

http://git-wip-us.apache.org/repos/asf/incubator-taverna-plugin-bioinformatics/blob/9e08cac0/src/main/java/org/biomart/martservice/config/ui/MartServiceQueryConfigUIFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/biomart/martservice/config/ui/MartServiceQueryConfigUIFactory.java b/src/main/java/org/biomart/martservice/config/ui/MartServiceQueryConfigUIFactory.java
deleted file mode 100644
index 3531539..0000000
--- a/src/main/java/org/biomart/martservice/config/ui/MartServiceQueryConfigUIFactory.java
+++ /dev/null
@@ -1,3543 +0,0 @@
-/*
- * Copyright (C) 2003 The University of Manchester
- *
- * Modifications to the initial code base are copyright of their
- * respective authors, or their employers as appropriate.  Authorship
- * of the modifications may be determined from the ChangeLog placed at
- * the end of this file.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- *
- ****************************************************************
- * Source code information
- * -----------------------
- * Filename           $RCSfile: MartServiceQueryConfigUIFactory.java,v $
- * Revision           $Revision: 1.6 $
- * Release status     $State: Exp $
- * Last modified on   $Date: 2008/03/04 16:46:53 $
- *               by   $Author: davidwithers $
- * Created on 21-Jun-2007
- *****************************************************************/
-package org.biomart.martservice.config.ui;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.GridLayout;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.swing.AbstractButton;
-import javax.swing.AbstractListModel;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.ButtonGroup;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JProgressBar;
-import javax.swing.JRadioButton;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import javax.swing.ListModel;
-import javax.swing.SwingConstants;
-import javax.swing.border.AbstractBorder;
-import javax.swing.border.CompoundBorder;
-import javax.swing.border.EmptyBorder;
-import javax.swing.border.LineBorder;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-
-import org.apache.log4j.Logger;
-import org.biomart.martservice.DatasetLink;
-import org.biomart.martservice.MartDataset;
-import org.biomart.martservice.MartQuery;
-import org.biomart.martservice.MartService;
-import org.biomart.martservice.MartServiceException;
-import org.biomart.martservice.config.QueryConfigController;
-import org.biomart.martservice.config.QueryConfigUtils;
-import org.biomart.martservice.config.event.QueryComponentAdapter;
-import org.biomart.martservice.config.event.QueryComponentEvent;
-import org.biomart.martservice.query.Attribute;
-import org.biomart.martservice.query.Dataset;
-import org.biomart.martservice.query.Filter;
-import org.biomart.martservice.query.Query;
-import org.biomart.martservice.query.QueryListener;
-import org.ensembl.mart.lib.config.AttributeCollection;
-import org.ensembl.mart.lib.config.AttributeDescription;
-import org.ensembl.mart.lib.config.AttributeGroup;
-import org.ensembl.mart.lib.config.AttributeList;
-import org.ensembl.mart.lib.config.AttributePage;
-import org.ensembl.mart.lib.config.BaseNamedConfigurationObject;
-import org.ensembl.mart.lib.config.DatasetConfig;
-import org.ensembl.mart.lib.config.FilterCollection;
-import org.ensembl.mart.lib.config.FilterDescription;
-import org.ensembl.mart.lib.config.FilterGroup;
-import org.ensembl.mart.lib.config.FilterPage;
-import org.ensembl.mart.lib.config.Option;
-import org.ensembl.mart.lib.config.PushAction;
-
-/**
- * Implementation of the <code>QueryConfigUIFactory</code> interface that
- * creates a UI which looks like the Biomart web interface.
- *
- * @author David Withers
- */
-public class MartServiceQueryConfigUIFactory implements QueryConfigUIFactory {
-
-	private static Logger logger = Logger
-	.getLogger(MartServiceQueryConfigUIFactory.class);
-
-	private String version;
-
-	private Color borderColor = new Color(202, 207, 213);
-
-	private Color backgroundColor = Color.WHITE;
-
-	private Color componentBackgroundColor = Color.WHITE;
-
-	private MartService martService;
-
-	private QueryConfigController controller;
-
-	private MartDataset martDataset;
-
-	private DatasetConfig datasetConfig;
-
-	private Map<String, Component> filterNameToComponentMap = new HashMap<String, Component>();
-
-	private Map<String, List<Component>> attributeNameToComponentMap = new HashMap<String, List<Component>>();
-
-	private Map<String, String> filterToDisplayName = new HashMap<String, String>();
-
-	private Map<String, String> attributeToDisplayName = new HashMap<String, String>();
-
-	private Map<String, Component> attributePageNameToComponent = new HashMap<String, Component>();
-
-	private Map<String, JRadioButton> attributePageNameToButton = new HashMap<String, JRadioButton>();
-
-	private boolean settingAttributeState = false;
-
-	private List<Component> componentRegister = new ArrayList<Component>();
-
-	private int datasetNumber;
-
-	public MartServiceQueryConfigUIFactory(MartService martService,
-			QueryConfigController controller, MartDataset martDataset)
-			throws MartServiceException {
-		this(martService, controller, martDataset, 1);
-	}
-
-	public MartServiceQueryConfigUIFactory(MartService martService,
-			QueryConfigController controller, MartDataset martDataset,
-			int datasetNumber) throws MartServiceException {
-		this.martService = martService;
-		this.controller = controller;
-		this.martDataset = martDataset;
-		this.datasetNumber = datasetNumber;
-		version = getConfigStyle();
-	}
-
-	private String getConfigStyle() {
-		String configStyle = "0.5";
-		String version = controller.getMartQuery().getQuery()
-				.getSoftwareVersion();
-		if (version == null || "0.4".equals(version)) {
-			configStyle = "0.4";
-		}
-		return configStyle;
-	}
-
-	/**
-	 * Returns the martDataset.
-	 *
-	 * @return the martDataset.
-	 */
-	public MartDataset getMartDataset() {
-		return martDataset;
-	}
-
-	/**
-	 * Returns the query configuration for the dataset.
-	 *
-	 * @return the query configuration for the dataset
-	 * @throws MartServiceException
-	 *             if the MartService returns an error or is unavailable
-	 */
-	public DatasetConfig getDatasetConfig() throws MartServiceException {
-		if (datasetConfig == null) {
-			datasetConfig = martService.getDatasetConfig(martDataset);
-		}
-		return datasetConfig;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getDatasetConfigUI(org.ensembl.mart.lib.config.DatasetConfig)
-	 */
-	public Component getDatasetConfigUI() throws MartServiceException {
-		JPanel panel = new JPanel(new BorderLayout());
-
-		final SummaryPanel summaryPanel = new SummaryPanel();
-
-		final JButton countButton = new JButton("Count");
-		countButton.setFont(countButton.getFont().deriveFont(Font.BOLD));
-		countButton.setOpaque(false);
-		countButton.addActionListener(new ActionListener() {
-
-			public void actionPerformed(ActionEvent e) {
-				countButton.setEnabled(false);
-				countButton.setText("Counting...");
-				new Thread("BiomartDatasetCount") {
-					public void run() {
-						try {
-							MartQuery martQuery = controller.getMartQuery();
-							Query query = martQuery.getQuery();
-							String datasetName = martQuery.getMartDataset()
-									.getName();
-
-							JLabel label1 = summaryPanel
-									.getDataset1CountLabel();
-							setSummaryCount(query, datasetName, label1);
-
-							Set<String> linkedDatasets = martQuery.getLinkedDatasets();
-							if (linkedDatasets.size() == 1) {
-								String linkedDatasetName = linkedDatasets
-										.iterator().next();
-								JLabel label2 = summaryPanel
-										.getDataset2CountLabel();
-								setSummaryCount(query, linkedDatasetName,
-										label2);
-							}
-
-						} catch (MartServiceException e) {
-						}
-						countButton.setText("Count");
-						countButton.setEnabled(true);
-					}
-				}.start();
-			}
-
-		});
-
-		final JCheckBox uniqueCheckBox = new JCheckBox("Unique results only");
-		uniqueCheckBox.setBackground(Color.BLACK);
-		uniqueCheckBox.setForeground(Color.WHITE);
-		uniqueCheckBox.setSelected(controller.getMartQuery().getQuery()
-				.getUniqueRows() == 1);
-
-		uniqueCheckBox.addItemListener(new ItemListener() {
-			public void itemStateChanged(ItemEvent e) {
-				if (e.getStateChange() == ItemEvent.SELECTED) {
-					controller.getMartQuery().getQuery().setUniqueRows(1);
-				} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-					controller.getMartQuery().getQuery().setUniqueRows(0);
-				}
-			}
-		});
-
-		JPanel buttonPanel = new JPanel(new BorderLayout());
-		buttonPanel.setBackground(Color.BLACK);
-		buttonPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
-		buttonPanel.add(countButton, BorderLayout.WEST);
-		buttonPanel.add(uniqueCheckBox, BorderLayout.EAST);
-		panel.add(buttonPanel, BorderLayout.NORTH);
-
-		JLabel label = new JLabel("biomart version 0.6");
-		label.setBackground(Color.BLACK);
-		label.setForeground(Color.WHITE);
-		label.setOpaque(true);
-		label.setBorder(new EmptyBorder(5, 5, 5, 5));
-		panel.add(label, BorderLayout.SOUTH);
-
-		JSplitPane splitPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
-				true);
-		splitPanel.setBackground(backgroundColor);
-		splitPanel.setBorder(new EmptyBorder(10, 0, 10, 0));
-		splitPanel.setDividerLocation(250);
-
-		panel.add(splitPanel, BorderLayout.CENTER);
-
-		JScrollPane scrollPane1 = new JScrollPane(summaryPanel);
-		scrollPane1.getVerticalScrollBar().setUnitIncrement(10);
-		scrollPane1.setBorder(new LineBorder(Color.BLACK, 1));
-
-		splitPanel.setLeftComponent(scrollPane1);
-
-		final JComponent inputPanel = createVerticalBox(backgroundColor);
-		inputPanel.setBorder(new EmptyBorder(10, 5, 10, 5));
-
-		JScrollPane scrollPane = new JScrollPane(inputPanel);
-		scrollPane.getVerticalScrollBar().setUnitIncrement(10);
-		scrollPane.setBorder(new LineBorder(Color.BLACK, 1));
-
-		splitPanel.setRightComponent(scrollPane);
-
-		final JComponent datasetPanel = new DatasetPanel();
-		inputPanel.add(datasetPanel);
-
-//		final Component linkComponent = new DatasetLinkComponent(inputPanel,
-//				summaryPanel);
-//		componentRegister.add(linkComponent);
-
-		final JComponent attributePanel = createVerticalBox(backgroundColor);
-		attributePanel.setBorder(new EmptyBorder(10, 5, 10, 5));
-
-		final JComponent filterPanel = createVerticalBox(backgroundColor);
-		filterPanel.setBorder(new EmptyBorder(10, 5, 10, 5));
-
-		summaryPanel.getDataset1Button().addActionListener(
-				new ActionListener() {
-					public void actionPerformed(ActionEvent e) {
-						inputPanel.removeAll();
-						inputPanel.add(datasetPanel);
-						inputPanel.revalidate();
-						inputPanel.repaint();
-					}
-				});
-
-//		summaryPanel.getDataset2Button().addActionListener(
-//				new ActionListener() {
-//					public void actionPerformed(ActionEvent e) {
-//						inputPanel.removeAll();
-//						inputPanel.add(linkComponent);
-//						inputPanel.revalidate();
-//						inputPanel.repaint();
-//					}
-//				});
-
-		generateConfiguration(this, summaryPanel, inputPanel, attributePanel,
-				filterPanel);
-
-		summaryPanel.getFilters1Button().addActionListener(
-				new ActionListener() {
-					public void actionPerformed(ActionEvent e) {
-						inputPanel.removeAll();
-						inputPanel.add(filterPanel);
-						inputPanel.revalidate();
-						inputPanel.repaint();
-					}
-				});
-
-		summaryPanel.getAttributes1Button().addActionListener(
-				new ActionListener() {
-					public void actionPerformed(ActionEvent e) {
-						inputPanel.removeAll();
-						inputPanel.add(attributePanel);
-						inputPanel.revalidate();
-						inputPanel.repaint();
-					}
-				});
-
-		return panel;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributePagesUI(org.ensembl.mart.lib.config.AttributePage[])
-	 */
-	public Component getAttributePagesUI(AttributePage[] attributePages,
-			Object data) throws MartServiceException {
-		final JComponent box = createVerticalBox(backgroundColor);
-
-		final JComboBox formatList = new JComboBox();
-		formatList.setBackground(backgroundColor);
-
-		if (datasetNumber == 1) {
-			formatList.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-						controller.getMartQuery().getQuery().setFormatter(
-								(String) e.getItem());
-					}
-				}
-			});
-
-			ButtonGroup outputButtons = new ButtonGroup();
-			JRadioButton multipleOutput = new JRadioButton(
-					"Multiple outputs (one per attribute)");
-			multipleOutput.setBackground(backgroundColor);
-			JRadioButton singleOutput = new JRadioButton(
-					"Single output formatted as");
-			singleOutput.setBackground(backgroundColor);
-			outputButtons.add(multipleOutput);
-			outputButtons.add(singleOutput);
-			if (controller.getMartQuery().getQuery().getFormatter() == null) {
-				multipleOutput.setSelected(true);
-				formatList.setEnabled(false);
-			} else {
-				singleOutput.setSelected(true);
-				formatList.setEnabled(true);
-			}
-
-			singleOutput.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-						controller.getMartQuery().getQuery().setFormatter(
-								(String) formatList.getSelectedItem());
-						formatList.setEnabled(true);
-					} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-						controller.getMartQuery().getQuery().setFormatter(null);
-						formatList.setEnabled(false);
-					}
-				}
-			});
-
-			JPanel multipleOutputBox = new JPanel(new MinimalLayout());
-			multipleOutputBox.setBackground(componentBackgroundColor);
-			multipleOutputBox.add(multipleOutput);
-
-			JComponent formatBox = createHorizontalBox(backgroundColor);
-			formatBox.add(singleOutput);
-			formatBox.add(Box.createHorizontalStrut(10));
-			formatBox.add(formatList);
-			formatBox.add(Box.createHorizontalGlue());
-
-			JComponent outputBox = createVerticalBox(backgroundColor);
-			outputBox.setBorder(new CompoundBorder(new LineBorder(borderColor,
-					1), new EmptyBorder(10, 10, 10, 10)));
-			outputBox.add(multipleOutputBox);
-			outputBox.add(formatBox);
-
-			box.add(Box.createVerticalStrut(2));
-			box.add(outputBox);
-
-		}
-
-		if (attributePages.length > 1) {
-			ButtonGroup buttonGroup = new ButtonGroup();
-			final Map<String, Component> componentMap = new HashMap<String, Component>();
-			final Map<String, List<String>> formatMap = new HashMap<String, List<String>>();
-
-			final JComponent buttonBox = new JPanel(new GridLayout(0, 2));
-			buttonBox.setBorder(new CompoundBorder(new LineBorder(borderColor,
-					1), new EmptyBorder(10, 10, 10, 10)));
-			buttonBox.setBackground(backgroundColor);
-			box.add(buttonBox, 0);
-
-			final JComponent pagePanel = new JPanel(new BorderLayout());
-			pagePanel.setBackground(backgroundColor);
-			box.add(pagePanel);
-
-			ItemListener listener = new ItemListener() {
-				Component lastSelectedComponent;
-
-				JRadioButton lastSelectedButton;
-
-				public void itemStateChanged(ItemEvent e) {
-					JRadioButton button = (JRadioButton) e.getItem();
-					if (button != null) {
-						Component selectedComponent = componentMap.get(button
-								.getActionCommand());
-						if (e.getStateChange() == ItemEvent.SELECTED) {
-							boolean switchPage = true;
-							if (lastSelectedComponent != null) {
-								Map<String, AttributeComponent> selected = new HashMap<String, AttributeComponent>();
-								// find all attributes on the last page that
-								// were selected
-								List<AttributeComponent> oldChildren = getAttributeComponents(lastSelectedComponent);
-								for (AttributeComponent attributeComponent : oldChildren) {
-									if (attributeComponent.isSelected()) {
-										selected.put(attributeComponent
-												.getQualifiedName(),
-												attributeComponent);
-									}
-								}
-								// remove attributes that are already selected
-								// on
-								// the new page
-								List<AttributeComponent> newChildren = getAttributeComponents(selectedComponent);
-								for (AttributeComponent attributeComponent : newChildren) {
-									if (attributeComponent.isSelected()) {
-										selected.remove(attributeComponent
-												.getQualifiedName());
-									}
-								}
-								Collection<AttributeComponent> stillSelected = selected
-										.values();
-								if (stillSelected.size() > 0) {
-									List<String> attributeNames = new ArrayList<String>();
-									for (AttributeComponent component : stillSelected) {
-										attributeNames.add(component
-												.getButton().getText());
-									}
-									List<Object> message = new ArrayList<Object>();
-									message
-											.add("The "
-													+ button.getText()
-													+ " page does not contain the following attributes:");
-									JList jList = new JList(attributeNames
-											.toArray());
-									jList.setBorder(LineBorder
-											.createGrayLineBorder());
-									message.add(jList);
-									message
-											.add("These attributes will be removed. Do you wish to continue?");
-									switchPage = JOptionPane.showConfirmDialog(
-											buttonBox, message.toArray(),
-											"Confirm page change",
-											JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
-								}
-								if (switchPage) {
-									// deselect any attributes on the old page
-									// that are not on the new page
-									for (AttributeComponent attributeComponent : stillSelected) {
-										attributeComponent.setSelected(false);
-									}
-								}
-							}
-							if (switchPage) {
-								pagePanel.add(selectedComponent,
-										BorderLayout.NORTH);
-								if (datasetNumber == 1) {
-									List<String> formats = formatMap.get(button
-											.getActionCommand());
-									formatList
-											.setModel(new DefaultComboBoxModel(
-													formats.toArray()));
-									String formatter = controller
-											.getMartQuery().getQuery()
-											.getFormatter();
-									if (formatter != null) {
-										formatList.getModel().setSelectedItem(
-												null);
-										if (formats.contains(formatter)) {
-											formatList.getModel()
-													.setSelectedItem(formatter);
-										} else if (formats.size() > 0) {
-											formatList.getModel()
-													.setSelectedItem(
-															formats.get(0));
-										}
-									}
-								}
-							} else {
-								lastSelectedButton.setSelected(true);
-							}
-							box.revalidate();
-							box.repaint();
-						} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-							pagePanel.removeAll();
-							lastSelectedComponent = selectedComponent;
-							lastSelectedButton = button;
-						}
-					}
-				}
-
-			};
-
-			for (int i = 0; i < attributePages.length; i++) {
-				if (QueryConfigUtils.display(attributePages[i])) {
-					Component component = getAttributePageUI(attributePages[i],
-							data);
-					JRadioButton button = new JRadioButton(attributePages[i]
-							.getDisplayName());
-					String description = attributePages[i].getDescription();
-					if (description != null) {
-						button.setToolTipText(description);
-					}
-					button.setBackground(backgroundColor);
-					button.setFont(button.getFont().deriveFont(Font.BOLD));
-					button
-							.setActionCommand(attributePages[i]
-									.getInternalName());
-					button.addItemListener(listener);
-					buttonGroup.add(button);
-					buttonBox.add(button);
-					componentMap.put(attributePages[i].getInternalName(),
-							component);
-					formatMap.put(attributePages[i].getInternalName(), getFormatList(attributePages[i]));
-					attributePageNameToComponent.put(attributePages[i]
-							.getInternalName(), component);
-					attributePageNameToButton.put(attributePages[i]
-							.getInternalName(), button);
-				}
-			}
-
-		} else if (attributePages.length == 1) {
-			if (datasetNumber == 1) {
-				List<String> formats = Arrays.asList(attributePages[0]
-						.getOutFormats().toUpperCase().split(","));
-				formatList
-						.setModel(new DefaultComboBoxModel(formats.toArray()));
-				String formatter = controller.getMartQuery().getQuery()
-						.getFormatter();
-				if (formatter != null) {
-					formatList.getModel().setSelectedItem(null);
-					if (formats.contains(formatter)) {
-						formatList.getModel().setSelectedItem(formatter);
-					} else if (formats.size() > 0) {
-						formatList.getModel().setSelectedItem(formats.get(0));
-					}
-				}
-			}
-			box.add(getAttributePageUI(attributePages[0], data));
-
-		} else {
-			box.add(new JLabel("No attributes available"));
-		}
-
-		JPanel northPanel = new JPanel(new BorderLayout());
-		northPanel.setBackground(backgroundColor);
-		northPanel.add(box, BorderLayout.NORTH);
-
-		return northPanel;
-
-		// return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributePageUI(org.ensembl.mart.lib.config.AttributePage)
-	 */
-	public Component getAttributePageUI(AttributePage attributePage, Object data)
-			throws MartServiceException {
-		JComponent box = createVerticalBox(backgroundColor);
-
-		AttributeGroup[] attributeGroups = (AttributeGroup[]) attributePage
-				.getAttributeGroups().toArray(new AttributeGroup[0]);
-
-		box.add(getAttributeGroupsUI(attributeGroups, data));
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeGroupsUI(org.ensembl.mart.lib.config.AttributeGroup[])
-	 */
-	public Component getAttributeGroupsUI(AttributeGroup[] attributeGroups,
-			Object data) throws MartServiceException {
-		JComponent box = createVerticalBox(backgroundColor);
-
-		for (int i = 0; i < attributeGroups.length; i++) {
-			if (QueryConfigUtils.display(attributeGroups[i])) {
-				box.add(Box.createVerticalStrut(2));
-				box.add(getAttributeGroupUI(attributeGroups[i], data));
-			}
-		}
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeGroupUI(org.ensembl.mart.lib.config.AttributeGroup)
-	 */
-	public Component getAttributeGroupUI(AttributeGroup attributeGroup,
-			Object data) throws MartServiceException {
-		JLabel title = new JLabel(attributeGroup.getDisplayName());
-		title.setFont(title.getFont().deriveFont(Font.PLAIN));
-
-		String description = attributeGroup.getDescription();
-		if (description != null) {
-			title.setToolTipText(description);
-		}
-		ExpandableBox box = new ExpandableBox(title, componentBackgroundColor,
-				borderColor, new Insets(10, 10, 10, 10));
-
-		AttributeCollection[] attributeCollections = attributeGroup
-				.getAttributeCollections();
-		box.add(getAttributeCollectionsUI(attributeCollections, data));
-
-		box.setExpanded(false);
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeCollectionsUI(org.ensembl.mart.lib.config.AttributeCollection[])
-	 */
-	public Component getAttributeCollectionsUI(
-			AttributeCollection[] attributeCollections, Object data)
-			throws MartServiceException {
-		JComponent box = createVerticalBox(componentBackgroundColor);
-
-		for (int i = 0; i < attributeCollections.length; i++) {
-			if (QueryConfigUtils.display(attributeCollections[i])) {
-				box.add(Box.createVerticalStrut(10));
-				box
-						.add(getAttributeCollectionUI(attributeCollections[i],
-								data));
-			}
-		}
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeCollectionUI(org.ensembl.mart.lib.config.AttributeCollection)
-	 */
-	public Component getAttributeCollectionUI(
-			AttributeCollection attributeCollection, Object data)
-			throws MartServiceException {
-		JComponent box = null;
-
-		AttributeDescription[] attributeDescriptions = (AttributeDescription[]) attributeCollection
-				.getAttributeDescriptions()
-				.toArray(new AttributeDescription[0]);
-
-		AttributeList[] attributeLists = (AttributeList[]) attributeCollection
-				.getAttributeLists().toArray(new AttributeList[0]);
-
-		JLabel sequenceLabel = null;
-		if ("seq_scope_type".equals(attributeCollection.getInternalName())) {
-			sequenceLabel = new JLabel(MartServiceIcons
-					.getIcon("gene_schematic"));
-			box = createBox(sequenceLabel, false);
-		} else if (attributeDescriptions.length > 1
-				|| attributeLists.length > 1) {
-			// more than one attribute so create a box with the collection name
-			// as a header
-			JLabel title = new JLabel(attributeCollection.getDisplayName());
-			title.setFont(title.getFont().deriveFont(Font.BOLD));
-			String description = attributeCollection.getDescription();
-			if (description != null) {
-				title.setToolTipText(description);
-			}
-			box = createBox(title, false);
-		} else {
-			box = createBox(null, false);
-		}
-
-		int maxSelect = attributeCollection.getMaxSelect();
-		if (maxSelect == 1) {
-			if (attributeDescriptions.length > 0) {
-				box.add(getAttributeDescriptionsUI(attributeDescriptions,
-						new Object[] { SINGLE_SELECTION, sequenceLabel }));
-			} else {
-				box.add(getAttributeListsUI(attributeLists, new Object[] {
-						SINGLE_SELECTION, sequenceLabel }));
-			}
-		} else {
-			if (attributeDescriptions.length > 0) {
-				box.add(getAttributeDescriptionsUI(attributeDescriptions,
-						new Object[] { MULTIPLE_SELECTION, sequenceLabel }));
-			} else {
-				box.add(getAttributeListsUI(attributeLists, new Object[] {
-						MULTIPLE_SELECTION, sequenceLabel }));
-			}
-		}
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeDescriptionsUI(org.ensembl.mart.lib.config.AttributeDescription[],
-	 *      int)
-	 */
-	public Component getAttributeDescriptionsUI(
-			AttributeDescription[] attributeDescriptions, Object data)
-			throws MartServiceException {
-		Object[] dataArray = (Object[]) data;
-		JComponent box = new JPanel(new GridLayout(1, 2));
-		box.setBackground(componentBackgroundColor);
-		JComponent box1 = createVerticalBox(componentBackgroundColor);
-		JComponent box2 = createVerticalBox(componentBackgroundColor);
-		box.add(box1);
-		box.add(box2);
-
-		// button group used if the attribute collection is SINGLE_SELECTION
-		ButtonGroup buttonGroup = new ButtonGroup();
-		JRadioButton off = new JRadioButton("OFF");
-		buttonGroup.add(off);
-
-		JComponent currentBox = box1;
-
-		for (int i = 0; i < attributeDescriptions.length; i++) {
-			if (QueryConfigUtils.display(attributeDescriptions[i])) {
-				Component component = getAttributeDescriptionUI(
-						attributeDescriptions[i],
-						dataArray[0] == SINGLE_SELECTION ? new Object[] { off,
-								dataArray[1] } : new Object[] { null,
-								dataArray[1] });
-				if (component != null) {
-					currentBox.add(component);
-					if (dataArray[0] == SINGLE_SELECTION
-							&& component instanceof AttributeComponent) {
-						AttributeComponent attributeComponent = (AttributeComponent) component;
-						buttonGroup.add(attributeComponent.getButton());
-					}
-					if (QueryConfigUtils.isFilterReference(
-							attributeDescriptions[i], version)) {
-						FilterDescription filterDescription = QueryConfigUtils
-								.getReferencedFilterDescription(
-										attributeDescriptions[i], version);
-						Component filterComponent = getFilterDescriptionUI(
-								filterDescription, data);
-						if (filterComponent instanceof QueryComponent
-								&& component instanceof AttributeComponent) {
-							AttributeComponent attributeComponent = (AttributeComponent) component;
-							((QueryComponent) filterComponent)
-									.setSelectorButton(attributeComponent
-											.getButton());
-						}
-						componentRegister.add(filterComponent);
-						box2.add(filterComponent);
-						currentBox = box2;
-					}
-					if (currentBox == box1) {
-						currentBox = box2;
-					} else {
-						currentBox = box1;
-					}
-				}
-			}
-		}
-		currentBox.add(Box.createVerticalGlue());
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeDescriptionUI(org.ensembl.mart.lib.config.AttributeDescription,
-	 *      int)
-	 */
-	public Component getAttributeDescriptionUI(
-			AttributeDescription attributeDescription, Object data)
-			throws MartServiceException {
-		Object[] dataArray = (Object[]) data;
-		MartDataset dataset = martDataset;
-		AttributeDescription displayedAttribute;
-		if (QueryConfigUtils.isReference(attributeDescription, version)) {
-			dataset = QueryConfigUtils.getReferencedDataset(martService,
-					martDataset, attributeDescription, version);
-			if (dataset == null) {
-				return null;
-			}
-			if (QueryConfigUtils.isFilterReference(attributeDescription,
-					version)) {
-				FilterDescription filter = QueryConfigUtils
-						.getReferencedFilterDescription(martService, dataset,
-								attributeDescription, version);
-				if (filter == null) {
-					return null;
-				}
-				displayedAttribute = attributeDescription;
-				displayedAttribute.setDisplayName(filter.getDisplayName());
-				filterToDisplayName.put(filter.getInternalName(), filter
-						.getDisplayName());
-			} else {
-				displayedAttribute = QueryConfigUtils
-						.getReferencedAttributeDescription(martService,
-								dataset, attributeDescription, version);
-				if (displayedAttribute == null) {
-					// if the reference can't be resolved the the attribute just
-					// doesn't get displayed
-					return null;
-				}
-			}
-		} else {
-			displayedAttribute = attributeDescription;
-		}
-
-		final AttributeComponent component = new AttributeComponent(
-				displayedAttribute, martDataset, dataArray[0]);
-		component.setPointerDataset(attributeDescription
-				.getAttribute("pointerDataset"));
-		if (!QueryConfigUtils.isFilterReference(attributeDescription, version)) {
-			if (!attributeNameToComponentMap.containsKey(component
-					.getQualifiedName())) {
-				attributeNameToComponentMap.put(component.getQualifiedName(),
-						new ArrayList<Component>());
-			}
-			attributeNameToComponentMap.get(component
-					.getQualifiedName()).add(component);
-			componentRegister.add(component);
-			// nasty hard coded rules that aren't in the configs
-			// component.addQueryComponentListener(new QueryComponentAdapter() {
-			// public void attributeAdded(QueryComponentEvent event) {
-			// String name = component.getName();
-			// String dataset = component.getDataset().getName();
-			// if (name.equals("coding_gene_flank")
-			// || name.equals("coding_transcript_flank")
-			// || name.equals("transcript_flank")
-			// || name.equals("gene_flank")) {
-			// QueryComponent filterComponent = (QueryComponent)
-			// filterNameToComponentMap
-			// .get("upstream_flank");
-			// if (filterComponent != null) {
-			// filterComponent.setSelected(true);
-			// }
-			// filterComponent = (QueryComponent) filterNameToComponentMap
-			// .get("downstream_flank");
-			// if (filterComponent != null) {
-			// filterComponent.setSelected(true);
-			// }
-			// }
-			// }
-			//
-			// });
-		}
-		if (dataArray[1] instanceof JLabel) {
-			final JLabel sequenceLabel = (JLabel) dataArray[1];
-			component.addQueryComponentListener(new QueryComponentAdapter() {
-				public void attributeAdded(QueryComponentEvent event) {
-					String name = component.getName();
-					if ("3utr".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_3utr"));
-					} else if ("5utr".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_5utr"));
-					} else if ("cdna".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_cdna"));
-					} else if ("coding_gene_flank".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_coding_gene_flank"));
-					} else if ("coding_transcript_flank".equals(name)) {
-						sequenceLabel
-								.setIcon(MartServiceIcons
-										.getIcon("gene_schematic_coding_transcript_flank"));
-					} else if ("coding".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_coding"));
-					} else if ("gene_exon_intron".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_gene_exon_intron"));
-					} else if ("gene_exon".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_gene_exon"));
-					} else if ("gene_flank".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_gene_flank"));
-					} else if ("peptide".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_peptide"));
-					} else if ("transcript_exon_intron".equals(name)) {
-						sequenceLabel
-								.setIcon(MartServiceIcons
-										.getIcon("gene_schematic_transcript_exon_intron"));
-					} else if ("transcript_exon".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_transcript_exon"));
-					} else if ("transcript_flank".equals(name)) {
-						sequenceLabel.setIcon(MartServiceIcons
-								.getIcon("gene_schematic_transcript_flank"));
-					}
-				}
-
-			});
-		}
-		return component;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeListsUI(org.ensembl.mart.lib.config.AttributeList[],
-	 *      int)
-	 */
-	public Component getAttributeListsUI(AttributeList[] attributeLists,
-			Object data) throws MartServiceException {
-		Object[] dataArray = (Object[]) data;
-		JComponent box = new JPanel(new GridLayout(1, 2));
-		box.setBackground(componentBackgroundColor);
-		JComponent box1 = createVerticalBox(componentBackgroundColor);
-		JComponent box2 = createVerticalBox(componentBackgroundColor);
-		box.add(box1);
-		box.add(box2);
-
-		// button group used if the attribute collection is SINGLE_SELECTION
-		ButtonGroup buttonGroup = new ButtonGroup();
-		JRadioButton off = new JRadioButton("OFF");
-		buttonGroup.add(off);
-
-		JComponent currentBox = box1;
-
-		for (int i = 0; i < attributeLists.length; i++) {
-			if (QueryConfigUtils.display(attributeLists[i])) {
-				Component component = getAttributeListUI(attributeLists[i],
-						dataArray[0] == SINGLE_SELECTION ? new Object[] { off,
-								dataArray[1] } : new Object[] { null,
-								dataArray[1] });
-				if (component != null) {
-					currentBox.add(component);
-					if (dataArray[0] == SINGLE_SELECTION
-							&& component instanceof AttributeComponent) {
-						AttributeComponent attributeComponent = (AttributeComponent) component;
-						buttonGroup.add(attributeComponent.getButton());
-					}
-					if (currentBox == box1) {
-						currentBox = box2;
-					} else {
-						currentBox = box1;
-					}
-				}
-			}
-		}
-		currentBox.add(Box.createVerticalGlue());
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getAttributeListUI(org.ensembl.mart.lib.config.AttributeList,
-	 *      int)
-	 */
-	public Component getAttributeListUI(AttributeList attributeList, Object data)
-			throws MartServiceException {
-		Object[] dataArray = (Object[]) data;
-
-		AttributeComponent component = new AttributeComponent(attributeList,
-				martDataset, dataArray[0]);
-
-		if (!attributeNameToComponentMap.containsKey(component
-				.getQualifiedName())) {
-			attributeNameToComponentMap.put(component.getQualifiedName(),
-					new ArrayList<Component>());
-		}
-		attributeNameToComponentMap.get(component.getQualifiedName())
-				.add(component);
-		componentRegister.add(component);
-		/*
-		 * if (dataArray[1] instanceof JLabel) { final JLabel sequenceLabel =
-		 * (JLabel) dataArray[1]; component.addQueryComponentListener(new
-		 * QueryComponentAdapter() { public void
-		 * attributeAdded(QueryComponentEvent event) { String name =
-		 * component.getName(); if ("3utr".equals(name)) {
-		 * sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_3utr")); } else if ("5utr".equals(name)) {
-		 * sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_5utr")); } else if ("cdna".equals(name)) {
-		 * sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_cdna")); } else if
-		 * ("coding_gene_flank".equals(name)) {
-		 * sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_coding_gene_flank")); } else if
-		 * ("coding_transcript_flank".equals(name)) { sequenceLabel
-		 * .setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_coding_transcript_flank")); } else if
-		 * ("coding".equals(name)) { sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_coding")); } else if
-		 * ("gene_exon_intron".equals(name)) {
-		 * sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_gene_exon_intron")); } else if
-		 * ("gene_exon".equals(name)) { sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_gene_exon")); } else if
-		 * ("gene_flank".equals(name)) { sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_gene_flank")); } else if
-		 * ("peptide".equals(name)) { sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_peptide")); } else if
-		 * ("transcript_exon_intron".equals(name)) { sequenceLabel
-		 * .setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_transcript_exon_intron")); } else if
-		 * ("transcript_exon".equals(name)) {
-		 * sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_transcript_exon")); } else if
-		 * ("transcript_flank".equals(name)) {
-		 * sequenceLabel.setIcon(MartServiceIcons
-		 * .getIcon("gene_schematic_transcript_flank")); } }
-		 *
-		 * }); }
-		 */
-		return component;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterPagesUI(org.ensembl.mart.lib.config.FilterPage[])
-	 */
-	public Component getFilterPagesUI(FilterPage[] filterPages, Object data)
-			throws MartServiceException {
-		final JComponent box = createVerticalBox(backgroundColor);
-
-		for (int i = 0; i < filterPages.length; i++) {
-			if (QueryConfigUtils.display(filterPages[i])) {
-				box.add(getFilterPageUI(filterPages[i], data));
-			}
-		}
-
-		JPanel panel = new JPanel(new BorderLayout());
-		panel.setBackground(backgroundColor);
-		panel.add(box, BorderLayout.NORTH);
-
-		return panel;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterPageUI(org.ensembl.mart.lib.config.FilterPage)
-	 */
-	public Component getFilterPageUI(FilterPage filterPage, Object data)
-			throws MartServiceException {
-		JComponent box = createVerticalBox(backgroundColor);
-
-		FilterGroup[] filterGroups = (FilterGroup[]) filterPage
-				.getFilterGroups().toArray(new FilterGroup[0]);
-		box.add(getFilterGroupsUI(filterGroups, data));
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterGroupsUI(org.ensembl.mart.lib.config.FilterGroup[])
-	 */
-	public Component getFilterGroupsUI(FilterGroup[] filterGroups, Object data)
-			throws MartServiceException {
-		JComponent box = createVerticalBox(backgroundColor);
-
-		for (int i = 0; i < filterGroups.length; i++) {
-			if (QueryConfigUtils.display(filterGroups[i])) {
-				box.add(Box.createVerticalStrut(2));
-				box.add(getFilterGroupUI(filterGroups[i], data));
-			}
-		}
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterGroupUI(org.ensembl.mart.lib.config.FilterGroup)
-	 */
-	public Component getFilterGroupUI(FilterGroup filterGroup, Object data)
-			throws MartServiceException {
-		JLabel title = new JLabel(filterGroup.getDisplayName());
-		title.setFont(title.getFont().deriveFont(Font.PLAIN));
-		String description = filterGroup.getDescription();
-		if (description != null) {
-			title.setToolTipText(description);
-		}
-		ExpandableBox box = new ExpandableBox(title, componentBackgroundColor,
-				borderColor, new Insets(10, 10, 10, 10));
-
-		FilterCollection[] filterCollections = filterGroup
-				.getFilterCollections();
-		box.add(getFilterCollectionsUI(filterCollections, data));
-
-		box.setExpanded(false);
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterCollectionsUI(org.ensembl.mart.lib.config.FilterCollection[])
-	 */
-	public Component getFilterCollectionsUI(
-			FilterCollection[] filterCollections, Object data)
-			throws MartServiceException {
-		JComponent box = createVerticalBox(componentBackgroundColor);
-
-		for (int i = 0; i < filterCollections.length; i++) {
-			if (QueryConfigUtils.display(filterCollections[i])) {
-				Component component = getFilterCollectionUI(
-						filterCollections[i], data);
-				if (component != null) {
-					box.add(Box.createVerticalStrut(10));
-					box.add(component);
-				}
-			}
-		}
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterCollectionUI(org.ensembl.mart.lib.config.FilterCollection)
-	 */
-	public Component getFilterCollectionUI(FilterCollection filterCollection,
-			Object data) throws MartServiceException {
-		JComponent box = null;
-
-		String displayName = filterCollection.getDisplayName();
-		if (displayName == null) {
-			displayName = filterCollection.getInternalName();
-		}
-		AbstractButton selectorButton = new JCheckBox(QueryConfigUtils
-				.splitSentence(displayName));
-		selectorButton.setFont(selectorButton.getFont().deriveFont(Font.PLAIN));
-		selectorButton.setBackground(componentBackgroundColor);
-		String description = filterCollection.getDescription();
-		if (description != null) {
-			selectorButton.setToolTipText(description);
-		}
-
-		FilterDescription[] filterDescriptions = (FilterDescription[]) filterCollection
-				.getFilterDescriptions().toArray(new FilterDescription[0]);
-
-		if (filterDescriptions.length == 1) {
-			if (QueryConfigUtils.display(filterDescriptions[0])) {
-				Component filterComponent = getFilterDescriptionUI(
-						filterDescriptions[0], data);
-				if (filterComponent != null) {
-					filterToDisplayName.put(
-							filterDescriptions[0].getInternalName(), displayName);
-					if (QueryConfigUtils
-							.isReference(filterDescriptions[0], version)) {
-						MartDataset dataset = QueryConfigUtils
-						.getReferencedDataset(martService, martDataset,
-								filterDescriptions[0], version);
-						FilterDescription referencedFilter = QueryConfigUtils
-						.getReferencedFilterDescription(martService,
-								dataset, filterDescriptions[0], version);
-						filterToDisplayName.put(referencedFilter.getInternalName(),
-								displayName);
-					}
-
-					box = createBox(null, false);
-					JComponent grid = new JPanel(new GridLayout(1, 2));
-					grid.setBackground(componentBackgroundColor);
-					JPanel buttonPanel = new JPanel(new MinimalLayout());
-					buttonPanel.setBackground(componentBackgroundColor);
-					buttonPanel.add(selectorButton);
-					grid.add(buttonPanel);
-					if (filterComponent instanceof QueryComponent) {
-						((QueryComponent) filterComponent)
-						.setSelectorButton(selectorButton);
-					}
-					grid.add(filterComponent);
-					box.add(grid);
-				}
-			}
-		} else {
-			Component component = getFilterDescriptionsUI(filterDescriptions,
-					selectorButton);
-			if (component != null) {
-				box = createBox(selectorButton, false);
-				box.add(component);
-			}
-		}
-
-		return box;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterDescriptionsUI(org.ensembl.mart.lib.config.FilterDescription[],
-	 *      int)
-	 */
-	public Component getFilterDescriptionsUI(
-			FilterDescription[] filterDescriptions, Object data)
-			throws MartServiceException {
-		List<Component> components = new ArrayList<Component>();
-		for (int i = 0; i < filterDescriptions.length; i++) {
-			if (QueryConfigUtils.display(filterDescriptions[i])) {
-				Component component = getFilterDescriptionUI(
-						filterDescriptions[i], data);
-				if (component != null) {
-					if (component instanceof QueryComponent
-							&& data instanceof AbstractButton) {
-						((QueryComponent) component)
-						.setSelectorButton((AbstractButton) data);
-					}
-
-					String displayName = filterDescriptions[i].getDisplayName();
-					if (displayName == null) {
-						logger.info("Cant find a display name for filter '"
-								+ filterDescriptions[i].getInternalName() + "'");
-						displayName = filterDescriptions[i].getInternalName();
-					}
-					filterToDisplayName.put(
-							filterDescriptions[i].getInternalName(), displayName);
-					JLabel displayLabel = new JLabel(QueryConfigUtils
-							.splitSentence(displayName));
-					displayLabel.setFont(displayLabel.getFont().deriveFont(
-							Font.PLAIN));
-					String description = filterDescriptions[i].getDescription();
-					if (description != null) {
-						displayLabel.setToolTipText(description);
-					}
-					displayLabel.setBackground(componentBackgroundColor);
-					displayLabel.setBorder(new EmptyBorder(0, 22, 0, 0));
-
-					components.add(displayLabel);
-					components.add(component);
-				}
-			}
-		}
-
-		if (components.size() > 0) {
-			JComponent box = new JPanel(
-					new GridLayout(components.size() / 2, 2));
-			box.setBackground(componentBackgroundColor);
-			for (Component component : components) {
-				box.add(component);
-			}
-			return box;
-		} else {
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 *
-	 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryConfigUIFactory#getFilterDescriptionUI(org.ensembl.mart.lib.config.FilterDescription,
-	 *      int)
-	 */
-	public Component getFilterDescriptionUI(
-			FilterDescription filterDescription, Object data)
-			throws MartServiceException {
-		QueryComponent component;
-
-		String pointerDataset = filterDescription
-				.getAttribute("pointerDataset");
-		MartDataset dataset = martDataset;
-		FilterDescription displayedFilter;
-		if (QueryConfigUtils.isReference(filterDescription, version)) {
-			dataset = QueryConfigUtils.getReferencedDataset(martService,
-					martDataset, filterDescription, version);
-			if (dataset == null) {
-				return null;
-			}
-			displayedFilter = QueryConfigUtils.getReferencedFilterDescription(
-					martService, dataset, filterDescription, version);
-			if (displayedFilter == null){
-				return null;
-			}
-			filterDescription.setDisplayName(displayedFilter.getDisplayName());
-		} else {
-			displayedFilter = filterDescription;
-		}
-		assert dataset != null;
-
-		String type = displayedFilter.getType();
-		if (type == null) {
-			type = "text";// default filter type
-		}
-
-		if (type.equals("boolean") || type.equals("boolean_num")) {
-			component = new BooleanFilterComponent(displayedFilter, martDataset);
-			component.setPointerDataset(pointerDataset);
-			componentRegister.add(component);
-		} else if (type.endsWith("list") || type.endsWith("basic_filter")
-				|| QueryConfigUtils.isList(displayedFilter)) {
-			if (type.equals("boolean_list")
-					|| QueryConfigUtils.isBooleanList(displayedFilter)) {
-				Option[] options = displayedFilter.getOptions();
-				List filters = new ArrayList();
-				for (int i = 0; i < options.length; i++) {
-					FilterDescription booleanFilterDescription = new FilterDescription(
-							options[i]);
-					QueryComponent queryComponent = new BooleanFilterComponent(
-							booleanFilterDescription, martDataset);
-					queryComponent.setPointerDataset(pointerDataset);
-					filters.add(queryComponent);
-					componentRegister.add(queryComponent);
-				}
-				component = new BooleanListFilterComponent(displayedFilter,
-						martDataset, filters);
-				component.setPointerDataset(pointerDataset);
-			} else if (type.equals("id_list")
-					|| QueryConfigUtils.isIdList(displayedFilter)) {
-				Option[] options = displayedFilter.getOptions();
-				List<TextFilterComponent> filters = new ArrayList<TextFilterComponent>();
-				for (int i = 0; i < options.length; i++) {
-					FilterDescription idFilterDescription = new FilterDescription(
-							options[i]);
-					idFilterDescription.setType("id_list");
-					TextFilterComponent queryComponent = new TextFilterComponent(
-							idFilterDescription, martDataset);
-					queryComponent.setPointerDataset(pointerDataset);
-					filters.add(queryComponent);
-					componentRegister.add(queryComponent);
-				}
-				component = new IdListFilterComponent(displayedFilter,
-						martDataset, filters);
-				component.setPointerDataset(pointerDataset);
-			} else if (QueryConfigUtils.isNestedList(displayedFilter)) {
-				TextFilterComponent filterComponent = new TextFilterComponent(
-						displayedFilter, martDataset);
-				filterComponent.setPointerDataset(pointerDataset);
-				filterComponent.add(QueryConfigUtils.getOptionButton(
-						displayedFilter, filterComponent));
-				component = filterComponent;
-				componentRegister.add(component);
-			} else {
-				ListFilterComponent filterComponent = new ListFilterComponent(
-						getDatasetConfig().getDataset(), displayedFilter,
-						martDataset, filterNameToComponentMap);
-				filterComponent.setPointerDataset(pointerDataset);
-				// map the component to a local dataset name as the 'ref' of a
-				// pushaction may be a local reference
-				filterNameToComponentMap.put(getDatasetConfig().getDataset()
-						+ "." + displayedFilter.getInternalName(),
-						filterComponent);
-				// if the filter is a reference then also map the component to
-				// its referenced dataset name as the 'ref' of a pushaction may
-				// be a non-local reference
-				if (QueryConfigUtils.isReference(filterDescription, version)) {
-					filterNameToComponentMap.put(filterDescription
-							.getInternalName(), filterComponent);
-				}
-				component = filterComponent;
-				componentRegister.add(component);
-			}
-		} else {
-			String multipleValues = displayedFilter.getMultipleValues();
-			if ("1".equals(multipleValues)) {
-				component = new MultipleTextFilterComponent(displayedFilter, martDataset);
-			} else {
-				component = new TextFilterComponent(displayedFilter, martDataset);
-			}
-			component.setPointerDataset(pointerDataset);
-			componentRegister.add(component);
-			// mapping for hard coded rules
-			filterNameToComponentMap.put(filterDescription.getInternalName(),
-					component);
-		}
-
-		return component;
-	}
-
-	private void registerComponents() {
-		for (Iterator iter = componentRegister.iterator(); iter.hasNext();) {
-			QueryComponent component = (QueryComponent) iter.next();
-			controller.register(component);
-		}
-	}
-
-	private void deregisterComponents() {
-		for (Iterator iter = componentRegister.iterator(); iter.hasNext();) {
-			QueryComponent component = (QueryComponent) iter.next();
-			controller.deregister(component);
-		}
-	}
-
-	/**
-	 *
-	 * @param inputPanel
-	 * @param attributePanel
-	 * @param filterPanel
-	 */
-	private void generateConfiguration(
-			final MartServiceQueryConfigUIFactory factory,
-			final SummaryPanel summaryPanel, final JComponent inputPanel,
-			final JComponent attributePanel, final JComponent filterPanel) {
-		final JProgressBar filterProgressBar = new JProgressBar();
-		filterProgressBar.setIndeterminate(true);
-		filterProgressBar.setStringPainted(true);
-		filterProgressBar.setString("Fetching filter configuration");
-		filterPanel.add(filterProgressBar);
-
-		final JProgressBar attributeProgressBar = new JProgressBar();
-		attributeProgressBar.setIndeterminate(true);
-		attributeProgressBar.setStringPainted(true);
-		attributeProgressBar.setString("Fetching attribute configuration");
-		attributePanel.add(attributeProgressBar);
-
-		new Thread("DatasetConfigUI") {
-			public void run() {
-				try {
-
-					FilterPage[] filterPages = factory.getDatasetConfig()
-							.getFilterPages();
-					AttributePage[] attributePages = factory.getDatasetConfig()
-							.getAttributePages();
-
-					final Component filterPagesComponent = factory
-							.getFilterPagesUI(filterPages, null);
-					final Component attributePagesComponent = factory
-							.getAttributePagesUI(attributePages, null);
-
-					filterPanel.remove(filterProgressBar);
-					filterPanel.add(filterPagesComponent);
-
-					attributePanel.remove(attributeProgressBar);
-					attributePanel.add(attributePagesComponent);
-
-					factory.registerComponents();
-
-					factory.selectAttributePage(attributePages);
-
-				} catch (MartServiceException e) {
-					logger.error("Error while fetching dataset configuration", e);
-					JTextArea textArea = new JTextArea();
-					textArea
-							.append("Error while fetching dataset configuration\n\n");
-					textArea.append(e.getMessage());
-					inputPanel.removeAll();
-					inputPanel.add(textArea);
-				} catch (Exception e) {
-					logger.error("Error while generating the Query Editor", e);
-					JTextArea textArea = new JTextArea();
-					textArea
-							.append("Error while generating the Query Editor\n\n");
-					textArea.append(e.toString());
-					inputPanel.removeAll();
-					inputPanel.add(textArea);
-				} finally {
-					inputPanel.revalidate();
-					inputPanel.repaint();
-					summaryPanel.updateDatasets();
-				}
-			}
-		}.start();
-	}
-
-	private List<AttributeComponent> getAttributeComponents(Component component) {
-		List<AttributeComponent> attributeComponents = new ArrayList<AttributeComponent>();
-		if (component instanceof AttributeComponent) {
-			attributeComponents.add((AttributeComponent) component);
-		} else if (component instanceof ExpandableBox) {
-			Component[] children = ((ExpandableBox) component).getComponents();
-			for (int i = 0; i < children.length; i++) {
-				attributeComponents.addAll(getAttributeComponents(children[i]));
-			}
-		} else if (component instanceof Container) {
-			Component[] children = ((Container) component).getComponents();
-			for (int i = 0; i < children.length; i++) {
-				attributeComponents.addAll(getAttributeComponents(children[i]));
-			}
-		}
-		return attributeComponents;
-	}
-
-	private List<AttributeComponent> getSelectedAttributeComponents(
-			Component component) {
-		List<AttributeComponent> attributeComponents = new ArrayList<AttributeComponent>();
-		if (component instanceof AttributeComponent) {
-			if (((AttributeComponent) component).isSelected()) {
-				attributeComponents.add((AttributeComponent) component);
-			}
-		} else if (component instanceof ExpandableBox) {
-			Component[] children = ((ExpandableBox) component).getComponents();
-			for (int i = 0; i < children.length; i++) {
-				attributeComponents
-						.addAll(getSelectedAttributeComponents(children[i]));
-			}
-		} else if (component instanceof Container) {
-			Component[] children = ((Container) component).getComponents();
-			for (int i = 0; i < children.length; i++) {
-				attributeComponents
-						.addAll(getSelectedAttributeComponents(children[i]));
-			}
-		}
-		return attributeComponents;
-	}
-
-	private void selectAttributePage(AttributePage[] attributePages) {
-		int selectedAttributes = -1;
-		JRadioButton selectedButton = null;
-		Component selectedComponent = null;
-
-		for (int i = 0; i < attributePages.length; i++) {
-			if (QueryConfigUtils.display(attributePages[i])) {
-				Component component = attributePageNameToComponent
-						.get(attributePages[i].getInternalName());
-				JRadioButton button = attributePageNameToButton
-						.get(attributePages[i].getInternalName());
-				if (component != null && button != null) {
-					int attributeCount = getSelectedAttributeComponents(
-							component).size();
-					if (attributeCount > selectedAttributes) {
-						selectedAttributes = attributeCount;
-						selectedButton = button;
-						selectedComponent = component;
-					}
-				}
-			}
-			if (selectedButton != null && selectedComponent != null) {
-				selectedButton.setSelected(true);
-			}
-		}
-	}
-
-	private List<String> getFormatList(AttributePage attributePage) {
-		List<String> formatList = new ArrayList<String>();
-		for (String format : attributePage.getOutFormats()
-				.toUpperCase().split(",")) {
-			if (!"".equals(format)) {
-				formatList.add(format);
-			}
-		}
-		return formatList;
-	}
-
-	private JComponent createHorizontalBox(Color background) {
-		// using a JPanel instead of a Box as a workaround for bug 4907674
-		JPanel box = new JPanel();
-		box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS));
-		box.setBackground(background);
-		return box;
-	}
-
-	private JComponent createVerticalBox(Color background) {
-		// using a JPanel instead of a Box as a workaround for bug 4907674
-		JPanel box = new JPanel();
-		box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
-		box.setBackground(background);
-		return box;
-	}
-
-	private JComponent createBox(Component titleComponent, boolean fullBorder) {
-		JComponent box = createVerticalBox(componentBackgroundColor);
-		box.add(Box.createHorizontalStrut(400));
-		if (fullBorder) {
-			box.setBorder(new CompoundBorder(new LineBorder(borderColor, 1),
-					new EmptyBorder(10, 10, 10, 10)));
-		} else {
-			box.setBorder(new CompoundBorder(new SideBorder06(
-					SwingConstants.TOP, borderColor), new EmptyBorder(5, 10, 0,
-					10)));
-		}
-		if (titleComponent != null) {
-			JComponent labelBox = createHorizontalBox(componentBackgroundColor);
-			labelBox.add(titleComponent);
-			labelBox.add(Box.createHorizontalGlue());
-			box.add(labelBox);
-		}
-		return box;
-	}
-
-	private void setSummaryCount(Query query, String datasetName, JLabel label)
-			throws MartServiceException {
-		if ("".equals(label.getText())) {
-			String count = null;
-			String total = null;
-			Query countQuery = new Query(query);
-			countQuery.removeAllDatasets();
-			countQuery.addDataset(new Dataset(datasetName));
-			countQuery.setCount(1);
-			countQuery.setFormatter(null);
-
-			Object[] results = martService.executeQuery(countQuery);
-			if (results.length == 1) {
-				if (results[0] instanceof List) {
-					List result = (List) results[0];
-					if (result.size() >= 1) {
-						total = (String) result.get(0);
-						// test for biomart's 'let add a random blank line'
-						// thing
-						if ("".equals(total) && result.size() > 1) {
-							total = (String) result.get(1);
-						}
-						try {
-							Integer.parseInt(total);
-						} catch (NumberFormatException e) {
-							total = "?";
-						}
-					}
-				}
-			}
-			Dataset dataset = query.getDataset(datasetName);
-			if (dataset != null && dataset.getFilters().size() > 0) {
-				Dataset countDataset = new Dataset(dataset);
-				countQuery.removeAllDatasets();
-				countQuery.addDataset(countDataset);
-				results = martService.executeQuery(countQuery);
-				if (results.length == 1) {
-					if (results[0] instanceof List) {
-						List result = (List) results[0];
-						if (result.size() >= 1) {
-							count = (String) result.get(0);
-							// test for biomart's 'let add a random blank
-							// line' thing
-							if ("".equals(count) && result.size() > 1) {
-								count = (String) result.get(1);
-							}
-							try {
-								Integer.parseInt(count);
-							} catch (NumberFormatException e) {
-								count = "";
-							}
-						}
-					}
-				}
-			} else {
-				count = total;
-			}
-
-			if (count != null && total != null) {
-				if (count.equals("")) {
-					label.setText("0 / " + total + " Genes");
-				} else {
-					label.setText(count + " / " + total + " Genes");
-				}
-			}
-
-		}
-	}
-
-	class TextFilterComponent extends QueryComponent {
-		private static final long serialVersionUID = 1L;
-
-		private JTextField textField;
-
-		public TextFilterComponent(FilterDescription filterDescription,
-				MartDataset dataset) {
-			setConfigObject(filterDescription);
-			setDataset(dataset);
-			setName(filterDescription.getInternalName());
-			setLayout(new MinimalLayout(MinimalLayout.HORIZONTAL));
-			setBackground(componentBackgroundColor);
-
-			textField = new JTextField();
-			textField.setBackground(componentBackgroundColor);
-			textField.setPreferredSize(new Dimension(200, textField
-					.getPreferredSize().height + 4));
-
-			textField.getDocument().addDocumentListener(new DocumentListener() {
-				public void changedUpdate(DocumentEvent e) {
-				}
-
-				public void insertUpdate(DocumentEvent e) {
-					fireFilterChanged(new QueryComponentEvent(this, getName(),
-							getDataset(), textField.getText()));
-				}
-
-				public void removeUpdate(DocumentEvent e) {
-					fireFilterChanged(new QueryComponentEvent(this, getName(),
-							getDataset(), textField.getText()));
-				}
-			});
-
-			add(textField);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponent#getType()
-		 */
-		public int getType() {
-			return FILTER;
-		}
-
-		public void setValue(String value) {
-			textField.setText(value);
-		}
-
-		public String getValue() {
-			return textField.getText();
-		}
-
-	}
-
-	class MultipleTextFilterComponent extends QueryComponent {
-		private static final long serialVersionUID = 1L;
-
-		private JTextArea textArea;
-
-		public MultipleTextFilterComponent(FilterDescription filterDescription,
-				MartDataset dataset) {
-			setConfigObject(filterDescription);
-			setDataset(dataset);
-			setName(filterDescription.getInternalName());
-			setLayout(new MinimalLayout(MinimalLayout.HORIZONTAL));
-			setBackground(componentBackgroundColor);
-
-			textArea = new JTextArea();
-			textArea.getDocument().addDocumentListener(new DocumentListener() {
-				public void changedUpdate(DocumentEvent e) {
-				}
-
-				public void insertUpdate(DocumentEvent e) {
-					fireFilterChanged(new QueryComponentEvent(this, getName(),
-							getDataset(), getValue()));
-				}
-
-				public void removeUpdate(DocumentEvent e) {
-					fireFilterChanged(new QueryComponentEvent(this, getName(),
-							getDataset(), getValue()));
-				}
-			});
-
-			final JFileChooser chooser = new JFileChooser();
-			JButton chooserButton = new JButton("Browse...");
-			chooserButton.setBackground(componentBackgroundColor);
-			chooserButton.setFont(chooserButton.getFont()
-					.deriveFont(Font.PLAIN));
-			chooserButton.addActionListener(new ActionListener() {
-				public void actionPerformed(ActionEvent e) {
-					int returnVal = chooser
-							.showOpenDialog(MultipleTextFilterComponent.this);
-					if (returnVal == JFileChooser.APPROVE_OPTION) {
-						File file = chooser.getSelectedFile();
-						if (file != null && file.exists() && file.canRead()
-								&& !file.isDirectory()) {
-							StringBuffer buffer = new StringBuffer();
-							BufferedReader in = null;
-							try {
-								in = new BufferedReader(new FileReader(file));
-								String line = in.readLine();
-								while (line != null) {
-									buffer.append(line);
-									buffer.append(QueryConfigUtils.LINE_END);
-									line = in.readLine();
-								}
-							} catch (IOException e1) {
-								// no action
-							} finally {
-								if (in != null) {
-									try {
-										in.close();
-									} catch (IOException e1) {
-										// give up
-									}
-								}
-							}
-							setValue(buffer.toString());
-						}
-					}
-				}
-			});
-
-			JPanel buttonPanel = new JPanel(new BorderLayout());
-			buttonPanel.setBackground(componentBackgroundColor);
-			buttonPanel.add(chooserButton, BorderLayout.WEST);
-
-			JScrollPane textScrollPane = new JScrollPane(textArea);
-			textScrollPane.setBackground(componentBackgroundColor);
-			textScrollPane.setPreferredSize(new Dimension(200, 80));
-
-			add(textScrollPane, BorderLayout.CENTER);
-			add(buttonPanel, BorderLayout.SOUTH);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponent#getType()
-		 */
-		public int getType() {
-			return FILTER;
-		}
-
-		public void setValue(String value) {
-			textArea.setText(QueryConfigUtils.csvToValuePerLine(value));
-		}
-
-		public String getValue() {
-			return QueryConfigUtils.valuePerLineToCsv(textArea.getText());
-		}
-
-	}
-
-	class ListFilterComponent extends QueryComponent {
-		private static final long serialVersionUID = 1L;
-
-		private DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel();
-
-		private JComboBox comboBox;
-
-		private JTextField textField;
-
-		private Map optionMap = new HashMap();
-
-		private List optionList = new ArrayList();
-
-		private String dataset;
-
-		private Map componentMap;
-
-		private String type;
-
-		public ListFilterComponent(String refDataset,
-				FilterDescription filterDescription, MartDataset dataset,
-				Map componentMap) {
-			this.dataset = refDataset;
-			this.componentMap = componentMap;
-			setConfigObject(filterDescription);
-			setDataset(dataset);
-			setName(filterDescription.getInternalName());
-			setLayout(new BorderLayout());
-			setBackground(componentBackgroundColor);
-
-			Option[] options = filterDescription.getOptions();
-			// if there are no options but there is a default value then use the
-			// default value as an option
-			if (options.length == 0) {
-				String defaultValue = filterDescription.getDefaultValue();
-				if (defaultValue != null) {
-					Option newOption = new Option();
-					newOption.setInternalName(defaultValue);
-					newOption.setDisplayName(defaultValue);
-					newOption.setValue(defaultValue);
-					newOption.setSelectable("true");
-					options = new Option[] { newOption };
-				}
-			}
-
-			textField = new JTextField();
-			textField.setBackground(componentBackgroundColor);
-			textField.setPreferredSize(new Dimension(200, textField
-					.getPreferredSize().height + 4));
-
-			textField.getDocument().addDocumentListener(new DocumentListener() {
-				public void changedUpdate(DocumentEvent e) {
-					fireFilterChanged(new QueryComponentEvent(this, getName(),
-							getDataset(), textField.getText()));
-				}
-
-				public void insertUpdate(DocumentEvent e) {
-					fireFilterChanged(new QueryComponentEvent(this, getName(),
-							getDataset(), textField.getText()));
-				}
-
-				public void removeUpdate(DocumentEvent e) {
-					fireFilterChanged(new QueryComponentEvent(this, getName(),
-							getDataset(), textField.getText()));
-				}
-			});
-
-			comboBox = new JComboBox();
-			comboBox.setFont(comboBox.getFont().deriveFont(Font.PLAIN));
-			comboBox.setBackground(componentBackgroundColor);
-			comboBox.setModel(comboBoxModel);
-
-			if (options.length == 0) {
-				add(textField, BorderLayout.WEST);
-				type = "text";
-			} else {
-				add(comboBox, BorderLayout.WEST);
-				type = "list";
-			}
-
-			setOptions(options);
-			// comboBox.setSelectedIndex(-1);
-
-			comboBox.addItemListener(new ItemListener() {
-
-				public void itemStateChanged(ItemEvent e) {
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-						Option option = (Option) optionList.get(comboBox
-								.getSelectedIndex());
-						optionSelected(option);
-						ListFilterComponent.super.setValue(option.getValue());
-						fireFilterChanged(new QueryComponentEvent(this,
-								getName(), getDataset(), option.getValue()));
-					} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-						Option option = (Option) optionMap.get(getValue());
-						if (option != null) {
-							optionDeselected(option);
-						}
-						fireFilterChanged(new QueryComponentEvent(this,
-								getName(), getDataset(), ""));
-					}
-				}
-
-			});
-
-		}
-
-		public void setOptions(Option[] options) {
-			clearOptions();
-			for (int i = 0; i < options.length; i++) {
-				if (options[i].getHidden() == null
-						|| !options[i].getHidden().equals("true")) {
-					optionMap.put(options[i].getValue(), options[i]);
-					optionList.add(options[i]);
-					String displayName = options[i].getDisplayName();
-					if (displayName != null) {
-						comboBoxModel.addElement(QueryConfigUtils
-								.truncateName(displayName));
-					}
-				}
-			}
-			if (optionList.size() > 0) {
-				if ("text".equals(type)) {
-					removeAll();
-					add(comboBox, BorderLayout.WEST);
-					type = "list";
-					revalidate();
-					repaint();
-				}
-				setValue(((Option) optionList.get(0)).getValue());
-			} else {
-				if ("list".equals(type)) {
-					removeAll();
-					add(textField, BorderLayout.WEST);
-					type = "text";
-					revalidate();
-					repaint();
-				}
-			}
-		}
-
-		private void clearOptions() {
-			comboBox.setSelectedIndex(-1);
-			comboBoxModel.removeAllElements();
-			optionMap.clear();
-			optionList.clear();
-		}
-
-		public void setValue(String value) {
-			if ("list".equals(type)) {
-				if (value == null) {
-					if (getValue() != null) {
-						optionDeselected((Option) optionMap.get(getValue()));
-						comboBox.setSelectedIndex(-1);
-					}
-				} else {
-					if (getValue() != null) {
-						Option option = (Option) optionMap.get(getValue());
-						if (option != null) {
-							optionDeselected(option);
-						}
-					}
-					Option option = (Option) optionMap.get(value);
-					if (option != null) {
-						optionSelected(option);
-					}
-					int index = optionList.indexOf(option);
-					comboBox.setSelectedIndex(index);
-				}
-			} else if ("text".equals(type)) {
-				textField.setText(value);
-			}
-			super.setValue(value);
-		}
-
-		private void optionSelected(Option option) {
-			if (option == null) {
-				logger.info("null option for " + getName());
-			} else {
-				PushAction[] pushActions = option.getPushActions();
-				for (int i = 0; i < pushActions.length; i++) {
-					QueryComponent queryComponent = getReferencedComponent(pushActions[i]);
-					if (queryComponent instanceof ListFilterComponent) {
-						ListFilterComponent filterComponent = (ListFilterComponent) queryComponent;
-						if (filterComponent != null) {
-							filterComponent.setOptions(pushActions[i]
-									.getOptions());
-						}
-					}
-				}
-			}
-		}
-
-		private void optionDeselected(Option option) {
-			PushAction[] pushActions = option.getPushActions();
-			for (int i = 0; i < pushActions.length; i++) {
-				QueryComponent queryComponent = getReferencedComponent(pushActions[i]);
-				if (queryComponent instanceof ListFilterComponent) {
-					ListFilterComponent filterComponent = (ListFilterComponent) queryComponent;
-					if (filterComponent != null) {
-						filterComponent.clearOptions();
-					}
-				}
-			}
-		}
-
-		private QueryComponent getReferencedComponent(PushAction pushAction) {
-			String ref = pushAction.getRef();
-			if (ref.indexOf('.') == -1) {
-				return (QueryComponent) componentMap.get(dataset + "." + ref);
-			} else {
-				return (QueryComponent) componentMap.get(ref);
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 *
-		 * @see org.embl.ebi.escience.scuflworkers.biomartservice.config.QueryComponent#getType()
-		 */
-		public int getType() {
-			return FILTER;
-		}
-	}
-
-	class IdListFilterComponent extends QueryComponent {
-		private static final long serialVersionUID = 1L;
-
-		private DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel();
-
-		private JComboBox comboBox;
-
-		private JTextArea textArea;
-
-		private Map<String, QueryComponent> componentMap = new HashMap<String, QueryComponent>();
-
-		private List<String> filterList = new ArrayList<String>();
-
-		private int currentIndex;
-
-		private boolean valueChanging;
-
-		public IdListFilterComponent(FilterDescription description,
-				MartDataset dataset, List<TextFilterComponent> filterComponentList) {
-			setLayout(new MinimalLayout(MinimalLayout.VERTICAL));
-			setBackground(componentBackgroundColor);
-
-			comboBox = new JComboBox();
-			comboBox.setFont(comboBox.getFont().deriveFont(Font.PLAIN));
-			comboBox.setBackground(componentBackgroundColor);
-			comboBox.setModel(comboBoxModel);
-
-			for (TextFilterComponent filterComponent : filterComponentList) {
-				BaseNamedConfigurationObject filterDescription = filterComponent
-						.getConfigObject();
-				componentMap.put(filterDescription.getInternalName(),
-						filterComponent);
-				filterList.add(filterDescription.getInternalName());
-				comboBoxModel.addElement(filterDescription.getDisplayName());
-				filterToDisplayName.put(filterDescription.getInternalName(),
-						filterDescription.getDisplayName());
-				filterComponent
-						.addQueryComponentListener(new QueryComponentAdapter() {
-							public void filterAdded(QueryComponentEvent event) {
-								if (!valueChanging) {
-									valueChanging = true;
-									comboBox.setSelectedIndex(filterList
-											.indexOf(event.getName()));
-									selectorButton.setSelected(true);
-									valueChanging = false;
-								}
-							}
-
-							public void filterRemoved(QueryComponentEvent event) {
-								if (!valueChanging) {
-									valueChanging = true;
-									selectorButton.setSelected(false);
-									valueChanging = false;
-								}
-							}
-
-							public void filterChanged(QueryComponentEvent event) {
-								if (!valueChanging) {
-									valueChanging = true;
-									textArea
-											.setText(QueryConfigUtils
-													.csvToValuePerLine(event
-															.getValue()));
-									valueChanging = false;
-								}
-							}
-						});
-				filterComponent.setSelectorButton(new JCheckBox());
-			}
-
-			comboBox.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					int selectedIndex = comboBox.getSelectedIndex();
-					if (selectorButton.isSelected()) {
-						if (e.getStateChange() == ItemEvent.SELECTED) {
-							if (!valueChanging) {
-								valueChanging = true;
-								QueryComponent queryComponent = componentMap
-										.get(filterList.get(selectedIndex));
-								queryComponent.setValue(QueryConfigUtils
-										.valuePerLineToCsv(textArea.getText()));
-								queryComponent.setSelected(true);
-								valueChanging = false;
-							}
-						} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-							if (!valueChanging) {
-								valueChanging = true;
-								componentMap.get(filterList
-										.get(currentIndex)).setSelected(false);
-								valueChanging = false;
-							}
-						}
-					}
-					currentIndex = selectedIndex;
-				}
-			});
-
-			textArea = new JTextArea();
-			textArea.getDocument().addDocumentListener(new DocumentListener() {
-				public void changedUpdate(DocumentEvent e) {
-				}
-
-				public void insertUpdate(DocumentEvent e) {
-					updateValue();
-				}
-
-				public void removeUpdate(DocumentEvent e) {
-					updateValue();
-				}
-
-				private void updateValue() {
-					if (!valueChanging) {
-						valueChanging = true;
-						int selectedIndex = comboBox.getSelectedIndex();
-						String value = QueryConfigUtils
-								.valuePerLineToCsv(textArea.getText());
-						componentMap.get(filterList
-								.get(selectedIndex)).setValue(value);
-						valueChanging = false;
-					}
-				}
-			});
-
-			final JFileChooser chooser = new JFileChooser();
-			JButton chooserButton = new JButton("Browse...");
-			chooserButton.setBackground(componentBackgroundColor);
-			chooserButton.setFont(chooserButton.getFont()
-					.deriveFont(Font.PLAIN));
-			chooserButton.addActionListener(new ActionListener() {
-				public void actionPerformed(ActionEvent e) {
-					int returnVal = chooser
-							.showOpenDialog(IdListFilterComponent.this);
-					if (returnVal == JFileChooser.APPROVE_OPTION) {
-						File file = chooser.getSelectedFile();
-						if (file != null && file.exists() && file.canRead()
-								&& !file.isDirectory()) {
-							StringBuffer buffer = new StringBuffer();
-							BufferedReader in = null;
-							try {
-								in = new BufferedReader(new FileReader(file));
-								String line = in.readLine();
-								while (line != null) {
-									buffer.append(line);
-									buffer.append(QueryConfigUtils.LINE_END);
-									line = in.readLine();
-								}
-							} catch (IOException e1) {
-								// no action
-							} finally {
-								if (in != null) {
-									try {
-										in.close();
-									} catch (IOException e1) {
-										// give up
-									}
-								}
-							}
-							textArea.setText(buffer.toString());
-						}
-					}
-				}
-			});
-
-			JPanel buttonPanel = new JPanel(new BorderLayout());
-			buttonPanel.setBackground(componentBackgroundColor);
-			buttonPanel.add(chooserButton, BorderLayout.WEST);
-
-			JScrollPane textScrollPane = new JScrollPane(textArea);
-			textScrollPane.setBackground(componentBackgroundColor);
-			textScrollPane.setPreferredSize(new Dimension(200, 80));
-
-			add(comboBox, BorderLayout.NORTH);
-			add(textScrollPane, BorderLayout.CENTER);
-			add(buttonPanel, BorderLayout.SOUTH);
-
-		}
-
-		public void setSelectorButton(AbstractButton button) {
-			selectorButton = button;
-			button.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					int selectedIndex = comboBox.getSelectedIndex();
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-						if (!valueChanging) {
-							valueChanging = true;
-							QueryComponent queryComponent = componentMap
-									.get(filterList.get(selectedIndex));
-							queryComponent.setValue(QueryConfigUtils
-									.valuePerLineToCsv(textArea.getText()));
-							queryComponent.setSelected(true);
-							valueChanging = false;
-						}
-					} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-						if (!valueChanging) {
-							valueChanging = true;
-							componentMap.get(filterList
-									.get(selectedIndex)).setSelected(false);
-							valueChanging = false;
-						}
-					}
-				}
-			});
-
-		}
-
-		public int getType() {
-			return FILTER;
-		}
-
-	}
-
-	class BooleanListFilterComponent extends QueryComponent {
-		private static final long serialVersionUID = 1L;
-
-		private DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel();
-
-		private JComboBox comboBox;
-
-		private BooleanFilterComponent booleanFilterComponent;
-
-		private Map componentMap = new HashMap();
-
-		private List<String> filterList = new ArrayList<String>();
-
-		private int currentIndex;
-
-		public BooleanListFilterComponent(FilterDescription description,
-				MartDataset dataset, List filterComponentList) {
-			setLayout(new MinimalLayout(MinimalLayout.HORIZONTAL));
-			setBackground(componentBackgroundColor);
-
-			comboBox = new JComboBox();
-			comboBox.setFont(comboBox.getFont().deriveFont(Font.PLAIN));
-			comboBox.setBackground(componentBackgroundColor);
-			comboBox.setModel(comboBoxModel);
-
-			for (Iterator iter = filterComponentList.iterator(); iter.hasNext();) {
-				BooleanFilterComponent filterComponent = (BooleanFilterComponent) iter
-						.next();
-				BaseNamedConfigurationObject filterDescription = filterComponent
-						.getConfigObject();
-				componentMap.put(filterDescription.getInternalName(),
-						filterComponent);
-				filterList.add(filterDescription.getInternalName());
-				comboBoxModel.addElement(filterDescription.getDisplayName());
-				filterToDisplayName.put(filterDescription.getInternalName(),
-						filterDescription.getDisplayName());
-				filterComponent
-						.addQueryComponentListener(new QueryComponentAdapter() {
-							public void filterAdded(QueryComponentEvent event) {
-								comboBox.setSelectedIndex(filterList
-										.indexOf(event.getName()));
-								selectorButton.setSelected(true);
-							}
-
-							public void filterChanged(QueryComponentEvent event) {
-								booleanFilterComponent.setValue(event
-										.getValue());
-							}
-						});
-				filterComponent.setSelectorButton(new JCheckBox());
-			}
-
-			comboBox.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					int selectedIndex = comboBox.getSelectedIndex();
-					if (selectorButton.isSelected()) {
-						if (e.getStateChange() == ItemEvent.SELECTED) {
-							QueryComponent queryComponent = (QueryComponent) componentMap
-									.get(filterList.get(selectedIndex));
-							queryComponent.setValue(booleanFilterComponent
-									.getValue());
-							queryComponent.setSelected(true);
-						} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-							((QueryComponent) componentMap.get(filterList
-									.get(currentIndex))).setSelected(false);
-						}
-					}
-					currentIndex = selectedIndex;
-				}
-			});
-
-			booleanFilterComponent = new BooleanFilterComponent(
-					new FilterDescription(), dataset);
-			booleanFilterComponent
-					.addQueryComponentListener(new QueryComponentAdapter() {
-						public void filterChanged(QueryComponentEvent event) {
-							int selectedIndex = comboBox.getSelectedIndex();
-							((QueryComponent) componentMap.get(filterList
-									.get(selectedIndex))).setValue(event
-									.getValue());
-						}
-					});
-
-			JPanel comboBoxPanel = new JPanel(new MinimalLayout());
-			comboBoxPanel.setBackground(componentBackgroundColor);
-			comboBoxPanel.setBorder(new EmptyBorder(5, 5, 0, 0));
-			add(comboBox);
-			add(booleanFilterComponent);
-		}
-
-		public void setSelectorButton(AbstractButton button) {
-			selectorButton = button;
-			button.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					int selectedIndex = comboBox.getSelectedIndex();
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-						QueryComponent queryComponent = (QueryComponent) componentMap
-								.get(filterList.get(selectedIndex));
-						queryComponent.setValue(booleanFilterComponent
-								.getValue());
-						queryComponent.setSelected(true);
-					} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-						((QueryComponent) componentMap.get(filterList
-								.get(selectedIndex))).setSelected(false);
-					}
-				}
-			});
-		}
-
-		public int getType() {
-			return FILTER;
-		}
-
-	}
-
-	class BooleanFilterComponent extends QueryComponent {
-		private static final long serialVersionUID = 1L;
-
-		private static final String ONLY = "only";
-
-		private static final String EXCLUDED = "excluded";
-
-		private ButtonGroup buttonGroup = new ButtonGroup();
-
-		private JRadioButton only;
-
-		private JRadioButton excluded;
-
-		public BooleanFilterComponent(FilterDescription filterDescription,
-				MartDataset dataset) {
-			setConfigObject(filterDescription);
-			setDataset(dataset);
-			setName(filterDescription.getInternalName());
-			setBackground(componentBackgroundColor);
-
-			setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
-			setBackground(componentBackgroundColor);
-
-			only = new JRadioButton("Only");
-			only.setFont(only.getFont().deriveFont(Font.PLAIN));
-			only.setBackground(componentBackgroundColor);
-			only.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-						fireFilterChanged(new QueryComponentEvent(this,
-								getName(), getDataset(), ONLY));
-					}
-				}
-			});
-			buttonGroup.add(only);
-			add(only);
-
-			excluded = new JRadioButton("Excluded");
-			excluded.setFont(excluded.getFont().deriveFont(Font.PLAIN));
-			excluded.setBackground(componentBackgroundColor);
-			excluded.addItemListener(new ItemListener() {
-				public void itemStateChanged(ItemEvent e) {
-					if (e.getStateChange() == ItemEvent.SELECTED) {
-						fireFilterChanged(new QueryComponentEvent(this,
-								getName(), getDataset(), EXCLUDED));
-					}
-				}
-			});
-			buttonGroup.add(excluded);
-			add(excluded);
-
-			setValue(filterDescription.getQualifier());
-		}
-
-		public int getType() {
-			return FILTER;
-		}
-
-		public String getValue() {
-			if (excluded.isSelected()) {
-				return EXCLUDED;
-			} else {
-				return ONLY;
-			}
-		}
-
-		public void setValue(String value) {
-			if (EXCLUDED.equals(value)) {
-				excluded.setSelected(true);
-			} else {
-				only.setSelected(true);
-			}
-		}
-
-	}
-
-	class AttributeComponent extends QueryComponent {
-		private static final long serialVersionUID = 1L;
-
-		private AbstractButton button;
-
-		private AbstractButton offButton;
-
-		public AttributeComponent(
-				BaseNamedConfigurationObject attributeDescription,
-				MartDataset dataset, Object offButton) {
-			this.offButton = (AbstractButton) offButton;
-			setConfigObject(attributeDescription);
-			setDataset(dataset);
-			setName(attributeDescription.getInternalName());
-			if (attributeDescription instanceof AttributeList) {
-				setValue(((AttributeList) attributeDescription).getAttributes());
-			}
-			setLayout(new BorderLayout());
-			setBackground(componentBackgroundColor);
-			// if there's no display name the attribute isn't displayed
-			String displayName = attributeDescription.getDisplayName();
-			if (displayName != null) {
-				attributeToDisplayName.put(attributeDescription
-						.getInternalName(), displayName);
-				if (offButton != null) {
-					button = new JRadioButton(QueryConfigUtils
-							.splitSentence(displayName));
-				} else {
-					button = new JCheckBox(QueryConfigUtils
-							.splitSentence(displayName));
-				}
-				button.setFont(button.getFont().deriveFont(Font.PLAIN));
-				button.setBackground(componentBackgroundColor);
-				setSelectorButton(button);
-
-				String description = attributeDescription.getDescription();
-				if (description != null) {
-					button.setToolTipText(description);
-				}
-
-				add(button, BorderLayout.WEST);
-
-				button.addItemListener(new ItemListener() {
-					public void itemStateChanged(ItemEvent e) {
-						if (!settingAttributeState) {
-							settingAttributeState = true;
-							List attributes = (List) attributeNameToComponentMap
-									.get(getQualifiedName());
-							if (attributes != null) {
-								for (Iterator iter = attributes.iterator(); iter
-										.hasNext();) {
-									AttributeComponent attribute = (AttributeComponent) iter
-											.next();
-									if (attribute != AttributeComponent.this) {
-										if (e.getStateChange() == ItemEvent.SELECTED) {
-											attribute.setSelected(true);
-										} else if (e.getStateChange() == ItemEvent.DESELECTED) {
-											attribute.setSelected(false);
-										}
-									}
-								}
-							}
-							settingAttributeState = false;
-						}
-					}
-				});
-			}
-		}
-
-		public int getType() {
-			return ATTRIBUTE;
-		}
-
-		public void setSelected(boolean selected) {
-			if (offButton != null) {
-				if (selected) {
-					button.setSelected(true);
-				} else {
-					offButton.setSelected(true);
-				}
-			} else if (button != null) {
-				button.setSelected(selected);
-			}
-		}
-
-		public boolean isSelected() {


<TRUNCATED>