// ============================================================================
//
// 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.pattern;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.talend.commons.emf.EmfFileResourceUtil;
import org.talend.commons.emf.FactoriesUtil;
import org.talend.cwm.helper.ResourceHelper;
import org.talend.cwm.management.i18n.Messages;
import org.talend.dataquality.domain.pattern.Pattern;
import org.talend.dataquality.domain.pattern.PatternPackage;
import org.talend.dataquality.helpers.DataqualitySwitchHelper;
import org.talend.dq.helper.EObjectHelper;
import org.talend.dq.helper.resourcehelper.PatternResourceFileHelper;
import org.talend.dq.indicators.definitions.DefinitionHandler;
import org.talend.model.emf.CwmResource;
import orgomg.cwm.objectmodel.core.ModelElement;
public class PatternDefinitionHandler {
private static Logger log = Logger.getLogger(DefinitionHandler.class);
private static PatternDefinitionHandler instance;
private List<Pattern> patternDefinitions = new ArrayList<Pattern>();
private Map<String, String> patternToIdMap = new HashMap<String, String>();
public static PatternDefinitionHandler getInstance() {
if (instance == null) {
instance = new PatternDefinitionHandler();
instance.initializePatternDefinitions();
}
return instance;
}
public Pattern getPatternById(String definitionId) {
for (Pattern patDef : this.getPatternDefinitions()) {
CwmResource resource = (CwmResource) patDef.eResource();
EObject object = resource.getEObject(definitionId);
if (object != null && PatternPackage.eINSTANCE.getPattern().equals(object.eClass())) {
return (Pattern) object;
}
}
return null;
}
public String getIdByPattern(Pattern pattern) {
String id = patternToIdMap.get(pattern.getName());
if (id == null) {
id = ResourceHelper.getUUID(pattern);
patternToIdMap.put(pattern.getName(), id);
}
return id;
}
public Pattern getPatternDefinitionBySemanticLabel(String name) {
for (Pattern patternDefinition : this.getPatternDefinitions()) {
if (patternDefinition != null && patternDefinition.getName() != null
&& patternDefinition.getName().replace(" ", "_").compareTo(name) == 0) {
return patternDefinition;
}
}
return null;
}
public List<Pattern> getPatternDefinitions() {
if (patternDefinitions == null || patternDefinitions.isEmpty()) {
initializePatternDefinitions();
} else {
// resolve the IndicatorDefinition if need and only when it isn't initialized.
patternDefinitions = resolve(patternDefinitions);
if (patternDefinitions == null) {
throw new RuntimeException(Messages.getString("DefinitionHandler.IndicatorsDefinition")); //$NON-NLS-1$
}
}
return patternDefinitions;
}
/**
* resolve the IndicatorDefinition if it is proxy.
*
* @param definitions
* @return
*/
private List<Pattern> resolve(List<Pattern> definitions) {
List<Pattern> result = new ArrayList<Pattern>();
if (definitions != null && !definitions.isEmpty()) {
for (Pattern indDef : definitions) {
if (indDef.eIsProxy()) {
indDef = (Pattern) EObjectHelper.resolveObject(indDef);
}
result.add(indDef);
}
}
return result;
}
private void initializePatternDefinitions() {
this.patternDefinitions.clear();
if (Platform.isRunning()) {
patternDefinitions.addAll((List<Pattern>) PatternResourceFileHelper.getInstance().getAllElement());
} else {
patternDefinitions.addAll((List<Pattern>) getAllPatternModelElements(DefinitionHandler.getInstance().getTdqLibPath()
+ "Patterns" + File.separator + "Regex")); //$NON-NLS-1$
}
}
private List<? extends ModelElement> getAllPatternModelElements(String parentFolder) {
List<ModelElement> elementList = new ArrayList<ModelElement>();
try {
List<File> allFiles = searchAllFiles(new File(parentFolder));
// MOD qiongli 2011-4-19.bug 20566,avoid NPE
ModelElement mod = null;
for (File file : allFiles) {
mod = getPatternModelElement(file);
if (mod != null) {
// MOD msjian TDQ-4672 2012-2-17: modify another issue
elementList.add(mod);
// TDQ-4672~
}
}
} catch (Exception e) {
log.error(e);
}
return elementList;
}
private List<File> searchAllFiles(File file) {
List<File> fileList = new ArrayList<File>();
if (file.exists()) {
for (File child : file.listFiles()) {
if (child.isDirectory()) {
fileList.addAll(searchAllFiles(child));
continue;
}
if (checkFile(child)) {
fileList.add(child);
}
}
}
return fileList;
}
private final ModelElement getPatternModelElement(File file) {
if (file != null) {
Resource resource = EmfFileResourceUtil.getInstance().getFileResource(file.getAbsolutePath());
EList<EObject> contents = resource.getContents();
if (contents.isEmpty()) {
log.error("no content in: " + resource);//$NON-NLS-1$
}
for (EObject object : contents) {
ModelElement switchObject = DataqualitySwitchHelper.PATTERN_SWITCH.doSwitch(object);
if (switchObject != null) {
return switchObject;
}
}
}
return null;
}
private boolean checkFile(File file) {
String path = file.getAbsolutePath();
String extension = path.substring(path.lastIndexOf(".") + 1);
return file != null && FactoriesUtil.PATTERN.equalsIgnoreCase(extension);
}
}