/*******************************************************************************
 * Copyright (c) 2011, 2012 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jpa.ui.internal.commands;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jpt.common.core.internal.utility.PlatformTools;
import org.eclipse.jpt.jpa.core.JpaProject;
import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
import org.eclipse.ui.handlers.HandlerUtil;

public abstract class AbstractJavaMetadataConversionHandler
	extends AbstractHandler
{
	public AbstractJavaMetadataConversionHandler() {
		super();
	}

	public Object execute(ExecutionEvent event) throws ExecutionException {
		this.execute_(event);
		return null;
	}

	protected void execute_(ExecutionEvent event) throws ExecutionException {
		IStructuredSelection selection = (IStructuredSelection) HandlerUtil.getCurrentSelectionChecked(event);
		JpaProject jpaProject = this.convertSelectionToJpaProject(selection.getFirstElement());
		if (jpaProject != null) {
			this.convertJavaMetadata(jpaProject);
		}
	}

	protected abstract void convertJavaMetadata(JpaProject jpaProject);

	protected JpaProject convertSelectionToJpaProject(Object sel) {
		try {
			return (sel == null) ? null : this.convertSelectionToJpaProject_(sel);
		} catch (InterruptedException ex) {
			Thread.currentThread().interrupt();
			return null;
		}
	}

	protected JpaProject convertSelectionToJpaProject_(Object sel) throws InterruptedException {
		// this will handle JpaProject and IProject (when the JpaProject is already present)
		JpaProject jpaProject = PlatformTools.getAdapter(sel, JpaProject.class);
		if (jpaProject != null) {
			return jpaProject;
		}
		IProject project = this.convertSelectionToProject(sel);
		if (project == null) {
			return null;
		}
		JpaProject.Reference ref = (JpaProject.Reference) project.getAdapter(JpaProject.Reference.class);
		// this will wait for the JpaProject if it is under construction
		return (ref == null) ? null : ref.getValue();
	}

	protected IProject convertSelectionToProject(Object sel) {
		// this will handle JpaProject and IProject
		IResource resource = PlatformTools.getAdapter(sel, IResource.class);
		if (resource != null) {
			return resource.getProject();
		}

		IJavaProject javaProject = this.convertSelectionToJavaProject(sel);
		return (javaProject == null) ? null : javaProject.getProject();
	}

	protected IJavaProject convertSelectionToJavaProject(Object sel) {
		IJavaElement javaElement = PlatformTools.getAdapter(sel, IJavaElement.class);
		return (javaElement == null) ? null : javaElement.getJavaProject();
	}

	/**
	 * Convenience method.
	 */
	protected JpaPlatformUi getJpaPlatformUi(JpaProject jpaProject) {
		return (JpaPlatformUi) jpaProject.getJpaPlatform().getAdapter(JpaPlatformUi.class);
	}
}
