/** * <copyright> </copyright> * * $Id$ */ package org.talend.dataquality.indicators.impl; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.talend.core.model.metadata.builder.connection.Connection; import org.talend.core.model.metadata.builder.connection.DatabaseConnection; import org.talend.cwm.helper.ColumnHelper; import org.talend.cwm.helper.ConnectionHelper; import org.talend.cwm.helper.SwitchHelpers; import org.talend.cwm.relational.TdColumn; import org.talend.dataquality.PluginConstant; import org.talend.dataquality.helpers.IndicatorHelper; import org.talend.dataquality.indicators.DefValueCountIndicator; import org.talend.dataquality.indicators.IndicatorsPackage; import org.talend.utils.sql.Java2SqlType; /** * <!-- begin-user-doc --> An implementation of the model object '<em><b>Def Value Count Indicator</b></em>'. <!-- * end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link org.talend.dataquality.indicators.impl.DefValueCountIndicatorImpl#getDefaultValCount <em>Default Val Count</em>}</li> * </ul> * </p> * * @generated */ public class DefValueCountIndicatorImpl extends IndicatorImpl implements DefValueCountIndicator { /** * The default value of the '{@link #getDefaultValCount() <em>Default Val Count</em>}' attribute. <!-- * begin-user-doc --> <!-- end-user-doc --> * * @see #getDefaultValCount() * @generated * @ordered */ protected static final Long DEFAULT_VAL_COUNT_EDEFAULT = new Long(0L); /** * The cached value of the '{@link #getDefaultValCount() <em>Default Val Count</em>}' attribute. * <!-- begin-user-doc * --> <!-- end-user-doc --> * @see #getDefaultValCount() * @generated * @ordered */ protected Long defaultValCount = DEFAULT_VAL_COUNT_EDEFAULT; protected Object defValue = null; protected boolean isOracle = false; private static Logger log = Logger.getLogger(DefValueCountIndicatorImpl.class); private String pointZeroStr = ".0"; //$NON-NLS-1$ /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ protected DefValueCountIndicatorImpl() { super(); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return IndicatorsPackage.Literals.DEF_VALUE_COUNT_INDICATOR; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public Long getDefaultValCount() { return defaultValCount; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public void setDefaultValCount(Long newDefaultValCount) { Long oldDefaultValCount = defaultValCount; defaultValCount = newDefaultValCount; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, IndicatorsPackage.DEF_VALUE_COUNT_INDICATOR__DEFAULT_VAL_COUNT, oldDefaultValCount, defaultValCount)); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case IndicatorsPackage.DEF_VALUE_COUNT_INDICATOR__DEFAULT_VAL_COUNT: return getDefaultValCount(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case IndicatorsPackage.DEF_VALUE_COUNT_INDICATOR__DEFAULT_VAL_COUNT: setDefaultValCount((Long)newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case IndicatorsPackage.DEF_VALUE_COUNT_INDICATOR__DEFAULT_VAL_COUNT: setDefaultValCount(DEFAULT_VAL_COUNT_EDEFAULT); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public boolean eIsSet(int featureID) { switch (featureID) { case IndicatorsPackage.DEF_VALUE_COUNT_INDICATOR__DEFAULT_VAL_COUNT: return DEFAULT_VAL_COUNT_EDEFAULT == null ? defaultValCount != null : !DEFAULT_VAL_COUNT_EDEFAULT.equals(defaultValCount); } return super.eIsSet(featureID); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override public String toString() { if (eIsProxy()) return super.toString(); StringBuffer result = new StringBuffer(super.toString()); result.append(" (defaultValCount: "); result.append(defaultValCount); result.append(')'); return result.toString(); } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#storeSqlResults(java.util.List) * * ADDED scorreia 2009-01-28 storeSqlResults(List<Object[]> objects) */ @Override public boolean storeSqlResults(List<Object[]> objects) { if (!super.checkResults(objects, 1)) { return false; } // MOD gdbu 2011-4-14 bug : 18975 this.setDefaultValCount(IndicatorHelper.getLongFromObject(objects.get(0)[0])); // ~18975 return true; } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#getIntegerValue() * * ADDED scorreia 2009-04-28 getIntegerValue() */ @Override public Long getIntegerValue() { return this.getDefaultValCount(); } @Override public boolean reset() { this.defaultValCount = DEFAULT_VAL_COUNT_EDEFAULT; return super.reset(); } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#handle(java.lang.Object) * * ADD yyi 2009-09-02 prepare() */ @Override public boolean handle(Object data) { boolean ok = super.handle(data); if (data == null || defValue == null) { return ok; } String str = data.toString(); // MOD qiongli 2011-5-31 bug 21655,handle oracle date type. boolean isMatch = false; if (data instanceof Date && defValue instanceof Date) { if (((Date) data).compareTo((Date) defValue) == 0) { isMatch = true; } } else { // considering that Timestamp parse fail then defValue is a String and with equals,if data is end with // ".0",we should remove the end string ".0". if (str.endsWith(pointZeroStr)) { str = StringUtils.removeEnd(str, pointZeroStr); } if (StringUtils.equals(str, defValue.toString())) { isMatch = true; } } if (isMatch) { if (this.checkMustStoreCurrentRow()) { mustStoreRow = true; } this.defaultValCount++; } return ok; } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#prepare() * * ADD yyi 2009-09-02 prepare() */ @Override public boolean prepare() { TdColumn tdColumn = SwitchHelpers.COLUMN_SWITCH.doSwitch(this.getAnalyzedElement()); this.defValue = ColumnHelper.getDefaultValue(tdColumn); // MOD qiongli 2011-5-31 bug 21655,if it is oracle db,need to handel the default value. Connection connection = ConnectionHelper.getConnection(tdColumn); if (SwitchHelpers.DATABASECONNECTION_SWITCH.doSwitch(connection) != null) { String databaseType = ((DatabaseConnection) connection).getDatabaseType(); if (databaseType != null && databaseType.contains("Oracle")) { //$NON-NLS-1$ isOracle = true; } } // MOD qiongli 2011-11-7 TDQ-1554.if tdColumn is Date type,parse the default value to Date type when initialize // this indicator. if (defValue != null) { if (isOracle) { getDefValueForOracle(tdColumn); } else if (Java2SqlType.isDateInSQL(tdColumn.getSqlDataType().getJavaDataType())) { String defTmp = defValue.toString(); try { if (StringUtils.contains(defTmp, ":")) { //$NON-NLS-1$ defValue = DateFormat.getDateTimeInstance().parse(defTmp); } else { defValue = DateFormat.getDateInstance().parse(defTmp); } } catch (ParseException exc) { // if parse fail,reset defValue to String defValue = defTmp; log.warn("Parse default value failure!"); } } } return super.prepare(); } /** * * DOC qiongli:handle default value and get the right value. * * @param tdColumn */ protected void getDefValueForOracle(TdColumn tdColumn) { // MOD qiongli 2011-5-31 bug 21655,remove the redundant "\n" or "\'" and handle the date type for default value // on oracle db. String defTemp = defValue.toString(); defTemp = StringUtils.removeEnd(defTemp, PluginConstant.ENTER_STRING); try { if (Java2SqlType.isTextInSQL(tdColumn.getSqlDataType().getJavaDataType()) && defTemp.length() > 1 && (defTemp.startsWith(PluginConstant.SINGLE_QUOTE) && defTemp.endsWith(PluginConstant.SINGLE_QUOTE))) { defValue = defTemp.substring(1, defTemp.length() - 1); } else if (Java2SqlType.isDateInSQL(tdColumn.getSqlDataType().getJavaDataType()) && defTemp.startsWith("to_date(")) {//$NON-NLS-1$ String[] array = StringUtils.split(defTemp, PluginConstant.SINGLE_QUOTE); if (array.length > 3) { if (array[3] != null && !PluginConstant.EMPTY_STRING.equals(array[3].trim())) { String pattern = StringUtils.replace(array[3], "mi", "mm"); //$NON-NLS-1$ //$NON-NLS-2$ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); defValue = simpleDateFormat.parse(array[1]); } else { defValue = StringUtils.removeEnd(array[1], PluginConstant.ENTER_STRING); } } } else { defValue = defTemp; } } catch (Exception e) { log.error(e, e); } } } // DefValueCountIndicatorImpl