/*******************************************************************************
 * 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.archive.operations;



import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.core.JavaModel;

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


/**
 * Create a Java Project Load Strategy based on J2EE Load Strategy which is used by common archive
 * operations.
 */
public class JavaProjectLoadStrategyImpl extends J2EELoadStrategyImpl {

	//	IProject project;
	protected IJavaProject javaProject;
	protected List sourceContainers = null;

	public static final String JAVA_EXTENSION = "java"; //$NON-NLS-1$
	public static final String CLASS_EXTENSION = "class"; //$NON-NLS-1$


	/**
	 * Constructor for JavaProjectLoadStrategyImpl.
	 */
	public JavaProjectLoadStrategyImpl(IProject proj) {
		super();
		project = proj;
		filesList = new ArrayList();
		JavaModel model = ProjectUtilities.getJavaModel();
		javaProject = model.getJavaProject(project.getName());

	}

	public IContainer getModuleContainer() {
		return ProjectUtilities.getJavaProjectOutputContainer(getProject());
	}

	/*
	 * @see J2EELoadStrategyImpl#getProjectURIConverter()
	 */
	public WorkbenchURIConverter getProjectURIConverter() {
		if (projectURIConverter != null)
			return projectURIConverter;

		IContainer outputContainer = ProjectUtilities.getJavaProjectOutputContainer(getProject());
		List uriContainers = new ArrayList();
		uriContainers.add(outputContainer);
		if (isExportSource()) {
			List localSourceFolders = getSourceFolders();
			//We always want the output container at the front of the list
			//If the output container is also source, then remove it so it's not searched twice
			localSourceFolders.remove(outputContainer);
			uriContainers.addAll(localSourceFolders);
		}
		projectURIConverter = new WorkbenchURIConverterImpl();
		for (int i = 0; i < uriContainers.size(); i++) {
			projectURIConverter.addInputContainer((IContainer) uriContainers.get(i));
		}
		return projectURIConverter;
	}

	/*
	 * Overridden from superclass, V5. For future releases, need to clean up the implementation in
	 * the superclass, but for now, overriding for minimum disruption.
	 */
	protected IPath getOutputPathForFile(IPath aPath) throws Exception {

		if (isProjectMetaFile(aPath.toString())) {
			if (shouldIncludeProjectMetaFiles())
				return aPath;
			return null;
		}
		if (!checkIfNeeded(aPath))
			return null;

		List containers = getProjectURIConverter().getInputContainers();
		for (int i = 0; i < containers.size(); i++) {
			IContainer aContainer = (IContainer) containers.get(i);
			IPath containerPath = aContainer.getProjectRelativePath();
			if (aPath.matchingFirstSegments(containerPath) == containerPath.segmentCount()) {
				IPath result = aPath.removeFirstSegments(containerPath.segmentCount());
				//The next three lines cover the case where you have the project as source
				//and a folder as the output
				if (isProjectMetaFile(result.toString()) && !shouldIncludeProjectMetaFiles())
					return null;
				return result;
			}
		}
		return null;
	}


	public List getSourceFolders() {
		if (sourceContainers == null)
			sourceContainers = ProjectUtilities.getSourceContainers(project);
		return sourceContainers;
	}


	protected boolean checkIfNeeded(IPath path) throws Exception {
		if (path == null || path.segmentCount() == 0)
			return false;

		String ext = path.getFileExtension();

		if (isJava(ext))
			return isExportSource();
		return true;
	}

	protected boolean isResource(String ext) {
		return ext == null || (!isClass(ext) && !isJava(ext));
	}

	protected boolean isClass(String ext) {
		return CLASS_EXTENSION.equals(ext);
	}

	protected boolean isJava(String ext) {
		return JAVA_EXTENSION.equals(ext);
	}

}