OPENJPA-2257 Properly synchronized _supportedKeys in ConigurationImpl. Test case contributed by Stephan Hagedorn.

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@1381326 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Albert Lee 2012-09-05 19:53:52 +00:00
parent bc29ef104d
commit 512520f7fb
2 changed files with 86 additions and 11 deletions

View File

@ -118,7 +118,7 @@ public class ConfigurationImpl
private boolean _globals = false;
private String _auto = null;
private final List<Value> _vals = new ArrayList<Value>();
private Set<String> _supportedKeys;
private Set<String> _supportedKeys = new TreeSet<String>();
// property listener helper
private PropertyChangeSupport _changeSupport = null;
@ -697,16 +697,16 @@ public class ConfigurationImpl
* The Values that are {@linkplain Value#makePrivate() marked private} are filtered out.
*/
public Set<String> getPropertyKeys() {
if (_supportedKeys != null)
return _supportedKeys;
_supportedKeys = new TreeSet<String>();
for (Value val : _vals) {
if (val.isPrivate())
continue;
List<String> keys = val.getPropertyKeys();
for (String key : keys) {
_supportedKeys.add(fixPrefix(key));
synchronized (_supportedKeys) {
if (_supportedKeys.size() == 0) {
for (Value val : _vals) {
if (val.isPrivate())
continue;
List<String> keys = val.getPropertyKeys();
for (String key : keys) {
_supportedKeys.add(fixPrefix(key));
}
}
}
}
return _supportedKeys;

View File

@ -0,0 +1,75 @@
/*
* 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.
*/
package org.apache.openjpa.conf;
import java.util.*;
import javax.persistence.*;
import junit.framework.*;
import org.apache.openjpa.persistence.*;
public class TestGetProperty extends TestCase {
private EntityManagerFactory emf;
public void setUp() throws Exception {
emf = (OpenJPAEntityManagerFactory) Persistence
.createEntityManagerFactory("test");
}
public void tearDown() throws Exception {
emf.close();
emf = null;
}
public void testGetProperty() {
try {
Collection<Thread> tests = new ArrayList<Thread>();
for (int i = 0; i < 10; i++) {
Test test = new Test();
test.start();
tests.add(test);
}
for (Thread test : tests)
test.join();
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
class Test extends Thread {
EntityManager em;
public Test() {
this.em = emf.createEntityManager();
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
em.getProperties();
}
if (em != null && em.isOpen())
em.close();
}
}
}