// ============================================================================
//
// 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.analysis;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
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.eclipse.ui.IEditorPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.database.DqRepositoryViewService;
import org.talend.cwm.helper.CatalogHelper;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.dataprofiler.core.PluginConstant;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.model.OverviewIndUIElement;
import org.talend.dataquality.analysis.AnalysisType;
import org.talend.dataquality.domain.Domain;
import org.talend.dataquality.exception.DataprofilerCoreException;
import org.talend.dataquality.helpers.AnalysisHelper;
import org.talend.dataquality.helpers.DomainHelper;
import org.talend.dq.analysis.AnalysisHandler;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.utils.sugars.ReturnCode;
import orgomg.cwm.resource.relational.Catalog;
import orgomg.cwm.resource.relational.Schema;
/**
* DOC rli class global comment. Detailled comment
*/
public abstract class AbstractFilterMetadataPage extends AbstractAnalysisMetadataPage {
private Text tableFilterText;
private Text viewFilterText;
protected Connection tdDataProvider;
private String latestTableFilterValue;
private String latestViewFilterValue;
private Button reloadDatabasesBtn = null;
public Connection getTdDataProvider() {
return this.tdDataProvider;
}
@Override
protected void createFormContent(IManagedForm managedForm) {
setFormTitle(DefaultMessagesImpl.getString("ConnectionMasterDetailsPage.connectionAnalysis")); //$NON-NLS-1$
setMetadataSectionTitle(DefaultMessagesImpl.getString("ConnectionMasterDetailsPage.analysisMeta")); //$NON-NLS-1$
setMetadataSectionDescription(DefaultMessagesImpl.getString("ConnectionMasterDetailsPage.setAnalysisProp")); //$NON-NLS-1$
super.createFormContent(managedForm);
createAnalysisParamSection();
createContextGroupSection(form, topComp);
}
/**
* create Analysis Param Section.
*
*/
private void createAnalysisParamSection() {
analysisParamSection = createSection(form, topComp,
DefaultMessagesImpl.getString("ConnectionMasterDetailsPage.analysisParameter")); //$NON-NLS-1$
Composite sectionClient = toolkit.createComposite(analysisParamSection);
sectionClient.setLayout(new GridLayout(1, false));
Composite comp1 = new Composite(sectionClient, SWT.NONE);
this.createAnalysisLimitComposite(comp1);
Composite comp2 = new Composite(sectionClient, SWT.NONE);
comp2.setLayout(new GridLayout(2, false));
GridDataFactory.fillDefaults().grab(true, true).applyTo(comp2);
Label tableFilterLabel = new Label(comp2, SWT.None);
tableFilterLabel.setText(DefaultMessagesImpl.getString("ConnectionMasterDetailsPage.filterOnTable")); //$NON-NLS-1$
tableFilterLabel.setLayoutData(new GridData());
tableFilterText = new Text(comp2, SWT.BORDER);
EList<Domain> dataFilters = getCurrentModelElement().getParameters().getDataFilter();
String tablePattern = DomainHelper.getTablePattern(dataFilters);
latestTableFilterValue = tablePattern == null ? PluginConstant.EMPTY_STRING : tablePattern;
tableFilterText.setText(latestTableFilterValue);
tableFilterText.setToolTipText(DefaultMessagesImpl.getString("AbstractFilterMetadataPage.FilterTables")); //$NON-NLS-1$
GridDataFactory.fillDefaults().grab(true, false).applyTo(tableFilterText);
tableFilterText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
setDirty(true);
}
});
Label viewFilterLabel = new Label(comp2, SWT.None);
viewFilterLabel.setText(DefaultMessagesImpl.getString("ConnectionMasterDetailsPage.filterOnView")); //$NON-NLS-1$
viewFilterLabel.setLayoutData(new GridData());
viewFilterText = new Text(comp2, SWT.BORDER);
String viewPattern = DomainHelper.getViewPattern(dataFilters);
latestViewFilterValue = viewPattern == null ? PluginConstant.EMPTY_STRING : viewPattern;
viewFilterText.setText(latestViewFilterValue);
viewFilterText.setToolTipText(DefaultMessagesImpl.getString("AbstractFilterMetadataPage.FilterViews")); //$NON-NLS-1$
GridDataFactory.fillDefaults().grab(true, false).applyTo(viewFilterText);
viewFilterText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
setDirty(true);
}
});
// ADD yyi 2011-05-31 16158:add whitespace check for text fields.
addWhitespaceValidate(tableFilterText, viewFilterText);
// ADD xqliu 2010-01-04 bug 10190
createReloadDatabasesButton(comp2);
// ~
analysisParamSection.setClient(sectionClient);
}
/**
* DOC xqliu Comment method "createReloadDatabasesButton".
*
* @param sectionClient
*/
private void createReloadDatabasesButton(Composite sectionClient) {
if (isConnectionAnalysis()) {
reloadDatabasesBtn = new Button(sectionClient, SWT.CHECK);
reloadDatabasesBtn.setText(DefaultMessagesImpl.getString("AbstractFilterMetadataPage.ReloadDatabases"));//$NON-NLS-1$
if (DqRepositoryViewService.isComeFromRefrenceProject(this.getTdDataProvider())) {
reloadDatabasesBtn.setEnabled(false);
reloadDatabasesBtn.setSelection(false);
} else {
reloadDatabasesBtn.setSelection(AnalysisHelper.getReloadDatabases(getCurrentModelElement()));
}
reloadDatabasesBtn.addMouseListener(new MouseListener() {
public void mouseDoubleClick(MouseEvent e) {
// do nothing here until now
}
public void mouseDown(MouseEvent e) {
setDirty(true);
}
public void mouseUp(MouseEvent e) {
// do nothing here until now
}
});
}
}
/**
* DOC xqliu Comment method "isConnectionAnalysis".
*
* @return
*/
private boolean isConnectionAnalysis() {
if (getCurrentModelElement() != null) {
return AnalysisType.CONNECTION.equals(AnalysisHelper.getAnalysisType(getCurrentModelElement()));
}
return false;
}
protected abstract void fillDataProvider();
protected abstract List<Catalog> getCatalogs();
protected abstract List<OverviewIndUIElement> getCatalogIndicators();
protected abstract List<OverviewIndUIElement> getSchemaIndicators();
/**
* find all analyzed schemas
*
* @param tdCatalogs
* @return
*/
protected int getSchamas(List<Catalog> tdCatalogs) {
List<Schema> tdSchema = new ArrayList<Schema>();
if (!tdCatalogs.isEmpty()) {
for (Catalog catalog : tdCatalogs) {
tdSchema.addAll(CatalogHelper.getSchemas(catalog));
}
}
if (tdSchema.isEmpty()) {
tdSchema = ConnectionHelper.getSchema(tdDataProvider);
}
return tdSchema.size();
}
@Override
public void saveAnalysis() throws DataprofilerCoreException {
// ADD xqliu 2010-01-04 bug 10190
if (isConnectionAnalysis()) { // MOD zshen 2010-03-19 bug 12041
AnalysisHelper.setReloadDatabases(getCurrentModelElement(), reloadDatabasesBtn.getSelection());
}
// ~
EList<Domain> dataFilters = getCurrentModelElement().getParameters().getDataFilter();
if (!this.tableFilterText.getText().equals(DomainHelper.getTablePattern(dataFilters))) {
DomainHelper.setDataFilterTablePattern(dataFilters, tableFilterText.getText());
latestTableFilterValue = this.tableFilterText.getText();
}
if (!this.viewFilterText.getText().equals(DomainHelper.getViewPattern(dataFilters))) {
DomainHelper.setDataFilterViewPattern(dataFilters, viewFilterText.getText());
latestViewFilterValue = this.viewFilterText.getText();
}
// save the number of connections per analysis
this.saveNumberOfConnectionsPerAnalysis();
// 2011.1.12 MOD by zhsne to unify anlysis and connection id when saving.
this.nameText.setText(getCurrentModelElement().getName());
// ~
// MOD yyi 2012-02-08 TDQ-4621:Explicitly set true for updating dependencies.
ReturnCode saved = ElementWriterFactory.getInstance().createAnalysisWrite()
.save(getCurrentRepNode().getObject().getProperty().getItem(), true);
// MOD yyi 2012-02-03 TDQ-3602:Avoid to rewriting all analyzes after saving, no reason to update all analyzes
// which is depended in the referred connection.
// Extract saving log function.
// @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#logSaved(ReturnCode)
logSaved(saved);
}
public void propertyChange(PropertyChangeEvent evt) {
if (PluginConstant.ISDIRTY_PROPERTY.equals(evt.getPropertyName())) {
((AnalysisEditor) this.getEditor()).firePropertyChange(IEditorPart.PROP_DIRTY);
}
}
public AbstractFilterMetadataPage(FormEditor editor, String id, String title) {
super(editor, id, title);
}
@Override
protected ReturnCode canRun() {
return new ReturnCode(true);
}
@Override
public void refreshGraphicsInSettingsPage() {
// do nothing here
}
@Override
public AnalysisHandler getAnalysisHandler() {
AnalysisHandler analysisHandler = new AnalysisHandler();
analysisHandler.setAnalysis(getCurrentModelElement());
return analysisHandler;
}
}