[386452] ConcurrentModificationException in CMNamedNodeMapForBuddySystem
diff --git a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java
index 9b584bf..3f685e4 100644
--- a/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java
+++ b/bundles/org.eclipse.wst.html.core/src/org/eclipse/wst/html/core/internal/modelquery/CMNamedNodeMapForBuddySystem.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
+ * Copyright (c) 2004, 2012 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
@@ -17,6 +17,7 @@
import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
+import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
/**
*/
@@ -57,11 +58,13 @@
* @see CMNamedNodeMap#item(int)
*/
public CMNode item(int index) {
- Iterator iter = iterator();
- while (iter.hasNext()) {
- Object node = iter.next();
- if (--index < 0)
- return (CMNode) node;
+ synchronized (map) {
+ Iterator iter = iterator();
+ while (iter.hasNext()) {
+ Object node = iter.next();
+ if (--index < 0)
+ return (CMNode) node;
+ }
}
return null;
}
@@ -93,7 +96,20 @@
* to build up its contents.
*/
protected void makeBuddySystem(CMNamedNodeMap original) {
- Iterator i = original.iterator();
+ if (original instanceof CMNamedNodeMapImpl) {
+ final Hashtable table = ((CMNamedNodeMapImpl) original).getHashtable();
+ if (table != null) {
+ synchronized (table) {
+ buddy(table.values().iterator());
+ }
+ }
+ }
+ else {
+ buddy(original.iterator());
+ }
+ }
+
+ private void buddy(Iterator i) {
if (i == null)
return;
while (i.hasNext()) {