// ============================================================================ // // 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.dq.analysis; import java.util.ArrayList; import java.util.Collection; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.resource.Resource; import org.talend.core.model.metadata.builder.connection.MetadataColumn; import org.talend.cwm.dependencies.DependenciesHandler; import org.talend.cwm.helper.ModelElementHelper; import org.talend.cwm.management.i18n.Messages; import org.talend.dataquality.PluginConstant; import org.talend.dataquality.domain.pattern.Pattern; import org.talend.dataquality.helpers.AnalysisHelper; import org.talend.dataquality.helpers.IndicatorHelper; import org.talend.dataquality.helpers.MetadataHelper; import org.talend.dataquality.indicators.CompositeIndicator; import org.talend.dataquality.indicators.DataminingType; import org.talend.dataquality.indicators.Indicator; import org.talend.dataquality.indicators.IndicatorsFactory; import org.talend.dataquality.indicators.PatternMatchingIndicator; import org.talend.dataquality.indicators.sql.UserDefIndicator; import org.talend.dq.helper.ContextHelper; import org.talend.dq.helper.EObjectHelper; import org.talend.dq.indicators.definitions.DefinitionHandler; import org.talend.utils.sugars.TypedReturnCode; import orgomg.cwm.foundation.softwaredeployment.DataManager; import orgomg.cwm.objectmodel.core.Dependency; import orgomg.cwm.objectmodel.core.ModelElement; /** * DOC xqliu class global comment. Detailled comment */ public class ModelElementAnalysisHandler extends AnalysisHandler { private static Logger log = Logger.getLogger(ModelElementAnalysisHandler.class); /** * Method "addColumnToAnalyze". * * @param modelElement * @return */ public boolean addColumnToAnalyze(ModelElement modelElement) { assert analysis != null; assert analysis.getContext() != null; return analysis.getContext().getAnalysedElements().add(modelElement); } public boolean addColumnsToAnalyze(Collection<ModelElement> modelElement) { assert analysis != null; assert analysis.getContext() != null; return analysis.getContext().getAnalysedElements().addAll(modelElement); } public boolean addIndicator(ModelElement modelElement, Indicator... indicators) { if (!analysis.getContext().getAnalysedElements().contains(modelElement)) { analysis.getContext().getAnalysedElements().add(modelElement); } for (Indicator indicator : indicators) { // ADD TDQ-7164 msjian 2013-5-14:set default indicator parameters. if (indicator.getParameters() == null) { indicator.setParameters(IndicatorsFactory.eINSTANCE.createIndicatorParameters()); } // TDQ-7164~ // store first level of indicators in result. analysis.getResults().getIndicators().add(indicator); initializeIndicator(indicator, modelElement); } DataManager connection = analysis.getContext().getConnection(); if (connection == null) { // try to get one log.error(Messages.getString("ColumnCorrelationAnalysisHandler.CONNNOTBEENSETINANALYSIS"));//$NON-NLS-1$ connection = ModelElementHelper.getTdDataProvider(modelElement); analysis.getContext().setConnection(connection); } TypedReturnCode<Dependency> rc = DependenciesHandler.getInstance().setDependencyOn(analysis, connection); return rc.isOk(); } private void initializeIndicator(Indicator indicator, ModelElement modelElement) { indicator.setAnalyzedElement(modelElement); // Make sure that indicator definition is set if (indicator.getIndicatorDefinition() == null) { DefinitionHandler.getInstance().setDefaultIndicatorDefinition(indicator); } // scorreia in case of composite indicators, add children to result. if (indicator instanceof CompositeIndicator) { for (Indicator child : ((CompositeIndicator) indicator).getChildIndicators()) { initializeIndicator(child, modelElement); // recurse } } } /** * Method "getDatamingType". * * @param column * @return the datamining type literal if any or empty string */ public String getDatamingType(ModelElement modelElement) { DataminingType dmType = MetadataHelper.getDataminingType(modelElement); if (dmType == null) { return PluginConstant.EMPTY_STRING; } // else return dmType.getLiteral(); } /** * Method "getIndicators". * * @param modelElement * @return the indicators attached to this column */ public Collection<Indicator> getIndicators(ModelElement modelElement) { ModelElement me = modelElement; // TDQ-9553, if import an old analysis with MDM Connection,the modelement will be null. Collection<Indicator> indics = new ArrayList<Indicator>(); if (me == null) { return indics; } if (me.eIsProxy()) { me = (ModelElement) EObjectHelper.resolveObject(me); } EList<Indicator> allIndics = analysis.getResults().getIndicators(); for (Indicator indicator : allIndics) { if (indicator.getAnalyzedElement() != null && indicator.getAnalyzedElement().equals(me)) { initializeIndicator(indicator); indics.add(indicator); } } return indics; } /** * * zshen Comment method "initializeIndicator". * * @param indicator */ public void initializeIndicator(Indicator indicator) { if (indicator.getIndicatorDefinition() == null || indicator.getIndicatorDefinition().eIsProxy()) { DefinitionHandler.getInstance().setDefaultIndicatorDefinition(indicator); } if (indicator instanceof CompositeIndicator) { for (Indicator child : ((CompositeIndicator) indicator).getChildIndicators()) { if (child.getAnalyzedElement() == null) { child.setAnalyzedElement(indicator.getAnalyzedElement()); } initializeIndicator(child); // recurse } } // Added TDQ-11736, check the pattern and udi name. if (indicator instanceof PatternMatchingIndicator && indicator.getParameters() != null) { Pattern pattern = indicator.getParameters().getDataValidDomain().getPatterns().get(0); if (!StringUtils.equals(indicator.getName(), pattern.getName())) { indicator.setName(pattern.getName()); } } if (indicator instanceof UserDefIndicator) { String defName = indicator.getIndicatorDefinition().getName(); if (!StringUtils.equals(indicator.getName(), defName)) { indicator.setName(defName); } } } /** * Method "getIndicatorLeaves" returns the indicators for the given column at the leaf level. * * @param column * @return the indicators attached to this column */ public Collection<Indicator> getIndicatorLeaves(ModelElement modelElement) { // get the leaf indicators Collection<Indicator> leafIndics = IndicatorHelper.getIndicatorLeaves(analysis.getResults()); // filter only indicators for this column Collection<Indicator> indics = new ArrayList<Indicator>(); for (Indicator indicator : leafIndics) { if (indicator.getAnalyzedElement() != null && indicator.getAnalyzedElement().equals(modelElement)) { indics.add(indicator); } } return indics; } /** * Method "setStringDataFilter". * * @param datafilterString * @return true when a new data filter is created, false if it is only updated */ public boolean setStringDataFilter(String datafilterString) { return AnalysisHelper.setStringDataFilter(analysis, datafilterString); } /** * get StringDataFilter with Context. * * @return */ public String getStringDataFilterwithContext() { return AnalysisHelper.getStringDataFilter(analysis); } /** * get StringDataFilter without Context. * * @return */ public String getStringDataFilter() { return ContextHelper.getDataFilterWithoutContext(analysis); } /** * DOC xqliu Comment method "setDatamingType". * * @param dataminingTypeLiteral * @param modelElement */ public void setDatamingType(String dataminingTypeLiteral, ModelElement modelElement) { DataminingType type = DataminingType.get(dataminingTypeLiteral); if (modelElement instanceof MetadataColumn) { MetadataHelper.setDataminingType(type, modelElement); } else { return; } Resource resource = modelElement.eResource(); if (resource != null) { resource.setModified(true); // tell that the resource has been modified. // it would be better to handle modifications with EMF Commands } } }