// ============================================================================
//
// 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.dataquality.helpers;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.talend.commons.emf.FactoriesUtil;
import org.talend.commons.utils.WorkspaceUtils;
import org.talend.core.model.metadata.builder.connection.MetadataColumn;
import org.talend.core.model.properties.Project;
import org.talend.core.model.properties.Status;
import org.talend.cwm.constants.DevelopmentStatus;
import org.talend.cwm.helper.ColumnHelper;
import org.talend.cwm.helper.TaggedValueHelper;
import org.talend.cwm.relational.TdColumn;
import org.talend.cwm.relational.TdSqlDataType;
import org.talend.dataquality.PluginConstant;
import org.talend.dataquality.analysis.Analysis;
import org.talend.dataquality.analysis.AnalysisType;
import org.talend.dataquality.indicators.DataminingType;
import org.talend.model.bridge.ReponsitoryContextBridge;
import org.talend.utils.sql.Java2SqlType;
import org.talend.utils.sql.TalendTypeConvert;
import orgomg.cwm.objectmodel.core.ModelElement;
import orgomg.cwm.objectmodel.core.TaggedValue;
/**
* @author scorreia
*
* This class is a helper for handling data quality metadata.
*/
public final class MetadataHelper {
// MOD klliu 2010-10-09 feature 15821
/**
*
* DOC klliu Comment method "getOtherParameter".
*
* @return
*/
public static String getOtherParameter(ModelElement element) {
TaggedValue tv = TaggedValueHelper.getTaggedValue(TaggedValueHelper.OTHER_PARAMETER, element.getTaggedValue());
if (tv == null) {
return "";
}
return tv.getValue();
}
/**
*
* DOC klliu Comment method "setOtherParameter".
*
* @param otherParameter
*/
public static void setOtherParameter(String otherParameter, ModelElement element) {
TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.OTHER_PARAMETER, otherParameter);
}
private MetadataHelper() {
}
/**
* Method "setDataminingType" sets the type of the content of a column.
*
* @param type
* @param column
*/
public static void setDataminingType(DataminingType type, TdColumn column) {
column.setContentType(type.getLiteral());
}
/**
* DOC xqliu Comment method "setDataminingType".
*
* @param type
* @param modelElement
*/
public static void setDataminingType(DataminingType type, ModelElement modelElement) {
TaggedValueHelper.setTaggedValue(modelElement, TaggedValueHelper.DATA_CONTENT_TYPE_TAGGED_VAL, type.getLiteral());
}
/**
* Set the DataminingType according to the Column Type.
*
* @param modelElement
*/
public static void setDefaultDataminingType(ModelElement modelElement) {
if (modelElement == null) {
return;
}
DataminingType type = getDataminingType(modelElement);
if (type == null) {
type = getDefaultDataminingType(0);
}
TaggedValueHelper.setTaggedValue(modelElement, TaggedValueHelper.DATA_CONTENT_TYPE_TAGGED_VAL, type.getLiteral());
}
/**
* Method "getDataminingType" gets the type of the content of a column.
*
* @param column
* @return the DataminingType or null if none has been set.
*/
public static DataminingType getDataminingType(TdColumn column) {
// MOD xqliu 2009-11-27 bug 8690
// MOD xqliu 2010-03-23 bug 12014
String contentType = column.getContentType();
if (contentType == null || contentType.equals("")) {
if (ColumnHelper.isPrimaryKey(column) || ColumnHelper.isForeignKey(column)) {
return DataminingType.NOMINAL;
} else {
// MOD scorreia 2010-10-20 bug 16403 avoid NPE here
TdSqlDataType sqlDataType = column.getSqlDataType();
return (sqlDataType != null) ? getDefaultDataminingType(sqlDataType.getJavaDataType()) : DataminingType.OTHER;
}
} else {
return DataminingType.get(contentType);
}
}
/**
* method "getDefaultDataminingType" gets the default type of the content of a column.
*
* @param javaSqlType
* @return the datamining type (never null)
*/
public static DataminingType getDefaultDataminingType(int javaSqlType) {
if (Java2SqlType.isTextInSQL(javaSqlType)) {
return DataminingType.NOMINAL;
}
if (Java2SqlType.isNumbericInSQL(javaSqlType)) {
return DataminingType.INTERVAL;
}
if (Java2SqlType.isDateInSQL(javaSqlType)) {
return DataminingType.INTERVAL;
}
if (Java2SqlType.isOtherTypeInSQL(javaSqlType)) {
return DataminingType.OTHER;
}
return DataminingType.OTHER;
}
/**
* DOC bZhou Comment method "setAuthor".
*
* @param element
* @param author
* @return
*/
public static boolean setAuthor(ModelElement element, String author) {
return TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.AUTHOR, author);
}
/**
* DOC bZhou Comment method "getAuthor".
*
* @param element
* @return
*/
public static String getAuthor(ModelElement element) {
TaggedValue tv = TaggedValueHelper.getTaggedValue(TaggedValueHelper.AUTHOR, element.getTaggedValue());
if (tv == null) {
return PluginConstant.EMPTY_STRING;
}
return tv.getValue();
}
/**
* DOC bZhou Comment method "getDescription".
*
* @param element
* @return
*/
public static String getDescription(ModelElement element) {
TaggedValue tv = TaggedValueHelper.getTaggedValue(TaggedValueHelper.DESCRIPTION, element.getTaggedValue());
if (tv == null) {
return PluginConstant.EMPTY_STRING;
}
return tv.getValue();
}
/**
* DOC bZhou Comment method "setDescription".
*
* @param description
* @param element
* @return
*/
public static boolean setDescription(String description, ModelElement element) {
return TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.DESCRIPTION, description);
}
/**
* Method "setDevStatus" sets the development status of the given element.
*
* @param element
* @param status the state to set.
* @return
*/
public static boolean setDevStatus(ModelElement element, String statusLabel) {
// MOD mzhao feature 7479 2009-10-16
if (statusLabel == null) {
return false;
}
return TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.DEV_STATUS, statusLabel);
}
/**
* Method "getDevStatus". MOD mzhao feature 7479
*
* @param element such as Analysis, DataProvider...
* @return the development status of the element
*/
public static String getDevStatus(ModelElement element) {
TaggedValue taggedValue = TaggedValueHelper.getTaggedValue(TaggedValueHelper.DEV_STATUS, element.getTaggedValue());
if (taggedValue == null) {
List<org.talend.core.model.properties.Status> statusList = MetadataHelper.getTechnicalStatus();
if (statusList != null && statusList.size() > 0) {
return statusList.get(0).getLabel();
} else {
return DevelopmentStatus.DRAFT.getLiteral();
}
}
String statusValueString = taggedValue.getValue();
return statusValueString;
}
/**
* Method "setPurpose".
*
* @param purpose the purpose to set or create
* @param element a CWM element
*/
public static void setPurpose(String purpose, ModelElement element) {
TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.PURPOSE, purpose);
}
/**
* Method "getPurpose".
*
* @param element a CWM element
* @return the purpose or null
*/
public static String getPurpose(ModelElement element) {
TaggedValue tv = TaggedValueHelper.getTaggedValue(TaggedValueHelper.PURPOSE, element.getTaggedValue());
if (tv == null) {
return PluginConstant.EMPTY_STRING;
}
return tv.getValue();
}
/**
* Method "setVersion" sets the version of the given element.
*
* @param version the version to set
* @param element the element
* @return true if the value was not set before.
*/
public static boolean setVersion(String version, ModelElement element) {
String statusStr = String.valueOf(version);
return TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.VERSION, statusStr);
}
/**
* Method "getVersion".
*
* @param element
* @return the version of the element
*/
public static String getVersion(ModelElement element) {
TaggedValue tv = TaggedValueHelper.getTaggedValue(TaggedValueHelper.VERSION, element.getTaggedValue());
if (tv == null) {
return WorkspaceUtils.DEFAULT_VERSION;
}
return tv.getValue();
}
/**
* DOC bZhou Comment method "getPropertyPath".
*
* @param element
* @return
*/
public static String getPropertyPath(ModelElement element) {
TaggedValue taggedValue = TaggedValueHelper.getTaggedValue(TaggedValueHelper.PROPERTY_FILE, element.getTaggedValue());
return taggedValue == null ? null : taggedValue.getValue();
}
/**
* DOC bZhou Comment method "setPropertyPath".
*
* @param path
* @param element
*/
public static void setPropertyPath(String path, ModelElement element) {
if (path != null && path.endsWith(FactoriesUtil.PROPERTIES_EXTENSION)) {
TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.PROPERTY_FILE, path);
}
}
@SuppressWarnings("unchecked")
public static List<Status> getTechnicalStatus() {
Project project = ReponsitoryContextBridge.getProject();
if (project != null) {
return copyList(project.getTechnicalStatus());
} else {
return new ArrayList<Status>();
}
}
public static List<String> toArray(List<org.talend.core.model.properties.Status> status) {
List<String> res = new ArrayList<String>();
for (org.talend.core.model.properties.Status s : status) {
res.add(s.getLabel());
}
return res;
}
private static List<Status> copyList(List<Status> listOfStatus) {
List<Status> result = new ArrayList<Status>();
for (Object obj : listOfStatus) {
result.add((Status) obj);
}
return result;
}
/**
* DOC xqliu Comment method "getDataminingType".
*
* @param modelElement
* @return
*/
public static DataminingType getDataminingType(ModelElement modelElement) {
if (modelElement != null) {
if (modelElement instanceof TdColumn) {
return getDataminingType((TdColumn) modelElement);
} else if (modelElement instanceof MetadataColumn) {
String contentType = TaggedValueHelper.getValueString(TaggedValueHelper.DATA_CONTENT_TYPE_TAGGED_VAL,
modelElement);
if (StringUtils.isNotEmpty(contentType)) {
return DataminingType.get(contentType);
}
// MOD yyi 2011-06-23 22700: override the method for flatfile column
int javaType = TalendTypeConvert.convertToJDBCType(((MetadataColumn) modelElement).getTalendType());
return MetadataHelper.getDefaultDataminingType(javaType);
}
}
return getDefaultDataminingType(0);
}
/**
* DOC xqliu Comment method "setRetrieveAllMetadata".
*
* @param retrieveAllMetadata
* @param element
* @return
*/
public static boolean setRetrieveAllMetadata(String retrieveAllMetadata, ModelElement element) {
return TaggedValueHelper.setTaggedValue(element, TaggedValueHelper.RETRIEVE_ALL, retrieveAllMetadata);
}
/**
* DOC xqliu Comment method "getRetrieveAllMetadata".
*
* @param element
* @return
*/
public static String getRetrieveAllMetadata(ModelElement element) {
TaggedValue tv = TaggedValueHelper.getTaggedValue(TaggedValueHelper.RETRIEVE_ALL, element.getTaggedValue());
if (tv == null) {
return "true";
}
return tv.getValue();
}
/**
* DOC klliu Comment method "getAnType".
*
* @param analysis
* @return
*/
public static String getAnType(Analysis analysis) {
AnalysisType analysisType = analysis.getParameters().getAnalysisType();
return analysisType.getName();
}
}