/*******************************************************************************
* Copyright (c) 2007, 2008 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.cdt.internal.core.language;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.core.language.ProjectLanguageConfiguration;
import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration;
import org.eclipse.cdt.core.model.LanguageManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
/**
* Resolves the effective language for various resources such as
* files and projects.
*/
public class LanguageMappingResolver {
public static final int DEFAULT_MAPPING = 0;
public static final int WORKSPACE_MAPPING = 1;
public static final int PROJECT_MAPPING = 2;
public static final int FILE_MAPPING = 3;
/**
* Returns the effective language for the file specified by the given path.
* If <code>fetchAll</code> is <code>true</code> all inherited language
* mappings will be returned in order of precedence. Otherwise, only the
* effective language will be returned.
*
* This method will always return at least one mapping.
*
* @param project the project that contains the given file
* @param filePath the path to the file
* @param contentTypeId the content type of the file (optional)
* @param fetchAll if <code>true</code>, returns all inherited language mappings.
* Otherwise, returns only the effective language.
* @return the effective language for the file specified by the given path.
* @throws CoreException
*/
public static LanguageMapping[] computeLanguage(IProject project, String filePath, ICConfigurationDescription configuration, String contentTypeId, boolean fetchAll) throws CoreException {
LanguageManager manager = LanguageManager.getInstance();
List<LanguageMapping> inheritedLanguages = new LinkedList<LanguageMapping>();
if (project != null) {
ProjectLanguageConfiguration mappings = manager.getLanguageConfiguration(project);
if (mappings != null) {
// File-level mappings
if (filePath != null) {
String id = mappings.getLanguageForFile(configuration, filePath);
if (id != null) {
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), FILE_MAPPING));
if (!fetchAll) {
return createLanguageMappingArray(inheritedLanguages);
}
}
// Check for a file mapping that's global across all configurations in
// the project.
if (configuration != null) {
id = mappings.getLanguageForFile(null, filePath);
if (id != null) {
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), FILE_MAPPING));
if (!fetchAll) {
return createLanguageMappingArray(inheritedLanguages);
}
}
}
}
// Project-level mappings
String id = mappings.getLanguageForContentType(configuration, contentTypeId);
if (id != null) {
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), PROJECT_MAPPING));
if (!fetchAll) {
return createLanguageMappingArray(inheritedLanguages);
}
}
// Check for a content type mapping that's global across all configurations in
// the project.
if (configuration != null) {
id = mappings.getLanguageForContentType(null, contentTypeId);
if (id != null) {
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), PROJECT_MAPPING));
if (!fetchAll) {
return createLanguageMappingArray(inheritedLanguages);
}
}
}
}
}
// Workspace mappings
WorkspaceLanguageConfiguration workspaceMappings = manager.getWorkspaceLanguageConfiguration();
String id = workspaceMappings.getLanguageForContentType(contentTypeId);
if (id != null) {
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(id), WORKSPACE_MAPPING));
if (!fetchAll) {
return createLanguageMappingArray(inheritedLanguages);
}
}
// Platform mappings
IContentType contentType = Platform.getContentTypeManager().getContentType(contentTypeId);
inheritedLanguages.add(new LanguageMapping(manager.getLanguage(contentType), DEFAULT_MAPPING));
return createLanguageMappingArray(inheritedLanguages);
}
private static LanguageMapping[] createLanguageMappingArray(List<LanguageMapping> inheritedLanguages) {
LanguageMapping[] results = new LanguageMapping[inheritedLanguages.size()];
Iterator<LanguageMapping> mappings = inheritedLanguages.iterator();
int i = 0;
while (mappings.hasNext()) {
LanguageMapping mapping = mappings.next();
results[i] = mapping;
i++;
}
return results;
}
}