/******************************************************************************* * 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.ui.language; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.Map.Entry; import org.eclipse.cdt.core.language.ProjectLanguageConfiguration; import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration; import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.LanguageManager; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; /** * Analyzes and repairs language mapping configurations. */ public class LanguageVerifier { public static Map<String, ILanguage> computeAvailableLanguages() { ILanguage[] registeredLanguages = LanguageManager.getInstance().getRegisteredLanguages(); Map<String, ILanguage> languages = new TreeMap<String, ILanguage>(); for (int i = 0; i < registeredLanguages.length; i++) { languages.put(registeredLanguages[i].getId(), registeredLanguages[i]); } return languages; } public static String computeAffectedLanguages(Set<String> missingLanguages) { Iterator<String> languages = missingLanguages.iterator(); StringBuffer buffer = new StringBuffer(); while (languages.hasNext()) { buffer.append('\n'); buffer.append(languages.next()); } return buffer.toString(); } public static Set<String> removeMissingLanguages(ProjectLanguageConfiguration config, ICProjectDescription description, Map<String, ILanguage> availableLanguages) { Set<String> missingLanguages = new TreeSet<String>(); // Check file mappings Iterator<Entry<String, Map<String, String>>> fileConfigurationMappings = config.getFileMappings().entrySet().iterator(); while (fileConfigurationMappings.hasNext()) { Entry<String, Map<String, String>> entry = fileConfigurationMappings.next(); String path = entry.getKey(); Map<String, String> configurationLanguageMappings = entry.getValue(); Iterator<Entry<String, String>> mappings = configurationLanguageMappings.entrySet().iterator(); while (mappings.hasNext()) { Entry<String, String> mapping = mappings.next(); String configurationId = mapping.getKey(); String languageId = mapping.getValue(); if (!availableLanguages.containsKey(languageId)) { missingLanguages.add(languageId); ICConfigurationDescription configuration = description.getConfigurationById(configurationId); config.removeFileMapping(configuration, path); } } } // Check content type mappings Iterator<Entry<String, Map<String, String>>> configurationContentTypeMappings = config.getContentTypeMappings().entrySet().iterator(); while (configurationContentTypeMappings.hasNext()) { Entry<String, Map<String, String>> entry = configurationContentTypeMappings.next(); String configurationId = entry.getKey(); Map<String, String> contentTypeLanguageMappings = entry.getValue(); Iterator<Entry<String, String>> mappings = contentTypeLanguageMappings.entrySet().iterator(); while (mappings.hasNext()) { Entry<String, String> mapping = mappings.next(); String contentTypeId = mapping.getKey(); String languageId = mapping.getValue(); if (!availableLanguages.containsKey(languageId)) { missingLanguages.add(languageId); ICConfigurationDescription configuration = description.getConfigurationById(configurationId); config.removeContentTypeMapping(configuration, contentTypeId); } } } return missingLanguages; } public static Set<String> removeMissingLanguages(WorkspaceLanguageConfiguration config, Map<String, ILanguage> availableLanguages) { Set<String> missingLanguages = new TreeSet<String>(); // Check content type mappings Iterator<Entry<String, String>> contentTypeMappings = config.getWorkspaceMappings().entrySet().iterator(); while (contentTypeMappings.hasNext()) { Entry<String, String> entry = contentTypeMappings.next(); String contentTypeId = entry.getKey(); String languageId = entry.getValue(); if (!availableLanguages.containsKey(languageId)) { missingLanguages.add(languageId); config.removeWorkspaceMapping(contentTypeId); } } return missingLanguages; } }