package org.teiid.designer.datatools.profiles.modeshape; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.datatools.connectivity.drivers.jdbc.IJDBCConnectionProfileConstants; import org.eclipse.datatools.connectivity.drivers.jdbc.IJDBCDriverDefinitionConstants; import org.eclipse.datatools.connectivity.internal.ui.ConnectivityUIPlugin; import org.eclipse.datatools.connectivity.ui.wizards.IDriverUIContributor; import org.eclipse.datatools.connectivity.ui.wizards.IDriverUIContributorInformation; import org.eclipse.jface.dialogs.DialogPage; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.swt.widgets.Text; import org.teiid.designer.datatools.ui.DatatoolsUiConstants; import org.teiid.designer.ui.common.util.WidgetFactory; public class ModeShapeDriverUIContributor implements IDriverUIContributor, Listener { private static final String HOST_LBL_UI_ = DatatoolsUiConstants.UTIL.getString("Common.HOST_LBL_UI_"); //$NON-NLS-1$ private static final String PORT_LBL_UI_ = DatatoolsUiConstants.UTIL.getString("Common.PORT_LBL_UI_"); //$NON-NLS-1$ private static final String CONNECTIONURL_LBL_UI_ = DatatoolsUiConstants.UTIL.getString("Common.CONNECTIONURL_LBL_UI_"); //$NON-NLS-1$ private static final String USERNAME_LBL_UI_ = DatatoolsUiConstants.UTIL.getString("Common.USERNAME_LBL_UI_"); //$NON-NLS-1$ private static final String PASSWORD_LBL_UI_ = DatatoolsUiConstants.UTIL.getString("Common.PASSWORD_LBL_UI_"); //$NON-NLS-1$ private static final String SSL_BTN_UI_ = DatatoolsUiConstants.UTIL.getString("Common.SSL_BTN_UI_"); //$NON-NLS-1$ private static final String TEIID_BTN_UI_ = DatatoolsUiConstants.UTIL.getString("Common.TEIID_BTN_UI_"); //$NON-NLS-1$ private static final String SAVE_PASSWORD_LBL_UI_ = DatatoolsUiConstants.UTIL.getString("Common.SAVE_PASSWORD_LBL_UI_"); //$NON-NLS-1$ private static final String PATH_LBL_UI_ = DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.REPOS.TXT"); //$NON-NLS-1$ private static final String HOST_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.host"); //$NON-NLS-1$ private static final String PORT_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.port"); //$NON-NLS-1$ private static final String USERNAME_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.username"); //$NON-NLS-1$ private static final String URL_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.url"); //$NON-NLS-1$ private static final String SSL_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.protocol"); //$NON-NLS-1$ private static final String TEIID_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.teiid"); //$NON-NLS-1$ private static final String SAVE_PASSWORD_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.persistpassword.label"); //$NON-NLS-1$ private static final String TRUE_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.true"); //$NON-NLS-1$ private static final String FALSE_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.false"); //$NON-NLS-1$ private static final String PATH_SUMMARY_DATA_TEXT_ = DatatoolsUiConstants.UTIL.getString("Common.summary.path"); //$NON-NLS-1$ private boolean isReadOnly = false; private Composite parentComposite; private Label hostLabel; private Text hostText; private Label portLabel; private Text portText; private Label usernameLabel; private Text usernameText; private Label passwordLabel; private Text passwordText; private Button protocolCheck; private Button teiidCheck; private Button savePasswordButton; private Label urlLabel; private Text urlText; private Label reposLabel; private Combo reposCombo; private Properties properties; private DialogPage parentPage; private IDriverUIContributorInformation contributorInformation; private Button reposBrowseButton; private LabelProvider reposLabelProvider; @Override public Composite getContributedDriverUI(Composite parent, boolean isReadOnly) { if ((parentComposite == null) || parentComposite.isDisposed() || (this.isReadOnly != isReadOnly)) { GridData gd; this.isReadOnly = isReadOnly; int additionalStyles = SWT.NONE; if (isReadOnly) { additionalStyles = SWT.READ_ONLY; } parentComposite = new Composite(parent, SWT.NONE); parentComposite.setLayout(new GridLayout()); parentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); TabFolder tabComposite = new TabFolder(parentComposite, SWT.TOP); tabComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); // add general tab TabItem generalTab = new TabItem(tabComposite, SWT.NONE); generalTab.setText(ConnectivityUIPlugin.getDefault().getResourceString("CommonDriverUIContributor.generaltab")); //$NON-NLS-1$ Composite baseComposite = new Composite(tabComposite, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 3; baseComposite.setLayout(layout); generalTab.setControl(baseComposite); hostLabel = new Label(baseComposite, SWT.NONE); hostLabel.setText(HOST_LBL_UI_); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; hostLabel.setLayoutData(gd); hostText = new Text(baseComposite, SWT.SINGLE | SWT.BORDER | additionalStyles); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.horizontalSpan = 2; gd.grabExcessHorizontalSpace = true; hostText.setLayoutData(gd); portLabel = new Label(baseComposite, SWT.NONE); portLabel.setText(PORT_LBL_UI_); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; portLabel.setLayoutData(gd); portText = new Text(baseComposite, SWT.SINGLE | SWT.BORDER | additionalStyles); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = 2; portText.setLayoutData(gd); usernameLabel = new Label(baseComposite, SWT.NONE); usernameLabel.setText(USERNAME_LBL_UI_); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; usernameLabel.setLayoutData(gd); usernameText = new Text(baseComposite, SWT.SINGLE | SWT.BORDER | additionalStyles); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = 2; usernameText.setLayoutData(gd); passwordLabel = new Label(baseComposite, SWT.NONE); passwordLabel.setText(PASSWORD_LBL_UI_); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; passwordLabel.setLayoutData(gd); passwordText = new Text(baseComposite, SWT.SINGLE | SWT.BORDER | SWT.PASSWORD | additionalStyles); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = 2; passwordText.setLayoutData(gd); reposLabel = new Label(baseComposite, SWT.NONE); reposLabel.setText(PATH_LBL_UI_); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; reposLabel.setLayoutData(gd); reposLabelProvider = new LabelProvider() { @Override public String getText( final Object source ) { return (String)source; } }; reposCombo = WidgetFactory.createCombo(baseComposite, SWT.SIMPLE, GridData.FILL_HORIZONTAL, new ArrayList<String>(), reposLabelProvider, true); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.grabExcessHorizontalSpace = true; reposCombo.setLayoutData(gd); reposBrowseButton = new Button(baseComposite, SWT.BUTTON1); reposBrowseButton.setText(DatatoolsUiConstants.UTIL.getString("Common.REFRESH_BUTTON_LBL_UI_")); //$NON-NLS-1$ gd = new GridData(); gd.horizontalAlignment = GridData.CENTER; gd.verticalAlignment = GridData.BEGINNING; gd.grabExcessHorizontalSpace = false; reposBrowseButton.setLayoutData(gd); reposBrowseButton.setEnabled(false); protocolCheck = new Button(baseComposite, SWT.CHECK); protocolCheck.setText(SSL_BTN_UI_); protocolCheck.setSelection(false); gd = new GridData(); gd.horizontalSpan = 3; protocolCheck.setLayoutData(gd); teiidCheck = new Button(baseComposite, SWT.CHECK); teiidCheck.setText(TEIID_BTN_UI_); teiidCheck.setSelection(true); gd = new GridData(); gd.horizontalSpan = 3; teiidCheck.setLayoutData(gd); savePasswordButton = new Button(baseComposite, SWT.CHECK); savePasswordButton.setText(SAVE_PASSWORD_LBL_UI_); gd = new GridData(); gd.horizontalAlignment = GridData.FILL; gd.verticalAlignment = GridData.BEGINNING; gd.horizontalSpan = 3; gd.grabExcessHorizontalSpace = true; savePasswordButton.setLayoutData(gd); urlLabel = new Label(baseComposite, SWT.NONE); urlLabel.setText(CONNECTIONURL_LBL_UI_); gd = new GridData(); gd.verticalAlignment = GridData.BEGINNING; urlLabel.setLayoutData(gd); urlText = new Text(baseComposite, SWT.MULTI | SWT.BORDER | SWT.READ_ONLY | SWT.WRAP); gd = new GridData(SWT.FILL, SWT.FILL, true, true); gd.horizontalSpan = 2; urlText.setLayoutData(gd); initialize(); } return parentComposite; } private void initialize() { updateURL(); addListeners(); } public void updateURL() { String url = "jdbc:jcr:"; //$NON-NLS-1$ if (protocolCheck.getSelection()) { url += "https://"; //$NON-NLS-1$ } else { url += "http://"; //$NON-NLS-1$ } if (hostText.getText().trim().length() > 0) { url += hostText.getText().trim(); } if (portText.getText().trim().length() > 0) { url += ":" + portText.getText().trim() + "/modeshape-rest"; //$NON-NLS-1$ //$NON-NLS-2$ } if (reposCombo.getText().trim().length() > 0) { String repos = reposCombo.getText().trim(); if(repos.indexOf('/') == 0) { url += repos; } else { url += "/" + repos; //$NON-NLS-1$ } } if (teiidCheck.getSelection()) { url += "?teiidsupport=true"; //$NON-NLS-1$ } urlText.setText(url); } private String getRestUrl() { StringBuffer url = new StringBuffer(); if (protocolCheck.getSelection()) { url.append("https://"); //$NON-NLS-1$ } else { url.append("http://"); //$NON-NLS-1$ } if (hostText.getText().trim().length() > 0) { url.append(hostText.getText().trim()); } if (portText.getText().trim().length() > 0) { url.append(":").append(portText.getText().trim()); //$NON-NLS-1$ } url.append("/modeshape-rest/"); //$NON-NLS-1$ return url.toString(); } private void removeListeners() { hostText.removeListener(SWT.Modify, this); portText.removeListener(SWT.Modify, this); reposCombo.removeListener(SWT.Modify, this); usernameText.removeListener(SWT.Modify, this); passwordText.removeListener(SWT.Modify, this); reposBrowseButton.removeListener(SWT.Selection, this); protocolCheck.removeListener(SWT.Selection, this); teiidCheck.removeListener(SWT.Selection, this); savePasswordButton.removeListener(SWT.Selection, this); } private void addListeners() { hostText.addListener(SWT.Modify, this); portText.addListener(SWT.Modify, this); reposCombo.addListener(SWT.Modify, this); usernameText.addListener(SWT.Modify, this); passwordText.addListener(SWT.Modify, this); reposBrowseButton.addListener(SWT.Selection, this); protocolCheck.addListener(SWT.Selection, this); teiidCheck.addListener(SWT.Selection, this); savePasswordButton.addListener(SWT.Selection, this); } @Override public void handleEvent( Event event ) { if (event.widget == savePasswordButton) { savePasswordButton.setSelection(savePasswordButton.getSelection()); } else if (event.widget == protocolCheck) { protocolCheck.setSelection(protocolCheck.getSelection()); } else if (event.widget == teiidCheck) { teiidCheck.setSelection(teiidCheck.getSelection()); } else if (event.widget == reposBrowseButton) { browseForRepos(); } updateURL(); updateBrowseButtonEnablement(); setConnectionInformation(); } private void updateBrowseButtonEnablement() { if(!hostText.getText().trim().isEmpty() && !portText.getText().trim().isEmpty() && !usernameText.getText().trim().isEmpty() && !passwordText.getText().trim().isEmpty()) { reposBrowseButton.setEnabled(true); } else { reposBrowseButton.setEnabled(false); } } public void setConnectionInformation() { properties.setProperty(IJDBCDriverDefinitionConstants.PASSWORD_PROP_ID, this.passwordText.getText()); properties.setProperty(IJDBCDriverDefinitionConstants.USERNAME_PROP_ID, this.usernameText.getText()); properties.setProperty(IJDBCDriverDefinitionConstants.URL_PROP_ID, this.urlText.getText().trim()); properties.setProperty(IJDBCConnectionProfileConstants.SAVE_PASSWORD_PROP_ID, String.valueOf(savePasswordButton.getSelection())); this.contributorInformation.setProperties(properties); } @Override public boolean determineContributorCompletion() { boolean isComplete = true; if (hostText.getText().trim().length() < 1) { parentPage.setErrorMessage(DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.VALIDATE_HOST_REQ_UI_")); //$NON-NLS-1$ isComplete = false; } else if (portText.getText().trim().length() < 1) { parentPage.setErrorMessage(DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.VALIDATE_PORT_REQ_MSG_UI_")); //$NON-NLS-1$ isComplete = false; } else if (usernameText.getText().trim().length() < 1) { parentPage.setErrorMessage(DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.VALIDATE_USERID_REQ_MSG_UI_")); //$NON-NLS-1$ isComplete = false; } else if (passwordText.getText().trim().length() < 1) { parentPage.setErrorMessage(DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.VALIDATE_PASSWORD_REQ_MSG_UI_")); //$NON-NLS-1$ isComplete = false; } else if (reposCombo.getText().trim().length() < 1) { parentPage.setErrorMessage(DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.VALIDATE_PATH_REQ_UI_")); //$NON-NLS-1$ isComplete = false; } if (isComplete) { parentPage.setErrorMessage(null); } return isComplete; } @Override public void setDialogPage( DialogPage parentPage ) { this.parentPage = parentPage; } @Override public void setDriverUIContributorInformation( IDriverUIContributorInformation contributorInformation) { this.contributorInformation = contributorInformation; this.properties = contributorInformation.getProperties(); } @Override public void loadProperties() { removeListeners(); ModeShapeJdbcUrl url = new ModeShapeJdbcUrl( this.properties .getProperty(IJDBCDriverDefinitionConstants.URL_PROP_ID)); hostText.setText(url.getHost()); portText.setText(url.getPort()); reposCombo.setText(url.getRepos()); String username = this.properties.getProperty(IJDBCDriverDefinitionConstants.USERNAME_PROP_ID); if (username != null) { usernameText.setText(username); } String password = this.properties.getProperty(IJDBCDriverDefinitionConstants.PASSWORD_PROP_ID); if (password != null) { passwordText.setText(password); } if (!(url.getProtocol().equals("https"))) { //$NON-NLS-1$ protocolCheck.setSelection(false); } else { protocolCheck.setSelection(true); } if (!(url.getTeiidMetadata())) { teiidCheck.setSelection(false); } else { teiidCheck.setSelection(true); } String savePassword = this.properties.getProperty(IJDBCConnectionProfileConstants.SAVE_PASSWORD_PROP_ID); if ((savePassword != null) && Boolean.valueOf(savePassword) == Boolean.TRUE) { savePasswordButton.setSelection(true); } updateURL(); addListeners(); updateBrowseButtonEnablement(); setConnectionInformation(); } @SuppressWarnings({ "unchecked" }) @Override public List getSummaryData() { List summaryData = new ArrayList(); //summaryData.add(new String[] {DATABASE_SUMMARY_DATA_TEXT_, this.databaseText.getText().trim()}); summaryData.add(new String[] {HOST_SUMMARY_DATA_TEXT_, this.hostText.getText().trim()}); summaryData.add(new String[] {PORT_SUMMARY_DATA_TEXT_, this.portText.getText().trim()}); summaryData.add(new String[] {PATH_SUMMARY_DATA_TEXT_, this.reposCombo.getText().trim()}); summaryData.add(new String[] {USERNAME_SUMMARY_DATA_TEXT_, this.usernameText.getText().trim()}); summaryData.add(new String[] {SSL_SUMMARY_DATA_TEXT_, protocolCheck.getSelection() ? TRUE_SUMMARY_DATA_TEXT_ : FALSE_SUMMARY_DATA_TEXT_}); summaryData.add(new String[] {TEIID_SUMMARY_DATA_TEXT_, teiidCheck.getSelection() ? TRUE_SUMMARY_DATA_TEXT_ : FALSE_SUMMARY_DATA_TEXT_}); summaryData.add(new String[] {SAVE_PASSWORD_SUMMARY_DATA_TEXT_, savePasswordButton.getSelection() ? TRUE_SUMMARY_DATA_TEXT_ : FALSE_SUMMARY_DATA_TEXT_}); summaryData.add(new String[] {URL_SUMMARY_DATA_TEXT_, this.urlText.getText().trim()}); return summaryData; } private void browseForRepos() { URL url; try { url = new URL(getRestUrl()); RestUtils restUtils = new RestUtils(); List<String> repositories = restUtils.getRepositoryList(url, usernameText.getText(), passwordText.getText()); reposCombo.setItems(repositories.toArray(new String[0])); if(!repositories.isEmpty()) { reposCombo.setText(repositories.get(0)); } } catch (Exception e) { Shell shell = Display.getCurrent().getActiveShell(); MessageDialog.openError(shell, DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.repos.browse.exception"), e.getMessage()); //$NON-NLS-1$ IStatus status = new Status(IStatus.ERROR, DatatoolsUiConstants.PLUGIN_ID, DatatoolsUiConstants.UTIL.getString("ModeShapeDriverUIContributor.repos.browse.exception"), e); //$NON-NLS-1$ DatatoolsUiConstants.UTIL.log(status); } } }