// ============================================================================
//
// 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.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.talend.commons.emf.EMFUtil;
import org.talend.commons.emf.FactoriesUtil;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.utils.io.FilesUtils;
import org.talend.core.model.metadata.builder.connection.Connection;
import org.talend.core.model.metadata.builder.connection.DatabaseConnection;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.model.properties.Item;
import org.talend.core.model.properties.ItemState;
import org.talend.core.model.properties.PropertiesFactory;
import org.talend.core.model.properties.Property;
import org.talend.core.model.properties.TDQItem;
import org.talend.core.repository.model.ProxyRepositoryFactory;
import org.talend.cwm.helper.ConnectionHelper;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.migration.AbstractWorksapceUpdateTask;
import org.talend.dq.helper.PropertyHelper;
import org.talend.resource.ResourceManager;
/**
*
* DOC zshen class global comment. Detailled comment change the properties "FileName" to a Reference of Connection
*/
public class ExchangeFileNameToReferenceTask extends AbstractWorksapceUpdateTask {
protected static Logger log = Logger.getLogger(ExchangeFileNameToReferenceTask.class);
public static final String DB_CONNECTION = "TDQ_Metadata/DB Connections"; //$NON-NLS-1$
public static final String MDM_CONNECTION = "TDQ_Metadata/MDM Connections"; //$NON-NLS-1$
private Map<String, String> replaceStringMap;
public ExchangeFileNameToReferenceTask() {
// TODO Auto-generated constructor stub
}
/*
* (non-Javadoc)
*
* @see org.talend.dataprofiler.core.migration.AMigrationTask#doExecute()
*/
@Override
protected boolean doExecute() throws Exception {
boolean returnFlag = true;
List<File> mergeFolders = new ArrayList<File>();
mergeFolders.add(getWorkspacePath().append(DB_CONNECTION).toFile());
mergeFolders.add(getWorkspacePath().append(MDM_CONNECTION).toFile());
List<File> resources = new ArrayList<File>();
for (File theFile : mergeFolders) {
if (theFile != null && theFile.exists()
&& (DB_CONNECTION.endsWith(theFile.getName()) || MDM_CONNECTION.endsWith(theFile.getName()))) {
for (File newFile : theFile.listFiles()) {
if (newFile.isDirectory()) {
resources.addAll(iteratorResource(newFile));
} else if (newFile.getName().toLowerCase().endsWith(FactoriesUtil.PROPERTIES_EXTENSION.toLowerCase())) {
resources.add(newFile);
}
}
// resources.addAll(Arrays.asList(theFile.listFiles()));
}
}
if (resources.size() > 0) {
for (File resource : resources) {
if (resource.isFile()
&& resource.getName().toLowerCase().endsWith(FactoriesUtil.PROPERTIES_EXTENSION.toLowerCase())) {
try {
handlePropertiesFile(resource);
} catch (Exception e) {
returnFlag = false;
log.warn(
DefaultMessagesImpl.getString(
"ExchangeFileNameToReferenceTask_MigWarn", resource.getAbsolutePath()), e); //$NON-NLS-1$
}
}
}
File fileAnalysis = new File(ResourceManager.getAnalysisFolder().getRawLocationURI());
File fileRule = new File(ResourceManager.getRulesFolder().getRawLocationURI());
try {
String[] anaFileExtentionNames = { FactoriesUtil.ANA };
String[] rulesFileEctentionNames = { FactoriesUtil.DQRULE };
returnFlag &= FilesUtils.migrateFolder(fileAnalysis, anaFileExtentionNames, this.getReplaceStringMap(), log)
&& FilesUtils.migrateFolder(fileRule, rulesFileEctentionNames, this.getReplaceStringMap(), log);
// AnaResourceFileHelper.getInstance().clear();
// AnaResourceFileHelper.getInstance().getAllAnalysis();
} catch (Exception e) {
returnFlag = false;
log.error(e, e);
}
}
return returnFlag;
}
private void handlePropertiesFile(File resource) throws PersistenceException {
Property property = PropertyHelper.getProperty(resource);
Item oldItem = property.getItem();
if (oldItem instanceof TDQItem) {
String fileName = ((TDQItem) oldItem).getFilename();
File theFile = new File(resource.getParent() + File.separator + fileName);
File desFile = new File(resource.getParent() + File.separator + fileName.substring(0, fileName.lastIndexOf('.') + 1)
+ FactoriesUtil.ITEM_EXTENSION);
theFile.renameTo(desFile);
URI uri = URI.createFileURI(desFile.getAbsolutePath());
Resource prvResource = new ResourceSetImpl().getResource(uri, true);
if (prvResource != null) {
Collection<Connection> tdDataProviders = ConnectionHelper.getTdDataProviders(prvResource.getContents());
Iterator<Connection> it = tdDataProviders.iterator();
Connection connection = null;
while (it.hasNext()) {
connection = it.next();
break;
}
if (connection != null) {
ConnectionItem newItem = null;
if (connection instanceof DatabaseConnection) {
newItem = PropertiesFactory.eINSTANCE.createDatabaseConnectionItem();
} else {
newItem = PropertiesFactory.eINSTANCE.createMDMConnectionItem();
}
newItem.setConnection(connection);
if (oldItem.getState() != null) {
newItem.setState(oldItem.getState());
} else {
ItemState itemState = PropertiesFactory.eINSTANCE.createItemState();
newItem.setState(itemState);
}
property.setItem(newItem);
property.eResource().getContents().remove(oldItem);
property.eResource().getContents().add(newItem);
if (isWorksapcePath()) {
ProxyRepositoryFactory.getInstance().save(property);
} else {
EMFUtil.saveResource(property.eResource());
}
}
}
}
}
private List<File> iteratorResource(File theFolder) {
List<File> fileList = new ArrayList<File>();
for (File subFile : theFolder.listFiles()) {
if (subFile.isFile() && isPropertyFile(subFile)) {
fileList.add(subFile);
} else if (subFile.isDirectory()) {
fileList.addAll(iteratorResource(subFile));
}
}
return fileList;
}
private boolean isPropertyFile(File propertyFile) {
if (propertyFile.isFile()
&& propertyFile.getName().toLowerCase().endsWith("." + FactoriesUtil.PROPERTIES_EXTENSION.toLowerCase())) { //$NON-NLS-1$
return true;
}
return false;
}
public MigrationTaskType getMigrationTaskType() {
return MigrationTaskType.FILE;
}
public Date getOrder() {
return createDate(2010, 8, 13);
}
public Map<String, String> getReplaceStringMap() {
if (this.replaceStringMap == null) {
this.replaceStringMap = initReplaceStringMap();
}
return this.replaceStringMap;
}
private Map<String, String> initReplaceStringMap() {
Map<String, String> result = new HashMap<String, String>();
result.put(".prv", ".item"); //$NON-NLS-1$ //$NON-NLS-2$
return result;
}
}