/*******************************************************************************
 * Copyright (c) 2000, 2005 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.jdt.internal.junit.refactoring;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.core.resources.IProject;

import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;

import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;

import org.eclipse.jdt.internal.junit.launcher.JUnitBaseLaunchConfiguration;

public class ProjectRenameParticipant extends JUnitRenameParticipant {

	private IJavaProject fProject;

	private IJavaProject getNewJavaProject() {
		IProject project= fProject.getProject().getWorkspace().getRoot().getProject(getNewName());
		return getJavaProject(project);
	}

	protected IJavaProject getJavaProject(IProject project) {
		return JavaCore.create(project);
	}

	protected boolean initialize(Object element) {
		fProject= (IJavaProject) element;
		return true;
	}

	public void createChangeForConfig(JUnitRenameParticipant.ChangeList changeList, LaunchConfigurationContainer config) throws CoreException {

		changeList.addAttributeChangeIfNeeded(config, IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProject.getElementName(), getNewName());

		IJavaProject newJavaProject= getNewJavaProject();

		String container= config.getAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, (String) null);
		IJavaElement javaElement= getJavaElement(container);
		if (javaElement == null)
			return;
		IJavaElement potentialMatch= javaElement;

		// TODO: spike!
		while (!potentialMatch.getHandleIdentifier().equals(fProject.getHandleIdentifier())) {
			potentialMatch= potentialMatch.getParent();
			if (potentialMatch == null)
				return;
		}

		String newHandle;
		if (javaElement instanceof IPackageFragment) {
			IPackageFragment fragment= (IPackageFragment) javaElement;
			newHandle= newJavaProject.getPackageFragmentRoot(fragment.getParent().getElementName()).getPackageFragment(fragment.getElementName()).getHandleIdentifier();
		} else if (javaElement instanceof IPackageFragmentRoot) {
			IPackageFragmentRoot root= (IPackageFragmentRoot) javaElement;
			newHandle= newJavaProject.getPackageFragmentRoot(root.getElementName()).getHandleIdentifier();
		} else if (javaElement instanceof IJavaProject) {
			newHandle= newJavaProject.getHandleIdentifier();
		} else {
			// shouldn't happen, but if it does, we silently fail.
			return;
		}
		changeList.addAttributeChange(config, JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, newHandle);

		// rename change must come at the end
		changeList.addRenameChangeIfNeeded(config, fProject.getElementName());
	}

	protected IJavaElement getJavaElement(String handle) {
		return JavaCore.create(handle);
	}
}