/*******************************************************************************
 * Copyright (c) 2005, 2007 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
 *
 
 *******************************************************************************/
package org.eclipse.dltk.internal.core;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.core.util.Util;

class ProjectFragmentInfo extends OpenableElementInfo {

	/**
	 * The kind of the root associated with this info.
	 */
	protected int fRootKind = IProjectFragment.K_SOURCE;

	protected Object[] foreignResources;

	/**
	 * Returns the kind of this root.
	 */
	public int getRootKind() {
		return this.fRootKind;
	}

	void setForeignResources(Object[] resources) {
		foreignResources = resources;
	}

	public Object[] getForeignResources(IScriptProject scriptProject,
			IResource resource, ProjectFragment fragment) {
		Object[] nonScriptResources = this.foreignResources;
		if (nonScriptResources == null) {
			nonScriptResources = this.computeForeignResources(scriptProject,
					resource, fragment);
			this.foreignResources = nonScriptResources;
		}
		return nonScriptResources;
	}

	private Object[] computeForeignResources(IScriptProject scriptProject,
			IResource underlyingResource, ProjectFragment handle) {
		Object[] nonScriptResources = NO_NON_SCRIPT_RESOURCES;
		try {
			// the underlying resource may be a folder or a project (in the case
			// that the project folder
			// is actually the package fragment root)
			if (underlyingResource.getType() == IResource.FOLDER
					|| underlyingResource.getType() == IResource.PROJECT) {
				nonScriptResources = computeFolderForeignResources(
						(ScriptProject) scriptProject,
						(IContainer) underlyingResource, handle
								.fullInclusionPatternChars(), handle
								.fullExclusionPatternChars());
			}
		} catch (ModelException e) {
			// ignore
		}
		return nonScriptResources;
	}

	public static Object[] computeFolderForeignResources(ScriptProject project,
			IContainer folder, char[][] inclusionPatterns,
			char[][] exclusionPatterns) throws ModelException {
		Object[] nonScriptResources = new IResource[5];
		int nonScriptResourcesCounter = 0;
		try {
			IBuildpathEntry[] classpath = project.getResolvedBuildpath();
			IResource[] members = folder.members();
			nextResource: for (int i = 0, max = members.length; i < max; i++) {
				IResource member = members[i];
				switch (member.getType()) {
				case IResource.FILE:
					String fileName = member.getName();

					// ignore .java files that are not excluded
					if (Util.isValidSourceModule(project, member)
							&& !Util.isExcluded(member, inclusionPatterns,
									exclusionPatterns))
						continue nextResource;
					// ignore .zip file on buildpath
					if (org.eclipse.dltk.compiler.util.Util.isArchiveFileName(
							DLTKLanguageManager.getLanguageToolkit(project),
							fileName)
							&& isBuildpathEntry(member.getFullPath(), classpath))
						continue nextResource;
					// All other resources should be in folders.
					// continue nextResource;
					break;

				case IResource.FOLDER:
					// ignore valid packages or excluded folders that correspond
					// to a nested pkg fragment root
					if (Util.isValidFolderNameForPackage(folder, member
							.getName())
							&& (!Util.isExcluded(member, inclusionPatterns,
									exclusionPatterns) || isBuildpathEntry(
									member.getFullPath(), classpath)))
						continue nextResource;
					break;
				}
				if (nonScriptResources.length == nonScriptResourcesCounter) {
					// resize
					System
							.arraycopy(
									nonScriptResources,
									0,
									(nonScriptResources = new IResource[nonScriptResourcesCounter * 2]),
									0, nonScriptResourcesCounter);
				}
				nonScriptResources[nonScriptResourcesCounter++] = member;

			}
			if (nonScriptResources.length != nonScriptResourcesCounter) {
				System
						.arraycopy(
								nonScriptResources,
								0,
								(nonScriptResources = new IResource[nonScriptResourcesCounter]),
								0, nonScriptResourcesCounter);
			}
			return nonScriptResources;
		} catch (CoreException e) {
			throw new ModelException(e);
		}

	}

	private static boolean isBuildpathEntry(IPath path,
			IBuildpathEntry[] resolvedClasspath) {
		for (int i = 0, length = resolvedClasspath.length; i < length; i++) {
			IBuildpathEntry entry = resolvedClasspath[i];
			if (entry.getPath().equals(path)) {
				return true;
			}
		}
		return false;
	}
}
