blob: 7c9f9360454f5f3b46e0eb9a410e94b279412686 [file] [log] [blame]
/*
* 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.event;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.apache.openjpa.event.AbstractRemoteCommitProvider;
import org.apache.openjpa.event.RemoteCommitEvent;
import org.apache.openjpa.event.RemoteCommitListener;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.common.utils.AbstractTestCase;
import org.apache.openjpa.persistence.event.common.apps.RuntimeTest1;
import org.apache.openjpa.persistence.test.AllowFailure;
import org.apache.openjpa.util.Id;
@AllowFailure(message="surefire excluded")
public class TestFakeRemoteEvents extends AbstractTestCase {
/*
* The most recently set provider, and a lock to control access to it. This
* is rather hacky.
*/
private static Object currentProviderLock = new Object();
private static RemoteCommitProviderTestImpl currentProvider;
public TestFakeRemoteEvents(String s) {
super(s, "eventcactusapp");
}
@Override
public void setUp() {
deleteAll(RuntimeTest1.class);
}
public void testListener() {
Map propsMap = new HashMap();
propsMap.put("openjpa.RemoteCommitProvider", "sjvm");
propsMap.put("openjpa.DataCache", "true");
OpenJPAEntityManagerFactory factory = getEmf(propsMap);
RemoteCommitListenerTestImpl transactionListener =
new RemoteCommitListenerTestImpl();
((OpenJPAEntityManagerFactorySPI) factory).getConfiguration()
.getRemoteCommitEventManager().addListener(
transactionListener);
OpenJPAEntityManager pm = (OpenJPAEntityManager) factory
.createEntityManager();
// get an object id
RuntimeTest1 t1 = new RuntimeTest1("foo", 5);
startTx(pm);
pm.persist(t1);
Object oid = pm.getObjectId(t1);
rollbackTx(pm);
// simulate an add
Set s = new HashSet();
s.add(oid);
((OpenJPAEntityManagerFactorySPI) factory).getConfiguration()
.getRemoteCommitEventManager().fireEvent(
new RemoteCommitEvent(RemoteCommitEvent.PAYLOAD_OIDS_WITH_ADDS,
s, null, null, null));
boolean pass = false;
for (Object item : transactionListener.added) {
if (item.equals(oid)) {
pass = true;
break;
}
}
assertTrue(pass);
assertTrue(transactionListener.updated.size() == 0);
assertTrue(transactionListener.deleted.size() == 0);
// simulate modifications
((OpenJPAEntityManagerFactorySPI) factory).getConfiguration()
.getRemoteCommitEventManager().fireEvent(
new RemoteCommitEvent(RemoteCommitEvent.PAYLOAD_OIDS_WITH_ADDS,
null, null, s, null));
pass = false;
for (Object value : transactionListener.updated) {
if (value.equals(oid)) {
pass = true;
break;
}
}
assertTrue(pass);
assertTrue(transactionListener.added.size() == 0);
assertTrue(transactionListener.deleted.size() == 0);
// simulate a delete
((OpenJPAEntityManagerFactorySPI) factory).getConfiguration()
.getRemoteCommitEventManager().fireEvent(
new RemoteCommitEvent(RemoteCommitEvent.PAYLOAD_OIDS_WITH_ADDS,
null, null, null, s));
pass = false;
for (Object o : transactionListener.deleted) {
if (o.equals(oid)) {
pass = true;
break;
}
}
assertTrue(pass);
assertTrue(transactionListener.added.size() == 0);
assertTrue(transactionListener.updated.size() == 0);
}
public void testProvider() {
RemoteCommitProviderTestImpl provider;
OpenJPAEntityManager pm;
synchronized (currentProviderLock) {
Map propsMap = new HashMap();
propsMap.put("openjpa.RemoteCommitProvider",
RemoteCommitProviderTestImpl.class.getName()
+ "(TransmitPersistedObjectIds=true)");
propsMap.put("openjpa.DataCache", "true");
OpenJPAEntityManagerFactory factory = getEmf(propsMap);
pm = (OpenJPAEntityManager) factory.createEntityManager();
provider = currentProvider;
}
// get an object id
RuntimeTest1 t1 = new RuntimeTest1("foo", 5);
startTx(pm);
pm.persist(t1);
Object oid = pm.getObjectId(t1);
endTx(pm);
boolean pass = false;
for (Object added : provider.added) {
if (equals(added, oid)) {
pass = true;
break;
}
}
assertTrue(pass);
assertTrue(provider.updated.size() == 0);
assertTrue(provider.deleted.size() == 0);
}
boolean equals(Object added, Object oid) {
if (added.equals(oid))
return true;
if (added instanceof Id)
return ((Id) added).getIdObject().equals(oid);
return false;
}
private static class RemoteCommitListenerTestImpl implements
RemoteCommitListener {
transient Collection added;
transient Collection updated;
transient Collection deleted;
@Override
public void afterCommit(RemoteCommitEvent event) {
this.added = event.getPersistedObjectIds();
this.updated = event.getUpdatedObjectIds();
this.deleted = event.getDeletedObjectIds();
}
@Override
public void close() {
}
}
public static class RemoteCommitProviderTestImpl extends
AbstractRemoteCommitProvider {
Collection added;
Collection updated;
Collection deleted;
public RemoteCommitProviderTestImpl() {
synchronized (currentProviderLock) {
currentProvider = this;
}
}
// ---------- RemoteCommitProvider implementation ----------
@Override
public void broadcast(RemoteCommitEvent event) {
this.added = event.getPersistedObjectIds();
this.updated = event.getUpdatedObjectIds();
this.deleted = event.getDeletedObjectIds();
}
@Override
public void close() {
}
}
}