From dc28d7f6f8877c179e5cbc80d696be6f71380ed7 Mon Sep 17 00:00:00 2001 From: Serge Beauchamp Date: Mon, 23 Sep 2013 19:14:29 +0100 Subject: [PATCH] Bug 417852 - java.utilConcurrentModificationException in LanguageVerifier Change-Id: I8c614c37ab1559069c0639e8c4247ec414e0f0fd Signed-off-by: Serge Beauchamp Reviewed-on: https://git.eclipse.org/r/16703 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../ui/tests/misc/LanguageVerifierTests.java | 47 +++++++++++++++++++ .../cdt/ui/tests/misc/MiscTestSuite.java | 1 + .../ui/language/LanguageVerifier.java | 10 +++- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/LanguageVerifierTests.java diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/LanguageVerifierTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/LanguageVerifierTests.java new file mode 100644 index 00000000000..c0a060d9b78 --- /dev/null +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/LanguageVerifierTests.java @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2013 Serge Beauchamp 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: + * Serge Beauchamp (Freescale Semiconductor.) - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.ui.tests.misc; + +import java.util.HashMap; +import java.util.Map; + +import junit.framework.TestCase; + +import org.eclipse.cdt.core.language.WorkspaceLanguageConfiguration; +import org.eclipse.cdt.core.model.ILanguage; + +import org.eclipse.cdt.internal.ui.language.LanguageVerifier; + +/** + * Tests for CDT Language Verifier. + */ +public class LanguageVerifierTests extends TestCase { + + /** + * This API call was throwing a java.utilConcurrentModificationException. + * see Bug 417852 + */ + public void testConcurrentExceptionInLanguageVerifier() throws Exception { + + WorkspaceLanguageConfiguration config = new WorkspaceLanguageConfiguration(); + + config.addWorkspaceMapping("foo", "bar"); + config.addWorkspaceMapping("foo2", "bar2"); + + Map availableLanguages = new HashMap(); + + availableLanguages.put("foo", null); + availableLanguages.put("foo3", null); + + LanguageVerifier.removeMissingLanguages(config, availableLanguages); + } +} diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/MiscTestSuite.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/MiscTestSuite.java index 95b6f028678..6264079c018 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/MiscTestSuite.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/misc/MiscTestSuite.java @@ -25,5 +25,6 @@ public class MiscTestSuite extends TestSuite { public MiscTestSuite() { super(MiscTestSuite.class.getName()); addTestSuite(CDTSharedImagesTests.class); + addTestSuite(LanguageVerifierTests.class); } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/LanguageVerifier.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/LanguageVerifier.java index 59662f41295..f2a4a9c03c3 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/LanguageVerifier.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/language/LanguageVerifier.java @@ -7,10 +7,13 @@ * * Contributors: * IBM Corporation - Initial API and implementation + * Freescale Semiconductor - Bug 417852 *******************************************************************************/ package org.eclipse.cdt.internal.ui.language; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -97,16 +100,19 @@ public class LanguageVerifier { // Check content type mappings Iterator> contentTypeMappings = config.getWorkspaceMappings().entrySet().iterator(); + List removals = new ArrayList(); while (contentTypeMappings.hasNext()) { Entry entry = contentTypeMappings.next(); - String contentTypeId = entry.getKey(); String languageId = entry.getValue(); if (!availableLanguages.containsKey(languageId)) { missingLanguages.add(languageId); - config.removeWorkspaceMapping(contentTypeId); + removals.add(entry.getKey()); } } + for (String removal : removals) { + config.removeWorkspaceMapping(removal); + } return missingLanguages; } }