//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 IBM Corporation and others. // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // which accompanies this distribution, and is available at // http://www.eclipse.org/legal/epl-v10.html // // Contributors: // IBM Corporation - initial implementation //------------------------------------------------------------------------------ package org.eclipse.epf.importing.services; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.epf.common.utils.FileUtil; import org.eclipse.epf.persistence.MultiFileSaveUtil; import org.eclipse.epf.services.IFileManager; import org.eclipse.epf.services.Services; /** * utility class to copy files from one dir to another, and delete the un-needed files from source dir. * * @author Jinhua Xi * @since 1.0 */ public class DirCopy { //private IStatus fileCheckedOutStatus = null; File srcDir; File targetDir; // new files to be added to the target List newFiles = new ArrayList(); // files exists in both src and target dir List oldFiles = new ArrayList(); // files only in target dir, these files are treated as deleted in the src folder. List deletedFiles = new ArrayList(); /** * Creates a new instance. */ public DirCopy(File srcDir, File targetDir) { this.srcDir = srcDir; this.targetDir = targetDir; prepare(); } private static String CP_FODLER = MultiFileSaveUtil.CAPABILITY_PATTERN_PATH + "/"; //$NON-NLS-1$ private static String DP_FODLER = MultiFileSaveUtil.DELIVERY_PROCESS_PATH + "/"; //$NON-NLS-1$ /** * check out the existing files, delete the files from cm, and add new files, copy the files over * */ public IStatus execute() { // check out files List files = new ArrayList(); for ( Iterator it = oldFiles.iterator(); it.hasNext(); ) { String path = (String)it.next(); if (needCopy(new File(srcDir, path), new File(targetDir, path))) { //154321 files.add(new File(targetDir, path).getAbsolutePath()); } } IStatus fileCheckedOutStatus = FileModifyChecker.checkModify(files); if ( !fileCheckedOutStatus.isOK() ) { return fileCheckedOutStatus; } // delete files IFileManager fileMgr = Services.getFileManager(); for ( Iterator it = deletedFiles.iterator(); it.hasNext(); ) { String path = (String)it.next(); File f = new File(targetDir, path); fileMgr.delete(f.getAbsolutePath()); // delete the empty CP and DP folder path = path.replace(File.separatorChar, '/'); if ( path.startsWith(CP_FODLER) || path.startsWith(DP_FODLER) ) { File folder = f.getParentFile(); String[] items = folder.list(); if ( items == null || items.length == 0 ) { fileMgr.delete(folder.getAbsolutePath()); } } } // copy old files for ( Iterator it = oldFiles.iterator(); it.hasNext(); ) { String path = (String)it.next(); FileUtil.copyFile(new File(srcDir, path), new File(targetDir, path)); } // copy new files for ( Iterator it = newFiles.iterator(); it.hasNext(); ) { String path = (String)it.next(); FileUtil.copyFile(new File(srcDir, path), new File(targetDir, path)); } return fileCheckedOutStatus; } private void prepare() { List allSrcFiles = getAllFiles(srcDir); List allTargetFiles = getAllFiles(targetDir); while ( allTargetFiles.size() > 0 ) { String path = (String)allTargetFiles.remove(0); if ( allSrcFiles.contains(path) ) { oldFiles.add(path); allSrcFiles.remove(path); } else { deletedFiles.add(path); } } // the remaining files in the target list is the new files newFiles.addAll(allSrcFiles); } /** * get all the files with relative path to the root * @param dir the root dir * @return List all files in the dir, with relative path to the root */ private List getAllFiles(File dir) { List files = new ArrayList(); FileUtil.getAllFiles(dir, files, true); // convert to list of path, not File URI baseUrl = dir.toURI(); int i = 0; while ( i < files.size() ) { File f = (File)files.get(i); if ( canIgnore(f.getAbsolutePath()) || canIgnore(f)) { files.remove(i); } else { URI rel = baseUrl.relativize(f.toURI()); files.set(i, rel.getPath()); i++; } } return files; } private static final String CVS_FOLDER = File.separator + "CVS" + File.separator; //$NON-NLS-1$ private static final String SVN_FOLDER = File.separator + ".svn" + File.separator; //$NON-NLS-1$ private boolean canIgnore(String path) { if ( path.indexOf(CVS_FOLDER) >=0 ) { return true; } if ( path.indexOf(SVN_FOLDER) >=0 ) { return true; } return false; } private static final String[] ignoreFiles = { ".copyarea.dat", //$NON-NLS-1$ ".copyarea.db" //$NON-NLS-1$ }; private boolean canIgnore(File file) { String name = file.getName(); for (int i=0; i<ignoreFiles.length; i++) { if (name.equals(ignoreFiles[i])) { return true; } } return false; } /** * Checks to see if the copy action is needed. */ public static boolean needCopy(File source, File dest) { boolean ret = true; if (dest.exists()) { ret = (dest.lastModified() != source.lastModified()) || (dest.length() != source.length()); } return ret; } }