// ============================================================================ // // 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.beans.PropertyChangeListener; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; 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.Display; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.events.ExpansionAdapter; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.ImageHyperlink; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.SwitchHelpers; import org.talend.dataprofiler.core.ImageLib; import org.talend.dataprofiler.core.PluginConstant; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.model.TableIndicator; import org.talend.dataprofiler.core.model.dynamic.DynamicIndicatorModel; import org.talend.dataprofiler.core.ui.editor.analysis.TablesSelectionDialog.TableSelectionType; import org.talend.dataprofiler.core.ui.editor.composite.AbstractColumnDropTree; import org.talend.dataprofiler.core.ui.editor.composite.AnalysisTableTreeViewer; import org.talend.dataprofiler.core.ui.editor.preview.CompositeIndicator; import org.talend.dataprofiler.core.ui.editor.preview.TableIndicatorUnit; import org.talend.dataprofiler.core.ui.editor.preview.model.ChartTypeStatesFactory; import org.talend.dataprofiler.core.ui.editor.preview.model.states.IChartTypeStates; import org.talend.dataprofiler.core.ui.editor.preview.model.states.WhereRuleStatisticsStateTable; import org.talend.dataprofiler.core.ui.events.DynamicChartEventReceiver; import org.talend.dataprofiler.core.ui.events.EventEnum; import org.talend.dataprofiler.core.ui.events.EventManager; import org.talend.dataprofiler.core.ui.events.IEventReceiver; import org.talend.dataprofiler.core.ui.events.TableDynamicChartEventReceiver; import org.talend.dataprofiler.core.ui.pref.EditorPreferencePage; import org.talend.dataprofiler.core.ui.utils.AnalysisUtils; import org.talend.dataprofiler.core.ui.utils.TOPChartUtils; import org.talend.dataprofiler.core.ui.utils.WorkbenchUtils; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.analysis.ExecutionLanguage; import org.talend.dataquality.domain.Domain; import org.talend.dataquality.exception.DataprofilerCoreException; import org.talend.dataquality.indicators.Indicator; import org.talend.dq.analysis.TableAnalysisHandler; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.helper.RepositoryNodeHelper; import org.talend.dq.indicators.preview.EIndicatorChartType; import org.talend.dq.nodes.indicator.type.IndicatorEnum; import org.talend.dq.writer.impl.ElementWriterFactory; import org.talend.repository.model.IRepositoryNode; import org.talend.repository.model.RepositoryNode; import org.talend.utils.sugars.ReturnCode; import orgomg.cwm.objectmodel.core.ModelElement; import orgomg.cwm.resource.relational.NamedColumnSet; /** * DOC xqliu class global comment. Detailled comment */ public class BusinessRuleAnalysisDetailsPage extends DynamicAnalysisMasterPage implements PropertyChangeListener { private static Logger log = Logger.getLogger(BusinessRuleAnalysisDetailsPage.class); AnalysisTableTreeViewer treeViewer; TableAnalysisHandler analysisHandler; private TableIndicator[] currentTableIndicators; private static final int TREE_MAX_LENGTH = 400; private Composite[] previewChartCompsites; private Section analysisTableSection = null; private List<ExpandableComposite> previewChartList = null; // Added TDQ-8787 20140617 yyin : store the temp indicator and its related dataset between one running private List<DynamicIndicatorModel> dynamicList = new ArrayList<DynamicIndicatorModel>(); /** * DOC xqliu TableMasterDetailsPage constructor comment. * * @param editor * @param id * @param title */ public BusinessRuleAnalysisDetailsPage(FormEditor editor, String id, String title) { super(editor, id, title); currentEditor = (AnalysisEditor) editor; execLang = ExecutionLanguage.SQL.getLiteral(); } public TableIndicator[] getCurrentTableIndicators() { return currentTableIndicators; } @Override public void initialize(FormEditor editor) { super.initialize(editor); recomputeIndicators(); } public void recomputeIndicators() { analysisHandler = new TableAnalysisHandler(); analysisHandler.setAnalysis(getCurrentModelElement()); stringDataFilter = analysisHandler.getStringDataFilter(); EList<ModelElement> analyzedTables = analysisHandler.getAnalyzedTables(); List<TableIndicator> tableIndicatorList = new ArrayList<TableIndicator>(); for (ModelElement element : analyzedTables) { NamedColumnSet set = SwitchHelpers.NAMED_COLUMN_SET_SWITCH.doSwitch(element); if (set == null) { continue; } TableIndicator currentTableIndicator = new TableIndicator(set); Collection<Indicator> indicatorList = analysisHandler.getIndicators(set); currentTableIndicator.setIndicators(indicatorList.toArray(new Indicator[indicatorList.size()])); tableIndicatorList.add(currentTableIndicator); } currentTableIndicators = tableIndicatorList.toArray(new TableIndicator[tableIndicatorList.size()]); } @Override protected void createFormContent(IManagedForm managedForm) { this.form = managedForm.getForm(); Composite body = form.getBody(); body.setLayout(new GridLayout()); sForm = new SashForm(body, SWT.NULL); sForm.setLayoutData(new GridData(GridData.FILL_BOTH)); topComp = toolkit.createComposite(sForm); topComp.setLayoutData(new GridData(GridData.FILL_BOTH)); topComp.setLayout(new GridLayout()); form.setText(DefaultMessagesImpl.getString("TableMasterDetailsPage.tableAna")); //$NON-NLS-1$ setMetadataSectionTitle(DefaultMessagesImpl.getString("TableMasterDetailsPage.analysisMeta")); //$NON-NLS-1$ setMetadataSectionDescription(DefaultMessagesImpl.getString("TableMasterDetailsPage.setPropOfAnalysis")); //$NON-NLS-1$ metadataSection = creatMetadataSection(form, topComp); createAnalysisTablesSection(form, topComp); createDataFilterSection(form, topComp); dataFilterComp.addPropertyChangeListener(this); createAnalysisParamSection(form, topComp); createContextGroupSection(form, topComp); // MOD klliu Hide the setting pate graphics 2011-03-11 if (canShowGraphicsSectionForSettingsPage()) { createPreviewComposite(); createPreviewSection(form, previewComp); } } void createAnalysisTablesSection(final ScrolledForm form1, Composite anasisDataComp) { analysisTableSection = createSection(form1, anasisDataComp, DefaultMessagesImpl.getString("TableMasterDetailsPage.analyzeTable"), null); //$NON-NLS-1$ Composite topComp1 = toolkit.createComposite(analysisTableSection); topComp1.setLayout(new GridLayout()); // ~ MOD mzhao 2009-05-05,Bug 6587. createConnBindWidget(topComp1); // ~ Composite actionBarComp = toolkit.createComposite(topComp1); GridLayout gdLayout = new GridLayout(); gdLayout.numColumns = 3; actionBarComp.setLayout(gdLayout); ImageHyperlink collapseAllImageLink = toolkit.createImageHyperlink(actionBarComp, SWT.NONE); collapseAllImageLink.setToolTipText(DefaultMessagesImpl.getString("TableMasterDetailsPage.collapseAllTables")); //$NON-NLS-1$ WorkbenchUtils.setHyperlinkImage(collapseAllImageLink, ImageLib.getImage(ImageLib.COLLAPSE_ALL)); collapseAllImageLink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { TreeItem[] items = treeViewer.getTree().getItems(); expandTreeItems(items, false); packOtherColumns(); } }); ImageHyperlink expandAllImageLink = toolkit.createImageHyperlink(actionBarComp, SWT.NONE); expandAllImageLink.setToolTipText(DefaultMessagesImpl.getString("TableMasterDetailsPage.expandAllTables")); //$NON-NLS-1$ WorkbenchUtils.setHyperlinkImage(expandAllImageLink, ImageLib.getImage(ImageLib.EXPAND_ALL)); expandAllImageLink.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { TreeItem[] items = treeViewer.getTree().getItems(); expandTreeItems(items, true); packOtherColumns(); } }); Button clmnBtn = toolkit.createButton(actionBarComp, DefaultMessagesImpl.getString("TableMasterDetailsPage.selectTable"), //$NON-NLS-1$ SWT.NONE); clmnBtn.addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { openTableSelectionDialog(); } }); Composite treeComp = toolkit.createComposite(topComp1, SWT.NONE); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).applyTo(treeComp); treeComp.setLayout(new GridLayout()); ((GridData) treeComp.getLayoutData()).heightHint = TREE_MAX_LENGTH; treeComp.setBackgroundMode(SWT.INHERIT_DEFAULT); treeViewer = new AnalysisTableTreeViewer(treeComp, this); treeViewer.setDirty(false); treeViewer.addPropertyChangeListener(this); analysisTableSection.setClient(topComp1); } /** * DOC xqliu Comment method "packOtherColumns". */ private void packOtherColumns() { TreeColumn[] columns = treeViewer.getTree().getColumns(); for (TreeColumn column : columns) { column.pack(); } } /** * DOC xqliu Comment method "expandTreeItems". * * @param items * @param expandOrCollapse */ private void expandTreeItems(TreeItem[] items, boolean expandOrCollapse) { for (TreeItem item : items) { item.setExpanded(expandOrCollapse); TreeItem[] its = item.getItems(); if (its != null && its.length > 0) { expandTreeItems(its, expandOrCollapse); } } } public void openTableSelectionDialog() { if (!RepositoryNodeHelper.isOpenDQCommonViewer()) { if (RepositoryNodeHelper.getDQCommonViewer(true) == null) { MessageDialog .openWarning( this.getSite().getShell(), DefaultMessagesImpl.getString("TableMasterDetailsPage.WarningDialogTitle"), DefaultMessagesImpl.getString("TableMasterDetailsPage.WarningDialogCantFindNode")); //$NON-NLS-1$ //$NON-NLS-2$ return; } } TableIndicator[] tableIndicators = treeViewer.getTableIndicator(); List<IRepositoryNode> setList = new ArrayList<IRepositoryNode>(); for (TableIndicator tableIndicator : tableIndicators) { RepositoryNode recursiveFind = RepositoryNodeHelper.recursiveFind(tableIndicator.getColumnSet()); if (recursiveFind == null) { recursiveFind = RepositoryNodeHelper.createRepositoryNode(tableIndicator.getColumnSet()); } setList.add(recursiveFind); } RepositoryNode connComboSelectNode = getConnComboSelectNode(); TablesSelectionDialog dialog = new TablesSelectionDialog(this, null, DefaultMessagesImpl.getString("TableMasterDetailsPage.tableSelection"), setList, DefaultMessagesImpl //$NON-NLS-1$ .getString("TableMasterDetailsPage.tableSelections"), connComboSelectNode); //$NON-NLS-1$ dialog.setTableType(TableSelectionType.ALL); if (dialog.open() == Window.OK) { Object[] tables = dialog.getResult(); treeViewer.setInput(tables); return; } } @Override public void createPreviewCharts(final ScrolledForm form1, final Composite composite) { previewChartList = new ArrayList<ExpandableComposite>(); dynamicList.clear(); for (final TableIndicator tableIndicator : this.treeViewer.getTableIndicator()) { final NamedColumnSet set = tableIndicator.getColumnSet(); ExpandableComposite exComp = toolkit.createExpandableComposite(composite, ExpandableComposite.TREE_NODE | ExpandableComposite.CLIENT_INDENT); // bug 10541 modify by zshen,Change some character set to be proper to add view in the table anasys if (tableIndicator.isTable()) { exComp.setText(DefaultMessagesImpl.getString("TableMasterDetailsPage.table") + set.getName()); //$NON-NLS-1$ } else { exComp.setText(DefaultMessagesImpl.getString("TableMasterDetailsPage.view") + set.getName()); //$NON-NLS-1$ } exComp.setLayout(new GridLayout()); exComp.setLayoutData(new GridData(GridData.FILL_BOTH)); exComp.setData(tableIndicator); previewChartList.add(exComp); final Composite comp = toolkit.createComposite(exComp); comp.setLayout(new GridLayout()); comp.setLayoutData(new GridData(GridData.FILL_BOTH)); exComp.setExpanded(true); exComp.setClient(comp); if (tableIndicator.getIndicators().length != 0) { IRunnableWithProgress rwp = new IRunnableWithProgress() { public void run(final IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { monitor.beginTask(DefaultMessagesImpl.getString("TableMasterDetailsPage.createPreview") //$NON-NLS-1$ + set.getName(), IProgressMonitor.UNKNOWN); Display.getDefault().syncExec(new Runnable() { public void run() { Map<EIndicatorChartType, List<TableIndicatorUnit>> indicatorComposite = CompositeIndicator .getInstance().getTableIndicatorComposite(tableIndicator); for (EIndicatorChartType chartType : indicatorComposite.keySet()) { List<TableIndicatorUnit> units = indicatorComposite.get(chartType); if (!units.isEmpty()) { final IChartTypeStates chartTypeState = ChartTypeStatesFactory.getChartStateOfTableAna( chartType, units, tableIndicator); // get all indicator lists separated by chart, and only // WhereRuleStatisticsStateTable can get not-null charts List<List<Indicator>> pagedIndicators = ((WhereRuleStatisticsStateTable) chartTypeState) .getPagedIndicators(); // Added TDQ-9241: for each list(for each chart), check if the current // list has been registered dynamic event List<Object> datasets = new ArrayList<Object>(); for (List<Indicator> oneChart : pagedIndicators) { IEventReceiver event = EventManager.getInstance().findRegisteredEvent( oneChart.get(0), EventEnum.DQ_DYMANIC_CHART, 0); if (event != null) { // get the dataset from the event Object dataset = ((TableDynamicChartEventReceiver) event).getDataset(); // if there has the dataset for the current rule, use it to replace, // (only happen when first switch from master to result page, during // one running) if (dataset != null) { datasets.add(dataset); } }// ~ } // create chart List<Object> charts = null; if (datasets.size() > 0) { charts = chartTypeState.getChartList(datasets); } else { charts = chartTypeState.getChartList(); } int index = 0; if (charts != null) { for (Object chart : charts) { Object chartComp = TOPChartUtils.getInstance().createChartComposite(comp, SWT.NONE, chart, true); // Added TDQ-8787 20140707 yyin: create and store the dynamic model DynamicIndicatorModel dyModel = AnalysisUtils.createDynamicModel(chartType, pagedIndicators.get(index++), chart); dynamicList.add(dyModel); // ~ TOPChartUtils.getInstance().addListenerToChartComp(chartComp, chartTypeState.getReferenceLink(), DefaultMessagesImpl.getString("TableMasterDetailsPage.what")); //$NON-NLS-1$ } } } } } }); monitor.done(); } }; try { new ProgressMonitorDialog(getSite().getShell()).run(true, false, rwp); } catch (Exception ex) { log.error(ex, ex); } } exComp.addExpansionListener(new ExpansionAdapter() { @Override public void expansionStateChanged(ExpansionEvent e) { getChartComposite().layout(); form1.reflow(true); composite.pack(); } }); getChartComposite().layout(); form1.reflow(true); composite.pack(); } if (!previewChartList.isEmpty()) { this.previewChartCompsites = previewChartList.toArray(new Composite[previewChartList.size()]); } } @Override public Composite getChartComposite() { return chartComposite; } public Composite[] getPreviewChartCompsites() { // ADD msjian TDQ-6213 2012-12-18: filter the disposed composite if (previewChartList != null && !previewChartList.isEmpty()) { List<ExpandableComposite> withOutDisposed = new ArrayList<ExpandableComposite>(); for (ExpandableComposite com : previewChartList) { if (!com.isDisposed()) { withOutDisposed.add(com); } } this.previewChartCompsites = withOutDisposed.toArray(new ExpandableComposite[withOutDisposed.size()]); } // TDQ-6213~ return previewChartCompsites; } public void setPreviewChartCompsites(Composite[] previewChartCompsites) { this.previewChartCompsites = previewChartCompsites; } @Override protected ReturnCode canRun() { TableIndicator[] tableIndicators = treeViewer.getTableIndicator(); if (tableIndicators == null || tableIndicators.length == 0) { return new ReturnCode(DefaultMessagesImpl.getString("TableMasterDetailsPage.NoTableAssigned"), false); //$NON-NLS-1$ } for (TableIndicator tableIndicator : tableIndicators) { if (tableIndicator.getIndicators().length == 0) { return new ReturnCode(DefaultMessagesImpl.getString("TableMasterDetailsPage.NoIndicatorAssigned"), false); //$NON-NLS-1$ } } return new ReturnCode(true); } @Override public ReturnCode canSave() { // MOD by gdbu 2011-3-21 bug 19179 ReturnCode canModRetCode = super.canSave(); if (!canModRetCode.isOk()) { return canModRetCode; } // ~19179 return new ReturnCode(true); } @Override public void saveAnalysis() throws DataprofilerCoreException { // ADD gdbu 2011-3-3 bug 19179 for (Domain domain : getCurrentModelElement().getParameters().getDataFilter()) { domain.setName(getCurrentModelElement().getName()); } // ~ analysisHandler.clearAnalysis(); TableIndicator[] tableIndicators = treeViewer.getTableIndicator(); Connection tdProvider = null; Analysis analysis = analysisHandler.getAnalysis(); analysis.getParameters().setExecutionLanguage(ExecutionLanguage.get(execLang)); if (tableIndicators != null && tableIndicators.length != 0) { tdProvider = ConnectionHelper.getDataProvider(tableIndicators[0].getColumnSet()); if (tdProvider.eIsProxy()) { // Resolve the connection again tdProvider = (Connection) EObjectHelper.resolveObject(tdProvider); } analysis.getContext().setConnection(tdProvider); for (TableIndicator tableIndicator : tableIndicators) { analysisHandler.addIndicator(tableIndicator.getColumnSet(), tableIndicator.getIndicators()); } } else { analysis.getContext().setConnection(null); } analysisHandler.setStringDataFilter(dataFilterComp.getDataFilterString()); // 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(analysisHandler.getName()); // TDQ-5581,if has removed rules,should remove dependency each other before saving. // 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); treeViewer.setDirty(false); dataFilterComp.setDirty(false); } public void propertyChange(PropertyChangeEvent evt) { if (PluginConstant.ISDIRTY_PROPERTY.equals(evt.getPropertyName())) { ((AnalysisEditor) currentEditor).firePropertyChange(IEditorPart.PROP_DIRTY); ((AnalysisEditor) currentEditor).setRefreshResultPage(true); } else if (PluginConstant.DATAFILTER_PROPERTY.equals(evt.getPropertyName())) { this.analysisHandler.setStringDataFilter((String) evt.getNewValue()); } } @Override public void refreshGraphicsInSettingsPage() { if (EditorPreferencePage.isHideGraphicsSectionForSettingsPage()) { if (sForm.getChildren().length > 1) { if (null != sForm.getChildren()[1] && !sForm.getChildren()[1].isDisposed()) { sForm.getChildren()[1].dispose(); } topComp.getParent().layout(); topComp.layout(); } } else { if (chartComposite != null && !chartComposite.isDisposed()) { try { for (Control control : chartComposite.getChildren()) { control.dispose(); } createPreviewCharts(form, chartComposite); chartComposite.getParent().layout(); chartComposite.layout(); } catch (Exception ex) { log.error(ex, ex); } } else { createPreviewComposite(); createPreviewSection(form, previewComp); createPreviewCharts(form, chartComposite); } } } @Override public boolean isDirty() { return super.isDirty() || (treeViewer != null && treeViewer.isDirty()) || (dataFilterComp != null && dataFilterComp.isDirty()); } @Override public void dispose() { super.dispose(); if (this.treeViewer != null) { this.treeViewer.removePropertyChangeListener(this); } if (dataFilterComp != null) { this.dataFilterComp.removePropertyChangeListener(this); } } @Override public TableAnalysisHandler getAnalysisHandler() { return analysisHandler; } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.AbstractAnalysisMetadataPage#getTreeViewer() */ @Override public AbstractColumnDropTree getTreeViewer() { return this.treeViewer; } @Override List<ExpandableComposite> getPreviewChartList() { return this.previewChartList; } @Override String getExpandString() { return DefaultMessagesImpl.getString("TableMasterDetailsPage.expandAllTables"); //$NON-NLS-1$ } @Override String getCollapseAllString() { return DefaultMessagesImpl.getString("TableMasterDetailsPage.collapseAllTables");//$NON-NLS-1$ } /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.ui.editor.analysis.DynamicAnalysisMasterPage#getDynamicDatasets() */ @Override public List<DynamicIndicatorModel> getDynamicDatasets() { return dynamicList; } @Override public void clearDynamicDatasets() { super.clearDynamicDatasets(); this.dynamicList.clear(); } @Override protected DynamicChartEventReceiver createEventReceiver(DynamicIndicatorModel indModel, int index, Indicator oneIndicator) { TableDynamicChartEventReceiver eReceiver = new TableDynamicChartEventReceiver(); eReceiver.setDataset(indModel.getDataset()); eReceiver.setIndexInDataset(index); eReceiver.setIndicatorName(oneIndicator.getName()); eReceiver.setIndicator(oneIndicator); eReceiver.setIndicatorType(IndicatorEnum.findIndicatorEnum(oneIndicator.eClass())); // clear data eReceiver.clearValue(); return eReceiver; } }