package fr.opensagres.nosql.ide.mongodb.ui.wizards.server; import java.util.List; 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 com.mongodb.MongoURI; import com.mongodb.tools.driver.MongoDriverHelper; import fr.opensagres.nosql.ide.core.Platform; import fr.opensagres.nosql.ide.core.model.IServerRuntime; import fr.opensagres.nosql.ide.core.utils.StringUtils; import fr.opensagres.nosql.ide.mongodb.core.model.MongoServer; import fr.opensagres.nosql.ide.mongodb.ui.internal.ImageResources; import fr.opensagres.nosql.ide.mongodb.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 mongoURIText; private Text nameText; private Combo hostCombo; private Combo portCombo; private ComboViewer runtimeViewer; private Text userNameText; private Text passwordText; private Text databaseNameText; private Widget currentWidgetWhichModifyMongoURI; 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( MongoServer.TYPE_ID)); 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); // MongoURI Label mongoURILabel = new Label(container, SWT.NONE); mongoURILabel.setText(Messages.NewServerWizardPage_mongoURI_label); mongoURIText = new Text(container, SWT.BORDER); mongoURIText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { updateFieldsFromMongoURI(); validate(); } }); mongoURIText.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) { updateMongoURIField(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) { updateMongoURIField(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) { updateMongoURIField(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) { updateMongoURIField(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) { updateMongoURIField(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; } } // Mongo URI validation try { new MongoURI(mongoURIText.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 MongoURI getMongoURI() { return MongoDriverHelper.createMongoURI(hostCombo.getText(), getPort(), userNameText.getText(), passwordText.getText(), databaseNameText.getText()); } 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 updateMongoURIField(Widget widget) { if (currentWidgetWhichModifyMongoURI != null) { return; } try { currentWidgetWhichModifyMongoURI = widget; mongoURIText.setText(MongoDriverHelper.createStringMongoURI( hostCombo.getText(), getPort(), userNameText.getText(), passwordText.getText(), databaseNameText.getText())); } finally { currentWidgetWhichModifyMongoURI = null; } } private void updateFieldsFromMongoURI() { try { String host = null; String port = null; String userName = null; String password = null; String databaseName = null; try { 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(currentWidgetWhichModifyMongoURI)) { widget.setText(text != null ? text : ""); } } private void updateText(Combo widget, String text) { if (!widget.equals(currentWidgetWhichModifyMongoURI)) { widget.setText(text != null ? text : ""); } } @Override protected void onLoad() { // Do nothing. } }