/** * <copyright> </copyright> * * $Id$ */ package org.talend.dataquality.indicators.impl; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.talend.dataquality.domain.Domain; import org.talend.dataquality.domain.pattern.Pattern; import org.talend.dataquality.helpers.DomainHelper; import org.talend.dataquality.indicators.IndicatorsPackage; import org.talend.dataquality.indicators.RegexpMatchingIndicator; import org.talend.dataquality.indicators.mapdb.AbstractDB; import org.talend.dataquality.indicators.mapdb.StandardDBName; import org.talend.i18n.Messages; /** * <!-- begin-user-doc --> An implementation of the model object '<em><b>Regexp Matching Indicator</b></em>'. <!-- * end-user-doc --> * <p> * </p> * * @generated */ public class RegexpMatchingIndicatorImpl extends PatternMatchingIndicatorImpl implements RegexpMatchingIndicator { private static Logger log = Logger.getLogger(RegexpMatchingIndicatorImpl.class); // FIXME never use now. error message should not be specific to this indicator. // add klliu 2010-06-12 bug 13695 private String javaPatternMessage; private Long invalidCount = 0l; private Long invalidValueCount = 0l; private Long validValueCount = 0l; public String getJavaPatternMessage() { return javaPatternMessage; } public void setJavaPatternMessage(String javaPatternMessage) { this.javaPatternMessage = javaPatternMessage; } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ protected RegexpMatchingIndicatorImpl() { super(); } /** * <!-- begin-user-doc --> <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return IndicatorsPackage.Literals.REGEXP_MATCHING_INDICATOR; } private String regex = null; private java.util.regex.Pattern pattern = null; /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#prepare() */ @Override public boolean prepare() { this.regex = getRegex(); if (regex == null) { return false; } // MOD klliu 2010-06-12 bug 13695 if (regex.equals(this.getJavaPatternMessage())) { return false; } try { pattern = java.util.regex.Pattern.compile(regex); } catch (java.util.regex.PatternSyntaxException e) { log.error(Messages.getString("Using_regular_expression", this.getName(), regex), e); return false; } if (log.isInfoEnabled()) { log.info(Messages.getString("Using_regular_expression", this.getName(), regex)); } return super.prepare(); } /** * DOC scorreia Comment method "getRegex". * * this mehtod only for job Action * * 1) only in Java Engine will call this method 2) get Java Regex first, if don't have Java Regex then get Default * Regex, if don't have Default Regex then return null * * @return */ @Override public String getRegex() { // MOD klliu 2010-06-12 bug 13695 if (this.parameters != null) { final Domain dataValidDomain = parameters.getDataValidDomain(); if (dataValidDomain != null) { final EList<Pattern> patterns = dataValidDomain.getPatterns(); for (Pattern p : patterns) { if (p != null) { // MOD yyi 2009-09-29 Feature: 9289 String r = DomainHelper.getJavaRegexp(p); if (r == null) { // if don't have Java Regex, get the Default Regex r = DomainHelper.getSQLRegexp(p); } if (r != null) { if (r.startsWith("'") && r.endsWith("'")) { // remove enclosing singles quotes which are used for SQL only (not java) r = r.substring(1, r.length() - 1); } return r; } } } } } return null; } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#finalizeComputation() */ @Override public boolean finalizeComputation() { if (count != null && matchingValueCount != null) { this.setNotMatchingValueCount(count - matchingValueCount); } return super.finalizeComputation(); } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#handle(java.lang.Object) */ @Override public boolean handle(Object data) { boolean ok = super.handle(data); this.setValidRow(false); this.setInValidRow(false); if (data != null) { String body = String.valueOf(data); Matcher matcher = pattern.matcher(body); if (matcher.find()) { this.matchingValueCount++; this.setValidRow(true); } else { this.setInValidRow(true); } } else { this.setInValidRow(true); } if (checkDrillDownCount()) { this.mustStoreRow = true; } return ok; } /** * "checkDrillDownCount". * * @return */ private boolean checkDrillDownCount() { if (this.validRow) { return this.checkMustStoreCurrentRow(matchingValueCount - 1) || this.checkMustStoreCurrentRow(validValueCount); } else { return this.checkMustStoreCurrentRow(invalidValueCount) || this.checkMustStoreCurrentRow(invalidCount); } } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#getMapDB(java.lang.String) */ @Override public AbstractDB getMapDB(String dbName) { if (isUsedMapDBMode()) { // get invalidDrillDownValues set if (StandardDBName.invalidDrillDownValues.name().equals(dbName)) { // create new DBSet return initValueForDBSet(StandardDBName.invalidDrillDownValues.name()); } } return super.getMapDB(dbName); } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.IndicatorImpl#handleDrillDownData(java.lang.Object, java.util.List) */ @Override public void handleDrillDownData(Object masterObject, List<Object> inputRowList) { if (validRow) { // store drill dwon data for view valid values if (this.checkMustStoreCurrentRow(matchingValueCount - 1)) { super.handleDrillDownData(masterObject, inputRowList); } // store drill dwon data for view valid values if (this.checkMustStoreCurrentRow(validValueCount)) { if (!drillDownValuesSet.contains(masterObject)) { validValueCount++; drillDownValuesSet.add(masterObject); } } } else { // store drill dwon data for view invalid values if (this.checkMustStoreCurrentRow(invalidValueCount)) { Set<Object> drillDownValuesSet = initValueForDBSet(StandardDBName.invalidDrillDownValues.name()); if (!drillDownValuesSet.contains(masterObject)) { invalidValueCount++; drillDownValuesSet.add(masterObject); } } // store drill dwon data for view invalid rows if (this.checkMustStoreCurrentRow(invalidCount)) { invalidCount++; Map<Object, List<Object>> drillDownRowsMap = initValueForDBMap(StandardDBName.invalidDrillDown.name()); drillDownRowsMap.put(invalidCount - 1, inputRowList); } } } /* * (non-Javadoc) * * @see org.talend.dataquality.indicators.impl.MatchingIndicatorImpl#reset() */ @Override public boolean reset() { invalidCount = 0l; invalidValueCount = 0l; validValueCount = 0l; return super.reset(); } } // RegexpMatchingIndicatorImpl