package fr.opensagres.nosql.ide.orientdb.ui.wizards.server;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import fr.opensagres.nosql.ide.core.model.IServerRuntime;
import fr.opensagres.nosql.ide.core.utils.StringUtils;
import fr.opensagres.nosql.ide.orientdb.ui.internal.ImageResources;
import fr.opensagres.nosql.ide.orientdb.ui.internal.Messages;
import fr.opensagres.nosql.ide.ui.ServerUI;
import fr.opensagres.nosql.ide.ui.viewers.RuntimeContentProvider;
import fr.opensagres.nosql.ide.ui.viewers.RuntimeLabelProvider;
import fr.opensagres.nosql.ide.ui.wizards.AbstractWizardPage;
public class NewServerWizardPage extends AbstractWizardPage {
private static final String PAGE_NAME = "NewServerWizardPage";
private Text urlText;
private Text nameText;
private Combo hostCombo;
private Combo portCombo;
private ComboViewer runtimeViewer;
private Text userNameText;
private Text passwordText;
private Text databaseNameText;
private Widget currentWidgetWhichModifyURL;
protected NewServerWizardPage() {
super(PAGE_NAME);
super.setTitle(Messages.NewServerWizardPage_title);
super.setDescription(Messages.NewServerWizardPage_desc);
super.setImageDescriptor(ImageResources
.getImageDescriptor(ImageResources.IMG_WIZBAN_NEW_SERVER));
}
@Override
protected Composite createUI(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
container.setLayout(gridLayout);
// Name
Label nameLabel = new Label(container, SWT.NONE);
nameLabel.setText(Messages.NewServerWizardPage_name_label);
nameText = new Text(container, SWT.BORDER);
nameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
}
});
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Location Group
createLocationGroup(container);
// Authentication Group
createAuthenticationGroup(container);
// Runtime
Label runtimeLabel = new Label(container, SWT.NONE);
runtimeLabel.setText(Messages.NewServerWizardPage_runtime_label);
runtimeViewer = new ComboViewer(container, SWT.BORDER | SWT.READ_ONLY);
runtimeViewer.setLabelProvider(RuntimeLabelProvider.getInstance());
runtimeViewer.setContentProvider(RuntimeContentProvider.getInstance());
// runtimeViewer.setInput(Platform.getServerRuntimeManager().getRuntimes());
runtimeViewer.getControl().setLayoutData(
new GridData(GridData.FILL_HORIZONTAL));
return container;
}
private void createLocationGroup(Composite parent) {
Group container = new Group(parent, SWT.NONE);
container.setText(Messages.NewServerWizardPage_locationGroup_label);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
container.setLayoutData(gridData);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
container.setLayout(gridLayout);
// URL
Label urlLabel = new Label(container, SWT.NONE);
urlLabel.setText(Messages.NewServerWizardPage_url_label);
urlText = new Text(container, SWT.BORDER);
urlText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateFieldsFromURL();
validate();
}
});
urlText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Host
Label hostLabel = new Label(container, SWT.NONE);
hostLabel.setText(Messages.NewServerWizardPage_host_label);
hostCombo = new Combo(container, SWT.BORDER);
hostCombo.setItems(ServerUI.getLocalhosts());
hostCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateURLField(hostCombo);
validate();
}
});
hostCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Port
Label portLabel = new Label(container, SWT.NONE);
portLabel.setText(Messages.NewServerWizardPage_port_label);
portCombo = new Combo(container, SWT.BORDER);
portCombo.setItems(ServerUI.getDefaultPorts());
portCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateURLField(portCombo);
validate();
}
});
portCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
private void createAuthenticationGroup(Composite parent) {
Group container = new Group(parent, SWT.NONE);
container
.setText(Messages.NewServerWizardPage_authenticationGroup_label);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 2;
container.setLayoutData(gridData);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
container.setLayout(gridLayout);
// Username
Label userNameLabel = new Label(container, SWT.NONE);
userNameLabel.setText(Messages.NewServerWizardPage_userName_label);
userNameText = new Text(container, SWT.BORDER);
userNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateURLField(userNameText);
validate();
}
});
userNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Password
Label passwordLabel = new Label(container, SWT.NONE);
passwordLabel.setText(Messages.NewServerWizardPage_password_label);
passwordText = new Text(container, SWT.BORDER);
passwordText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateURLField(passwordText);
validate();
}
});
passwordText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// Database
Label databaseNameLabel = new Label(container, SWT.NONE);
databaseNameLabel
.setText(Messages.NewServerWizardPage_databaseName_label);
databaseNameText = new Text(container, SWT.BORDER);
databaseNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateURLField(databaseNameText);
validate();
}
});
databaseNameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
@Override
protected boolean validateFields() {
// Name validation
if (StringUtils.isEmpty(nameText.getText())) {
setErrorMessage(Messages.NewServerWizardPage_name_validation_required);
return false;
}
// Host validation
if (StringUtils.isEmpty(hostCombo.getText())) {
setErrorMessage(Messages.NewServerWizardPage_host_validation_required);
return false;
}
// Port validation
if (StringUtils.isNotEmpty(portCombo.getText())) {
try {
Integer.parseInt(portCombo.getText());
} catch (Throwable e) {
setErrorMessage(Messages.NewServerWizardPage_port_validation_int);
return false;
}
}
// Orient URL validation
try {
new URL(urlText.getText());
} catch (Throwable e) {
setErrorMessage(NLS.bind(
Messages.NewServerWizardPage_mongoURI_validation_notValid,
e.getMessage()));
return false;
}
return true;
}
public String getName() {
return nameText.getText();
}
public URL getURL() {
try {
return new URL(urlText.getText());
} catch (MalformedURLException e) {
return null;
}
}
public IServerRuntime getRuntime() {
IStructuredSelection selection = (IStructuredSelection) runtimeViewer
.getSelection();
if (selection != null && !selection.isEmpty()) {
return (IServerRuntime) selection.getFirstElement();
}
return null;
}
public Integer getPort() {
if (StringUtils.isNotEmpty(portCombo.getText())) {
return Integer.parseInt(portCombo.getText());
}
return null;
}
private void updateURLField(Widget widget) {
if (currentWidgetWhichModifyURL != null) {
return;
}
try {
currentWidgetWhichModifyURL = widget;
StringBuilder url = new StringBuilder();
url.append("http://");
url.append(hostCombo.getText());
String port = portCombo.getText();
if (StringUtils.isNotEmpty(port)) {
url.append(":");
url.append(port);
}
String databaseName = databaseNameText.getText();
if (StringUtils.isNotEmpty(databaseName)) {
url.append("/");
url.append(databaseName);
}
urlText.setText(url.toString());
} finally {
currentWidgetWhichModifyURL = null;
}
}
private void updateFieldsFromURL() {
try {
String host = null;
int portAsInt = -1;
String port = null;
String userName = null;
String password = null;
String databaseName = null;
try {
URL url = new URL(urlText.getText());
host = url.getHost();
portAsInt = url.getPort();
port = portAsInt >= 0 ? String.valueOf(portAsInt) : null;
databaseName = url.getPath();
if (StringUtils.isNotEmpty(databaseName)
&& databaseName.startsWith("/")) {
databaseName = databaseName.substring(1,
databaseName.length());
}
// MongoURI mongoURI = new MongoURI(mongoURIText.getText());
// Retrieve host and port fields from the MongoURI
// List<String> hosts = mongoURI.getHosts();
// if (hosts != null && hosts.size() > 0) {
// String hostAndPort = hosts.get(0);
// int index = hostAndPort.indexOf(":");
// if (index > 0) {
// host = hostAndPort.substring(0, index);
// port = hostAndPort.substring(index + 1,
// hostAndPort.length());
// } else {
//
// host = hostAndPort;
// port = null;
// }
// }
// // Retrieve authentification from the MongoURI
// userName = mongoURI.getUsername();
// char[] p = mongoURI.getPassword();
// if (p != null && p.length > 0) {
// password = String.valueOf(p);
// }
// // Retrieve database name from the MongoURI
// databaseName = mongoURI.getDatabase();
} catch (Throwable e) {
}
updateText(hostCombo, host);
updateText(portCombo, port);
updateText(userNameText, userName);
updateText(passwordText, password);
updateText(databaseNameText, databaseName);
} finally {
}
}
private void updateText(Text widget, String text) {
if (!widget.equals(currentWidgetWhichModifyURL)) {
widget.setText(text != null ? text : "");
}
}
private void updateText(Combo widget, String text) {
if (!widget.equals(currentWidgetWhichModifyURL)) {
widget.setText(text != null ? text : "");
}
}
@Override
protected void onLoad() {
// Do nothing.
}
}