/*******************************************************************************
 * Copyright (c) 2003, 2004 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.jst.j2ee.internal.java.codegen;



import org.eclipse.core.resources.IWorkspace;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.common.jdt.internal.integration.WorkingCopyProvider;
import org.eclipse.jst.j2ee.internal.codegen.GenerationException;
import org.eclipse.jst.j2ee.internal.codegen.TopLevelGenerationHelper;

import com.ibm.wtp.emf.workbench.ProjectUtilities;

/**
 * Java generation specific top level helper. This may be extended to add metadata level helper
 * information.
 */
public class JavaTopLevelGenerationHelper extends TopLevelGenerationHelper {
	private String fDefaultPkgFragRootName = null;
	private IJavaModel fJavaModel = null;
	private IJavaProject fJavaProject = null;
	private IPackageFragmentRoot fDefaultPackageFragmentRoot = null;
	private WorkingCopyProvider workingCopyProvider;

	/**
	 * JavaTopLevelGenerationHelper default constructor.
	 */
	public JavaTopLevelGenerationHelper() {
		super();
	}

	/**
	 * Subclasses can override to create a proper merge strategy. The default is an instance of
	 * {@link JavaTagBatchMergeStrategy}. Overriding this merge strategy creation here in the top
	 * level helper has the effect of setting the merge strategy for all compilation units affected
	 * by this generation.
	 * 
	 * @return org.eclipse.jst.j2ee.internal.internal.internal.java.codegen.IJavaMergeStrategy
	 * @see JavaCompilationUnitGenerator#createMergeStrategy()
	 */
	public IJavaMergeStrategy createMergeStrategy() {
		return new org.eclipse.jst.j2ee.internal.java.codegen.JavaTagBatchMergeStrategy();
	}

	/**
	 * Returns the default PackageFragmentRoot for this generation. If the setter has not been
	 * called, it will try to return the first source root in the Java project. If this can not be
	 * resolved, an exception is thrown.
	 * 
	 * @return org.eclipse.jdt.core.api.IPackageFragmentRoot
	 * @exception GenerationException
	 *                if the project does not exist or no source root can be found
	 */
	public IPackageFragmentRoot getDefaultPackageFragmentRoot() throws GenerationException {
		if (fDefaultPackageFragmentRoot == null) {
			String pkgFragRootName = getDefaultPackageFragmentRootName();
			if ((pkgFragRootName == null) || (pkgFragRootName.length() == 0)) {
				try {
					IPackageFragmentRoot[] roots = getJavaProject().getPackageFragmentRoots();
					for (int i = 0; (i < roots.length) && (fDefaultPackageFragmentRoot == null); i++) {
						if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE)
							fDefaultPackageFragmentRoot = roots[i];
					}
				} catch (JavaModelException exc) {
					throw new GenerationException(exc);
				}
				if (fDefaultPackageFragmentRoot == null)
					throw new GenerationException(JavaCodeGenResourceHandler.getString("No_source_package_fragment_EXC_")); //$NON-NLS-1$ = "No source package fragment root could be found."
			} else {
				try {
					fDefaultPackageFragmentRoot = getJavaProject().findPackageFragmentRoot(getJavaProject().getProject().getFullPath().append(pkgFragRootName));
					if (fDefaultPackageFragmentRoot.getKind() != IPackageFragmentRoot.K_SOURCE) {
						fDefaultPackageFragmentRoot = null;
						throw new GenerationException(JavaCodeGenResourceHandler.getString("Specified_root_is_not_a_so_EXC_")); //$NON-NLS-1$ = "Specified root is not a source root."
					}
				} catch (JavaModelException exc) {
					throw new GenerationException(exc);
				}
			}
		}
		return fDefaultPackageFragmentRoot;
	}

	/**
	 * Returns the project relative name of the default package fragment root.
	 */
	public String getDefaultPackageFragmentRootName() {
		return fDefaultPkgFragRootName;
	}

	/**
	 * Returns the JavaModel for this generation.
	 * 
	 * @return org.eclipse.jdt.core.api.IJavaModel
	 */
	public IJavaModel getJavaModel() {
		if (fJavaModel == null)
			fJavaModel = ProjectUtilities.getJavaModel();
		return fJavaModel;
	}

	/**
	 * Returns the JavaProject for this generation.
	 * 
	 * @return org.eclipse.jdt.core.api.IJavaProject
	 * @exception org.eclipse.jst.j2ee.internal.internal.internal.codegen.GenerationException
	 *                if the project name has not been set.
	 */
	public IJavaProject getJavaProject() throws GenerationException {
		if (fJavaProject == null) {
			String projName = getProjectName();
			if ((projName == null) || (projName.length() == 0))
				throw new GenerationException(JavaCodeGenResourceHandler.getString("Project_name_not_specified_EXC_")); //$NON-NLS-1$ = "Project name not specified."
			fJavaProject = getJavaModel().getJavaProject(projName);
		}
		return fJavaProject;
	}

	/**
	 * Returns the compilation unit working copy provider for this generation. The working copy
	 * provider must be set before starting generation. Otherwise, this call will return null and
	 * null pointer exceptions are sure to result.
	 * 
	 * @return org.eclipse.jst.j2ee.internal.internal.internal.java.codegen.WorkingCopyProvider
	 */
	public WorkingCopyProvider getWorkingCopyProvider() {
		return workingCopyProvider;
	}

	/**
	 * Returns the target workspace.
	 */
	public IWorkspace getWorkspace() {
		return org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin.getWorkspace();
	}

	/**
	 * Sets the project relative name of the default package fragment root.
	 */
	public void setDefaultPackageFragmentRootName(String rootName) {
		fDefaultPkgFragRootName = rootName;
	}

	/**
	 * Sets the working copy provider for this generation. This must be set before starting the
	 * generation.
	 * 
	 * @param newWorkingCopyProvider
	 *            org.eclipse.jst.j2ee.internal.internal.internal.java.codegen.WorkingCopyProvider
	 */
	public void setWorkingCopyProvider(WorkingCopyProvider newWorkingCopyProvider) {
		workingCopyProvider = newWorkingCopyProvider;
	}
}