package org.eclipse.dltk.core;

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

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;

public class ScriptModelHelper {
	/**
	 * Returns the opened script projects in the model, opened script projects
	 * that have the specified nature id, or an empty array if there are none.
	 *
	 * @param model
	 *            script model
	 *
	 * @param natureId
	 *            nature id, if null then all opened script projects returned
	 *
	 * @return the script projects in this model, or an empty array if there are
	 *         none
	 *
	 * @throws ModelException
	 *             if the request fails
	 */
	public static IScriptProject[] getOpenedScriptProjects(IScriptModel model,
			String natureId) throws ModelException {
		final List<IScriptProject> list = new ArrayList<>();
		final IScriptProject[] projects = model.getScriptProjects();
		try {
			for (int i = 0; i < projects.length; ++i) {
				final IScriptProject scriptProject = projects[i];
				final IProject project = scriptProject.getProject();

				if (project.exists() && project.isOpen()
						&& (natureId == null || project.hasNature(natureId))) {
					list.add(scriptProject);
				}
			}
		} catch (CoreException e) {
			throw new ModelException(e);
		}

		return list.toArray(new IScriptProject[list.size()]);
	}
}
