/*
* 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.persistence.callbacks;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
public class TestMultiEmEntityListeners extends SingleEMFTestCase {
public void setUp() {
setUp(CLEAR_TABLES, ListenerInEntity.class, AddListenerEntity.class
// , "openjpa.Compatibility", "SingletonLifecycleEventManager=true"
);
}
public void testListenerInEntity1() {
OpenJPAEntityManager em1 = null;
OpenJPAEntityManager em2 = null;
try {
em1 = emf.createEntityManager();
em2 = emf.createEntityManager();
ListenerInEntity o1 = new ListenerInEntity();
ListenerInEntity o2 = new ListenerInEntity();
em1.getTransaction().begin();
em1.persist(o1);
assertListenerInEntityStatus(o1, 1, 0, 0, 0, 0, 0, 0);
assertListenerInEntityStatus(o2, 0, 0, 0, 0, 0, 0, 0);
em2.getTransaction().begin();
em2.persist(o2);
assertListenerInEntityStatus(o1, 1, 0, 0, 0, 0, 0, 0);
assertListenerInEntityStatus(o2, 1, 0, 0, 0, 0, 0, 0);
em2.getTransaction().commit();
long id2 = o2.getId();
assertListenerInEntityStatus(o1, 1, 0, 0, 0, 0, 0, 0);
assertListenerInEntityStatus(o2, 1, 1, 0, 0, 0, 0, 0);
em1.getTransaction().commit();
long id1 = o1.getId();
assertListenerInEntityStatus(o1, 1, 1, 0, 0, 0, 0, 0);
assertListenerInEntityStatus(o2, 1, 1, 0, 0, 0, 0, 0);
em1.clear();
ListenerInEntity fo1 = em1.find(ListenerInEntity.class, id1);
assertNotNull(fo1);
assertListenerInEntityStatus(fo1, 0, 0, 0, 0, 0, 0, 1);
em2.clear();
ListenerInEntity fo2 = em2.find(ListenerInEntity.class, id2);
assertNotNull(fo2);
assertListenerInEntityStatus(fo1, 0, 0, 0, 0, 0, 0, 1);
assertListenerInEntityStatus(fo2, 0, 0, 0, 0, 0, 0, 1);
em1.getTransaction().begin();
fo1.setValue(fo1.getValue() + 1);
em1.flush();
assertListenerInEntityStatus(fo1, 0, 0, 1, 1, 0, 0, 1);
assertListenerInEntityStatus(fo2, 0, 0, 0, 0, 0, 0, 1);
em2.getTransaction().begin();
fo2.setValue(fo2.getValue() + 1);
em2.flush();
assertListenerInEntityStatus(fo1, 0, 0, 1, 1, 0, 0, 1);
assertListenerInEntityStatus(fo2, 0, 0, 1, 1, 0, 0, 1);
em1.remove(fo1);
assertListenerInEntityStatus(fo1, 0, 0, 1, 1, 1, 0, 1);
assertListenerInEntityStatus(fo2, 0, 0, 1, 1, 0, 0, 1);
em2.remove(fo2);
assertListenerInEntityStatus(fo1, 0, 0, 1, 1, 1, 0, 1);
assertListenerInEntityStatus(fo2, 0, 0, 1, 1, 1, 0, 1);
em1.getTransaction().commit();
assertListenerInEntityStatus(fo1, 0, 0, 1, 1, 1, 1, 1);
assertListenerInEntityStatus(fo2, 0, 0, 1, 1, 1, 0, 1);
em2.getTransaction().commit();
assertListenerInEntityStatus(fo1, 0, 0, 1, 1, 1, 1, 1);
assertListenerInEntityStatus(fo2, 0, 0, 1, 1, 1, 1, 1);
em1.close();
em2.close();
} finally {
if (em1 != null && em1.getTransaction().isActive())
em1.getTransaction().rollback();
if (em1 != null && em1.isOpen())
em1.close();
if (em2 != null && em2.getTransaction().isActive())
em2.getTransaction().rollback();
if (em2 != null && em2.isOpen())
em2.close();
}
}
private void assertListenerInEntityStatus(ListenerInEntity l,
int prePersist, int postPersist,
int preUpdate, int postUpdate,
int preRemove, int postRemove,
int postLoad) {
assertEquals(prePersist, l.prePersistCount);
assertEquals(postPersist, l.postPersistCount);
assertEquals(preUpdate, l.preUpdateCount);
assertEquals(postUpdate, l.postUpdateCount);
assertEquals(preRemove, l.preRemoveCount);
assertEquals(postRemove, l.postRemoveCount);
assertEquals(postLoad, l.postLoadCount);
}
public void testAddListenerEntity1() {
OpenJPAEntityManager em1 = null;
OpenJPAEntityManager em2 = null;
try {
em1 = emf.createEntityManager();
PerInstanceListener l1 = new PerInstanceListener();
((OpenJPAEntityManagerSPI) em1).addLifecycleListener(l1, (Class<?>[])null);
em2 = emf.createEntityManager();
PerInstanceListener l2 = new PerInstanceListener();
((OpenJPAEntityManagerSPI) em2).addLifecycleListener(l2, (Class<?>[])null);
AddListenerEntity o1 = new AddListenerEntity();
AddListenerEntity o2 = new AddListenerEntity();
em1.getTransaction().begin();
em1.persist(o1);
assertAddListenerEntityStatus(l1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0);
assertAddListenerEntityStatus(l2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
em2.getTransaction().begin();
em2.persist(o2);
assertAddListenerEntityStatus(l1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0);
em2.getTransaction().commit();
assertAddListenerEntityStatus(l1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0);
long id2 = o2.getId();
em1.getTransaction().commit();
assertAddListenerEntityStatus(l1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0);
long id1 = o1.getId();
em1.clear();
AddListenerEntity fo1 = em1.find(AddListenerEntity.class, id1);
assertAddListenerEntityStatus(l1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0);
assertNotNull(fo1);
em2.clear();
AddListenerEntity fo2 = em2.find(AddListenerEntity.class, id2);
assertAddListenerEntityStatus(l1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0);
assertNotNull(fo2);
em1.getTransaction().begin();
fo1.setValue(fo1.getValue() + 1);
assertAddListenerEntityStatus(l1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0);
em1.flush();
assertAddListenerEntityStatus(l1, 1, 1, 2, 2, 1, 0, 1, 1, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0);
em2.getTransaction().begin();
fo2.setValue(fo2.getValue() + 1);
assertAddListenerEntityStatus(l1, 1, 1, 2, 2, 1, 0, 1, 1, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0);
em2.flush();
assertAddListenerEntityStatus(l1, 1, 1, 2, 2, 1, 0, 1, 1, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 2, 2, 1, 0, 1, 1, 0, 0);
em2.remove(fo2);
assertAddListenerEntityStatus(l1, 1, 1, 2, 2, 1, 0, 1, 1, 0, 0);
assertAddListenerEntityStatus(l2, 1, 1, 2, 2, 1, 0, 1, 1, 1, 1);
em1.remove(fo1);
assertAddListenerEntityStatus(l1, 1, 1, 2, 2, 1, 0, 1, 1, 1, 1);
assertAddListenerEntityStatus(l2, 1, 1, 2, 2, 1, 0, 1, 1, 1, 1);
em1.getTransaction().commit();
em2.getTransaction().commit();
em1.close();
em2.close();
} finally {
if (em1 != null && em1.getTransaction().isActive())
em1.getTransaction().rollback();
if (em1 != null && em1.isOpen())
em1.close();
if (em2 != null && em2.getTransaction().isActive())
em2.getTransaction().rollback();
if (em2 != null && em2.isOpen())
em2.close();
}
}
private void assertAddListenerEntityStatus(PerInstanceListener l
, int beforePersist, int afterPersist
, int beforeStore, int afterStore
, int afterLoad, int afterRefresh
, int beforeDirty, int afterDirty
, int beforeDelete, int afterDelete) {
assertEquals(beforePersist, l.beforePersist);
assertEquals(afterPersist, l.afterPersist);
assertEquals(beforeStore, l.beforeStore);
assertEquals(afterStore, l.afterStore);
assertEquals(afterLoad, l.afterLoad);
assertEquals(afterRefresh, l.afterRefresh);
assertEquals(beforeDirty, l.beforeDirty);
assertEquals(afterDirty, l.afterDirty);
assertEquals(beforeDelete, l.beforeDelete);
assertEquals(afterDelete, l.afterDelete);
}
}