/**********************************************************************
 * Copyright (c) 2004, 2005, 2006, 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
 * 
 * Contributors:
 *    IBM Corporation - Initial API and implementation
 **********************************************************************/
package org.eclipse.jst.server.tomcat.core.internal;

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

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.sourcelookup.ISourceContainer;
import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jst.server.tomcat.core.internal.wst.IModuleVisitor;
import org.eclipse.jst.server.tomcat.core.internal.wst.ModuleTraverser;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.ServerUtil;

/**
 * 
 */
public class TomcatSourcePathComputerDelegate implements
		ISourcePathComputerDelegate {

	/**
	 * {@inheritDoc}
	 */
	public ISourceContainer[] computeSourceContainers(
			ILaunchConfiguration configuration, IProgressMonitor monitor)
			throws CoreException {
		IServer server = ServerUtil.getServer(configuration);

		SourcePathComputerVisitor visitor = new SourcePathComputerVisitor(
				configuration);

		IModule[] modules = server.getModules();
		for (int i = 0; i < modules.length; i++) {
			ModuleTraverser.traverse(modules[i], visitor, monitor);
		}

		return visitor.getSourceContainers();
	}

	class SourcePathComputerVisitor implements IModuleVisitor {

		final ILaunchConfiguration configuration;

		/**
		 * List<IRuntimeClasspathEntry> of unresolved IRuntimeClasspathEntries
		 */
		List runtimeClasspath = new ArrayList();

		SourcePathComputerVisitor(ILaunchConfiguration configuration) {
			this.configuration = configuration;
		}

		/**
		 * {@inheritDoc}
		 */
		public void visitWebComponent(IVirtualComponent component)
				throws CoreException {
			IProject project = component.getProject();
			if (project.hasNature(JavaCore.NATURE_ID)) {
				IJavaProject javaProject = JavaCore.create(project);
				runtimeClasspath.add(JavaRuntime
						.newDefaultProjectClasspathEntry(javaProject));
			}
		}

		/**
		 * {@inheritDoc}
		 */
		public void endVisitWebComponent(IVirtualComponent component)
				throws CoreException {
			// do nothing
		}

		/**
		 * {@inheritDoc}
		 */
		public void visitArchiveComponent(IPath runtimePath, IPath workspacePath) {
			// do nothing
		}

		/**
		 * {@inheritDoc}
		 */
		public void visitDependentComponent(IPath runtimePath,
				IPath workspacePath) {
			// do nothing
		}

		/**
		 * {@inheritDoc}
		 */
		public void visitWebResource(IPath runtimePath, IPath workspacePath) {
			// do nothing
		}

		/**
		 * {@inheritDoc}
		 */
		public void visitEarResource(IPath runtimePath, IPath workspacePath) {
			// do nothing
		}

		/**
		 * {@inheritDoc}
		 */
		public void endVisitEarComponent(IVirtualComponent component)
				throws CoreException {
			// do nothing
		}

		/**
		 * {@inheritDoc}
		 */
		public void visitClasspathEntry(IPath rtFolder, IClasspathEntry entry) {
			// do nothing
		}

		ISourceContainer[] getSourceContainers() throws CoreException {
			runtimeClasspath.addAll(Arrays.asList(JavaRuntime
					.computeUnresolvedSourceLookupPath(configuration)));
			IRuntimeClasspathEntry[] entries = (IRuntimeClasspathEntry[]) runtimeClasspath
					.toArray(new IRuntimeClasspathEntry[runtimeClasspath.size()]);
			IRuntimeClasspathEntry[] resolved = JavaRuntime
					.resolveSourceLookupPath(entries, configuration);
			return JavaRuntime.getSourceContainers(resolved);
		}

	}
}