// ============================================================================ // // 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.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.talend.commons.emf.EMFUtil; import org.talend.commons.emf.FactoriesUtil; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; import org.talend.dataprofiler.core.manager.DQStructureManager; import org.talend.dataprofiler.core.migration.AbstractWorksapceUpdateTask; import org.talend.dataquality.analysis.Analysis; import org.talend.dataquality.helpers.DataqualitySwitchHelper; import org.talend.dq.helper.resourcehelper.AnaResourceFileHelper; import org.talend.dq.helper.resourcehelper.DQRuleResourceFileHelper; import org.talend.dq.helper.resourcehelper.PatternResourceFileHelper; import org.talend.resource.EResourceConstant; import org.talend.resource.ResourceManager; import org.talend.resource.ResourceService; import orgomg.cwm.objectmodel.core.Dependency; import orgomg.cwm.objectmodel.core.ModelElement; /** * * DOC mzhao 2009-07-01 feature 7482. */ public class ReorderingLibraryFoldersTask extends AbstractWorksapceUpdateTask { private static Logger log = Logger.getLogger(ReorderingLibraryFoldersTask.class); private static final String SQL_PATTERNS = "SQL Patterns"; //$NON-NLS-1$ private static final String DQ_RULES = "DQ Rules"; //$NON-NLS-1$ private static final String JRXML_REPORTS = "JRXML Reports"; //$NON-NLS-1$ /* * (non-Javadoc) * * @see org.talend.dataprofiler.core.migration.AMigrationTask#doExecute() */ @Override protected boolean doExecute() throws Exception { IFolder libraryFolder = ResourceManager.getLibrariesFolder(); // Patterns -> Patterns/Regex IFolder patternFolder = ResourceManager.getPatternFolder(); IFolder regexFolder = ResourceManager.getPatternRegexFolder(); if (!regexFolder.exists()) { IFolder newRegexSubfolder = createSubfolder(patternFolder, EResourceConstant.PATTERN_REGEX.getName()); moveItems(patternFolder, newRegexSubfolder); } // SQL Patterns -> Patterns/SQL IFolder sqlFolder = ResourceManager.getPatternSQLFolder(); if (!sqlFolder.exists()) { IFolder oldSqlPatternsFolder = libraryFolder.getFolder(SQL_PATTERNS); IFolder newSqlSubfolder = createSubfolder(patternFolder, EResourceConstant.PATTERN_SQL.getName()); moveItems(oldSqlPatternsFolder, newSqlSubfolder); oldSqlPatternsFolder.delete(true, null); } // DQ Rules -> Rules/SQL IFolder dqRuleFolder = ResourceManager.getRulesSQLFolder(); if (!dqRuleFolder.exists()) { IFolder oldDqRulesFolder = libraryFolder.getFolder(DQ_RULES); IFolder newRulesFolder = createSubfolder(libraryFolder, EResourceConstant.RULES.getName()); IFolder newRulesSQLSubfolder = createSubfolder(newRulesFolder, EResourceConstant.RULES_SQL.getName()); moveItems(oldDqRulesFolder, newRulesSQLSubfolder); oldDqRulesFolder.delete(true, null); } // JRXML Reports -> JRXML Template IFolder jrxmlFolder = ResourceManager.getJRXMLFolder(); if (!jrxmlFolder.exists()) { IFolder oldJrxmlFolder = libraryFolder.getFolder(JRXML_REPORTS); IFolder newJrxmlFolder = createSubfolder(libraryFolder, EResourceConstant.JRXML_TEMPLATE.getName()); moveItems(oldJrxmlFolder, newJrxmlFolder); oldJrxmlFolder.delete(true, null); } // Refresh project ResourceService.refreshStructure(); return true; } /** * DOC scorreia Comment method "createSubfolder". * * @param newPatternFolder * @return * @throws CoreException */ private IFolder createSubfolder(IFolder newPatternFolder, final String folderName) throws CoreException { return DQStructureManager.getInstance().createNewFolder(newPatternFolder, folderName); } private void moveItems(IFolder oldSubFolder, IFolder newSubfolder) throws CoreException { if (!oldSubFolder.exists()) { return; } for (IResource oldResource : oldSubFolder.members()) { if (newSubfolder.getName().equals(oldResource.getName())) { continue; } // cannot simply copy EMF files: need to keep the links between files when moving them. See bug 9461 if (oldResource instanceof IFolder) { IFolder oldFolder = (IFolder) oldResource; IFolder newFolder = DQStructureManager.getInstance().createNewFolder(newSubfolder, oldFolder.getName()); moveItems(oldFolder, newFolder); // delete folder oldFolder.delete(true, null); } if (oldResource instanceof IFile) { IFile file = (IFile) oldResource; final ModelElement eltFromLibraryFolder = getModelElement(file); final EList<Dependency> supplierDependency = eltFromLibraryFolder.getSupplierDependency(); if (supplierDependency.isEmpty()) { // simple copy of file is enough oldResource.copy(newSubfolder.getFolder(oldResource.getName()).getFullPath(), true, null); } else { // handle dependent analyses List<Analysis> analyses = new ArrayList<Analysis>(); for (Dependency dependency : supplierDependency) { URI newUri = URI.createPlatformResourceURI(newSubfolder.getFullPath().toOSString(), true); // move pattern EMFUtil.changeUri(eltFromLibraryFolder.eResource(), newUri); final EList<ModelElement> clientAnalyses = dependency.getClient(); for (ModelElement modelElement : clientAnalyses) { Analysis analysis = DataqualitySwitchHelper.ANALYSIS_SWITCH.doSwitch(modelElement); if (analysis != null) { analyses.add(analysis); } } } // clean the dependencies that do not refer to an existing object. for (Analysis analysis : analyses) { final EList<Dependency> clientDependency = analysis.getClientDependency(); List<Dependency> newClientDeps = new ArrayList<Dependency>(); for (Dependency dependency : clientDependency) { if (!dependency.eIsProxy()) { newClientDeps.add(dependency); } } clientDependency.clear(); clientDependency.addAll(newClientDeps); AnaResourceFileHelper.getInstance().save(analysis); } } remove(file); } } } /** * DOC bZhou Comment method "remove". * * @param file */ private void remove(IFile file) throws CoreException { file.delete(true, null); } /** * DOC scorreia Comment method "getEMFObject". * * @param file * @param folderProperty * @return */ private ModelElement getModelElement(IFile file) { String fileExtension = file.getFileExtension(); if (FactoriesUtil.isPatternFile(fileExtension)) { return PatternResourceFileHelper.getInstance().findPattern(file); } else if (FactoriesUtil.isDQRuleFile(fileExtension)) { return DQRuleResourceFileHelper.getInstance().findWhereRule(file); } log.error(DefaultMessagesImpl.getString("ReorderingLibraryFoldersTask_LogErr", file.getFullPath().toOSString())); //$NON-NLS-1$ return null; } public MigrationTaskType getMigrationTaskType() { return MigrationTaskType.STUCTRUE; } public Date getOrder() { return createDate(2009, 07, 01); } }