/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.wizards.toolintegration; import java.io.File; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.help.IWorkbenchHelpSystem; import de.rcenvironment.core.component.api.ComponentConstants; import de.rcenvironment.core.component.integration.ToolIntegrationConstants; import de.rcenvironment.core.component.model.endpoint.api.EndpointDefinition; import de.rcenvironment.core.datamodel.api.DataType; import de.rcenvironment.core.gui.wizards.toolintegration.api.ToolIntegrationWizardPage; import de.rcenvironment.core.utils.common.StringUtils; import jodd.mail.EmailAddress; /** * @author Sascha Zur * @author Goekhan Guerkan * @author Doreen Seider */ public class InOutputConfigurationPage extends ToolIntegrationWizardPage { /** Key for in-/output from configuration map. */ public static final String FOLDER = ToolIntegrationConstants.KEY_ENDPOINT_FOLDER; /** Key for in-/output from configuration map. */ public static final String DATA_TYPE = ToolIntegrationConstants.KEY_ENDPOINT_DATA_TYPE; /** Key for in-/output from configuration map. */ public static final String NAME = ToolIntegrationConstants.KEY_ENDPOINT_NAME; /** Key for in-/output from configuration map. */ public static final String FILENAME = ToolIntegrationConstants.KEY_ENDPOINT_FILENAME; /** Key for in-/output from configuration map. */ public static final String USAGE = ToolIntegrationConstants.KEY_ENDPOINT_USAGE; /** Key for in-/output from configuration map. */ public static final String HANDLING = ToolIntegrationConstants.KEY_INPUT_HANDLING; /** Key for in-/output from configuration map. */ public static final String CONSTRAINT = ToolIntegrationConstants.KEY_INPUT_EXECUTION_CONSTRAINT; /** Key for in-/output from configuration map. */ public static final String DEFAULT_HANDLING = ToolIntegrationConstants.KEY_DEFAULT_INPUT_HANDLING; /** Key for in-/output from configuration map. */ public static final String DEFAULT_CONSTRAINT = ToolIntegrationConstants.KEY_DEFAULT_INPUT_EXECUTION_CONSTRAINT; /** Key for the input keyword. */ public static final String INPUTS = ToolIntegrationConstants.KEY_ENDPOINT_INPUTS; private static final String HELP_CONTEXT_ID = "de.rcenvironment.core.gui.wizard.toolintegration.integration_inputOutput"; private static final String OUTPUTS = ToolIntegrationConstants.KEY_ENDPOINT_OUTPUTS; private Map<String, Object> configurationMap; private ButtonSelectionListener btnSelectionListener; private Table inputTable; private Table outputTable; private Table activTable; private Button waitForVerificationButton; private Button defaultTokenLocationButton; private Button customTokenLocationButton; private Text customTokenLocationText; private Button chooseCustomTokenLocationButton; private Button sendMailButton; private Text emailReciepientsText; private boolean validateVerificationTab = true; protected InOutputConfigurationPage(String pageName, Map<String, Object> configurationMap) { super(pageName); setTitle(pageName); setDescription(Messages.inoutputPageDescription); this.configurationMap = configurationMap; if (configurationMap.get(INPUTS) == null) { configurationMap.put(INPUTS, new LinkedList<Object>()); } if (configurationMap.get(OUTPUTS) == null) { configurationMap.put(OUTPUTS, new LinkedList<Object>()); } } @Override public void createControl(Composite parent) { CTabFolder tabFolder = new CTabFolder(parent, SWT.BORDER); inputTable = createEndpointTableTab(Messages.inputs, INPUTS, tabFolder); outputTable = createEndpointTableTab(Messages.outputs, OUTPUTS, tabFolder); createResultVerificationTab(tabFolder); updateTable(INPUTS); updateTable(OUTPUTS); fillContextMenu(inputTable); fillContextMenu(outputTable); tabFolder.setSelection(0); setControl(tabFolder); PlatformUI.getWorkbench().getHelpSystem().setHelp(this.getControl(), HELP_CONTEXT_ID); setPageComplete(true); } private Table createEndpointTableTab(String name, final String type, CTabFolder tabFolder) { CTabItem item = new CTabItem(tabFolder, SWT.NONE); item.setText(name); Composite client = new Composite(tabFolder, SWT.NONE); client.setLayout(new GridLayout(2, false)); item.setControl(client); final Composite tableComposite = new Composite(client, SWT.NONE); TableColumnLayout tableLayout = new TableColumnLayout(); tableComposite.setLayout(tableLayout); final Table table = new Table(tableComposite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER); table.setHeaderVisible(true); GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 5); final int minHeight = 140; tableLayoutData.heightHint = minHeight; // effectively min height tableComposite.setLayoutData(tableLayoutData); // first column - name TableColumn col1 = new TableColumn(table, SWT.NONE); col1.setText(name.substring(0, name.length() - 1)); // second column - data type TableColumn col2 = new TableColumn(table, SWT.NONE); col2.setText(Messages.dataType); TableColumn col3 = null; TableColumn col4 = null; /** * Commented out because of bug with renaming file / dir */ // TableColumn col5 = null; if (type.equals(INPUTS)) { col3 = new TableColumn(table, SWT.NONE); col3.setText(Messages.inputHandling); col4 = new TableColumn(table, SWT.NONE); col4.setText(Messages.inputExecutionConstraint); table.setData(INPUTS); /** * Commented out because of bug with renaming file / dir */ // col5 = new TableColumn(table, SWT.NONE); // col5.setText(Messages.filename); } else { table.setData("output"); } // layout data for the columns final int columnWeight = 20; tableLayout.setColumnData(col1, new ColumnWeightData(columnWeight, true)); tableLayout.setColumnData(col2, new ColumnWeightData(columnWeight, true)); if (type.equals(INPUTS)) { tableLayout.setColumnData(col3, new ColumnWeightData(columnWeight, true)); tableLayout.setColumnData(col4, new ColumnWeightData(columnWeight, true)); // tableLayout.setColumnData(col5, new ColumnWeightData(columnWeight, true)); } Button buttonAdd = new Button(client, SWT.FLAT); buttonAdd.setText(Messages.add); buttonAdd.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); buttonAdd.addSelectionListener(new ButtonSelectionListener(buttonAdd, table, name.toLowerCase())); Button buttonEdit = new Button(client, SWT.FLAT); buttonEdit.setText(Messages.edit); buttonEdit.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); btnSelectionListener = new ButtonSelectionListener(buttonEdit, table, name.toLowerCase()); buttonEdit.addSelectionListener(btnSelectionListener); buttonEdit.setEnabled(false); Button buttonRemove = new Button(client, SWT.FLAT); buttonRemove.setText(Messages.remove); buttonRemove.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); buttonRemove.addSelectionListener(new ButtonSelectionListener(buttonRemove, table, name.toLowerCase())); buttonRemove.setEnabled(false); table.addSelectionListener(new TableSelectionListener(table, buttonEdit, buttonRemove)); table.addMouseListener(new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent e) { TableItem[] selection = table.getSelection(); editInputOutput(selection, type); } @Override public void mouseDown(MouseEvent e) { activTable = table; } }); table.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { if (e.keyCode == SWT.DEL) { TableItem[] selection = table.getSelection(); removeInputOutput(selection, type); } } }); return table; } private void updateButtonActivation(Table table, Button edit, Button remove) { boolean enabled = (table.getSelection() != null && table.getSelectionCount() > 0 && table.getItemCount() != 0); edit.setEnabled(enabled); remove.setEnabled(enabled); } private void fillTable(String type) { Table table; if (type.equals(INPUTS)) { table = inputTable; } else { table = outputTable; } table.removeAll(); @SuppressWarnings("unchecked") List<Map<String, String>> staticEndpoints = (List<Map<String, String>>) configurationMap.get(type); fillCells(staticEndpoints, table, type); } private void fillCells(List<Map<String, String>> staticEndpoints, Table table, String type) { if (staticEndpoints != null) { Map<String, Map<String, String>> endpointNames = new TreeMap<String, Map<String, String>>(); for (Map<String, String> endpoint : staticEndpoints) { endpointNames.put(endpoint.get(NAME), endpoint); } for (Entry<String, Map<String, String>> endpointName : endpointNames.entrySet()) { Map<String, String> endpoint = endpointName.getValue(); TableItem item = new TableItem(table, SWT.None); item.setText(0, endpoint.get(NAME)); item.setText(1, DataType.valueOf(endpoint.get(DATA_TYPE)).getDisplayName()); // migration code: initial, required, optional -> immutable, // consuming; required, required if connected if (type.equals(INPUTS)) { if (endpoint.containsKey(HANDLING)) { String text = ""; for (String handling : StringUtils.splitAndUnescape(endpoint.get(HANDLING))) { text += EndpointDefinition.InputDatumHandling.valueOf(handling).getDisplayName(); text += ", "; } item.setText(2, text.substring(0, text.length() - 2)); } else if (endpoint.containsKey(USAGE) && endpoint.get(USAGE).equals("initial")) { item.setText(2, EndpointDefinition.InputDatumHandling.Constant.getDisplayName()); } else { item.setText(2, EndpointDefinition.InputDatumHandling.Single.getDisplayName()); } if (endpoint.containsKey(CONSTRAINT)) { String text = ""; for (String constraint : StringUtils .splitAndUnescape(endpoint.get(CONSTRAINT))) { text += EndpointDefinition.InputExecutionContraint.valueOf(constraint).getDisplayName(); text += ", "; } item.setText(3, text.substring(0, text.length() - 2)); } else if (endpoint.containsKey(USAGE) && endpoint.get(USAGE).equals("optional")) { item.setText(3, EndpointDefinition.InputExecutionContraint.NotRequired.getDisplayName()); } else { item.setText(3, EndpointDefinition.InputExecutionContraint.Required.getDisplayName()); } /** * Commented out because of bug with renaming file / dir */ // if ((DataType.valueOf(endpoint.get(DATA_TYPE)) == DataType.FileReference || // DataType // .valueOf(endpoint.get(DATA_TYPE)) == DataType.DirectoryReference) // && endpoint.get(FILENAME) != null) { // if (endpoint.get(FILENAME).isEmpty()) { // item.setText(4, Messages.emptyFilenameTable); // } else if (endpoint.get(FILENAME).equals("-")) { // item.setText( // 4, // ToolIntegrationConstants.DIRECTORIES_PLACEHOLDER[2] // + File.separator // + endpoint.get(FILENAME)); // } else { // item.setText( // 4, // ToolIntegrationConstants.DIRECTORIES_PLACEHOLDER[2] // + File.separator // + endpoint.get(NAME) // + File.separator // + endpoint.get(FILENAME)); // } // } else { // item.setText(4, "" + "-"); // } } } } } /** * @param type if it is for inputs or for outputs * @return all current configured in- and outputs. */ @SuppressWarnings("unchecked") private List<String> getAllEndpointNames(String type) { List<String> result = new LinkedList<String>(); List<Object> inputEndpoints = (List<Object>) configurationMap.get(type); if (inputEndpoints != null) { for (Object endpoint : inputEndpoints) { Map<String, String> endpointMap = (Map<String, String>) endpoint; result.add(endpointMap.get(NAME)); } } return result; } protected void updateTable(String name) { fillTable(name); } private void createResultVerificationTab(CTabFolder tabFolder) { CTabItem item = new CTabItem(tabFolder, SWT.NONE); item.setText("Verification"); Composite client = new Composite(tabFolder, SWT.NONE); client.setLayout(new GridLayout(1, false)); item.setControl(client); waitForVerificationButton = new Button(client, SWT.CHECK); waitForVerificationButton.setText("Wait for manual output approval (allows manual tool result review and verification)"); Label label = new Label(client, SWT.WRAP); label.setText("Output values are only sent further if they are approved manually. For that, a so called verification key " + "is generated after tool execution.\nWith the key, the tool results can either be approved or rejected with a dialog " + "under 'Run -> Verify tool results...'. "); final Group tokenGroup = new Group(client, SWT.NONE); tokenGroup.setText("Verification Key"); tokenGroup.setLayout(new GridLayout(2, false)); GridData layoutData = new GridData(SWT.FILL, SWT.NONE, true, false); tokenGroup.setLayoutData(layoutData); defaultTokenLocationButton = new Button(tokenGroup, SWT.RADIO); defaultTokenLocationButton.setText("Store verification key in tool working directory (default)"); defaultTokenLocationButton.setSelection(true); layoutData = new GridData(); layoutData.horizontalSpan = 2; defaultTokenLocationButton.setLayoutData(layoutData); customTokenLocationButton = new Button(tokenGroup, SWT.RADIO); customTokenLocationButton.setText("Store verification key at custom location (on the tool's machine)"); layoutData = new GridData(); layoutData.horizontalSpan = 2; customTokenLocationButton.setLayoutData(layoutData); customTokenLocationText = new Text(tokenGroup, SWT.BORDER); layoutData = new GridData(SWT.FILL, SWT.NONE, true, false); customTokenLocationText.setLayoutData(layoutData); chooseCustomTokenLocationButton = new Button(tokenGroup, SWT.PUSH); chooseCustomTokenLocationButton.setText(" ... "); chooseCustomTokenLocationButton.addSelectionListener(new PathChooserButtonListener(customTokenLocationText, true, getShell())); sendMailButton = new Button(tokenGroup, SWT.CHECK); sendMailButton.setText("Send verification key via email (provide addresses below separated by ';')"); layoutData = new GridData(); layoutData.horizontalSpan = 2; sendMailButton.setLayoutData(layoutData); emailReciepientsText = new Text(tokenGroup, SWT.BORDER); layoutData = new GridData(SWT.FILL, SWT.NONE, true, false); layoutData.horizontalSpan = 2; emailReciepientsText.setLayoutData(layoutData); setupVerificationTabListener(); setEnabledStateForVerificationTabElements(); } private void setupVerificationTabListener() { customTokenLocationText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validateVerificationTabAndStoreValues(); } }); customTokenLocationButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { widgetDefaultSelected(event); } @Override public void widgetDefaultSelected(SelectionEvent event) { setEnabledStateForCustomVerificationTokenText(); validateVerificationTabAndStoreValues(); } }); emailReciepientsText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validateVerificationTabAndStoreValues(); } }); sendMailButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { widgetDefaultSelected(event); } @Override public void widgetDefaultSelected(SelectionEvent event) { setEnabledStateForEmailRecipientText(); validateVerificationTabAndStoreValues(); } }); waitForVerificationButton.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { widgetDefaultSelected(event); } @Override public void widgetDefaultSelected(SelectionEvent event) { setEnabledStateForVerificationTabElements(); validateVerificationTabAndStoreValues(); } }); } private void setEnabledStateForEmailRecipientText() { boolean enabled = waitForVerificationButton.getSelection() && sendMailButton.getSelection(); emailReciepientsText.setEnabled(enabled); } private void setEnabledStateForCustomVerificationTokenText() { boolean enabled = waitForVerificationButton.getSelection() && customTokenLocationButton.getSelection(); customTokenLocationText.setEnabled(enabled); chooseCustomTokenLocationButton.setEnabled(enabled); } private void setEnabledStateForVerificationTabElements() { boolean enabled = waitForVerificationButton.getSelection(); defaultTokenLocationButton.setEnabled(enabled); customTokenLocationButton.setEnabled(enabled); customTokenLocationText.setEnabled(customTokenLocationButton.getSelection() && enabled); chooseCustomTokenLocationButton.setEnabled(customTokenLocationButton.getSelection() && enabled); sendMailButton.setEnabled(enabled); emailReciepientsText.setEnabled(sendMailButton.getSelection() && enabled); } private void updateVerificationTab() { boolean waitForVerification = configurationMap.containsKey(ComponentConstants.COMPONENT_CONFIG_KEY_REQUIRES_OUTPUT_APPROVAL) && (boolean) configurationMap.get(ComponentConstants.COMPONENT_CONFIG_KEY_REQUIRES_OUTPUT_APPROVAL); waitForVerificationButton.setSelection(waitForVerification); String customTokenLocation = (String) configurationMap.get(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_LOCATION); if (customTokenLocation != null && !customTokenLocation.isEmpty()) { customTokenLocationButton.setSelection(true); customTokenLocationText.setText(customTokenLocation); defaultTokenLocationButton.setSelection(false); } else { defaultTokenLocationButton.setSelection(true); customTokenLocationButton.setSelection(false); } String emailRecipients = (String) configurationMap.get(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_RECIPIENTS); if (emailRecipients != null && !emailRecipients.isEmpty()) { sendMailButton.setSelection(true); emailReciepientsText.setText(emailRecipients); } setEnabledStateForVerificationTabElements(); } private void validateVerificationTabAndStoreValues() { if (!validateVerificationTab) { return; } boolean validated = true; if (waitForVerificationButton.getSelection()) { if (sendMailButton.getSelection()) { if (emailReciepientsText.getText().isEmpty()) { setMessage("Provide at least one email address.", DialogPage.ERROR); validated = false; } else { for (String emailAddress : emailReciepientsText.getText() .split(ToolIntegrationConstants.VERIFICATION_TOKEN_RECIPIENTS_SEPARATOR)) { if (!emailAddress.replaceAll("\\s+", "").isEmpty() && !new EmailAddress(emailAddress.trim()).isValid()) { setMessage("Email address not valid: " + emailAddress.trim(), DialogPage.ERROR); validated = false; } } } } if (customTokenLocationButton.getSelection() && (customTokenLocationText.getText().trim().isEmpty() || !new File(customTokenLocationText.getText().trim()).isAbsolute())) { setMessage("Provide location for verification key (absolute path required).", DialogPage.ERROR); validated = false; } } if (validated) { setMessage(null, DialogPage.NONE); configurationMap.put(ComponentConstants.COMPONENT_CONFIG_KEY_REQUIRES_OUTPUT_APPROVAL, waitForVerificationButton.getSelection()); if (customTokenLocationButton.getSelection()) { configurationMap.put(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_LOCATION, customTokenLocationText.getText().trim()); } else { configurationMap.remove(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_LOCATION); } if (sendMailButton.getSelection()) { configurationMap.put(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_RECIPIENTS, emailReciepientsText.getText().trim()); } else { configurationMap.remove(ToolIntegrationConstants.KEY_VERIFICATION_TOKEN_RECIPIENTS); } } setPageComplete(validated); } /** * Listener for the in-/output tables. * * @author Sascha Zur */ private final class TableSelectionListener extends SelectionAdapter { private final Table table; private final Button editButton; private final Button removeButton; private TableSelectionListener(Table table, Button editButton, Button removeButton) { this.table = table; this.editButton = editButton; this.removeButton = removeButton; } @Override public void widgetSelected(SelectionEvent e) { updateButtonActivation(table, editButton, removeButton); } @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } } /** * Listener for the table buttons. * * @author Sascha Zur */ private class ButtonSelectionListener implements SelectionListener { private final Button button; private final Table selectionTable; private final String type; ButtonSelectionListener(Button button, Table table, String name) { this.button = button; this.selectionTable = table; type = name; } @Override public void widgetDefaultSelected(SelectionEvent arg0) { widgetSelected(arg0); } @Override public void widgetSelected(SelectionEvent arg0) { TableItem[] selection = selectionTable.getSelection(); if (button.getText().equals(Messages.add)) { // addInputOutput(selection, title, type); addInputOutput(type); } else if (button.getText().equals(Messages.edit)) { editInputOutput(selection, type); } else if (button.getText().equals(Messages.remove)) { removeInputOutput(selection, type); } } } /** * Sets a new configurationMap and updates all fields. * * @param newConfigurationMap new map */ @Override public void setConfigMap(Map<String, Object> newConfigurationMap) { configurationMap = newConfigurationMap; validateVerificationTab = false; updatePageValues(); validateVerificationTab = true; } private void updatePageValues() { updateTable(INPUTS); updateTable(OUTPUTS); updateVerificationTab(); } @Override public void performHelp() { super.performHelp(); IWorkbenchHelpSystem helpSystem = PlatformUI.getWorkbench().getHelpSystem(); helpSystem.displayHelp(HELP_CONTEXT_ID); } @SuppressWarnings("unchecked") private void addInputOutput(String type) { String title = type.substring(0, 1).toUpperCase() + type.substring(1, type.length() - 1); WizardEndpointEditDialog weed = new WizardEndpointEditDialog(null, Messages.add + " " + title, type, getAllEndpointNames(type)); int exit = weed.open(); if (exit == Dialog.OK) { if (((List<Map<String, String>>) configurationMap.get(type)) == null) { configurationMap.put(type, new LinkedList<Map<String, String>>()); } ((List<Map<String, String>>) configurationMap.get(type)).add(weed.getConfig()); updateTable(type); ((ToolIntegrationWizard) getWizard()).updateAllPages(); } } @SuppressWarnings("unchecked") private void editInputOutput(TableItem[] selection, String type) { String title = type.substring(0, 1).toUpperCase() + type.substring(1, type.length() - 1); if (selection != null && selection.length > 0) { List<Map<String, String>> endpointList = (List<Map<String, String>>) configurationMap.get(type); Map<String, String> oldConfig = null; Map<String, String> oldConfigCopy = new HashMap<String, String>(); for (Map<String, String> endpoint : endpointList) { if (endpoint.get(NAME) != null && endpoint.get(NAME).equals(selection[0].getText())) { oldConfigCopy.putAll(endpoint); oldConfig = endpoint; } } WizardEndpointEditDialog weed = new WizardEndpointEditDialog(null, Messages.edit + " " + title, type, oldConfigCopy, getAllEndpointNames(type)); int exit = weed.open(); if (exit == Dialog.OK) { ((List<Map<String, String>>) configurationMap.get(type)).remove(oldConfig); ((List<Map<String, String>>) configurationMap.get(type)).add(weed.getConfig()); updateTable(type); ((ToolIntegrationWizard) getWizard()).updateAllPages(); } } } @SuppressWarnings("unchecked") private void removeInputOutput(TableItem[] selection, String type) { if (selection != null && selection.length > 0) { List<Map<String, String>> endpointList = (List<Map<String, String>>) configurationMap.get(type); Map<String, String> endpointToRemove = null; for (Map<String, String> endpoint : endpointList) { if (endpoint.get(NAME) != null && endpoint.get(NAME).equals(selection[0].getText())) { endpointToRemove = endpoint; } } endpointList.remove(endpointToRemove); updateTable(type); ((ToolIntegrationWizard) getWizard()).updateAllPages(); } } @Override public void updatePage() {} @Override protected void onAddClicked() { if (activTable.getData().equals(INPUTS)) { addInputOutput(INPUTS); } else { addInputOutput(OUTPUTS); } } @Override protected void onEditClicked() { TableItem[] selection = activTable.getSelection(); if (activTable.getData().equals(INPUTS)) { editInputOutput(selection, INPUTS); } else { editInputOutput(selection, OUTPUTS); } } @Override protected void onRemoveClicked() { TableItem[] selection = activTable.getSelection(); if (activTable.getData().equals(INPUTS)) { removeInputOutput(selection, INPUTS); } else { removeInputOutput(selection, OUTPUTS); } } }