/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hdt.core.internal.hdfs;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.team.IMoveDeleteHook;
import org.eclipse.core.resources.team.IResourceTree;
import org.eclipse.core.runtime.IProgressMonitor;

/**
 * @author Srimanth Gunturi
 * 
 */
public class HDFSMoveDeleteHook implements IMoveDeleteHook {

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.core.resources.team.IMoveDeleteHook#deleteFile(org.eclipse
	 * .core.resources.team.IResourceTree, org.eclipse.core.resources.IFile,
	 * int, org.eclipse.core.runtime.IProgressMonitor)
	 */
	@Override
	public boolean deleteFile(IResourceTree tree, IFile file, int updateFlags, IProgressMonitor monitor) {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.core.resources.team.IMoveDeleteHook#deleteFolder(org.eclipse
	 * .core.resources.team.IResourceTree, org.eclipse.core.resources.IFolder,
	 * int, org.eclipse.core.runtime.IProgressMonitor)
	 */
	@Override
	public boolean deleteFolder(IResourceTree tree, IFolder folder, int updateFlags, IProgressMonitor monitor) {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.core.resources.team.IMoveDeleteHook#deleteProject(org.eclipse
	 * .core.resources.team.IResourceTree, org.eclipse.core.resources.IProject,
	 * int, org.eclipse.core.runtime.IProgressMonitor)
	 */
	@Override
	public boolean deleteProject(IResourceTree tree, IProject project, int updateFlags, IProgressMonitor monitor) {
		if (HDFSFileSystem.SCHEME.equals(project.getLocationURI().getScheme())) {
			// Deleting a HDFS project root folder *and* its contents is not
			// supported.
			// Caller has to uncheck the 'Delete project contents' checkbox.
			if ((IResource.ALWAYS_DELETE_PROJECT_CONTENT & updateFlags) > 0) {
				throw new RuntimeException(
						"Deletion of HDFS project root folder is not supported. To remove project uncheck the \'Delete project contents on disk\' checkbox");
			}
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.core.resources.team.IMoveDeleteHook#moveFile(org.eclipse.
	 * core.resources.team.IResourceTree, org.eclipse.core.resources.IFile,
	 * org.eclipse.core.resources.IFile, int,
	 * org.eclipse.core.runtime.IProgressMonitor)
	 */
	@Override
	public boolean moveFile(IResourceTree tree, IFile source, IFile destination, int updateFlags, IProgressMonitor monitor) {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.core.resources.team.IMoveDeleteHook#moveFolder(org.eclipse
	 * .core.resources.team.IResourceTree, org.eclipse.core.resources.IFolder,
	 * org.eclipse.core.resources.IFolder, int,
	 * org.eclipse.core.runtime.IProgressMonitor)
	 */
	@Override
	public boolean moveFolder(IResourceTree tree, IFolder source, IFolder destination, int updateFlags, IProgressMonitor monitor) {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.core.resources.team.IMoveDeleteHook#moveProject(org.eclipse
	 * .core.resources.team.IResourceTree, org.eclipse.core.resources.IProject,
	 * org.eclipse.core.resources.IProjectDescription, int,
	 * org.eclipse.core.runtime.IProgressMonitor)
	 */
	@Override
	public boolean moveProject(IResourceTree tree, IProject source, IProjectDescription description, int updateFlags, IProgressMonitor monitor) {
		if (HDFSFileSystem.SCHEME.equals(source.getLocationURI().getScheme())) {
			// Moving a HDFS project is not supported.
			throw new RuntimeException("Moving a HDFS project root folder is not supported.");
		}
		return false;
	}

}
