/*
* Copyright [1999-2015] Wellcome Trust Sanger Institute and the EMBL-European Bioinformatics Institute
* Copyright [2016-2017] EMBL-European Bioinformatics Institute
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ensembl.healthcheck.eg_gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.border.Border;
import org.ensembl.healthcheck.DatabaseRegistry;
import org.ensembl.healthcheck.GroupOfTests;
import org.ensembl.healthcheck.configuration.ConfigureHost;
import org.ensembl.healthcheck.testcase.EnsTestCase;
import org.ensembl.healthcheck.util.ClassFileFilter;
import org.ensembl.healthcheck.util.Clazz;
import org.ensembl.healthcheck.util.DBUtils;
import org.ensembl.healthcheck.util.Jar;
public class SetupTabBuilder {
protected SetupTab setupTab;
public SetupTabBuilder(
ActionListener actionListener,
String jarFile
) {
this.setupTab = new SetupTab();
setupTab.actionListener = actionListener;
setupTab.jarFile = jarFile;
}
/**
*
* <p>
* Searches the jarFile for classes that are true subclasses of
* GroupOfTests and returns them as a List of GroupOfTests objects.
* </p>
*
* @param jarFile
* @return List<GroupOfTests>
*
*/
protected List<GroupOfTests> createListOfAvailableTestGroupsFromJar(String jarFile) {
List<String> classesInJar = Jar.findAllClassesInJar(jarFile);
List<GroupOfTests> testGroupList = Clazz.instantiateListOfTestGroups(
ClassFileFilter.filterForTrueSubclassesOf(
classesInJar,
GroupOfTests.class
)
);
return testGroupList;
}
protected List<Class<EnsTestCase>> createListOfAvailableTestsFromJar(String jarFile) {
List<String> classesInJar = Jar.findAllClassesInJar(jarFile);
List<Class<EnsTestCase>> testGroupList = Clazz.classloadListOfClasses(
ClassFileFilter.filterForTrueSubclassesOf(
classesInJar,
EnsTestCase.class
)
);
return testGroupList;
}
public void buildTestGroupList() {
setupTab.testGroupList = createListOfAvailableTestGroupsFromJar(setupTab.jarFile);
}
public void buildAllTestsList() {
setupTab.allTestsList = createListOfAvailableTestsFromJar(setupTab.jarFile);
}
public void buildAllTests() {
if (setupTab.testGroupList==null) {
throw new NullPointerException("testGroupList has not been built.");
}
// Create a group that has all tests and add it to the testGroupList
// for the user to select from.
//
GroupOfTests allGroups = new GroupOfTests();
allGroups.addTest(setupTab.allTestsList);
allGroups.setName(Constants.ALL_TESTS_GROUP_NAME);
setupTab.testGroupList.add(allGroups);
}
protected void buildTestInstantiator() {
String packageWithHealthchecks = "org.ensembl.healthcheck.testcase";
String packageWithTestgroups = "org.ensembl.healthcheck.testgroup";
setupTab.testInstantiator = new TestInstantiatorDynamic(
packageWithHealthchecks,
packageWithTestgroups
);
if (setupTab.allGroups!=null) {
setupTab.testInstantiator.addDynamicGroups(Constants.ALL_TESTS_GROUP_NAME, setupTab.allGroups);
}
}
protected void buildListOfTestsToBeExecutedPopupMenu() {
if (setupTab.actionListener==null) {
throw new NullPointerException("actionListener has not been built.");
}
if (setupTab==null) {
throw new NullPointerException("setupTab has not been built.");
}
setupTab.listOfTestsToBeExecutedPopupMenu = GuiTestRunnerFrameComponentBuilder
.createListOfTestsToBeExecutedPopupMenu(setupTab.actionListener);
}
protected void buildMysqlConnectionWidget() {
setupTab.mysqlWidget = new MySqlConnectionWidget(
setupTab.dbDetails,
setupTab.dbPrimaryServerSelector,
setupTab.databaseTabbedPaneWithSearchBox.getDatabasePane()
);
}
protected void buildComponentWiring() {
if (setupTab==null) {
throw new NullPointerException("setupTab has not been built.");
}
if (setupTab.tree==null) {
throw new NullPointerException("setupTab.tree has not been built.");
}
if (setupTab.dbPrimaryServerSelector==null) {
throw new NullPointerException("setupTab.dbServerSelector has not been built.");
}
if (setupTab.dbSecondaryServerSelector==null) {
throw new NullPointerException("setupTab.secondaryDbServerSelector has not been built.");
}
setupTab.databaseTabbedPaneWithSearchBox.getDatabasePane().addActionListener(setupTab.mysqlWidget);
setupTab.dbPrimaryServerSelector.addActionListener(setupTab.mysqlWidget);
JScrollPane treePane = new JScrollPane(setupTab.tree);
JSplitPane testSelectionWidgets = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT,
treePane,
setupTab.testsPane
);
setupTab.setLayout(new BorderLayout());
setupTab.add(setupTab.mysqlWidget, BorderLayout.SOUTH);
setupTab.add(
new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
setupTab.databaseTabbedPaneWithSearchBox,
testSelectionWidgets
),
BorderLayout.CENTER
);
Box hbox = Box.createHorizontalBox();
hbox.add(setupTab.dbPrimaryServerSelector);
hbox.add(setupTab.dbSecondPrimaryServerSelector);
hbox.add(setupTab.dbSecondaryServerSelector);
setupTab.add(hbox, BorderLayout.NORTH);
// Create space around components so they don't look too crammed.
//
Border defaultEmptyBorder = GuiTestRunnerFrameComponentBuilder.defaultEmptyBorder;
Border noBorder = BorderFactory.createEmptyBorder(0, 0, 0, 0);
setupTab.dbPrimaryServerSelector .setBorder(BorderFactory.createTitledBorder(noBorder, "Primary (where your database is):"));
setupTab.dbSecondPrimaryServerSelector.setBorder(BorderFactory.createTitledBorder(noBorder, "Pan db server (for master databases)"));
setupTab.dbSecondaryServerSelector .setBorder(BorderFactory.createTitledBorder(noBorder, "Secondary (for ComparePreviousVersion* tests):"));
setupTab.databaseTabbedPaneWithSearchBox .setBorder(BorderFactory.createTitledBorder(defaultEmptyBorder, "2. Select a database:"));
hbox .setBorder(BorderFactory.createTitledBorder(defaultEmptyBorder, "1. Select database servers:"));
testSelectionWidgets .setBorder(BorderFactory.createTitledBorder(defaultEmptyBorder, "3. Select tests to be run:"));
treePane .setBorder(BorderFactory.createTitledBorder("Drag tests to the panel on the right"));
setupTab.testsPane .setBorder(BorderFactory.createTitledBorder("Select tests and run from context menu"));
/**
* Preferred size of the window.
*
*/
int windowWidth = Constants.INITIAL_APPLICATION_WINDOW_WIDTH;
int windowHeight = Constants.INITIAL_APPLICATION_WINDOW_HEIGHT;
setupTab.databaseTabbedPaneWithSearchBox.setMinimumSize(new Dimension(0, windowHeight/4));
setupTab.testsPane .setMinimumSize(new Dimension(0, windowHeight/4));
treePane .setMinimumSize(new Dimension(windowWidth/3, 0));
}
protected void buildListOfTestsToBeRunArea() {
if (setupTab.testInstantiator==null) {
throw new NullPointerException("testInstantiator has not been built.");
}
if (setupTab.listOfTestsToBeExecutedPopupMenu==null) {
throw new NullPointerException("listOfTestsToBeExecutedPopupMenu has not been built.");
}
if (setupTab.actionListener==null) {
throw new NullPointerException("actionListener has not been built.");
}
setupTab.listOfTestsToBeRun = GuiTestRunnerFrameComponentBuilder.createListOfTestsToBeRunArea(
setupTab.testInstantiator,
setupTab.listOfTestsToBeExecutedPopupMenu,
setupTab.actionListener
);
setupTab.rmSelectedTests = GuiTestRunnerFrameComponentBuilder.createRemoveSelectedTestsButton(setupTab.actionListener);
setupTab.runAllTests = GuiTestRunnerFrameComponentBuilder.createRunAllTestsButton(setupTab.actionListener);
setupTab.runSelectedTests = GuiTestRunnerFrameComponentBuilder.createRunSelectedTestsButton(setupTab.actionListener);
Box buttonBox = Box.createHorizontalBox();
buttonBox.add(setupTab.rmSelectedTests);
buttonBox.add(Box.createHorizontalStrut(Constants.DEFAULT_HORIZONTAL_COMPONENT_SPACING));
buttonBox.add(setupTab.runSelectedTests);
buttonBox.add(Box.createHorizontalStrut(Constants.DEFAULT_HORIZONTAL_COMPONENT_SPACING));
buttonBox.add(setupTab.runAllTests);
setupTab.testsPane = new JPanel(new BorderLayout());
setupTab.testsPane.add(buttonBox, BorderLayout.SOUTH);
setupTab.testsPane.add(new JScrollPane(setupTab.listOfTestsToBeRun), BorderLayout.CENTER);
}
protected void buildDbDetails() {
if (setupTab==null) {
throw new NullPointerException("setupTab has not been built.");
}
if (setupTab.dirsWithDbServerConfigs==null) {
throw new NullPointerException("setupTab.dirsWithDbServerConfigs has not been built.");
}
// Set to false, because checking availability costs too much startup
// time when there are many servers configured and opens too many
// connections.
//
boolean checkAvailabilityOfServers = false;
if (checkAvailabilityOfServers) {
setupTab.dbDetails = GuiTestRunnerFrameUtils.grepForAvailableServers(setupTab.dbDetails);
}
setupTab.dbDetails = GuiTestRunnerFrameUtils.createDbDetailsConfigurations(
setupTab.dirsWithDbServerConfigs
);
}
protected void buildDbServerSelector(
CallByReferenceWorkaround callByReferenceWorkaround,
String actionCommandChanged,
ActionListener actionListener,
String defaultServerName
) {
if (setupTab==null) {
throw new NullPointerException("setupTab has not been built.");
}
if (setupTab.dbDetails==null) {
throw new NullPointerException("setupTab.dbDetails has not been built.");
}
if (setupTab.actionListener==null) {
throw new NullPointerException("setupTab.actionListener has not been built.");
}
JComboBox dbServerSelector = GuiTestRunnerFrameComponentBuilder.createDbServerSelector(setupTab.dbDetails);
dbServerSelector.setActionCommand(actionCommandChanged);
dbServerSelector.addActionListener(actionListener);
//
// See, if the default server name can be found in dbDetails. If so,
// select this as the default server for this database selector.
//
int numServers = setupTab.dbDetails.size();
int defaultSelectedServerIndex = 0;
for (int index=0; index<numServers; index++) {
String serverName = setupTab.dbDetails.get(index).getHost();
if (serverName.contains(defaultServerName)) {
defaultSelectedServerIndex = index;
}
}
if (dbServerSelector.getItemCount()>0) {
dbServerSelector.setSelectedIndex(defaultSelectedServerIndex);
callByReferenceWorkaround.setConfigureHostAttribute(setupTab.dbDetails.get(defaultSelectedServerIndex));
}
callByReferenceWorkaround.setDbServerSelectorAttribute(dbServerSelector);
}
protected interface CallByReferenceWorkaround {
public abstract void setDbServerSelectorAttribute(JComboBox jcb);
public abstract void setConfigureHostAttribute(ConfigureHost ch);
}
protected void buildPrimaryDbServerSelector() {
buildDbServerSelector(
new CallByReferenceWorkaround() {
@Override public void setDbServerSelectorAttribute(JComboBox jcb) {
setupTab.dbPrimaryServerSelector = jcb;
}
@Override
public void setConfigureHostAttribute(ConfigureHost ch) {
setupTab.primaryHostDetails = ch;
}
},
Constants.DB_SERVER_CHANGED,
setupTab.actionListener,
setupTab.defaultPrimaryServerName
);
}
protected void buildSecondaryDbServerSelector() {
buildDbServerSelector(
new CallByReferenceWorkaround() {
@Override public void setDbServerSelectorAttribute(JComboBox jcb) {
setupTab.dbSecondaryServerSelector = jcb;
}
@Override
public void setConfigureHostAttribute(ConfigureHost ch) {
setupTab.secondaryHostDetails = ch;
}
},
Constants.SECONDARY_DB_SERVER_CHANGED,
setupTab.actionListener,
setupTab.defaultSecondaryServerName
);
}
protected void buildSecondDbServerSelector() {
buildDbServerSelector(
new CallByReferenceWorkaround() {
@Override public void setDbServerSelectorAttribute(JComboBox jcb) {
setupTab.dbSecondPrimaryServerSelector = jcb;
}
@Override
public void setConfigureHostAttribute(ConfigureHost ch) {
setupTab.secondPrimaryHostDetails = ch;
}
},
Constants.PAN_DB_SERVER_CHANGED,
setupTab.actionListener,
setupTab.defaultPanServerName
);
}
protected void buildDatabaseTabbedPaneWithSearchBox() {
if (setupTab==null) {
throw new NullPointerException("setupTab has not been built.");
}
if (setupTab.actionListener==null) {
throw new NullPointerException("setupTab.actionListener has not been built.");
}
DBUtils.initialise(false);
List<String> regexps = new ArrayList<String>();
regexps.add(".*");
DatabaseRegistry databaseRegistry = new DatabaseRegistry(regexps, null, null, false);
DatabaseTabbedPane databaseTabbedPane = new DatabaseTabbedPane(databaseRegistry);
databaseTabbedPane.addActionListener(setupTab.actionListener);
setupTab.databaseTabbedPaneWithSearchBox = new DatabaseTabbedPaneWithSearchBox(databaseTabbedPane);
}
protected void buildTreeOfTestGroups() {
if (setupTab==null) {
throw new NullPointerException("guiTestRunnerFrame has not been built.");
}
// Functionality of the popup menu is not implemented yet,
// so no popup menu for the tree
//
//final JPopupMenu popupMenuTree = GuiComponentBuilder
// .createTreeOfTestGroupsPopupMenu(actionListener);
final JPopupMenu popupMenuTree = null;
setupTab.tree = GuiTestRunnerFrameComponentBuilder.createTreeOfTestGroups(
setupTab.testGroupList,
popupMenuTree
);
}
public SetupTab getResult() {
return setupTab;
}
}