/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.cluster.gui.properties;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import de.rcenvironment.components.cluster.common.ClusterComponentConstants;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.gui.utils.incubator.WidgetGroupFactory;
import de.rcenvironment.core.gui.utils.incubator.WidgetGroupFactory.LabelAndTextForProperty;
import de.rcenvironment.core.gui.workflow.executor.properties.HostSection;
import de.rcenvironment.core.utils.cluster.ClusterQueuingSystem;
/**
* {@link HostSection} enhanced with configuration options for cluster, e.g. queuing system.
*
* @author Doreen Seider
*/
public class ClusterHostSection extends HostSection {
private static final String QSUB = "qsub";
private static final String QSTAT = "qstat";
private static final String SHOWQ = "showq";
private final Updater updater = createUpdater();
private Combo queuingSystemCombo;
private Text qsubPathText;
private Text qstatPathText;
private Text showqPathText;
private Label showQPathLabel;
@Override
protected void createCompositeContent(final Composite parent, final TabbedPropertySheetPage aTabbedPropertySheetPage) {
super.createCompositeContent(parent, aTabbedPropertySheetPage);
TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage.getWidgetFactory();
Section queuingSystemSection = factory.createSection(parent, Section.TITLE_BAR | Section.EXPANDED);
queuingSystemSection.setText(Messages.configureQueuingSystem);
Composite queuingSystemParent = factory.createFlatFormComposite(queuingSystemSection);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
queuingSystemParent.setLayout(layout);
Label queuingSystemLabel = new Label(queuingSystemParent, SWT.NONE);
queuingSystemLabel.setText(Messages.queueingSystemLabel);
GridData gridData = new GridData();
gridData.widthHint = TEXT_WIDTH;
queuingSystemCombo = new Combo(queuingSystemParent, SWT.DROP_DOWN | SWT.READ_ONLY);
queuingSystemCombo.setLayoutData(gridData);
for (ClusterQueuingSystem system : ClusterQueuingSystem.values()) {
queuingSystemCombo.add(system.name());
}
qsubPathText = WidgetGroupFactory.addLabelAndTextfieldForPropertyToComposite(queuingSystemParent, "Path 'qsub' (optional)",
ClusterComponentConstants.CONFIG_KEY_PATHTOQUEUINGSYSTEMCOMMANDS, TEXT_WIDTH, WidgetGroupFactory.NONE).text;
qstatPathText = WidgetGroupFactory.addLabelAndTextfieldForPropertyToComposite(queuingSystemParent, "Path 'qstat' (optional)",
ClusterComponentConstants.CONFIG_KEY_PATHTOQUEUINGSYSTEMCOMMANDS, TEXT_WIDTH, WidgetGroupFactory.NONE).text;
LabelAndTextForProperty labelAndText = WidgetGroupFactory.addLabelAndTextfieldForPropertyToComposite(queuingSystemParent,
"Path 'showq' (optional)", ClusterComponentConstants.CONFIG_KEY_PATHTOQUEUINGSYSTEMCOMMANDS, TEXT_WIDTH,
WidgetGroupFactory.NONE);
showQPathLabel = labelAndText.label;
showqPathText = labelAndText.text;
queuingSystemCombo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent event) {
setProperty(ClusterComponentConstants.CONFIG_KEY_QUEUINGSYSTEM,
queuingSystemCombo.getItem(queuingSystemCombo.getSelectionIndex()));
enableShowqWidgets(queuingSystemCombo.getSelectionIndex() == 1);
}
@Override
public void widgetDefaultSelected(SelectionEvent event) {
widgetSelected(event);
}
});
queuingSystemSection.setClient(queuingSystemParent);
}
private void enableShowqWidgets(boolean enable) {
showQPathLabel.setEnabled(enable);
showqPathText.setEnabled(enable);
}
@Override
protected void setWorkflowNode(WorkflowNode workflowNode) {
super.setWorkflowNode(workflowNode);
queuingSystemCombo.select(queuingSystemCombo.indexOf(getProperty(ClusterComponentConstants.CONFIG_KEY_QUEUINGSYSTEM)));
enableShowqWidgets(queuingSystemCombo.getSelectionIndex() == 1);
}
@Override
protected Controller createController() {
return new PropertyController();
}
@Override
protected Updater createUpdater() {
return new PropertyUpdater();
}
@Override
protected Synchronizer createSynchronizer() {
return new PropertySynchronizer();
}
/**
* Handles the queuing system command paths as they are handled with three {@link Text}s, but stored within one property.
* @author Doreen Seoder
*/
private class PropertyController extends DefaultController {
@Override
public void modifyText(final ModifyEvent event) {
final Object source = event.getSource();
if (source == qsubPathText) {
controls(qsubPathText, QSUB);
} else if (source == qstatPathText) {
controls(qstatPathText, QSTAT);
} else if (source == showqPathText) {
controls(showqPathText, SHOWQ);
} else {
super.modifyText(event);
}
}
private void controls(Text text, String command) {
String oldProp = getProperty(ClusterComponentConstants.CONFIG_KEY_PATHTOQUEUINGSYSTEMCOMMANDS);
Map<String, String> paths = ClusterComponentConstants.extractPathsToQueuingSystemCommands(oldProp);
String textContent = text.getText();
if (!textContent.equals(paths.get(command))) {
if (editCommand == null || !editCommand.isEditable()) {
editCommand = editProperty(ClusterComponentConstants.CONFIG_KEY_PATHTOQUEUINGSYSTEMCOMMANDS);
}
if (textContent.isEmpty()) {
paths.remove(command);
} else {
if (!textContent.endsWith("/")) {
textContent = textContent + "/";
}
paths.put(command, textContent);
}
editCommand.setNewValue(ClusterComponentConstants.getCommandsPathsAsPropertyString(paths));
}
}
}
/**
* Handles the queuing system command paths as they are handled with three {@link Text}s, but stored within one property.
* @author Doreen Seoder
*/
protected class PropertyUpdater extends DefaultUpdater {
@Override
public void initializeControl(final Control control, final String propertyName, final String value) {
updateControl(control, propertyName, value, null);
}
@Override
public void updateControl(final Control control, final String propertyName, final String newValue, final String oldValue) {
if (newValue != oldValue && propertyName.equals(ClusterComponentConstants.CONFIG_KEY_PATHTOQUEUINGSYSTEMCOMMANDS)) {
Map<String, String> paths = ClusterComponentConstants.extractPathsToQueuingSystemCommands(newValue);
if (paths.containsKey(QSUB) && !qsubPathText.getText().equals(paths.get(QSUB))) {
qsubPathText.setText(valueOrDefault(paths.get(QSUB), ""));
}
if (paths.containsKey(QSTAT) && !qstatPathText.getText().equals(paths.get(QSTAT))) {
qstatPathText.setText(valueOrDefault(paths.get(QSTAT), ""));
}
if (paths.containsKey(SHOWQ) && !showqPathText.getText().equals(paths.get(SHOWQ))) {
showqPathText.setText(valueOrDefault(paths.get(SHOWQ), ""));
}
} else {
super.updateControl(control, propertyName, newValue, oldValue);
}
}
}
/**
* Delegates to own {@link Updater} implementation.
*
* @author Doreen Seider
*/
private class PropertySynchronizer extends DefaultSynchronizer {
@Override
protected void handlePropertyChange(final Control control, final String key, final String newValue, final String oldValue) {
updater.updateControl(control, key, newValue, oldValue);
}
}
}