/*******************************************************************************
 * Copyright (c) 2009, 2017 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 API and implementation
 *******************************************************************************/
package org.eclipse.core.tests.resources.regression;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.resources.Workspace;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.harness.FileSystemHelper;
import org.eclipse.core.tests.resources.ResourceTest;

public class Bug_265810 extends ResourceTest {

	protected final static String VARIABLE_NAME = "ROOT";
	private final ArrayList<IPath> toDelete = new ArrayList<>();
	List<IResourceDelta> resourceDeltas = new ArrayList<>();

	/**
	 * Constructor for Bug_265810.
	 */
	public Bug_265810() {
		super();
	}

	/**
	 * Constructor for Bug_265810.
	 * @param name
	 */
	public Bug_265810(String name) {
		super(name);
	}

	public static Test suite() {
		return new TestSuite(Bug_265810.class);
	}

	@Override
	protected void setUp() throws Exception {
		IPath base = super.getRandomLocation();
		toDelete.add(base);
		super.setUp();
	}

	@Override
	protected void tearDown() throws Exception {
		IPath[] paths = toDelete.toArray(new IPath[0]);
		toDelete.clear();
		for (IPath path : paths) {
			Workspace.clear(path.toFile());
		}
		super.tearDown();
	}

	/**
	 * @see org.eclipse.core.tests.harness.ResourceTest#getRandomLocation()
	 */
	@Override
	public IPath getRandomLocation() {
		IPath path = FileSystemHelper.computeRandomLocation(getTempDir());
		try {
			path.toFile().createNewFile();
		} catch (IOException e) {
			fail("can't create the file", e);
		}
		toDelete.add(path);
		return path;
	}

	public void testBug() {

		// create a project
		IProject project = getWorkspace().getRoot().getProject(getUniqueString());
		try {
			project.create(new NullProgressMonitor());
			project.open(new NullProgressMonitor());
		} catch (CoreException e) {
			fail("1.0", e);
		}

		// create a linked resource
		final IFile file = project.getFile(getUniqueString());
		// the file should not exist yet
		assertDoesNotExistInWorkspace("2.0", file);
		try {
			file.createLink(getRandomLocation(), IResource.NONE, new NullProgressMonitor());
			file.setContents(getContents("contents for a file"), IResource.NONE, new NullProgressMonitor());
		} catch (CoreException e) {
			fail("3.0", e);
		}

		// save the .project [1] content
		byte[] dotProject1 = storeDotProject(project);

		// create a new linked file
		final IFile newFile = project.getFile("newFile");
		// the file should not exist yet
		assertDoesNotExistInWorkspace("5.0", newFile);
		try {
			newFile.createLink(getRandomLocation(), IResource.NONE, new NullProgressMonitor());
		} catch (CoreException e) {
			fail("6.0", e);
		}

		// save the .project [2] content
		byte[] dotProject2 = storeDotProject(project);

		try {
			resourceDeltas = new ArrayList<>();
			getWorkspace().addResourceChangeListener(ll);

			// restore .project [1]
			restoreDotProject(project, dotProject1);

			assertEquals("9.0", 1, resourceDeltas.size());
			assertEquals("9.1", newFile, resourceDeltas.get(0).getResource());
			assertEquals("9.2", IResourceDelta.REMOVED, resourceDeltas.get(0).getKind());
		} finally {
			getWorkspace().removeResourceChangeListener(ll);
		}

		// create newFile as a non-linked resource
		try {
			newFile.create(getContents("content"), IResource.NONE, new NullProgressMonitor());
		} catch (CoreException e1) {
			fail("10.0", e1);
		}

		try {
			resourceDeltas = new ArrayList<>();
			getWorkspace().addResourceChangeListener(ll);

			// restore .project [2]
			restoreDotProject(project, dotProject2);

			assertEquals("11.0", 1, resourceDeltas.size());
			assertEquals("11.1", newFile, resourceDeltas.get(0).getResource());
			assertEquals("11.2", IResourceDelta.REPLACED, resourceDeltas.get(0).getFlags() & IResourceDelta.REPLACED);
		} finally {
			getWorkspace().removeResourceChangeListener(ll);
		}
	}

	private byte[] storeDotProject(IProject project) {
		byte[] buffer = new byte[2048];
		int bytesRead = 0;
		byte[] doProject = new byte[0];

		try {
			InputStream iS = project.getFile(".project").getContents();
			bytesRead = iS.read(buffer);
			iS.close();
		} catch (IOException e) {
			fail("storing dotProject failed", e);
		} catch (CoreException e) {
			fail("storing dotProject failed", e);
		}

		doProject = new byte[bytesRead];
		System.arraycopy(buffer, 0, doProject, 0, bytesRead);

		return doProject;
	}

	private void restoreDotProject(IProject project, byte[] dotProject) {
		try {
			project.getFile(".project").setContents(new ByteArrayInputStream(dotProject), IResource.NONE, new NullProgressMonitor());
		} catch (CoreException e) {
			fail("restoring dotProject failed", e);
		}
	}

	IResourceChangeListener ll = event -> {
		try {
			event.getDelta().accept(delta -> {
				IResource resource = delta.getResource();
				if (resource instanceof IFile && !resource.getName().equals(".project")) {
					addToResourceDelta(delta);
				}
				if (delta.getAffectedChildren().length > 0) {
					return true;
				}
				return false;
			});
		} catch (CoreException e) {
			fail("listener failed", e);
		}
	};

	boolean addToResourceDelta(IResourceDelta delta) {
		return resourceDeltas.add(delta);
	}
}
