| /* |
| * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Oracle - initial API and implementation from Oracle TopLink |
| package org.eclipse.persistence.testing.tests.identitymaps.cache; |
| |
| import org.eclipse.persistence.testing.framework.*; |
| import org.eclipse.persistence.internal.identitymaps.*; |
| |
| public class ConcurrentAccessTest extends AutoVerifyTestCase { |
| CacheIdentityMap cache; |
| |
| public ConcurrentAccessTest() { |
| } |
| |
| @Override |
| public void test() { |
| this.cache = new CacheIdentityMap(10, null, getAbstractSession(), false); |
| |
| org.eclipse.persistence.testing.models.employee.domain.Employee employee = new org.eclipse.persistence.testing.models.employee.domain.Employee(); |
| java.math.BigDecimal id = new java.math.BigDecimal(7777); |
| java.util.Vector primaryKeys = new java.util.Vector(); |
| |
| employee.setId(id); |
| employee.setFirstName("Joe"); |
| employee.setLastName("Blow"); |
| primaryKeys.addElement(id); |
| |
| ConcurrentAccessTest.Updater updater1 = new ConcurrentAccessTest.Updater(employee, primaryKeys, this.cache); |
| Thread thread1 = new Thread(updater1); |
| |
| employee = new org.eclipse.persistence.testing.models.employee.domain.Employee(); |
| id = new java.math.BigDecimal(6666); |
| primaryKeys = new java.util.Vector(); |
| |
| employee.setId(id); |
| employee.setFirstName("Andy"); |
| employee.setLastName("Blow"); |
| primaryKeys.addElement(id); |
| |
| ConcurrentAccessTest.Updater updater2 = new ConcurrentAccessTest.Updater(employee, primaryKeys, this.cache); |
| Thread thread2 = new Thread(updater2); |
| |
| employee = new org.eclipse.persistence.testing.models.employee.domain.Employee(); |
| id = new java.math.BigDecimal(5555); |
| primaryKeys = new java.util.Vector(); |
| |
| employee.setId(id); |
| employee.setFirstName("Darlene"); |
| employee.setLastName("Blow"); |
| primaryKeys.addElement(id); |
| |
| ConcurrentAccessTest.Updater updater3 = new ConcurrentAccessTest.Updater(employee, primaryKeys, this.cache); |
| Thread thread3 = new Thread(updater3); |
| |
| thread1.start(); |
| thread2.start(); |
| thread3.start(); |
| |
| try { |
| thread1.join(); |
| thread2.join(); |
| thread3.join(); |
| } catch (InterruptedException ex) { |
| } |
| if (updater1.hadError() || updater2.hadError() || updater3.hadError()) { |
| throw new TestErrorException("Null Pointer thrown within Cache Access"); |
| } |
| } |
| |
| private class Updater implements Runnable { |
| protected Object object; |
| protected java.util.Vector primaryKeys; |
| protected CacheIdentityMap cache; |
| protected boolean experienceError = false; |
| |
| public Updater(Object object, java.util.Vector primaryKeys, CacheIdentityMap cache) { |
| this.object = object; |
| this.primaryKeys = primaryKeys; |
| this.cache = cache; |
| } |
| |
| @Override |
| public void run() { |
| try { |
| for (int count = 0; count < 10000; ++count) { |
| cache.put(primaryKeys, object, null, 0); |
| cache.remove(primaryKeys, null); |
| } |
| } catch (NullPointerException ex) { |
| this.experienceError = true; |
| } |
| } |
| |
| public boolean hadError() { |
| return experienceError; |
| } |
| } |
| } |