/*
* $Id$
*
* Copyright 2011 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.server.itests.pixeldata;
import java.sql.Timestamp;
import java.util.concurrent.Callable;
import ome.model.core.Image;
import ome.model.core.Pixels;
import ome.model.enums.DimensionOrder;
import ome.model.enums.EventType;
import ome.model.enums.PixelsType;
import ome.model.meta.Event;
import ome.model.meta.EventLog;
import ome.model.meta.Experimenter;
import ome.model.meta.ExperimenterGroup;
import ome.server.itests.AbstractManagedContextTest;
import ome.services.eventlogs.EventLogQueue;
import ome.services.eventlogs.PersistentEventLogLoader;
import ome.services.sessions.SessionManager;
import ome.services.util.Executor;
import ome.system.EventContext;
import ome.system.Principal;
import ome.system.ServiceFactory;
import org.hibernate.Session;
import org.springframework.transaction.annotation.Transactional;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
@Test(groups = { "query", "pixeldata" })
public class PersistentEventLogLoaderTest extends AbstractManagedContextTest {
Executor ex;
SessionManager sm;
PersistentEventLogLoader ll;
PersistentEventLogLoader pel;
EventLogQueue elq;
@BeforeMethod
public void setup() {
ex = (Executor) this.applicationContext.getBean("executor");
sm = (SessionManager) this.applicationContext.getBean("sessionManager");
pel = (PersistentEventLogLoader) this.applicationContext
.getBean("pixelDataEventLogLoader");
elq = (EventLogQueue) this.applicationContext
.getBean("pixelDataEventLogQueue");
ll = elq;
}
protected <T> T call(String msg, final Callable<T> call) throws Throwable {
ome.model.meta.Session s = sm.createWithAgent(new Principal("root",
"system", "Test"), "Test", "127.0.0.1");
final Throwable exc[] = new Throwable[1];
@SuppressWarnings("unchecked")
T result = (T) ex.execute(new Principal(s.getUuid(), "system", "Test"),
new Executor.SimpleWork(this, msg) {
@Transactional(readOnly = false)
public Object doWork(Session session, ServiceFactory sf) {
try {
return call.call();
} catch (Throwable e) {
exc[0] = e;
return null;
}
}
});
if (exc[0] != null) {
throw exc[0];
}
return result;
}
public void testNoValueInDatabase() throws Throwable {
Long l = call("NoValueInDatabase", new Callable<Long>() {
public Long call() throws Exception {
ll.deleteCurrentId();
assertEquals(-1, ll.getCurrentId());
if (ll.hasNext()) {
EventLog log = ll.next();
for (EventLog log2 : ll) {
if (log2.getId() != null) {
continue;
// Must load all from a single batch in order to
// have the id set.
}
}
Long current = ll.getCurrentId();
assertTrue("is " + current, current > 0);
}
return null;
}
});
}
public void testMultipleEvents() throws Throwable {
loginRoot();
final EventLog el1 = eventlog();
final EventLog el2 = eventlog();
call("MultipleUsers", new Callable<Long>() {
public Long call() throws Exception {
ll.setCurrentId(el1.getId() - 1);
assertTrue(ll.hasNext());
assertEquals(el1.getId() - 1,
ll.getCurrentId());
assertNext(el1);
assertNext(el2);
return null;
}
});
}
public void testMultipleEventLogs() throws Throwable {
final Experimenter u1 = loginNewUser();
final EventContext ec1 = iAdmin.getEventContext();
final Experimenter u2 = loginNewUserInOtherUsersGroup(u1);
final EventContext ec2 = iAdmin.getEventContext();
loginRoot();
final Event e1 = event(ec1);
final Event e2 = event(ec2);
final EventLog el1a = eventlog(e1);
final EventLog el2a = eventlog(e2);
final EventLog el2b = eventlog(e2);
final EventLog el1b = eventlog(e1);
call("MultipleEventLogs", new Callable<Long>() {
public Long call() throws Exception {
ll.setCurrentId(el1a.getId() - 1);
assertTrue(ll.hasNext());
assertNext(el1a);
assertNext(el2a);
assertNext(el2b);
assertNext(el1b);
return null;
}
});
}
/**
* Extended scenario described in
* https://www.openmicroscopy.org/community/viewtopic.php?f=4&t=7593&p=14636#p14638
* after it was noticed that some events were being skipped.
*/
public void testMoreMultipleEventLogs() throws Throwable {
final Experimenter u1 = loginNewUser();
final EventContext ec1 = iAdmin.getEventContext();
loginNewUserInOtherUsersGroup(u1);
final EventContext ec2 = iAdmin.getEventContext();
loginNewUserInOtherUsersGroup(u1);
final EventContext ec3 = iAdmin.getEventContext();
loginRoot();
final Event e1 = event(ec1);
final Event e2 = event(ec2);
final Event e3 = event(ec3);
final EventLog el1a = eventlog(e1);
final EventLog el1b = eventlog(e1);
final EventLog el1c = eventlog(e1);
final EventLog el1d = eventlog(e1);
final EventLog el1e = eventlog(e1);
final EventLog el1f = eventlog(e1);
final EventLog el1g = eventlog(e1);
final EventLog el1h = eventlog(e1);
final EventLog el1i = eventlog(e1);
final EventLog el1j = eventlog(e1);
final EventLog el2a = eventlog(e2);
final EventLog el3a = eventlog(e3);
call("MultipleEventLogs", new Callable<Long>() {
public Long call() throws Exception {
ll.setCurrentId(el1a.getId() - 1);
assertTrue(ll.hasNext());
assertNext(el1a);
assertNext(el1b);
assertNext(el1c);
assertNext(el1d);
assertNext(el1e);
assertNext(el1f);
assertNext(el1g);
assertNext(el1h);
assertNext(el1i);
assertNext(el1j);
assertNext(el2a);
assertNext(el3a);
return null;
}
});
}
//
// Helpers
//
protected void assertNext(EventLog el) {
EventLog test = ll.next();
assertEquals(el.getId(), test.getId());
}
protected EventLog eventlog() throws Exception {
return eventlog(0l, 0l, null); // use root
}
protected EventLog eventlog(Event event) {
return eventlog(event.getExperimenter().getId(),
event.getExperimenterGroup().getId(),
event.getId());
}
protected EventLog eventlog(Long user, Long group, Long event) {
Event e;
if (event == null) {
e = event(user, group);
} else {
e = iQuery.findByQuery("select e from Event e " +
"left outer join fetch e.logs where e.id = " + event, null);
}
EventLog el = new EventLog();
el.setAction("PIXELDATA");
el.setEntityId(pixels().getId());
el.setEntityType(Pixels.class.getName());
el.setEvent(e);
e.addEventLog(el);
EventContext ec = iAdmin.getEventContext();
loginRootKeepGroup();
try {
return iUpdate.saveAndReturnObject(el);
} finally {
login(ec);
}
}
protected Event event(EventContext ec) {
return event(ec.getCurrentUserId(), ec.getCurrentGroupId());
}
protected Event event(Long user, Long group) {
Event e;
e = new Event();
e.setExperimenter(new Experimenter(user, false));
e.setExperimenterGroup(new ExperimenterGroup(group, false));
e.setStatus("Test");
e.setType(new EventType("Test"));
e.setTime(new Timestamp(System.currentTimeMillis()));
e.setSession(new ome.model.meta.Session(0l, false));
e = iUpdate.saveAndReturnObject(e);
return e;
}
protected Pixels pixels() {
Image image = new Image();
image.setName("pixeldatatest");
Pixels pixels = new Pixels();
pixels.setSizeX(1);
pixels.setSizeY(1);
pixels.setSizeZ(1);
pixels.setSizeT(1);
pixels.setSizeC(1);
pixels.setSha1("UNKNOWN");
pixels.setPixelsType(new PixelsType("int8"));
pixels.setDimensionOrder(new DimensionOrder("XYZCT"));
image.addPixels(pixels);
image = iUpdate.saveAndReturnObject(image);
pixels = image.getPrimaryPixels();
return pixels;
}
}