/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.cluster.configuration.internal; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import de.rcenvironment.core.gui.cluster.view.internal.ClusterJobInformationModel; import de.rcenvironment.core.utils.cluster.ClusterJobInformation; import de.rcenvironment.core.utils.cluster.ClusterQueuingSystem; import de.rcenvironment.core.utils.cluster.ClusterQueuingSystemConstants; /** * Dialog to create a new cluster connection configuration. * * @author Doreen Seider */ public class CreateClusterConnectionConfigurationDialog extends TitleAreaDialog { protected static final int CREATE = 2; protected Combo queuingSystemCombo; protected Text qstatPathText; protected Text showqPathText; protected Text qdelPathText; protected Text hostText; protected Text portText; protected Text usernameText; protected Text passwordText; protected Button savePasswordCheckbox; protected Text configurationNameText; protected Button defaultConfigurationNameCheckbox; protected Button createButton; protected List<String> existingConfigurationNames; private ClusterQueuingSystem queuingSystem; private Map<String, String> pathsToClusterQueuingSystemCommands = new HashMap<>(); private String host; private int port; private String username; private String password; private String configurationName; private boolean savePassword; private Label showqPathLabel; public CreateClusterConnectionConfigurationDialog(Shell parentShell, List<String> existingConfigurationNames) { super(parentShell); this.existingConfigurationNames = existingConfigurationNames; } @Override public void create() { super.create(); setTitle(Messages.newConfigurationDialogTitle); setMessage(Messages.newConfigurationDialogMessage); } @Override protected Control createDialogArea(Composite parent) { Composite control = (Composite) super.createDialogArea(parent); Composite container = new Composite(control, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.makeColumnsEqualWidth = false; container.setLayout(layout); GridData gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; container.setLayoutData(gridData); Label queuingSystemLabel = new Label(container, SWT.NONE); queuingSystemLabel.setText(Messages.queueingSystemLabel); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; queuingSystemCombo = new Combo(container, SWT.DROP_DOWN | SWT.READ_ONLY); queuingSystemCombo.setLayoutData(gridData); for (ClusterQueuingSystem system : ClusterQueuingSystem.values()) { queuingSystemCombo.add(system.name()); } queuingSystemCombo.select(0); createQueuingSystemCommandPathsLabelsAndTexts(container); Label hostLabel = new Label(container, SWT.NONE); hostLabel.setText(Messages.hostLabel); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; hostText = new Text(container, SWT.BORDER); hostText.setLayoutData(gridData); Label portLabel = new Label(container, SWT.NONE); portLabel.setText(Messages.portLabel); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; portText = new Text(container, SWT.BORDER); portText.setLayoutData(gridData); portText.setText(String.valueOf(ClusterJobInformation.DEFAULT_SSH_PORT)); Label usernameLabel = new Label(container, SWT.NONE); usernameLabel.setText(Messages.usernameLabel); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = GridData.VERTICAL_ALIGN_BEGINNING; usernameText = new Text(container, SWT.BORDER); usernameText.setLayoutData(gridData); Label passwordLabel = new Label(container, SWT.NONE); passwordLabel.setText(Messages.passwordLabel); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; passwordText = new Text(container, SWT.BORDER | SWT.PASSWORD); passwordText.setLayoutData(gridData); passwordText.setEnabled(false); // placeholder label new Label(container, SWT.NONE); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; savePasswordCheckbox = new Button(container, SWT.CHECK); savePasswordCheckbox.setText(Messages.savePasswordCheckboxLabel); savePasswordCheckbox.setLayoutData(gridData); Label configurationNameLabel = new Label(container, SWT.NONE); configurationNameLabel.setText(Messages.configurationNameLabel); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; configurationNameText = new Text(container, SWT.BORDER); configurationNameText.setLayoutData(gridData); configurationNameText.setEnabled(false); new Label(container, SWT.NONE); // placeholder label gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; defaultConfigurationNameCheckbox = new Button(container, SWT.CHECK); defaultConfigurationNameCheckbox.setText(Messages.useDefaultNameCheckboxLabel); defaultConfigurationNameCheckbox.setLayoutData(gridData); defaultConfigurationNameCheckbox.setSelection(true); setListener(); return container; } private void setShowqElementsEnabled() { showqPathText.setEnabled(queuingSystemCombo.getSelectionIndex() == 1); showqPathLabel.setEnabled(queuingSystemCombo.getSelectionIndex() == 1); } private void setListener() { queuingSystemCombo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { setShowqElementsEnabled(); } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } }); hostText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validateInput(); } }); portText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validateInput(); } }); usernameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validateInput(); } }); passwordText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validateInput(); } }); savePasswordCheckbox.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { passwordText.setEnabled(savePasswordCheckbox.getSelection()); validateInput(); } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } }); configurationNameText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent event) { validateInput(); } }); defaultConfigurationNameCheckbox.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent event) { configurationNameText.setEnabled(!defaultConfigurationNameCheckbox.getSelection()); validateInput(); } @Override public void widgetDefaultSelected(SelectionEvent event) { widgetSelected(event); } }); } private void createQueuingSystemCommandPathsLabelsAndTexts(Composite container) { Label qstatPathLabel = new Label(container, SWT.NONE); qstatPathLabel.setText("Path 'qstat' (optional)"); GridData gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; qstatPathText = new Text(container, SWT.BORDER); qstatPathText.setLayoutData(gridData); Label qdelPathLabel = new Label(container, SWT.NONE); qdelPathLabel.setText("Path 'qdel' (optional)"); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; qdelPathText = new Text(container, SWT.BORDER); qdelPathText.setLayoutData(gridData); showqPathLabel = new Label(container, SWT.NONE); showqPathLabel.setText("Path 'showq' (optional)"); gridData = new GridData(); gridData.grabExcessHorizontalSpace = true; gridData.horizontalAlignment = GridData.FILL; showqPathText = new Text(container, SWT.BORDER); showqPathText.setLayoutData(gridData); setShowqElementsEnabled(); } @Override protected Control createButtonBar(Composite parent) { final Composite buttonBar = new Composite(parent, SWT.NONE); final GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.makeColumnsEqualWidth = false; layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); buttonBar.setLayout(layout); final GridData data = new GridData(SWT.FILL, SWT.BOTTOM, true, false); data.grabExcessHorizontalSpace = true; data.grabExcessVerticalSpace = false; buttonBar.setLayoutData(data); final Control buttonControl = super.createButtonBar(buttonBar); buttonControl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false)); return buttonBar; } @Override protected void createButtonsForButtonBar(Composite parent) { createButton = createButton(parent, CREATE, Messages.createButtonTitle, true); createButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (validateInput()) { saveInput(); setReturnCode(CREATE); close(); } } }); Button cancelButton = createButton(parent, CANCEL, Messages.cancel, false); cancelButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setReturnCode(CANCEL); close(); } }); createButton.setEnabled(validateInput()); } private boolean validateInput() { boolean valid = true; if (hostText.getText().length() == 0) { setErrorMessage(Messages.provideHostLabel); valid = false; } if (valid && portText.getText().length() == 0) { setErrorMessage(Messages.providePortLabel); valid = false; } if (valid) { try { Integer.valueOf(portText.getText()); } catch (NumberFormatException e) { setErrorMessage(Messages.providePortNumberLabel); valid = false; } } if (valid && usernameText.getText().length() == 0) { setErrorMessage(Messages.provideUsernameLabel); valid = false; } if (valid && savePasswordCheckbox.getSelection()) { if (passwordText.getText().length() == 0) { setErrorMessage(Messages.providePasswordLabel); valid = false; } } if (valid) { valid = isConfigurationNameValid(null); } if (valid) { setErrorMessage(null); } if (createButton != null) { createButton.setEnabled(valid); } return valid; } protected boolean isConfigurationNameValid(String currentConfigurationName) { boolean valid = true; if (!defaultConfigurationNameCheckbox.getSelection()) { if (configurationNameText.getText().length() == 0) { setErrorMessage(Messages.configurationNameLabel); valid = false; } } else if (existingConfigurationNames.contains(usernameText.getText() + "@" + hostText.getText()) && (currentConfigurationName == null || !configurationNameText.getText().equals(currentConfigurationName))) { setErrorMessage(Messages.provideAnotherConfigurationNameLabel); valid = false; } if ((existingConfigurationNames.contains(configurationNameText.getText()) && (currentConfigurationName == null || !configurationNameText.getText().equals(currentConfigurationName))) // not clean approach to check for placeholder here but it is not very likely that a user will run into this and want to provide // this placeholder as configuration name || ClusterJobInformationModel.NOT_CONNECTED.equals(configurationNameText.getText())) { setErrorMessage(Messages.provideAnotherConfigurationNameLabel); valid = false; } return valid; } @Override protected boolean isResizable() { return true; } private void saveInput() { queuingSystem = ClusterQueuingSystem.valueOf(queuingSystemCombo.getItem(queuingSystemCombo.getSelectionIndex())); saveQueuingSystemCommandPath(ClusterQueuingSystemConstants.COMMAND_QSTAT, qstatPathText); saveQueuingSystemCommandPath(ClusterQueuingSystemConstants.COMMAND_QDEL, qdelPathText); saveQueuingSystemCommandPath(ClusterQueuingSystemConstants.COMMAND_SHOWQ, showqPathText); host = hostText.getText(); port = Integer.valueOf(portText.getText()); username = usernameText.getText(); if (savePasswordCheckbox.getSelection()) { password = passwordText.getText(); } if (defaultConfigurationNameCheckbox.getSelection()) { configurationName = username + "@" + host; } else { configurationName = configurationNameText.getText(); } } private void saveQueuingSystemCommandPath(String command, Text commandPathText) { String commandPath = commandPathText.getText(); if (!commandPath.isEmpty()) { if (!commandPath.endsWith("/")) { commandPath = commandPath + "/"; } pathsToClusterQueuingSystemCommands.put(command, commandPath); } } public ClusterQueuingSystem getClusterQueuingSystem() { return queuingSystem; } public Map<String, String> getPathsToClusterQueuingSystemCommands() { return Collections.unmodifiableMap(pathsToClusterQueuingSystemCommands); } public String getHost() { return host; } public int getPort() { return port; } public String getUsername() { return username; } public String getPassword() { return password; } public String getConfigurationName() { return configurationName; } /** * @return <code>true</code> if password should be saved, otherwise <code>false</code> */ public boolean savePassword() { return savePassword; } }