/*******************************************************************************
 * Copyright (c) 2000, 2008 QNX Software Systems 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:
 *     QNX Software Systems - Initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.internal.core.model;

import java.util.List;

import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ITranslationUnit;

/**
 */
public class SourceMapper {
	ICProject cproject;

	public SourceMapper(ICProject p) {
		cproject = p;
	}

	public ITranslationUnit findTranslationUnit(String filename) {
		return findTranslationUnit(cproject, filename);
	}
	
	public ITranslationUnit findTranslationUnit(IParent container, String filename) {
		try {
			List<?> list = container.getChildrenOfType(ICElement.C_UNIT);
			for (int i = 0; i < list.size(); i++) {
				Object o = list.get(i);
				if (o instanceof ITranslationUnit) {
					ITranslationUnit tu = (ITranslationUnit)o;
					// TODO: What about non case sensitive filesystems.
					if (filename.equals(tu.getElementName())) {
						return tu;
					}
				}
			}
			
			// TODO: This to simple, we are not protected against
			// loop in the file system symbolic links etc ..
			list = container.getChildrenOfType(ICElement.C_CCONTAINER);
			for (int i = 0; i < list.size(); i++) {
				Object o = list.get(i);
				if (o instanceof ICContainer) {
					ITranslationUnit tu = findTranslationUnit((ICContainer)o, filename);
					if (tu != null) {
						return tu;
					}
				}
			}
		} catch (CModelException e) {
		}
		return null;
	}
}
