/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.wizards.datatransfer;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.ContainerGenerator;
import org.eclipse.ui.dialogs.IOverwriteQuery;
import java.io.*;
import java.util.*;

/**
 * An operation which does the actual work of copying objects from the local file
 * system into the workspace.
 * <p>
 * This class may be instantiated; it is not intended to be subclassed.
 * </p>
 */
public class ImportOperation extends WorkspaceModifyOperation {
	private static final int POLICY_DEFAULT = 0;
	private static final int POLICY_SKIP_CHILDREN = 1;
	private static final int POLICY_FORCE_OVERWRITE = 2;
	
	private Object source;
	private IPath destinationPath;
	private IContainer destinationContainer;
	private List selectedFiles;
	private List rejectedFiles; 
	private IImportStructureProvider provider;
	private IProgressMonitor	monitor;
	protected IOverwriteQuery overwriteCallback;
	private Shell context;
	private List errorTable = new ArrayList();
	private boolean createContainerStructure = true;
	
	//The constants for the overwrite 3 state
	private static final int OVERWRITE_NOT_SET = 0;
	private static final int OVERWRITE_NONE = 1;	
	private static final int OVERWRITE_ALL = 2;	
	private int overwriteState = OVERWRITE_NOT_SET;
/**
 * Creates a new operation that recursively imports the entire contents of the
 * specified root file system object.
 * <p>
 * The <code>source</code> parameter represents the root file system object to 
 * import. All contents of this object are imported. Valid types for this parameter
 * are determined by the supplied <code>IImportStructureProvider</code>.
 * </p>
 * <p>
 * The <code>provider</code> parameter allows this operation to deal with the
 * source object in an abstract way. This operation calls methods on the provider
 * and the provider in turn calls specific methods on the source object.
 * </p>
 *  <p>
 * The default import behavior is to recreate the complete container structure
 * for the contents of the root file system object in their destination. 
 * If <code>setCreateContainerStructure</code> is set to false then the container 
 * structure created is relative to the root file system object.
 * </p>
 * 
 * @param containerPath the full path of the destination container within the
 *   workspace
 * @param source the root file system object to import
 * @param provider the file system structure provider to use
 * @param overwriteImplementor the overwrite strategy to use
 */
public ImportOperation(IPath containerPath, Object source, IImportStructureProvider provider, IOverwriteQuery overwriteImplementor) {
	super();
	this.destinationPath = containerPath;
	this.source = source;
	this.provider = provider;
	overwriteCallback = overwriteImplementor;
}
/**
 * Creates a new operation that imports specific file system objects.
 * In this usage context, the specified source file system object is used by the
 * operation solely to determine the destination container structure of the file system
 * objects being imported.
 * <p>
 * The <code>source</code> parameter represents the root file system object to 
 * import. Valid types for this parameter are determined by the supplied 
 * <code>IImportStructureProvider</code>. The contents of the source which
 * are to be imported are specified in the <code>filesToImport</code>
 * parameter.
 * </p>
 * <p>
 * The <code>provider</code> parameter allows this operation to deal with the
 * source object in an abstract way. This operation calls methods on the provider
 * and the provider in turn calls specific methods on the source object.
 * </p>
 * <p>
 * The <code>filesToImport</code> parameter specifies what contents of the root
 * file system object are to be imported.
 * </p>
 * <p>
 * The default import behavior is to recreate the complete container structure
 * for the file system objects in their destination. If <code>setCreateContainerStructure</code>
 * is set to <code>false</code>, then the container structure created for each of 
 * the file system objects is relative to the supplied root file system object.
 * </p>
 *
 * @param containerPath the full path of the destination container within the
 *   workspace
 * @param source the root file system object to import from
 * @param provider the file system structure provider to use
 * @param overwriteImplementor the overwrite strategy to use
 * @param filesToImport the list of file system objects to be imported
 *  (element type: <code>Object</code>)
 */
public ImportOperation(IPath containerPath, Object source, IImportStructureProvider provider, IOverwriteQuery overwriteImplementor, List filesToImport) {
	this(containerPath, source, provider, overwriteImplementor);
	setFilesToImport(filesToImport);
}
/**
 * Creates a new operation that imports specific file system objects.
 * <p>
 * The <code>provider</code> parameter allows this operation to deal with the
 * source object in an abstract way. This operation calls methods on the provider
 * and the provider in turn calls specific methods on the source object.
 * </p>
 * <p>
 * The <code>filesToImport</code> parameter specifies what file system objects 
 * are to be imported.
 * </p>
 * <p>
 * The default import behavior is to recreate the complete container structure
 * for the file system objects in their destination. If <code>setCreateContainerStructure</code>
 * is set to <code>false</code>, then no container structure is created for each of 
 * the file system objects.
 * </p>
 *
 * @param containerPath the full path of the destination container within the
 *   workspace
 * @param provider the file system structure provider to use
 * @param overwriteImplementor the overwrite strategy to use
 * @param filesToImport the list of file system objects to be imported
 *  (element type: <code>Object</code>)
 */
public ImportOperation(IPath containerPath, IImportStructureProvider provider, IOverwriteQuery overwriteImplementor, List filesToImport) {
	this(containerPath, null, provider, overwriteImplementor);
	setFilesToImport(filesToImport);
}
/**
 * Prompts if existing resources should be overwritten. Recursively collects
 * existing read-only files to overwrite and resources that should not be
 * overwritten.
 * 
 * @param destinationPath destination path to check for existing files
 * @param sources file system objects that may exist in the destination
 * @param noOverwrite files that were selected to be skipped (don't overwrite).
 * 	object type IPath
 * @param overwriteReadonly the collected existing read-only files to overwrite.
 * 	object type IPath
 */
void collectExistingReadonlyFiles(IPath destinationPath, List sources, ArrayList noOverwrite, ArrayList overwriteReadonly, int policy) {
	IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
	Iterator sourceIter = sources.iterator();
	IPath sourceRootPath = null;
	
	if (this.source != null) {
		sourceRootPath = new Path(provider.getFullPath(this.source));
	}
	while (sourceIter.hasNext()) {
		Object source = sourceIter.next();
		IPath sourcePath = new Path(provider.getFullPath(source));
		IPath newDestinationPath;
		IResource newDestination;
			
		if (sourceRootPath == null) {
			newDestinationPath = destinationPath.append(provider.getLabel(source));
		} else {
			int prefixLength = sourcePath.matchingFirstSegments(sourceRootPath);
			IPath relativeSourcePath = sourcePath.removeFirstSegments(prefixLength); 
			newDestinationPath = this.destinationPath.append(relativeSourcePath);
		}		
		newDestination = workspaceRoot.findMember(newDestinationPath);
		if (newDestination == null)
			continue;

		IFolder folder = getFolder(newDestination);
		if (folder != null) {
			if (policy != POLICY_FORCE_OVERWRITE){			
				if(this.overwriteState == OVERWRITE_NONE || !queryOverwrite(newDestinationPath)) {
					noOverwrite.add(folder);
					continue;
				}
			}			
			if (provider.isFolder(source))			
				collectExistingReadonlyFiles(
					newDestinationPath, 
					provider.getChildren(source), 
					noOverwrite, 
					overwriteReadonly, 
					POLICY_FORCE_OVERWRITE);
		}			
		else {
			IFile file = getFile(newDestination);
			
			if (file != null) {
				if (!queryOverwriteFile(file, policy))
					noOverwrite.add(file.getFullPath());
				else if (file.isReadOnly())
					overwriteReadonly.add(file);
			}	
		}
	}
} 
/**
 * Creates the folders that appear in the specified resource path.
 * These folders are created relative to the destination container.
 *
 * @param path the relative path of the resource
 * @return the container resource coresponding to the given path
 * @exception CoreException if this method failed
 */
IContainer createContainersFor(IPath path) throws CoreException {

	IContainer currentFolder = (IContainer) destinationContainer;
	
	int segmentCount = path.segmentCount();
	
	//No containers to create
	if(segmentCount == 0)
		return currentFolder;
	
	//Needs to be handles differently at the root
	if(currentFolder.getType() == IResource.ROOT)
		return createFromRoot(path);

	
	for (int i = 0; i < segmentCount; i++) {
		currentFolder = currentFolder.getFolder(new Path(path.segment(i)));
		if (!currentFolder.exists()) 
			((IFolder) currentFolder).create(false,true,null);
	}

	return currentFolder;
}

/**
 * Creates the folders that appear in the specified resource path
 * assuming that the destinationContainer begins at the root. Do not create projects.
 *
 * @param path the relative path of the resource
 * @return the container resource coresponding to the given path
 * @exception CoreException if this method failed
 */
private IContainer createFromRoot(IPath path) throws CoreException {
		
	int segmentCount = path.segmentCount();
	
	//Assume the project exists 
	IContainer currentFolder = 
		((IWorkspaceRoot) destinationContainer).getProject(path.segment(0));
	
	for (int i = 1; i < segmentCount; i++) {
		currentFolder = currentFolder.getFolder(new Path(path.segment(i)));
		if (!currentFolder.exists()) 
			((IFolder) currentFolder).create(false,true,null);
	}

	return currentFolder;
}


/**
 * Deletes the given resource. If the resource fails to be deleted, adds a
 * status object to the list to be returned by <code>getResult</code>.
 *
 * @param resource the resource
 */
void deleteResource(IResource resource) {
	try {
		resource.delete(IResource.KEEP_HISTORY, null);
	} catch (CoreException e) {
		errorTable.add(e.getStatus());
	}
}
/* (non-Javadoc)
 * Method declared on WorkbenchModifyOperation.
 * Imports the specified file system objects from the file system.
 */
protected void execute(IProgressMonitor progressMonitor) {
	
	monitor = progressMonitor;

	try {
		if (selectedFiles == null) {
			//Set the amount to 1000 as we have no idea of how long this will take
			monitor.beginTask(DataTransferMessages.getString("DataTransfer.importTask"),1000); //$NON-NLS-1$
			ContainerGenerator generator = new ContainerGenerator(destinationPath);
			monitor.worked(30);
			validateFiles(Arrays.asList(new Object[] {source}));
			monitor.worked(50);
			destinationContainer = generator.generateContainer(new SubProgressMonitor(monitor, 50));
			importRecursivelyFrom(source, POLICY_DEFAULT);
			//Be sure it finishes
			monitor.worked(90);
		} else {
			// Choose twice the selected files size to take folders into account
			int creationCount = selectedFiles.size();
			monitor.beginTask(DataTransferMessages.getString("DataTransfer.importTask"),creationCount + 100); //$NON-NLS-1$
			ContainerGenerator generator = new ContainerGenerator(destinationPath);
			monitor.worked(30);
			validateFiles(selectedFiles);		
			monitor.worked(50);
			destinationContainer = generator.generateContainer(new SubProgressMonitor(monitor, 50));
			importFileSystemObjects(selectedFiles);
			monitor.done();
		}
	}
	catch (CoreException e) {
		errorTable.add(e.getStatus());
	}
	finally {
		monitor.done();
	}
}
/**
 * Returns the container resource that the passed file system object should be
 * imported into.
 *
 * @param fileSystemObject the file system object being imported
 * @return the container resource that the passed file system object should be
 *     imported into
 * @exception CoreException if this method failed
 */
IContainer getDestinationContainerFor(Object fileSystemObject) throws CoreException {
	IPath pathname = new Path(provider.getFullPath(fileSystemObject));
	
	if (createContainerStructure)
		return createContainersFor(pathname.removeLastSegments(1));
	else {
		if (source == fileSystemObject)
			return null;
		IPath sourcePath = new Path(provider.getFullPath(source));
		IPath destContainerPath = pathname.removeLastSegments(1);
		IPath relativePath = destContainerPath.removeFirstSegments(sourcePath.segmentCount()).setDevice(null);
		return createContainersFor(relativePath);
	}
}
/**
 * Returns the resource either casted to or adapted to an IFile. 
 * 
 * @param resource resource to cast/adapt
 * @return the resource either casted to or adapted to an IFile.
 * 	<code>null</code> if the resource does not adapt to IFile 
 */
IFile getFile(IResource resource) {
	if (resource instanceof IFile) {
		return (IFile) resource;
	}
	if (resource instanceof IAdaptable) {
		return (IFile) ((IAdaptable) resource).getAdapter(IFile.class);
	}
	return null;
}
/**
 * Returns the resource either casted to or adapted to an IFolder. 
 * 
 * @param resource resource to cast/adapt
 * @return the resource either casted to or adapted to an IFolder.
 * 	<code>null</code> if the resource does not adapt to IFolder 
 */
IFolder getFolder(IResource resource) {
	if (resource instanceof IFolder) {
		return (IFolder) resource;
	}
	if (resource instanceof IAdaptable) {
		return (IFolder) ((IAdaptable) resource).getAdapter(IFolder.class);
	}
	return null;
}
/**
 * Returns the rejected files based on the given multi status.
 *  
 * @param multiStatus multi status to use to determine file rejection
 * @param files source files
 * @return list of rejected files as absolute paths. Object type IPath.
 */
ArrayList getRejectedFiles(IStatus multiStatus, IFile[] files) {
	ArrayList rejectedFiles = new ArrayList();

	IStatus[] status = multiStatus.getChildren();
	for (int i = 0; i < status.length; i++) {
		if (status[i].isOK() == false) {
			rejectedFiles.add(files[i].getFullPath());
		}
	}
	return rejectedFiles;
}
/**
 * Returns the status of the import operation.
 * If there were any errors, the result is a status object containing
 * individual status objects for each error.
 * If there were no errors, the result is a status object with error code <code>OK</code>.
 *
 * @return the status
 */
public IStatus getStatus() {
	IStatus[] errors = new IStatus[errorTable.size()];
	errorTable.toArray(errors);
	return new MultiStatus(
		PlatformUI.PLUGIN_ID, 
		IStatus.OK, 
		errors,
		DataTransferMessages.getString("ImportOperation.importProblems"),  //$NON-NLS-1$
		null);
}
/**
 * Imports the specified file system object into the workspace.
 * If the import fails, adds a status object to the list to be returned by
 * <code>getResult</code>.
 *
 * @param fileObject the file system object to be imported
 * @param policy determines how the file object is imported
 */
void importFile(Object fileObject, int policy) {
	IContainer containerResource;
	try {
		containerResource = getDestinationContainerFor(fileObject);
	} catch (CoreException e) {
		IStatus coreStatus = e.getStatus();		
		String newMessage = DataTransferMessages.format("ImportOperation.coreImportError", new Object [] {fileObject, coreStatus.getMessage()}); //$NON-NLS-1$
		IStatus status = new Status(coreStatus.getSeverity(), coreStatus.getPlugin(), coreStatus.getCode(), newMessage, null);
		errorTable.add(status);
		return;
	}
		
	String fileObjectPath = provider.getFullPath(fileObject);
	monitor.subTask(fileObjectPath);
	IFile targetResource = containerResource.getFile(new Path(provider.getLabel(fileObject)));
	monitor.worked(1);
	
	if (rejectedFiles.contains(targetResource.getFullPath()))
		return;

	// ensure that the source and target are not the same
	IPath targetPath = targetResource.getLocation();
	// Use Files for comparison to avoid platform specific case issues
	if (targetPath != null && 
		(targetPath.toFile().equals(new File(fileObjectPath)))) {
		errorTable.add(
			new Status(
				IStatus.ERROR,
				PlatformUI.PLUGIN_ID,
				0,
				DataTransferMessages.format(
					"ImportOperation.targetSameAsSourceError", //$NON-NLS-1$
					new Object [] {fileObjectPath}), 
				null));
		return;		
	}

	InputStream contentStream = provider.getContents(fileObject);
	if (contentStream == null) {
		errorTable.add(
			new Status(
				IStatus.ERROR,
				PlatformUI.PLUGIN_ID,
				0,
				DataTransferMessages.format("ImportOperation.openStreamError", new Object [] {fileObjectPath}), //$NON-NLS-1$
				null));
		return;
	}
	
	try {
		if (targetResource.exists())
			targetResource.setContents(contentStream, IResource.KEEP_HISTORY, null);
		else
			targetResource.create(contentStream, false, null);
	} catch (CoreException e) {
		errorTable.add(e.getStatus());
	} finally {
		try {
			contentStream.close();
		} catch (IOException e) {
			errorTable.add(
				new Status(
					IStatus.ERROR,
					PlatformUI.PLUGIN_ID,
					0,
					DataTransferMessages.format("ImportOperation.closeStreamError", new Object [] {fileObjectPath}),  //$NON-NLS-1$
					e));
		}
	}
}
/**
 * Imports the specified file system objects into the workspace.
 * If the import fails, adds a status object to the list to be returned by
 * <code>getStatus</code>.
 *
 * @param filesToImport the list of file system objects to import
 *   (element type: <code>Object</code>)
 * @exception OperationCanceledException if canceled
 */
void importFileSystemObjects(List filesToImport) {
	Iterator filesEnum = filesToImport.iterator();
	while (filesEnum.hasNext()) {
		Object fileSystemObject = filesEnum.next();
		if (source == null) {
			// We just import what we are given into the destination
			IPath sourcePath = new Path(provider.getFullPath(fileSystemObject)).removeLastSegments(1);
			if (provider.isFolder(fileSystemObject) && sourcePath.isEmpty()) {
				// If we don't have a parent then we have selected the
				// file systems root. Roots can't copied (at least not
				// under windows).
				errorTable.add(
					new Status(
						IStatus.INFO,
						PlatformUI.PLUGIN_ID,
						0,
						DataTransferMessages.getString("ImportOperation.cannotCopy"), //$NON-NLS-1$
						null));
				continue;
			}
			source = sourcePath.toFile();
		}
		importRecursivelyFrom(fileSystemObject, POLICY_DEFAULT);
	}
}
/**
 * Imports the specified file system container object into the workspace.
 * If the import fails, adds a status object to the list to be returned by
 * <code>getResult</code>.
 *
 * @param fileObject the file system container object to be imported
 * @param policy determines how the folder object and children are imported
 * @return the policy to use to import the folder's children
 */
int importFolder(Object folderObject, int policy) {
	IContainer containerResource;
	try {
		containerResource = getDestinationContainerFor(folderObject);
	} catch (CoreException e) {
		errorTable.add(e.getStatus());
		return policy;
	}

	if (containerResource == null)
		return policy;

	monitor.subTask(provider.getFullPath(folderObject));
	IWorkspace workspace = destinationContainer.getWorkspace();
	IPath containerPath = containerResource.getFullPath();
	IPath resourcePath = containerPath.append(provider.getLabel(folderObject));

	// Do not attempt the import if the resource path is unchanged. This may happen
	// when importing from a zip file.
	if (resourcePath.equals(containerPath))
		return policy;

	if (workspace.getRoot().exists(resourcePath)) {
		if (rejectedFiles.contains(resourcePath))
			return POLICY_SKIP_CHILDREN;

		return POLICY_FORCE_OVERWRITE;
	}
		
	try {
		workspace.getRoot().getFolder(resourcePath).create(
			false,
			true,
			null);
	} catch (CoreException e) {
		errorTable.add(e.getStatus());
	}

	return policy;
}
/**
 * Imports the specified file system object recursively into the workspace.
 * If the import fails, adds a status object to the list to be returned by
 * <code>getStatus</code>.
 *
 * @param fileSystemObject the file system object to be imported
 * @param policy determines how the file system object and children are imported
 * @exception OperationCanceledException if canceled
 */
void importRecursivelyFrom(Object fileSystemObject, int policy) {
	if (monitor.isCanceled())
		throw new OperationCanceledException();
	
	if (!provider.isFolder(fileSystemObject)) {
		importFile(fileSystemObject, policy);
		return;
	}

	int childPolicy = importFolder(fileSystemObject, policy);
	if (childPolicy != POLICY_SKIP_CHILDREN) {
		Iterator children = provider.getChildren(fileSystemObject).iterator();
		while (children.hasNext())
			importRecursivelyFrom(children.next(), childPolicy);
	}
}
/**
 * Queries the user whether the resource with the specified path should be
 * overwritten by a file system object that is being imported.
 * 
 * @param path the workspace path of the resource that needs to be overwritten
 * @return <code>true</code> to overwrite, <code>false</code> to not overwrite
 * @exception OperationCanceledException if canceled
 */
boolean queryOverwrite(IPath resourcePath) throws OperationCanceledException {
	String overwriteAnswer = overwriteCallback.queryOverwrite(resourcePath.makeRelative().toString());

	if (overwriteAnswer.equals(IOverwriteQuery.CANCEL))
		throw new OperationCanceledException(DataTransferMessages.getString("DataTransfer.emptyString")); //$NON-NLS-1$
				
	if (overwriteAnswer.equals(IOverwriteQuery.NO)) {
		return false;
	}
	
	if (overwriteAnswer.equals(IOverwriteQuery.NO_ALL)){
		this.overwriteState = OVERWRITE_NONE;
		return false;
	}
			
	if (overwriteAnswer.equals(IOverwriteQuery.ALL))
		this.overwriteState = OVERWRITE_ALL;

	return true;
}
/**
 * Returns whether the given file should be overwritten.
 *
 * @param targetFile the file to ask to overwrite 
 * @param policy determines if the user is queried for overwrite 
 * @return <code>true</code> if the file should be overwritten, and
 * 	<code>false</code> if not.
 */
boolean queryOverwriteFile(IFile targetFile, int policy) {
	//If force overwrite is on don't bother
	if (policy != POLICY_FORCE_OVERWRITE){
		if(this.overwriteState == OVERWRITE_NOT_SET && 
			!queryOverwrite(targetFile.getFullPath()))
				return false;
		if(this.overwriteState == OVERWRITE_NONE)
			return false;	
	}
	return true;
}
/**
 * Sets the context for use by the VCM provider to prompt the user
 * for check-out of files.
 * 
 * @param shell context for use by the VCM provider to prompt user
 * 	for check-out. The user will not be prompted if set to <code>null</code>.
 * @see IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object)
 * @since 2.1
 */
public void setContext(Shell shell) {
	context = shell;
}
/**
 * Sets whether the containment structures that are implied from the full paths
 * of file system objects being imported should be duplicated in the workbench.
 *
 * @param value <code>true</code> if containers should be created, and
 *  <code>false</code> otherwise
 */
public void setCreateContainerStructure(boolean value) {
	createContainerStructure = value;
}
/**
 * Sets the file system objects to import.
 *
 * @param filesToImport the list of file system objects to be imported
 *   (element type: <code>Object</code>)
 */
public void setFilesToImport(List filesToImport) {
	this.selectedFiles = filesToImport;
}
/**
 * Sets whether imported file system objects should automatically overwrite
 * existing workbench resources when a conflict occurs.
 *
 * @param value <code>true</code> to automatically overwrite, and 
 *   <code>false</code> otherwise
 */
public void setOverwriteResources(boolean value) {
	if(value)
		this.overwriteState = OVERWRITE_ALL;
}
/**
 * Validates that the given source resources can be copied to the 
 * destination as decided by the VCM provider.
 * 
 * @param existingFiles existing files to validate
 * @return list of rejected files as absolute paths. Object type IPath.
 */
ArrayList validateEdit(List existingFiles) {
	ArrayList rejectedFiles = new ArrayList();
		
	if (existingFiles.size() > 0) {
		IFile[] files = (IFile[]) existingFiles.toArray(new IFile[existingFiles.size()]);
		IWorkspace workspace = ResourcesPlugin.getWorkspace();
		IStatus status = workspace.validateEdit(files, context);
			
		if (status.isMultiStatus())
			rejectedFiles = getRejectedFiles(status, files);
		else if (!status.isOK())
			throw new OperationCanceledException(DataTransferMessages.getString("DataTransfer.emptyString")); //$NON-NLS-1$
	}
	return rejectedFiles;
}
/**
 * Validates the given file system objects.
 * The user is prompted to overwrite existing files.
 * Existing read-only files are validated with the VCM provider.
 * 
 * @param sourceFiles files to validate
 */
void validateFiles(List sourceFiles) {
	ArrayList noOverwrite = new ArrayList();
	ArrayList overwriteReadonly = new ArrayList();
	
	collectExistingReadonlyFiles(destinationPath, sourceFiles, noOverwrite, overwriteReadonly, POLICY_DEFAULT);
	rejectedFiles = validateEdit(overwriteReadonly);
	rejectedFiles.addAll(noOverwrite);
}
}
