/*
* Copyright 2006-2014 University of Dundee. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.testing;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import ome.api.IAdmin;
import ome.api.IQuery;
import ome.api.IUpdate;
import ome.model.IObject;
import ome.model.annotations.DatasetAnnotationLink;
import ome.model.annotations.ImageAnnotationLink;
import ome.model.annotations.TagAnnotation;
import ome.model.annotations.TextAnnotation;
import ome.model.containers.Dataset;
import ome.model.containers.DatasetImageLink;
import ome.model.containers.Project;
import ome.model.containers.ProjectDatasetLink;
import ome.model.core.Image;
import ome.model.meta.Experimenter;
import ome.model.meta.ExperimenterGroup;
import ome.system.EventContext;
import ome.system.Login;
import ome.system.ServiceFactory;
import ome.util.ShallowCopy;
/**
* setUp and tearDown must be called properly to make these work.
*
* @author josh
*
*/
public class CreatePojosFixture {
/**
* creates a new fixture logged in as a newly created user. requires an
* admin service factory in order to create user and should NOT be used from
* the server side.
*/
public static CreatePojosFixture withNewUser(ServiceFactory sf) {
CreatePojosFixture fixture = new CreatePojosFixture();
IAdmin rootAdmin = sf.getAdminService();
String G_NAME = UUID.randomUUID().toString();
fixture.g = new ExperimenterGroup();
fixture.g.setName(G_NAME);
fixture.g.setLdap(false);
fixture.g = new ExperimenterGroup(rootAdmin.createGroup(fixture.g),
false);
fixture.TESTER = "TESTER-" + UUID.randomUUID().toString();
fixture.e = new Experimenter();
fixture.e.setOmeName(fixture.TESTER);
fixture.e.setFirstName("Mr.");
fixture.e.setLastName("Allen");
fixture.e.setLdap(false);
fixture.e = new Experimenter(rootAdmin.createUser(fixture.e, G_NAME),
false);
Login testLogin = new Login(fixture.TESTER, "ome", G_NAME, "Test");
ServiceFactory factory = new ServiceFactory(testLogin);
fixture.setServices(factory);
fixture.init = true;
return fixture;
}
private CreatePojosFixture() {
}
/** requires an admin service factory in order to create user. */
public CreatePojosFixture(ServiceFactory factory) {
setServices(factory);
EventContext ec = iAdmin.getEventContext();
e = new Experimenter(ec.getCurrentUserId(), false);
g = new ExperimenterGroup(ec.getCurrentGroupId(), false);
TESTER = ec.getCurrentUserName();
init = true;
}
private void setServices(ServiceFactory factory) {
iAdmin = factory.getAdminService();
iQuery = factory.getQueryService();
iUpdate = factory.getUpdateService();
}
protected IAdmin iAdmin;
protected IQuery iQuery;
protected IUpdate iUpdate;
protected boolean init = false;
protected List<IObject> toAdd = new ArrayList<IObject>(),
needId = new ArrayList<IObject>();
public void createAllPojos() throws Exception {
init();
projects();
datasets();
pdlinks();
images();
dilinks();
annotations();
}
public void deleteAllPojos() throws Exception {
for (int i = toAdd.size() - 1; i >= 0; i--) {
iUpdate.deleteObject(toAdd.get(i));
}
iAdmin.deleteExperimenter(e);
// TODO iAdmin.deleteGroup(g);
}
public void init() {
if (!init) {
// moved to ctor
}
}
public void pdi() {
projects();
datasets();
images();
pdlinks();
dilinks();
}
public void projects() {
init();
pr9090 = project(null, "root project without links");
pr9091 = project(null, "root project with own annotations");
pr9092 = project(null, "root project with foreign annotations");
pu9990 = project(e, "user project without links");
pu9991 = project(e, "user project with own annotations");
pu9992 = project(e, "user project with foreign annotations");
saveAndClear();
}
public void datasets() {
init();
dr7070 = dataset(null, "root dataset without links");
dr7071 = dataset(null, "root dataset with own annotations");
dr7072 = dataset(null, "root dataset with foreign annotations");
du7770 = dataset(e, "user dataset without links");
du7771 = dataset(e, "user dataset with own annotations");
du7772 = dataset(e, "user dataset with foreign annotations");
saveAndClear();
}
// TODO we aren't passing in Experimenter here
public void pdlinks() {
init();
pdlink(pr9091, dr7071);
pdlink(pr9092, dr7071);
pdlink(pr9091, dr7072);
pdlink(pr9092, dr7072);
pdlink(pu9991, du7771);
pdlink(pu9992, du7771);
pdlink(pu9991, du7772);
pdlink(pu9992, du7772);
saveAndClear();
}
public void images() {
init();
ir5050 = image(null, "");
ir5051 = image(null, "");
ir5052 = image(null, "");
iu5550 = image(e, "");
iu5551 = image(e, "");
iu5552 = image(e, "");
// cgcpaths
iu5580 = image(e, "");
iu5581 = image(e, "");
iu5582 = image(e, "");
iu5583 = image(e, "");
iu5584 = image(e, "");
iu5585 = image(e, "");
iu5586 = image(e, "");
iu5587 = image(e, "");
iu5588 = image(e, "");
saveAndClear();
}
public void dilinks() {
init();
dilink(null, dr7071, ir5051);
dilink(null, dr7071, ir5052);
dilink(e, dr7072, ir5051);
dilink(e, dr7072, ir5052);
dilink(null, du7771, iu5551);
dilink(null, du7771, iu5552);
dilink(e, du7772, iu5551);
dilink(e, du7772, iu5552);
saveAndClear();
}
public void annotations() {
init();
datasetann(null, dr7071, "roots annotation");
datasetann(e, dr7072, "users annotation");
datasetann(null, du7771, "roots annotation");
datasetann(e, du7772, "users annotation");
imageann(null, ir5051, "roots annotation");
imageann(e, ir5052, "users annotation");
imageann(null, iu5551, "roots annotation");
imageann(e, iu5552, "users annotation");
saveAndClear();
}
// ~ Helpers
// =========================================================================
protected <T extends IObject> T push(T obj) {
toAdd.add(obj);
T copy = new ShallowCopy().copy(obj);
copy.unload();
needId.add(copy);
return copy;
}
protected void saveAndClear() {
IObject[] retVal = iUpdate.saveAndReturnArray(toAdd
.toArray(new IObject[toAdd.size()]));
IObject[] unloaded = needId.toArray(new IObject[needId.size()]);
for (int i = 0; i < retVal.length; i++) {
unloaded[i].setId(retVal[i].getId());
}
toAdd.clear();
needId.clear();
}
protected Project project(Experimenter owner, String name) {
Project p = new Project();
p.getDetails().setOwner(owner);
p.setName(name);
p = push(p);
return p;
}
protected Dataset dataset(Experimenter owner, String name) {
Dataset d = new Dataset();
d.getDetails().setOwner(owner);
d.setName(name);
d = push(d);
return d;
}
protected ProjectDatasetLink pdlink(Project prj, Dataset ds) {
ProjectDatasetLink link = new ProjectDatasetLink();
link.link(prj, ds);
link = push(link);
return link;
}
protected Image image(Experimenter e, String name) {
Image i = new Image();
i.getDetails().setOwner(e);
i.setName(name);
i = push(i);
return i;
}
protected DatasetImageLink dilink(Experimenter user, Dataset ds, Image i) {
DatasetImageLink link = new DatasetImageLink();
link.link(ds, i);
link.getDetails().setOwner(user);
link = push(link);
return link;
}
protected DatasetAnnotationLink datasetann(Experimenter user, Dataset d,
String name) {
TextAnnotation dann = new TagAnnotation();
dann.setNs(name);
dann.getDetails().setOwner(user);
DatasetAnnotationLink link = new DatasetAnnotationLink();
link.link(d.proxy(), dann);
link = push(link);
return link;
}
protected ImageAnnotationLink imageann(Experimenter user, Image i,
String name) {
TextAnnotation iann = new TagAnnotation();
iann.setNs(name);
iann.getDetails().setOwner(user);
ImageAnnotationLink link = new ImageAnnotationLink();
link.link(i.proxy(), iann);
link = push(link);
return link;
}
// static class Data {
public String TESTER;
public Experimenter e;
public ExperimenterGroup g;
public Project pr9090, pr9091, pr9092, pu9990, pu9991, pu9992;
public Dataset dr7070, dr7071, dr7072, du7770, du7771, du7772;
public Image ir5050, ir5051, ir5052, iu5550, iu5551, iu5552, iu5580,
iu5581, iu5582, iu5583, iu5584, iu5585, iu5586, iu5587, iu5588;
public List<Long> asIdList(IObject... iobjs) {
List<Long> list = new ArrayList<Long>();
for (IObject i : iobjs) {
list.add(i.getId());
}
return list;
}
}