package org.mongodb.meclipse.wizards; import static org.mongodb.meclipse.MeclipsePlugin.getCaption; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.databinding.validation.IValidator; import org.eclipse.core.databinding.validation.ValidationStatus; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.wizard.WizardPageSupport; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; 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.Label; import org.eclipse.swt.widgets.Text; import org.mongodb.meclipse.Images; import org.mongodb.meclipse.MeclipsePlugin; import org.mongodb.meclipse.preferences.MongoInstance; import org.mongodb.meclipse.views.objects.Connection; /** * @author Flavio [FlaPer87] Percoco Premoli * @author Joey Mink, ExoAnalytic Solutions */ public class ConnectionWizardPage extends WizardPage /* implements Listener */{ private Text connName; private Text host; private Text port; private Text username; private Text password; private Connection conn; private static Image help = Images.get(Images.Help); // private ISelection selection; private Button saveCheckBox; // private Combo savedServersSelect; /** the servers that were saved at the time this wizard page was loaded **/ private Map<String, MongoInstance> savedServers = new HashMap<String, MongoInstance>(); private IObservableValue hostValue = new WritableValue("", String.class); private IObservableValue portValue = new WritableValue("", String.class); private IObservableValue nameValue = new WritableValue("", String.class); private Set<String> mongoInstances = MeclipsePlugin.getDefault() .getMongoNames(); private final class DuplicateValidator implements IValidator { @Override public IStatus validate(Object arg0) { // TODO Auto-generated method stub return null; } } /** * Validator which verifies that the name is matching criteria */ private final class NameValidator implements IValidator { @Override public IStatus validate(Object value) { if (null == value || ((String) value).trim().isEmpty()) { return ValidationStatus .error(getCaption("connectionWizard.error.empty.name")); } else if (mongoInstances.contains((String) value)) { return ValidationStatus .error(getCaption("connectionWizard.error.dupl.name")); } return ValidationStatus.ok(); } } /** * Validator which validates that a hostname matching the required criteria * is inserted for a new connection */ private final class HostNameValidator implements IValidator { public IStatus validate(Object value) { if (null != value && ((String) value).trim().isEmpty()) { return ValidationStatus .error(getCaption("connectionWizard.error.empty.host")); } Integer val = 0; try { val = Integer.parseInt(port.getText()); } catch (NumberFormatException e) { } return checkDuplicateConnection((String) value, val); } } /** * Validator which validates that the inserted port matches criteria */ private final class PortValidator implements IValidator { @Override public IStatus validate(Object value) { if (null != value && ((String) value).trim().isEmpty()) { return ValidationStatus .error(getCaption("connectionWizard.error.port")); } int val = 0; try { val = Integer.parseInt((String) value); if (val < 0 || val > 65535) { return ValidationStatus .error(getCaption("connectionWizard.error.port")); } } catch (NumberFormatException e) { return ValidationStatus .error(getCaption("connectionWizard.error.port")); } return checkDuplicateConnection(host.getText(), val); } } public IStatus checkDuplicateConnection(String hostname, int port) { Iterator<String> it = mongoInstances.iterator(); while (it.hasNext()) { String cur = it.next(); MongoInstance instance = MeclipsePlugin.getDefault() .getMongoInstance(cur); if (instance.getPort() == port && instance.getHost().equals(hostname)) { return ValidationStatus.warning(String.format( getCaption("connectionWizard.warn.duplicate"), cur)); } } return ValidationStatus.ok(); } public Map<String, MongoInstance> getSavedServers() { return savedServers; } /** * Constructor for SampleNewWizardPage. * * @param pageName */ public ConnectionWizardPage(ISelection selection) { super("wizardPage"); setTitle(getCaption("connectionWizard.title")); // setDescription(""); // this.selection = selection; } /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 3; layout.verticalSpacing = 9; GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.widthHint = 250; Label label; label = new Label(container, SWT.NULL); label.setText(getCaption("connectionWizard.label.name")); connName = new Text(container, SWT.BORDER | SWT.SINGLE); connName.setLayoutData(gd); label = new Label(container, SWT.NULL); label.setImage(help); label.setToolTipText(getCaption("connectionWizard.tooltip.name")); label = new Label(container, SWT.NULL); label.setText(getCaption("connectionWizard.label.host")); host = new Text(container, SWT.BORDER | SWT.SINGLE); host.setLayoutData(gd); label = new Label(container, SWT.NULL); label.setImage(help); label.setToolTipText(getCaption("connectionWizard.tooltip.host")); label = new Label(container, SWT.NULL); label.setText(getCaption("connectionWizard.label.port")); port = new Text(container, SWT.BORDER | SWT.SINGLE); port.setLayoutData(gd); port.setText("27017"); label = new Label(container, SWT.NULL); label.setImage(help); label.setToolTipText(getCaption("connectionWizard.tooltip.port")); /* * label = new Label(container, SWT.NULL); label.setText("&Username:"); * username= new Text(container, SWT.BORDER | SWT.SINGLE); * username.setLayoutData(gd); */ /* * label = new Label(container, SWT.NULL); label.setText("Passwo&rd:"); * password = new Text(container, SWT.BORDER | SWT.SINGLE); * password.setLayoutData(gd); */ label = new Label(container, SWT.NULL); label.setText("Auth not supported yet..."); // add WizardPage validators DataBindingContext dbc = new DataBindingContext(); WizardPageSupport.create(this, dbc); dbc.bindValue(SWTObservables.observeText(connName, SWT.Modify), nameValue, new UpdateValueStrategy() .setBeforeSetValidator(new NameValidator()), null); dbc.bindValue(SWTObservables.observeText(host, SWT.Modify), hostValue, new UpdateValueStrategy() .setBeforeSetValidator(new HostNameValidator()), null); dbc.bindValue(SWTObservables.observeText(port, SWT.Modify), portValue, new UpdateValueStrategy() .setBeforeSetValidator(new PortValidator()), null); initialize(); setControl(container); // disable Save until everything matches setPageComplete(false); } /** * Tests if the current workbench selection is a suitable container to use. */ private void initialize() { // if (selection!=null && selection.isEmpty()==false && selection // instanceof IStructuredSelection) { // IStructuredSelection ssel = (IStructuredSelection)selection; // if (ssel.size()>1) return; // Object obj = ssel.getFirstElement(); // if (obj instanceof IResource) { // IContainer container; // if (obj instanceof IContainer) // container = (IContainer)obj; // else // container = ((IResource)obj).getParent(); // } // } } public String getConnName() { return connName.getText(); } public Connection getConnection() { return conn; } public String getHost() { return host.getText(); } public int getPort() { try { String portT = port.getText(); if (portT == null) return -2; return Integer.parseInt(portT); } catch (NumberFormatException e) { return -1; } } public String getUsername() { return username.getText(); } public String getPassword() { return password.getText(); } public Boolean isSaveConnection() { return saveCheckBox.getSelection(); } }