// ============================================================================
//
// 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.migration.impl;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature.Setting;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.talend.commons.emf.EMFUtil;
import org.talend.commons.emf.FactoriesUtil;
import org.talend.commons.utils.WorkspaceUtils;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.properties.DatabaseConnectionItem;
import org.talend.core.model.properties.FolderItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.Property;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.dataprofiler.core.migration.AbstractWorksapceUpdateTask;
import org.talend.dq.factory.ModelElementFileFactory;
import org.talend.dq.helper.EObjectHelper;
import org.talend.dq.helper.PropertyHelper;
import org.talend.dq.helper.resourcehelper.AnaResourceFileHelper;
import org.talend.dq.writer.AElementPersistance;
import org.talend.dq.writer.EMFSharedResources;
import org.talend.dq.writer.impl.ElementWriterFactory;
import org.talend.resource.EResourceConstant;
import orgomg.cwm.objectmodel.core.ModelElement;
/**
* update TDQ_Data Profiling and TDQ_Libraries folders after use same api with TOS(metadata folder has been updated
* before).
*/
public class UpdateAfterMergeTosApiTask extends AbstractWorksapceUpdateTask {
private static Logger log = Logger.getLogger(UpdateAfterMergeTosApiTask.class);
/*
* (non-Jsdoc)
*
* @see org.talend.dataprofiler.core.migration.IMigrationTask#getOrder()
*/
public Date getOrder() {
return createDate(2011, 1, 20);
}
/*
* (non-Jsdoc)
*
* @see org.talend.dataprofiler.core.migration.IMigrationTask#getMigrationTaskType()
*/
public MigrationTaskType getMigrationTaskType() {
return MigrationTaskType.FILE;
}
/*
* (non-Jsdoc)
*
* @see org.talend.dataprofiler.core.migration.AMigrationTask#doExecute()
*/
@Override
protected boolean doExecute() throws Exception {
ArrayList<File> fileList = getNeedUpdateFiles();
for (File file : fileList) {
createNewItemFile(file);
deleteOldItemFile(file);
}
updateConnectionFile();
return true;
}
/**
* DOC bZhou Comment method "addConnectionFileToUpdate".
*/
private void updateConnectionFile() {
File rawDir = getWorkspacePath().append(EResourceConstant.METADATA.getPath()).toFile();
ArrayList<File> fileList = new ArrayList<File>();
if (rawDir.exists()) {
getAllFilesFromFolder(rawDir, fileList, new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(FactoriesUtil.ITEM_EXTENSION);
}
});
}
for (File file : fileList) {
IFile iFile = WorkspaceUtils.fileToIFile(file);
Property property = PropertyHelper.getProperty(iFile);
if (property != null) {
Item item = property.getItem();
EResourceConstant type = EResourceConstant.getTypedConstant(item);
if (type == EResourceConstant.DB_CONNECTIONS) {
DatabaseConnectionItem dbItem = (DatabaseConnectionItem) item;
DatabaseConnection connection = (DatabaseConnection) dbItem.getConnection();
String otherParameter = ConnectionHelper.getOtherParameter(connection);
if (!StringUtils.isBlank(otherParameter)) {
connection.setUiSchema(otherParameter);
EMFSharedResources.getInstance().saveResource(connection.eResource());
}
}
}
}
}
/**
* DOC bZhou Comment method "getNeedUpdateFiles".
*
* @return
*/
private ArrayList<File> getNeedUpdateFiles() {
File dapRawFile = getWorkspacePath().append(EResourceConstant.DATA_PROFILING.getPath()).toFile();
File libRawFile = getWorkspacePath().append(EResourceConstant.LIBRARIES.getPath()).toFile();
ArrayList<File> fileList = findRawFiles(dapRawFile);
fileList.addAll(findRawFiles(libRawFile));
return fileList;
}
/**
* DOC bZhou Comment method "createNewItemFile".
*
* @param file
*/
private void createNewItemFile(File file) {
ModelElement modelElement = getModelElement(file);
if (modelElement != null) {
boolean needUpdateFlag = !modelElement.eIsProxy();
// log.info("needUpdateFlag======>" + needUpdateFlag);
// log.info("modelElement======>" + modelElement);
if (needUpdateFlag) {
IFile iFile = WorkspaceUtils.fileToIFile(file);
IFolder parentFolder = (IFolder) iFile.getParent();
Resource oldRes = modelElement.eResource();
List<Resource> needSaves = getReferenceResources(oldRes, modelElement);
AElementPersistance writer = ElementWriterFactory.getInstance().create(modelElement);
writer.create(modelElement, parentFolder, true);
EMFUtil.changeUri(oldRes, EObjectHelper.getURI(modelElement));
for (Resource toSave : needSaves) {
EMFSharedResources.getInstance().saveResource(toSave);
}
}
}
}
/**
* DOC bZhou Comment method "getReferenceResources".
*
* @param res
* @param modelElement
* @return
*/
public List<Resource> getReferenceResources(Resource res, ModelElement modelElement) {
EcoreUtil.resolveAll(res);
Map<EObject, Collection<Setting>> find = EcoreUtil.ExternalCrossReferencer.find(res);
List<Resource> needSaves = new ArrayList<Resource>();
for (EObject object : find.keySet()) {
Resource resource = object.eResource();
if (resource == null) {
continue;
}
EcoreUtil.resolveAll(resource);
needSaves.add(resource);
}
if (res.getURI().toPlatformString(false).contains(EResourceConstant.LIBRARIES.getPath())) {
final List<? extends ModelElement> allElement = AnaResourceFileHelper.getInstance().getAllElement();
for (ModelElement element : allElement) {
Map<EObject, Collection<Setting>> allFind = EcoreUtil.ExternalCrossReferencer.find(element.eResource());
if (allFind.keySet().contains(modelElement)) {
needSaves.add(element.eResource());
}
}
}
needSaves.add(res);
return needSaves;
}
/**
* DOC bZhou Comment method "deleteOldFile".
*
* @param file
* @throws CoreException
*/
private void deleteOldItemFile(File file) throws CoreException {
IFile itemFile = WorkspaceUtils.fileToIFile(file);
IFile propFile = PropertyHelper.getPropertyFile(itemFile);
Property property = PropertyHelper.getProperty(propFile);
Item currentItem = property.getItem();
if (currentItem.getParent() instanceof FolderItem) {
((FolderItem) currentItem.getParent()).getChildren().remove(currentItem);
}
itemFile.delete(true, null);
propFile.delete(true, null);
}
/**
* get the ModelElement from the file.
*
* @param parentFile
* @return
*/
private ModelElement getModelElement(File parentFile) {
ModelElement result = null;
try {
IFile iFile = WorkspaceUtils.fileToIFile(parentFile);
// log.info("iFile============>" + iFile.toString());
result = ModelElementFileFactory.getModelElement(iFile);
// log.info("result============>" + result.toString());
} catch (NullPointerException e) {
log.info(e, e);
} catch (Exception e) {
log.error(e, e);
}
return result;
}
private ArrayList<File> findRawFiles(File rawDir) {
ArrayList<File> fileList = new ArrayList<File>();
if (rawDir.exists()) {
getAllFilesFromFolder(rawDir, fileList, new FilenameFilter() {
public boolean accept(File dir, String name) {
if (isNotSVNFolder(dir)) {
File file = new Path(dir.getAbsolutePath()).append(name).toFile();
if (file.isFile()) {
ModelElement element = getModelElement(file);
if (element != null) {
String newName = WorkspaceUtils.normalize(element.getName());
return !name.contains(newName) || !name.contains("0.1"); //$NON-NLS-1$
}
}
}
return false;
}
});
}
return fileList;
}
/**
* DOC bZhou Comment method "isNotSVNFolder".
*
* @param file
* @return
*/
private boolean isNotSVNFolder(File file) {
return !file.getAbsolutePath().contains("svn"); //$NON-NLS-1$
}
}