// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.core.ui.pref;
import java.io.File;
import java.sql.Driver;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.talend.commons.exception.ExceptionHandler;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.runtime.model.repository.ERepositoryStatus;
import org.talend.commons.ui.swt.formtools.LabelledCombo;
import org.talend.commons.ui.swt.formtools.LabelledText;
import org.talend.commons.ui.utils.loader.MyURLClassLoader;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.metadata.builder.database.PluginConstant;
import org.talend.core.model.metadata.builder.database.dburl.SupportDBUrlType;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.repository.RepositoryManager;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.dataprofiler.core.CorePlugin;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.views.provider.DQRepositoryViewLabelProvider;
import org.talend.dataprofiler.core.ui.views.provider.ResourceViewContentProvider;
import org.talend.dq.CWMPlugin;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.DBConnectionFolderRepNode;
import org.talend.dq.nodes.DBConnectionRepNode;
import org.talend.dq.nodes.DBConnectionSubFolderRepNode;
import org.talend.metadata.managment.ui.dialog.MappingFileSelectDialog;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.repository.ui.wizards.metadata.connection.database.SelectDatabaseJarDialog;
import org.talend.resource.EResourceConstant;
/**
*
* DOC qiongli class global comment. Detailled comment <br/>
*
* $Id: talend.epf 55206 2011-02-15 17:32:14Z mhirt $
*
*/
public class SetJDBCDriverPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
private static Logger log = Logger.getLogger(SetJDBCDriverPreferencePage.class);
private Composite mainComposite;
private Label header;
private Label dbTypeLabel;
private LabelledText generalJdbcUrlText = null;
private LabelledText generalJdbcUserText = null;
private LabelledText generalJdbcPasswordText = null;
private LabelledCombo generalJdbcClassNameText = null;
private LabelledText generalJdbcDriverjarText = null;
private LabelledText generalMappingFileText = null;
private Button generalMappingSelectButton = null;
private Button browseJarFilesButton = null;
private Button browseClassButton = null;
private Button applyButton = null;
private final String URL_KEY = "PREF_JDBC_URL";//$NON-NLS-1$
private final String DRIVER_KEY = "PREf_JDBC_JAR";//$NON-NLS-1$
private final String CLASSNAME_KEY = "PREF_JDBC_CLASS";//$NON-NLS-1$
private final String USERNAME_KEY = "PREF_JDBC_USERNAME";//$NON-NLS-1$
private final String PASSWORD_KEY = "PREF_JDBC_PASSWORD";//$NON-NLS-1$
private final String MAPFILE_KEY = "PREF_JDBC_MAPFILE";//$NON-NLS-1$
private final String dbType_jdbc = SupportDBUrlType.GENERICJDBCDEFAULTURL.getDBKey();
public SetJDBCDriverPreferencePage() {
super();
IPreferenceStore store = CorePlugin.getDefault().getPreferenceStore();
setPreferenceStore(store);
}
public SetJDBCDriverPreferencePage(String title) {
super(title);
}
public SetJDBCDriverPreferencePage(String title, ImageDescriptor image) {
super(title, image);
}
public void init(IWorkbench workbench) {
}
@Override
protected Control createContents(Composite parent) {
mainComposite = new Composite(parent, SWT.NONE);
mainComposite.setLayout(new GridLayout(3, false));
mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout2 = (GridLayout) mainComposite.getLayout();
layout2.marginHeight = 0;
layout2.marginTop = 0;
layout2.marginBottom = 0;
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.horizontalSpan = 3;
header = new Label(mainComposite, SWT.WRAP);
header.setLayoutData(gridData);
header.setText(DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.heard")); //$NON-NLS-1$
dbTypeLabel = new Label(mainComposite, SWT.WRAP);
dbTypeLabel.setText(DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.dbType") + dbType_jdbc); //$NON-NLS-1$
dbTypeLabel.setLayoutData(gridData);
generalJdbcUrlText = new LabelledText(mainComposite,
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.general.url"), 2); //$NON-NLS-1$
String url = getPreferenceStore().getString(URL_KEY);
generalJdbcUrlText.setText(url != null ? url : PluginConstant.EMPTY_STRING);
generalJdbcDriverjarText = new LabelledText(mainComposite,
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.general.jarfile"), //$NON-NLS-1$
1);
String driver = getPreferenceStore().getString(DRIVER_KEY);
generalJdbcDriverjarText.setText(driver != null ? driver : PluginConstant.EMPTY_STRING);
browseJarFilesButton = new Button(mainComposite, SWT.NONE);
browseJarFilesButton.setText("..."); //$NON-NLS-1$
generalJdbcClassNameText = new LabelledCombo(mainComposite,
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.general.classname"), "", null, 1, true, SWT.NONE); //$NON-NLS-1$
String className = getPreferenceStore().getString(CLASSNAME_KEY);
generalJdbcClassNameText.setText(className != null ? className : PluginConstant.EMPTY_STRING);
browseClassButton = new Button(mainComposite, SWT.NONE);
browseClassButton.setText("..."); //$NON-NLS-1$
generalJdbcUserText = new LabelledText(mainComposite,
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.general.user"), 2); //$NON-NLS-1$
String userName = getPreferenceStore().getString(USERNAME_KEY);
generalJdbcUserText.setText(userName != null ? userName : PluginConstant.EMPTY_STRING);
generalJdbcPasswordText = new LabelledText(mainComposite,
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.general.password"), 2); //$NON-NLS-1$
generalJdbcPasswordText.getTextControl().setEchoChar('*'); // see
String password = getPreferenceStore().getString(PASSWORD_KEY);
generalJdbcPasswordText.setText(password != null ? password : PluginConstant.EMPTY_STRING);
generalMappingFileText = new LabelledText(mainComposite,
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.general.mapping"), 1); //$NON-NLS-1$
String mapFile = getPreferenceStore().getString(MAPFILE_KEY);
generalMappingFileText.setText(mapFile != null ? mapFile : PluginConstant.EMPTY_STRING);
generalMappingSelectButton = new Button(mainComposite, SWT.NONE);
generalMappingSelectButton.setText("..."); //$NON-NLS-1$
applyButton = new Button(mainComposite, SWT.CENTER | SWT.BOTTOM);
applyButton.setText(DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.selectConnectionButton")); //$NON-NLS-1$
GridData gd = new GridData();
gd.horizontalAlignment = GridData.CENTER;
gd.horizontalSpan = 3;
applyButton.setLayoutData(gd);
applyButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
CheckedTreeSelectionDialog dialog = createConnSelectDialog();
dialog.create();
if (dialog.open() == Window.OK) {
Object selects[] = dialog.getResult();
if (selects != null && selects.length > 0) {
boolean isConfirm = MessageDialog.openConfirm(dialog.getShell(),
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.confirmTitle"), //$NON-NLS-1$
DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.confirmContent")); //$NON-NLS-1$
if (!isConfirm) {
return;
}
saveDatabases(selects);
}
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
browseJarFilesButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
SelectDatabaseJarDialog dialog = new SelectDatabaseJarDialog(getShell(), generalJdbcDriverjarText.getText());
if (dialog.open() == Window.OK) {
generalJdbcDriverjarText.setText(dialog.getJarsString());
}
}
});
browseClassButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
generalJdbcClassNameText.removeAll();
for (String stringToFile : generalJdbcDriverjarText.getText().trim().split(";")) { //$NON-NLS-1$
File file = new File(stringToFile);
if (file != null) {
try {
MyURLClassLoader cl = new MyURLClassLoader(file.toURL());
Class[] classes = cl.getAssignableClasses(Driver.class);
for (Class classe : classes) {
generalJdbcClassNameText.add(classe.getName());
}
} catch (Exception ex) {
ExceptionHandler.process(ex);
}
}
}
if (generalJdbcClassNameText.getItemCount() > 0) {
String driverClassName = generalJdbcClassNameText.getItem(0);
generalJdbcClassNameText.setText(driverClassName);
}
}
});
generalMappingSelectButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
MappingFileSelectDialog dialog = new MappingFileSelectDialog(getShell());
dialog.open();
generalMappingFileText.setText(dialog.getSelectId());
}
});
return mainComposite;
}
@Override
protected void performDefaults() {
generalJdbcUrlText.setText(PluginConstant.EMPTY_STRING);
generalJdbcDriverjarText.setText(PluginConstant.EMPTY_STRING);
generalJdbcClassNameText.setText(PluginConstant.EMPTY_STRING);
generalJdbcUserText.setText(PluginConstant.EMPTY_STRING);
generalJdbcPasswordText.setText(PluginConstant.EMPTY_STRING);
generalMappingFileText.setText(PluginConstant.EMPTY_STRING);
}
@Override
public boolean performOk() {
getPreferenceStore().setValue(URL_KEY, generalJdbcUrlText.getText());
getPreferenceStore().setValue(DRIVER_KEY, generalJdbcDriverjarText.getText());
getPreferenceStore().setValue(CLASSNAME_KEY, generalJdbcClassNameText.getText());
getPreferenceStore().setValue(USERNAME_KEY, generalJdbcUserText.getText());
getPreferenceStore().setValue(PASSWORD_KEY, generalJdbcPasswordText.getText());
getPreferenceStore().setValue(MAPFILE_KEY, generalMappingFileText.getText());
return true;
}
private CheckedTreeSelectionDialog createConnSelectDialog() {
RepositoryNode node = (RepositoryNode) RepositoryNodeHelper.getMetadataFolderNode(EResourceConstant.DB_CONNECTIONS);
CheckedTreeSelectionDialog dialog = new CheckedTreeSelectionDialog(getShell(), new DQRepositoryViewLabelProvider(),
new ResourceViewContentProvider());
dialog.setInput(node);
dialog.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof DBConnectionRepNode) {
return isJdbcConnectionNode((DBConnectionRepNode) element);
} else if (element instanceof DBConnectionSubFolderRepNode) {
return hasJdbcConnNodeChild((DBConnectionSubFolderRepNode) element);
}
return false;
}
});
dialog.setValidator(new ISelectionStatusValidator() {
public IStatus validate(Object[] selection) {
for (Object object : selection) {
if (object instanceof DBConnectionRepNode) {
IRepositoryViewObject nodeObject = ((DBConnectionRepNode) object).getObject();
// when it's locked, can not modify
if (nodeObject != null
&& nodeObject.getProperty() != null
&& nodeObject.getProperty().getItem() != null
&& (nodeObject.getRepositoryStatus() == ERepositoryStatus.LOCK_BY_OTHER
|| nodeObject.getRepositoryStatus() == ERepositoryStatus.LOCK_BY_USER || RepositoryManager
.isOpenedItemInEditor(nodeObject))) {
String displayName = nodeObject.getProperty().getDisplayName();
String version = nodeObject.getProperty().getVersion();
return new Status(IStatus.ERROR, CorePlugin.PLUGIN_ID, DefaultMessagesImpl.getString(
"SetJDBCDriverPreferencePage.isLocked", displayName + " " + version)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
return new Status(IStatus.OK, PlatformUI.PLUGIN_ID, IStatus.OK, "", //$NON-NLS-1$
null);
}
});
dialog.setContainerMode(true);
dialog.setTitle(DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.selectConnectionButton")); //$NON-NLS-1$
dialog.setMessage(DefaultMessagesImpl.getString("SetJDBCDriverPreferencePage.ApplytoConnectionEditors")); //$NON-NLS-1$
dialog.setSize(80, 30);
return dialog;
}
/**
*
* judge if has a jdbc connection child node under this parentNode
*
* @param parrentNode
* @return
*/
private boolean hasJdbcConnNodeChild(IRepositoryNode parentNode) {
if (parentNode != null
&& (parentNode instanceof DBConnectionFolderRepNode || parentNode instanceof DBConnectionSubFolderRepNode)) {
List<IRepositoryNode> children = parentNode.getChildren(false);
if (children.size() > 0) {
for (IRepositoryNode inode : children) {
if (inode instanceof DBConnectionRepNode) {
if (isJdbcConnectionNode((DBConnectionRepNode) inode)) {
return true;
}
} else if (inode instanceof DBConnectionSubFolderRepNode) {
return hasJdbcConnNodeChild(inode);
}
}
}
}
return false;
}
/**
*
* judge if has a jdbc connection node under this dbConnNode.
*
* @param dbConnNode
* @return
*/
private boolean isJdbcConnectionNode(DBConnectionRepNode dbConnNode) {
DatabaseConnection dbConn = dbConnNode.getDatabaseConnection();
if (dbConn != null && dbType_jdbc.equalsIgnoreCase(dbConn.getDatabaseType())) {
return true;
}
return false;
}
/**
*
* persistence database setting.
*
* @param selects
* @return
*/
private boolean saveDatabases(Object selects[]) {
try {
for (Object obj : selects) {
if (obj instanceof DBConnectionRepNode) {
DBConnectionRepNode repNode = (DBConnectionRepNode) obj;
IRepositoryViewObject object = repNode.getObject();
if (object == null || object.getProperty() == null) {
continue;
}
Item item = object.getProperty().getItem();
if (item != null) {
ConnectionItem connItem = (ConnectionItem) item;
DatabaseConnection connection = (DatabaseConnection) connItem.getConnection();
connection.setDatabaseType(dbType_jdbc);
connection.setDriverClass(generalJdbcClassNameText.getText());
connection.setDriverJarPath(generalJdbcDriverjarText.getText());
connection.setURL(generalJdbcUrlText.getText());
connection.setUsername(generalJdbcUserText.getText());
connection.setRawPassword(generalJdbcPasswordText.getText());
String mapFileText = generalMappingFileText.getText();
if (mapFileText != null && !PluginConstant.EMPTY_STRING.equals(mapFileText.trim())) {
connection.setDbmsId(mapFileText);
}
ProxyRepositoryFactory.getInstance().save(item);
// notify SQLExplorer
CWMPlugin.getDefault().addConnetionAliasToSQLPlugin(connection);
}
}
}
RepositoryNode node = (RepositoryNode) RepositoryNodeHelper.getMetadataFolderNode(EResourceConstant.DB_CONNECTIONS);
CorePlugin.getDefault().refreshDQView(node);
} catch (PersistenceException e) {
log.error(e);
}
return true;
}
}