/*******************************************************************************
* Copyright (c) 2014 Zend Technologies Ltd.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Zend Technologies Ltd. - initial API and implementation
*******************************************************************************/
package org.zend.php.zendserver.deployment.ui.tunneling;
import java.util.List;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.php.internal.server.core.Server;
import org.eclipse.php.internal.ui.wizards.IControlHandler;
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.layout.FillLayout;
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.FileDialog;
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.Text;
import org.zend.php.server.ui.fragments.AbstractCompositeFragment;
import org.zend.php.zendserver.deployment.core.tunnel.PortForwarding;
import org.zend.php.zendserver.deployment.core.tunnel.SSHTunnelConfiguration;
import org.zend.php.zendserver.deployment.ui.Activator;
import org.zend.php.zendserver.deployment.ui.wizards.PortForwardingWizard;
/**
* @author Wojciech Galanciak, 2014
*
*/
@SuppressWarnings("restriction")
public class TunnelingCompositeFragment extends AbstractCompositeFragment {
public static String ID = "org.zend.php.zendserver.deployment.ui.preferences.TunnelingCompositeFragment"; //$NON-NLS-1$
private Button enableButton;
private Text usernameText;
private Text passwordText;
private Button browseButton;
private Text privateKeyText;
private Text proxyHostText;
private Text proxyPortText;
private Table table;
private Button addButton;
private Button editButton;
private Button removeButton;
private ModifyListener modifyListener;
private TableViewer portForwardingViewer;
private SSHTunnelConfiguration config;
public TunnelingCompositeFragment(Composite parent,
IControlHandler handler, boolean isForEditing) {
super(parent, handler, isForEditing,
Messages.TunnelingCompositeFragment_Name,
Messages.TunnelingCompositeFragment_Title, Messages.TunnelingCompositeFragment_Description);
setImageDescriptor(Activator.getImageDescriptor(Activator.IMAGE_WIZ_SSH_TUNNELING));
handler.setImageDescriptor(getImageDescriptor());
}
/**
* Saves the page's state
*/
public void saveValues() {
if (config.isEnabled()) {
config.store(getServer());
} else {
SSHTunnelConfiguration.remove(getServer());
}
}
public boolean performOk() {
saveValues();
return true;
}
public String getId() {
return ID;
}
public void validate() {
if (config.isEnabled()) {
String username = config.getUsername();
if (username == null || username.isEmpty()) {
setMessage(
Messages.TunnelingCompositeFragment_EmptyUsernameError,
IMessageProvider.ERROR);
return;
}
String password = config.getPassword();
if (password == null || password.isEmpty()) {
String privateKey = privateKeyText.getText();
if (privateKey.isEmpty()) {
setMessage(
Messages.TunnelingCompositeFragment_NoPathNorPasswordError,
IMessageProvider.ERROR);
return;
}
}
List<PortForwarding> portForwardings = config.getPortForwardings();
if (portForwardings == null || portForwardings.isEmpty()) {
setMessage(
Messages.TunnelingCompositeFragment_NoForwardingError,
IMessageProvider.ERROR);
return;
}
String httpProxyPort = config.getHttpProxyPort();
if (httpProxyPort != null && !httpProxyPort.isEmpty()) {
try {
Integer.valueOf(httpProxyPort);
} catch (NumberFormatException e) {
setMessage(
Messages.TunnelingCompositeFragment_InvalidProxyPortError,
IMessageProvider.ERROR);
return;
}
}
}
setMessage(getDescription(), IMessageProvider.NONE);
}
@Override
protected void createContents(Composite parent) {
this.config = new SSHTunnelConfiguration();
modifyListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateData();
validate();
}
};
enableButton = new Button(parent, SWT.CHECK);
enableButton.setText(Messages.TunnelingCompositeFragment_EnableLabel);
enableButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
boolean enabled = enableButton.getSelection();
updateState(enabled);
updateData();
validate();
}
});
createCredentialsGroup(parent);
createPortForwardingGroup(parent);
createProxyGroup(parent);
}
@Override
protected void init() {
Server server = getServer();
if (server != null) {
SSHTunnelConfiguration currentConfig = SSHTunnelConfiguration
.read(server);
boolean enabled = currentConfig.isEnabled();
enableButton.setSelection(enabled);
updateState(enabled);
String username = currentConfig.getUsername();
if (username != null) {
usernameText.setText(username);
}
String password = currentConfig.getPassword();
if (password != null) {
passwordText.setText(password);
}
String privateKey = currentConfig.getPrivateKey();
if (privateKey != null) {
privateKeyText.setText(privateKey);
}
config.setPortForwardings(currentConfig.getPortForwardings());
portForwardingViewer.refresh();
String proxyHost = currentConfig.getHttpProxyHost();
if (proxyHost != null) {
proxyHostText.setText(proxyHost);
}
String proxyPort = currentConfig.getHttpProxyPort();
if (proxyPort != null) {
proxyPortText.setText(proxyPort);
}
} else {
enableButton.setSelection(false);
}
updateData();
updateState(config.isEnabled());
validate();
}
private void createCredentialsGroup(Composite parent) {
Group credentialsGroup = createGroup(
Messages.TunnelingCompositeFragment_CredentialsLabel, parent);
usernameText = createText(
Messages.TunnelingCompositeFragment_UsernameLabel,
credentialsGroup);
usernameText.forceFocus();
passwordText = createPasswordText(
Messages.TunnelingCompositeFragment_PasswordLabel,
credentialsGroup);
Label label = new Label(credentialsGroup, SWT.NONE);
label.setText(Messages.TunnelingCompositeFragment_KeyLabel);
privateKeyText = new Text(credentialsGroup, SWT.BORDER);
privateKeyText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
false));
privateKeyText
.setToolTipText(Messages.TunnelingCompositeFragment_KeyTooltip);
privateKeyText.addModifyListener(modifyListener);
browseButton = new Button(credentialsGroup, SWT.PUSH);
browseButton.setText(Messages.TunnelingCompositeFragment_BrowseLabel);
browseButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
false));
browseButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
final FileDialog d = new FileDialog(e.display.getActiveShell(),
SWT.OPEN);
final String file = d.open();
if (file != null) {
privateKeyText.setText(file);
validate();
}
}
});
}
private void createProxyGroup(Composite parent) {
Group proxyGroup = createGroup(
Messages.TunnelingCompositeFragment_ProxyLabel, parent);
proxyHostText = createText(
Messages.TunnelingCompositeFragment_ProxyHostLabel, proxyGroup);
proxyPortText = createText(
Messages.TunnelingCompositeFragment_ProxyPort, proxyGroup);
}
private void createPortForwardingGroup(Composite parent) {
Group portForwardingGroup = createGroup(
Messages.TunnelingCompositeFragment_ForwardingLabel, parent);
portForwardingViewer = new TableViewer(portForwardingGroup);
portForwardingViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
handleEdit(getSelection());
portForwardingViewer.refresh();
validate();
}
});
portForwardingViewer
.setContentProvider(new IStructuredContentProvider() {
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object input) {
if (input instanceof List<?>) {
List<?> entries = (List<?>) input;
return entries.toArray(new PortForwarding[entries
.size()]);
}
if (input instanceof SSHTunnelConfiguration) {
return ((SSHTunnelConfiguration) input)
.getPortForwardings().toArray(
new PortForwarding[0]);
}
return new PortForwarding[0];
}
});
portForwardingViewer.setInput(config);
table = portForwardingViewer.getTable();
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableViewerColumn columnViewer = new TableViewerColumn(
portForwardingViewer, SWT.NONE);
columnViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((PortForwarding) element).getSide().getName();
}
});
TableColumn column = columnViewer.getColumn();
column.setWidth(50);
column.setText(Messages.TunnelingCompositeFragment_SideLabel);
columnViewer = new TableViewerColumn(portForwardingViewer, SWT.NONE);
columnViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((PortForwarding) element).getRemoteAddress();
}
});
column = columnViewer.getColumn();
column.setWidth(100);
column.setText(Messages.TunnelingCompositeFragment_RemoteAddrLabel);
columnViewer = new TableViewerColumn(portForwardingViewer, SWT.NONE);
columnViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return String.valueOf(((PortForwarding) element)
.getRemotePort());
}
});
column = columnViewer.getColumn();
column.setWidth(100);
column.setText(Messages.TunnelingCompositeFragment_RemotePortLabel);
columnViewer = new TableViewerColumn(portForwardingViewer, SWT.NONE);
columnViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return ((PortForwarding) element).getLocalAddress();
}
});
column = columnViewer.getColumn();
column.setWidth(100);
column.setText(Messages.TunnelingCompositeFragment_LocalAddrLabel);
columnViewer = new TableViewerColumn(portForwardingViewer, SWT.NONE);
columnViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return String.valueOf(((PortForwarding) element).getLocalPort());
}
});
column = columnViewer.getColumn();
column.setWidth(100);
column.setText(Messages.TunnelingCompositeFragment_LocalPortLabel);
Composite buttonsContainer = new Composite(portForwardingGroup,
SWT.NONE);
buttonsContainer.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false,
true));
FillLayout layout = new FillLayout(SWT.VERTICAL);
buttonsContainer.setLayout(layout);
addButton = new Button(buttonsContainer, SWT.PUSH);
addButton.setText(Messages.TunnelingCompositeFragment_AddLabel);
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleAdd();
portForwardingViewer.refresh();
validate();
}
});
editButton = new Button(buttonsContainer, SWT.PUSH);
editButton.setText(Messages.TunnelingCompositeFragment_EditLabel);
editButton.setEnabled(false);
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleEdit(getSelection());
portForwardingViewer.setInput(config);
validate();
}
});
removeButton = new Button(buttonsContainer, SWT.PUSH);
removeButton.setText(Messages.TunnelingCompositeFragment_RemoveLabel);
removeButton.setEnabled(false);
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleRemove(getSelection());
portForwardingViewer.refresh();
validate();
}
});
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
boolean enabled = getSelection().length != 0;
editButton.setEnabled(enabled);
removeButton.setEnabled(enabled);
}
});
}
private void handleRemove(PortForwarding[] selection) {
List<PortForwarding> portForwardings = config.getPortForwardings();
for (PortForwarding entry : selection) {
portForwardings.remove(entry);
}
}
private void handleEdit(PortForwarding[] selection) {
PortForwardingWizard wizard = new PortForwardingWizard(selection[0]);
WizardDialog dialog = new WizardDialog(getShell(), wizard);
if (dialog.open() == Window.OK) {
PortForwarding portForwarding = wizard.getResult();
List<PortForwarding> portForwardings = config.getPortForwardings();
int index = portForwardings.indexOf(selection[0]);
portForwardings.remove(selection[0]);
portForwardings.add(index, portForwarding);
}
}
private void handleAdd() {
PortForwardingWizard wizard = new PortForwardingWizard();
WizardDialog dialog = new WizardDialog(getShell(), wizard);
if (dialog.open() == Window.OK) {
PortForwarding portForwarding = wizard.getResult();
List<PortForwarding> portForwardings = config.getPortForwardings();
portForwardings.add(portForwarding);
}
}
private PortForwarding[] getSelection() {
IStructuredSelection selection = (IStructuredSelection) portForwardingViewer
.getSelection();
List<?> list = selection.toList();
return list.toArray(new PortForwarding[list.size()]);
}
private Text createText(String name, Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setText(name);
Text text = new Text(parent, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
text.addModifyListener(modifyListener);
return text;
}
private Text createPasswordText(String name, Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setText(name);
Text text = new Text(parent, SWT.BORDER | SWT.PASSWORD);
text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
text.addModifyListener(modifyListener);
return text;
}
private Group createGroup(String name, Composite parent) {
Group group = new Group(parent, SWT.NONE);
group.setText(name);
group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3,
1));
group.setLayout(new GridLayout(3, false));
return group;
}
private void updateData() {
if (enableButton != null) {
config.setEnabled(enableButton.getSelection());
}
if (usernameText != null) {
String username = usernameText.getText();
config.setUsername(username);
}
if (passwordText != null) {
String password = passwordText.getText();
config.setPassword(password);
}
if (privateKeyText != null) {
String privateKey = privateKeyText.getText();
config.setPrivateKey(privateKey);
}
if (proxyHostText != null) {
String httpProxyHost = proxyHostText.getText();
config.setHttpProxyHost(httpProxyHost);
}
if (proxyPortText != null) {
String httpProxyPort = proxyPortText.getText();
config.setHttpProxyPort(httpProxyPort);
}
}
private void updateState(boolean enabled) {
usernameText.setEnabled(enabled);
passwordText.setEnabled(enabled);
browseButton.setEnabled(enabled);
privateKeyText.setEnabled(enabled);
proxyHostText.setEnabled(enabled);
proxyPortText.setEnabled(enabled);
table.setEnabled(enabled);
addButton.setEnabled(enabled);
editButton.setEnabled(false);
removeButton.setEnabled(false);
}
}