diff --git a/contrib/CHANGES.txt b/contrib/CHANGES.txt index 685f2aedb4c..33eda328686 100644 --- a/contrib/CHANGES.txt +++ b/contrib/CHANGES.txt @@ -54,6 +54,9 @@ Bug fixes * LUCENE-2284: MatchAllDocsQueryNode toString() created an invalid XML tag. (Frank Wesemann via Robert Muir) + + * LUCENE-2277: QueryNodeImpl threw ConcurrentModificationException on + add(List). (Frank Wesemann via Robert Muir) API Changes diff --git a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/QueryNodeImpl.java b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/QueryNodeImpl.java index 8de5adc8639..e6316886838 100644 --- a/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/QueryNodeImpl.java +++ b/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/nodes/QueryNodeImpl.java @@ -74,7 +74,7 @@ public abstract class QueryNodeImpl implements QueryNode, Cloneable { .getLocalizedMessage(QueryParserMessages.NODE_ACTION_NOT_SUPPORTED)); } - for (QueryNode child : getChildren()) { + for (QueryNode child : children) { add(child); } diff --git a/contrib/queryparser/src/test/org/apache/lucene/queryParser/core/nodes/TestQueryNode.java b/contrib/queryparser/src/test/org/apache/lucene/queryParser/core/nodes/TestQueryNode.java new file mode 100644 index 00000000000..fc434fd2029 --- /dev/null +++ b/contrib/queryparser/src/test/org/apache/lucene/queryParser/core/nodes/TestQueryNode.java @@ -0,0 +1,35 @@ +package org.apache.lucene.queryParser.core.nodes; + +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.Arrays; + +import org.apache.lucene.util.LuceneTestCase; + +public class TestQueryNode extends LuceneTestCase { + + /* LUCENE-2227 bug in QueryNodeImpl.add() */ + public void testAddChildren() throws Exception { + FieldQueryNode nodeA = new FieldQueryNode("foo", "A", 0, 1); + FieldQueryNode nodeB = new FieldQueryNode("foo", "B", 1, 2); + BooleanQueryNode bq = new BooleanQueryNode( + Arrays.asList(new QueryNode[] { nodeA })); + bq.add(Arrays.asList(new QueryNode[] { nodeB })); + assertEquals(2, bq.getChildren().size()); + } +}