// ============================================================================
//
// 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.editor.composite;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Tree;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.repository.model.repositoryObject.MetadataColumnRepositoryObject;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.cwm.helper.ResourceHelper;
import org.talend.cwm.helper.SwitchHelpers;
import org.talend.cwm.relational.TdColumn;
import org.talend.dataprofiler.core.ImageLib;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.helper.ModelElementIndicatorHelper;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.model.ModelElementIndicator;
import org.talend.dataprofiler.core.model.TableIndicator;
import org.talend.dataprofiler.core.ui.action.actions.ChangeConnectionAction;
import org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage;
import org.talend.dataprofiler.core.ui.progress.ProgressUI;
import org.talend.dq.helper.EObjectHelper;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.RepositoryNodeHelper;
import org.talend.dq.nodes.DBColumnRepNode;
import org.talend.dq.nodes.DQRepositoryNode;
import org.talend.repository.model.IRepositoryNode;
import org.talend.repository.model.RepositoryNode;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.foundation.softwaredeployment.DataManager;
/**
* DOC rli class global comment. Detailled comment
*/
public abstract class AbstractPagePart {
private static Logger log = Logger.getLogger(AbstractPagePart.class);
private boolean isDirty;
protected PropertyChangeSupport propertyChangeSupport;
private SelectionListener selectionListener;
public AbstractPagePart() {
propertyChangeSupport = new PropertyChangeSupport(this);
}
public void setDirty(boolean dirty) {
if (isDirty != dirty) {
this.isDirty = dirty;
propertyChangeSupport.firePropertyChange(PluginConstant.ISDIRTY_PROPERTY, null, Boolean.valueOf(dirty));
}
}
public boolean isDirty() {
return isDirty;
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
/**
* ADD mzhao 2009-05-05 bug:6587. MOD 20130524 TDQ-7327 yyin: even when the indicators is empty, if the tdProvider
* is not null, should also set the connection state
*/
protected void updateBindConnection(AbstractAnalysisMetadataPage masterPage, ModelElementIndicator[] indicators, Tree tree) {
// MOD mzhao 2010-07-24, avoid a NPE, feature 13221
DataManager connection = masterPage.getCurrentModelElement().getContext().getConnection();
Connection tdProvider = null;
if (connection != null) {
tdProvider = SwitchHelpers.CONNECTION_SWITCH.doSwitch(connection);
}
if (indicators != null && indicators.length != 0 && tdProvider == null) {
tdProvider = ModelElementIndicatorHelper.getTdDataProvider(indicators[0]);
}
if (tdProvider != null) {
setConnectionState(masterPage, tdProvider);
}
}
/**
*
* ADD mzhao 2009-05-05 bug:6587.
*/
protected void updateBindConnection(AbstractAnalysisMetadataPage masterPage, TableIndicator[] indicators, Tree tree) {
Connection tdProvider = null;
if (indicators != null && indicators.length != 0) {
tdProvider = ConnectionHelper.getDataProvider(SwitchHelpers.COLUMN_SET_SWITCH.doSwitch(indicators[0].getColumnSet()));
setConnectionState(masterPage, tdProvider);
}
}
/**
*
* ADD mzhao 2009-05-05 bug:6587.
*/
protected void updateBindConnection(AbstractAnalysisMetadataPage masterPage, Tree tree) {
if (!isAnalyzedColumnsEmpty(tree)) {
DataManager dataManager = masterPage.getCurrentModelElement().getContext().getConnection();
if (dataManager == null) {
if (tree.getData() instanceof AnalysisColumnNominalIntervalTreeViewer) {
AnalysisColumnNominalIntervalTreeViewer treeViewer = (AnalysisColumnNominalIntervalTreeViewer) tree.getData();
RepositoryNode repositoryNode = treeViewer.getColumnSetMultiValueList().get(0);
dataManager = ((ConnectionItem) repositoryNode.getObject().getProperty().getItem()).getConnection();
} else if (tree.getData() instanceof AnalysisColumnSetTreeViewer) {
AnalysisColumnSetTreeViewer treeViewer = (AnalysisColumnSetTreeViewer) tree.getData();
IRepositoryNode reposNode = treeViewer.getColumnSetMultiValueList().get(0);
dataManager = ((ConnectionItem) reposNode.getObject().getProperty().getItem()).getConnection();
}
}
setConnectionState(masterPage, dataManager);
}
}
/**
* ADD mzhao 2009-05-05 bug:6587.
*/
protected void updateBindConnection(AbstractAnalysisMetadataPage masterPage, List<TableViewer> tableViewerPosStack) {
boolean isEmpty1 = tableViewerPosStack.get(0) == null || tableViewerPosStack.get(0).getInput() == null
|| ((List) tableViewerPosStack.get(0).getInput()).size() == 0;
boolean isEmpty2 = tableViewerPosStack.get(1) == null || tableViewerPosStack.get(1).getInput() == null
|| ((List) tableViewerPosStack.get(1).getInput()).size() == 0;
if (isEmpty1 && isEmpty2) {
return;
} else {
TableViewer columnsElementViewer = null;
if (!isEmpty1) {
columnsElementViewer = tableViewerPosStack.get(0);
} else {
columnsElementViewer = tableViewerPosStack.get(1);
}
Connection tdProvider = null;
Object input = columnsElementViewer.getInput();
List<DBColumnRepNode> columnSet = (List<DBColumnRepNode>) input;
if (columnSet != null && columnSet.size() != 0) {
TdColumn column = (TdColumn) ((MetadataColumnRepositoryObject) columnSet.get(0).getObject()).getTdColumn();
if (column != null && column.eIsProxy()) {
column = (TdColumn) EObjectHelper.resolveObject(column);
}
tdProvider = ConnectionHelper.getTdDataProvider(column);
setConnectionState(masterPage, tdProvider);
}
}
}
private void setConnectionState(final AbstractAnalysisMetadataPage masterPage, final DataManager dataManager) {
DataManager newDataManager = dataManager;
final DataManager fianlDataManager;
if (newDataManager != null) {
if (newDataManager.eIsProxy()) {
newDataManager = (DataManager) EObjectHelper.resolveObject(newDataManager);
}
Property prop = PropertyHelper.getProperty(newDataManager);
// MOD gdbu 2011-8-15 bug : TDQ-3213
masterPage.reloadDataproviderAndFillConnCombo();
fianlDataManager = newDataManager;
// MOD yyin 201204 TDQ-4977
Integer index = null;
// use property.getLabel() instead of dataManager.getDisplayName() because of we set it use first one for
// TDQ-6286.
boolean isConnectionAvailble = !(prop == null);
// MOD qiongli 2011-1-7 delimitedFile connection dosen't use 'dataManager.getName()'.
if (SwitchHelpers.CONNECTION_SWITCH.doSwitch(newDataManager) != null) {
// TDQ-10765: support ref project connection name, make the format of display is: label+(@reference
// project name)
DQRepositoryNode repNode = (DQRepositoryNode) RepositoryNodeHelper.recursiveFind(prop);
if (repNode != null) {
String displayName = RepositoryNodeHelper.getAnalysisConComboDisplayName(repNode);
index = (Integer) masterPage.getConnCombo().getData(
displayName + RepositoryNodeHelper.getConnectionType(newDataManager));
} else {
// when the current project(maybe local project) have no ref project, can not find the ref connection
isConnectionAvailble = false;
}
}
if (index != null) {
masterPage.getConnCombo().select(index);
}
// MOD qiongli 2011-5-16 bug 21453
if (prop != null && prop.getItem() != null && prop.getItem().getState() != null) {
masterPage.getLabelConnDeleted().setVisible(true);
if (prop.getItem().getState().isDeleted()) {
masterPage.getLabelConnDeleted().setText(
DefaultMessagesImpl.getString("AbstractPagePart.LogicalDeleteWarn", prop.getDisplayName()));//$NON-NLS-1$
} else {
if (!isConnectionAvailble) {
// when the connection is from ref project, but current project have not set ref project
masterPage.getLabelConnDeleted().setText(
DefaultMessagesImpl.getString("AbstractPagePart.ChangeConnectionError1", prop.getDisplayName()));//$NON-NLS-1$
}
}
} else {
masterPage.getLabelConnDeleted().setVisible(false);
// when the connection is from ref project, but current project have not set ref project
if (!isConnectionAvailble) {
masterPage.getLabelConnDeleted().setVisible(true);
masterPage.getLabelConnDeleted().setText(
DefaultMessagesImpl.getString(
"AbstractPagePart.ChangeConnectionError1", EObjectHelper.getURI(newDataManager).path()));//$NON-NLS-1$
}
}
// MOD mzhao 2009-06-09 feature 5887
if (selectionListener == null) {
selectionListener = new SelectionListener() {
private int prevSelect = masterPage.getConnCombo().getSelectionIndex();
private DataManager dataProvider = fianlDataManager;
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
ReturnCode rc = selectedObjectAvailable();
if (rc.isOk()) {
// Added TDQ-7327 20130523 yyin: to resolve the proxy connection which is caused by the
// refresh of the db connection tree
if (dataProvider.eIsProxy()) {
dataProvider = (Connection) EObjectHelper.resolveObject(dataProvider);
}// ~
Connection connection = null;
if (dataProvider instanceof RepositoryNode) {
connection = ((ConnectionItem) ((RepositoryNode) dataProvider).getObject().getProperty()
.getItem()).getConnection();
} else if (dataProvider instanceof Connection) {
connection = (Connection) dataProvider;
}
connection = callChangeConnectionAction(masterPage, prevSelect, connection);
prevSelect = masterPage.getConnCombo().getSelectionIndex();
} else {
// show error message
MessageDialogWithToggle
.openError(
null,
DefaultMessagesImpl.getString("AbstractPagePart.ChangeConnectionTitle"), DefaultMessagesImpl.getString("AbstractPagePart.ChangeConnectionError1", rc.getMessage())); //$NON-NLS-1$ //$NON-NLS-2$
// reload the connection combo
masterPage.reloadDataproviderAndFillConnCombo();
// reselect the old connection
masterPage.getConnCombo().removeSelectionListener(selectionListener);
String uuid = ResourceHelper.getUUID(dataProvider);
if (uuid != null) {
int itemCount = masterPage.getConnCombo().getItemCount();
for (int i = 0; i < itemCount; i++) {
Object connectionObj = masterPage.getConnCombo().getData(String.valueOf(i));
RepositoryNode repoNode = (RepositoryNode) connectionObj;
Connection connection = getConnectionFromRepositoryNode(repoNode);
if (connection != null && uuid.endsWith(ResourceHelper.getUUID(connection))) {
masterPage.getConnCombo().select(i);
break;
}
}
}
masterPage.getConnCombo().addSelectionListener(selectionListener);
}
}
/**
* check the connection is available or not(the connection is exist and not proxy, don't check the
* connection).
*
* @return a ReturnCode, the message is the connection label
*/
private ReturnCode selectedObjectAvailable() {
ReturnCode rc = new ReturnCode("", Boolean.FALSE); //$NON-NLS-1$
RepositoryNode repoNode = masterPage.getConnComboSelectNode();
rc.setMessage(repoNode.getLabel());
Connection connection = getConnectionFromRepositoryNode(repoNode);
if (connection != null && !connection.eIsProxy()) {
rc.setOk(true);
}
return rc;
}
/**
* DOC xqliu Comment method "getConnectionFromRepositoryNode".
*
* @param repoNode
* @return
*/
private Connection getConnectionFromRepositoryNode(RepositoryNode repoNode) {
Connection connection = null;
IRepositoryViewObject repoViewObject = repoNode.getObject();
if (repoViewObject != null) {
Property property = repoViewObject.getProperty();
if (property != null) {
Item item = property.getItem();
if (item != null && item instanceof ConnectionItem) {
connection = ((ConnectionItem) item).getConnection();
}
}
}
return connection;
}
};
masterPage.getConnCombo().addSelectionListener(selectionListener);
}
} else {
masterPage.getConnCombo().setText("unknown connection");//$NON-NLS-1$
}
}
// MOD mzhao 2009-06-09 feature 5887
private Connection callChangeConnectionAction(AbstractAnalysisMetadataPage masterPage, final int oldSelect,
Connection tdProvider) {
Connection returnProvider = tdProvider;
ChangeConnectionAction changeConnAction = new ChangeConnectionAction(masterPage, tdProvider);
changeConnAction.run();
ReturnCode ret = changeConnAction.getStatus();
if (ret.isOk()) {
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
updateModelViewer();
}
});
}
};
try {
ProgressUI.popProgressDialog(op);
} catch (InvocationTargetException e) {
log.error(e, e);
} catch (InterruptedException e) {
log.error(e, e);
}
// The newest dataprovider now would be the old one for next
// time connection changes.
Object connObject = masterPage.getConnCombo().getData(masterPage.getConnCombo().getSelectionIndex() + ""); //$NON-NLS-1$
if (connObject instanceof RepositoryNode) {
returnProvider = ((ConnectionItem) ((RepositoryNode) connObject).getObject().getProperty().getItem())
.getConnection();
} else if (connObject instanceof Connection) {
returnProvider = (Connection) connObject;
}
// MOD mzhao bug 12766, 2010-04-22 save the editor automatically.
masterPage.doSave(new NullProgressMonitor());
//
masterPage.updateAnalysisConnectionVersionInfo();
} else {
cancelSelection(masterPage, oldSelect);
}
return returnProvider;
}
private void cancelSelection(AbstractAnalysisMetadataPage masterPage, final int oldSelect) {
masterPage.getConnCombo().removeSelectionListener(selectionListener);
masterPage.getConnCombo().select(oldSelect);
masterPage.getConnCombo().addSelectionListener(selectionListener);
}
public abstract void updateModelViewer();
/**
*
* ADD mzhao 2009-05-05 bug:6587.
*/
private boolean isAnalyzedColumnsEmpty(Tree tree) {
boolean isEmpty = false;
if (tree == null || tree.getItemCount() == 0) {
isEmpty = true;
}
return isEmpty;
}
/**
* create the similar label for tree item
*
* @param parent
* @param imageName
* @param tooltipTextName
* @return Label
*/
protected Label createTreeItemLabel(Tree parent, String imageName, String tooltipTextName) {
Label label = new Label(parent, SWT.NONE);
label.setBackground(parent.getBackground());
label.setImage(ImageLib.getImage(imageName));
label.setToolTipText(DefaultMessagesImpl.getString(tooltipTextName));
label.pack();
return label;
}
}