/*
* Copyright 20078 Glencoe Software, Inc. All rights reserved.
* Use is subject to license terms supplied in LICENSE.txt
*/
package ome.services.delete;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import ome.api.IDelete;
import ome.api.ThumbnailStore;
import ome.conditions.ApiUsageException;
import ome.conditions.SecurityViolation;
import ome.model.annotations.CommentAnnotation;
import ome.model.annotations.FileAnnotation;
import ome.model.annotations.ImageAnnotationLink;
import ome.model.annotations.TagAnnotation;
import ome.model.containers.Dataset;
import ome.model.containers.DatasetImageLink;
import ome.model.core.Channel;
import ome.model.core.Image;
import ome.model.core.LogicalChannel;
import ome.model.core.OriginalFile;
import ome.model.core.Pixels;
import ome.model.internal.Permissions;
import ome.model.meta.Experimenter;
import ome.model.screen.Plate;
import ome.model.screen.Well;
import ome.model.screen.WellSample;
import ome.parameters.Parameters;
import ome.server.itests.AbstractManagedContextTest;
import org.testng.annotations.Test;
@Test(groups = { "integration" })
public class DeleteServiceTest extends AbstractManagedContextTest {
@Test
public void testSimpleDelete() throws Exception {
Image i = makeImage(true);
IDelete srv = this.factory.getServiceByClass(IDelete.class);
srv.deleteImage(i.getId(), true);
}
@Test
public void testDeleteWithOtherDatasets() throws Exception {
Image i = makeImage(true);
Dataset d = new Dataset();
d.setName("deletes");
DatasetImageLink link = new DatasetImageLink();
link.link(d, i.proxy());
this.factory.getUpdateService().saveObject(link);
IDelete srv = this.factory.getServiceByClass(IDelete.class);
srv.deleteImage(i.getId(), true);
}
public void testDeleteWithAnnotation() throws Exception {
Image i = makeImage(true);
CommentAnnotation ta = new CommentAnnotation();
ta.setNs("");
ta.setTextValue("");
ImageAnnotationLink link = new ImageAnnotationLink();
link.link(i.proxy(), ta);
this.factory.getUpdateService().saveObject(link);
IDelete srv = this.factory.getServiceByClass(IDelete.class);
srv.deleteImage(i.getId(), true);
}
@Test(expectedExceptions = ApiUsageException.class)
public void testDeleteWithOtherDatasetsNoForce() throws Exception {
Image i = makeImage(true);
Dataset d = new Dataset();
d.setName("deletes");
DatasetImageLink link = new DatasetImageLink();
link.link(d, i.proxy());
this.factory.getUpdateService().saveObject(link);
IDelete srv = this.factory.getServiceByClass(IDelete.class);
srv.deleteImage(i.getId(), false);
}
public void testDeletePreviewList() throws Exception {
Image i = makeImage(true);
Dataset d = new Dataset();
d.setName("deletes");
DatasetImageLink link = new DatasetImageLink();
link.link(d, i.proxy());
this.factory.getUpdateService().saveObject(link);
IDelete srv = this.factory.getServiceByClass(IDelete.class);
assertTrue(srv.previewImageDelete(i.getId(), false).size() > 1);
}
public void testDeleteByIds() throws Exception {
Image i1 = makeImage(false);
Image i2 = makeImage(false);
Image i3 = makeImage(false);
IDelete srv = this.factory.getDeleteService();
srv.deleteImages(new HashSet<Long>(Arrays.asList(i1.getId(),
i2.getId(), i3.getId())), false);
}
@Test(expectedExceptions = ApiUsageException.class)
public void testDeleteByIdsWithOtherDatasetNoForce() throws Exception {
Image i1 = makeImage(false);
Image i2 = makeImage(false);
Image i3 = makeImage(false);
Dataset containsAll = new Dataset("containsAll");
containsAll.linkImage(i1);
containsAll.linkImage(i2);
containsAll.linkImage(i3);
iUpdate.saveObject(containsAll);
IDelete srv = this.factory.getDeleteService();
srv.deleteImages(new HashSet<Long>(Arrays.asList(i1.getId(),
i2.getId(), i3.getId())), false);
}
public void testDeleteByIdsWithOtherDatasetForce() throws Exception {
Image i1 = makeImage(false);
Image i2 = makeImage(false);
Image i3 = makeImage(false);
Dataset containsAll = new Dataset("containsAll");
containsAll.linkImage(i1);
containsAll.linkImage(i2);
containsAll.linkImage(i3);
iUpdate.saveObject(containsAll);
IDelete srv = this.factory.getDeleteService();
srv.deleteImages(new HashSet<Long>(Arrays.asList(i1.getId(),
i2.getId(), i3.getId())), true);
}
public void testDeleteByDataset() throws Exception {
Image i1 = makeImage(false);
Image i2 = makeImage(false);
Image i3 = makeImage(false);
Dataset containsAll = new Dataset("containsAll");
containsAll.linkImage(i1);
containsAll.linkImage(i2);
containsAll.linkImage(i3);
iUpdate.saveObject(containsAll);
IDelete srv = this.factory.getDeleteService();
srv.deleteImagesByDataset(containsAll.getId(), false);
}
public void testDeleteByDatasetWithOtherDatasetForce() throws Exception {
Image i1 = makeImage(true);
Image i2 = makeImage(true);
Image i3 = makeImage(true);
Dataset containsAll = new Dataset("containsAll");
containsAll.linkImage(i1);
containsAll.linkImage(i2);
containsAll.linkImage(i3);
iUpdate.saveObject(containsAll);
IDelete srv = this.factory.getDeleteService();
srv.deleteImagesByDataset(containsAll.getId(), true);
}
@Test(expectedExceptions = ApiUsageException.class)
public void testDeleteByDatasetWithOtherDatasetNoForce() throws Exception {
Image i1 = makeImage(true);
Image i2 = makeImage(true);
Image i3 = makeImage(true);
Dataset containsAll = new Dataset("containsAll");
containsAll.linkImage(i1);
containsAll.linkImage(i2);
containsAll.linkImage(i3);
iUpdate.saveObject(containsAll);
IDelete srv = this.factory.getDeleteService();
srv.deleteImagesByDataset(containsAll.getId(), false);
}
@Test
public void testDeleteHandlesMultiLinkedLogicalChannels() throws Exception {
Image i1 = makeImage(true);
Image i2 = makeImage(true);
String sql = "select lc from LogicalChannel lc "
+ "join fetch lc.channels ch join ch.pixels p join p.image i where i.id = ";
List<LogicalChannel> lcs1 = iQuery.findAllByQuery(sql + i1.getId(),
null);
Channel c1 = lcs1.get(0).iterateChannels().next();
List<LogicalChannel> lcs2 = iQuery.findAllByQuery(sql + i2.getId(),
null);
c1.setLogicalChannel(lcs2.get(0));
iUpdate.saveObject(c1);
IDelete srv = this.factory.getDeleteService();
srv.deleteImage(i1.getId(), true);
}
// Multiuser tests
// =========================================================================
@Test(expectedExceptions = SecurityViolation.class)
public void testDeleteByDatasetWithTwoImagesFromDifferentUsers()
throws Exception {
Experimenter e1 = loginNewUser(Permissions.COLLAB_READLINK);
Image i1 = makeImage(false);
Experimenter e2 = loginNewUserInOtherUsersGroup(e1);
Image i2 = makeImage(false);
Dataset containsAll = new Dataset("containsAll");
containsAll.linkImage(i1);
containsAll.linkImage(i2);
iUpdate.saveObject(containsAll);
IDelete srv = this.factory.getDeleteService();
srv.deleteImagesByDataset(containsAll.getId(), true);
}
public void testDeleteImageAfterViewedByAnotherUser() throws Exception {
Experimenter e1 = loginNewUser(Permissions.COLLAB_READLINK);
Image i1 = makeImage(false);
Pixels p1 = i1.iteratePixels().next();
Experimenter e2 = loginNewUserInOtherUsersGroup(e1);
ThumbnailStore tb = this.factory.createThumbnailService();
tb.setPixelsId(p1.getId());
tb.resetDefaults();
tb.setPixelsId(p1.getId());
tb.createThumbnails();
loginUser(e1.getOmeName());
factory.getDeleteService().deleteImage(i1.getId(), false);
}
public void testDeleteSettingsAfterViewedByAnotherUser() throws Exception {
Experimenter e1 = loginNewUser(Permissions.COLLAB_READLINK);
Image i1 = makeImage(false);
Pixels p1 = i1.iteratePixels().next();
Experimenter e2 = loginNewUserInOtherUsersGroup(e1);
ThumbnailStore tb = this.factory.createThumbnailService();
tb.setPixelsId(p1.getId());
tb.resetDefaults();
tb.setPixelsId(p1.getId());
tb.createThumbnails();
loginUser(e1.getOmeName());
factory.getDeleteService().deleteSettings(i1.getId());
}
public void testDeleteSettingsAfterViewedByRoot() throws Exception {
Experimenter e1 = loginNewUser(Permissions.COLLAB_READLINK);
Image i1 = makeImage(false);
Pixels p1 = i1.iteratePixels().next();
loginRootKeepGroup();
ThumbnailStore tb = this.factory.createThumbnailService();
tb.setPixelsId(p1.getId());
tb.resetDefaults();
tb.setPixelsId(p1.getId());
tb.createThumbnails();
loginUser(e1.getOmeName());
factory.getDeleteService().deleteSettings(i1.getId());
}
@Test(groups = "ticket:1228")
public void testDeleteWithProjectionRemovesRelatedTo() throws Exception {
Experimenter e1 = loginNewUser();
Image i1 = makeImage(false);
Pixels p1 = i1.getPixels(0);
Image i2 = makeImage(false);
Pixels p2 = i2.getPixels(0);
p2.setRelatedTo(p1);
assertEquals(p1.getId(), iUpdate.saveAndReturnObject(p2).getRelatedTo()
.getId());
/*
* Leads to deadlock: IProjection prj =
* this.factory.getProjectionService(); prj.projectPixels(p1.getId(),
* p1.getPixelsType(), IProjection.MAXIMUM_INTENSITY, 0, p1.getSizeT(),
* // T Arrays.asList(0), 0, 0, p1.getSizeZ(), // Z "projection");
*/
factory.getDeleteService().deleteImage(i1.getId(), true);
}
// 4.1 - Plates
// =========================================================================
@Test(enabled = false, groups = {"ticket:1228", "broken"}) // Needs data!
public void testDeleteByPlateReal() throws Exception {
String name = "2007.08.02.16.43.24.xdce";
Experimenter e1 = loginNewUser();
try {
makeImage("classpath:"+name, false, null);
} catch (FileNotFoundException fnfe) {
// Partial support
}
Plate p = iQuery.findByQuery("select p from Plate p "
+ "where name like :name " + "order by id desc",
new Parameters().page(0, 1).addString("name",name));
factory.getDeleteService().deletePlate(p.getId());
}
@Test(groups = "ticket:1228")
public void testDeleteByPlateSimple() throws Exception {
Plate p = new Plate();
p.setName("ticket:1228");
Well w1 = new Well();
WellSample ws = new WellSample();
Image i = new Image();
i.setName("ticket:1228");
// Linking
p.addWell(w1);
w1.addWellSample(ws);
ws.setImage(i);
ws.setWell(w1);
i.addWellSample(ws);
p = iUpdate.saveAndReturnObject(p);
factory.getDeleteService().deletePlate(p.getId());
try {
iQuery.get(Plate.class, p.getId());
fail("This should throw");
} catch (ApiUsageException aue) {
// good, it's gone.
}
}
@Test(groups = "ticket:1228")
public void testDeleteByPlateAnnotated() throws Exception {
TagAnnotation ta = new TagAnnotation();
ta.setTextValue("ticket:1228");
Plate p = new Plate();
p.setName("ticket:1228");
p.linkAnnotation(ta);
Well w1 = new Well();
w1.linkAnnotation(ta);
WellSample ws = new WellSample();
Image i = new Image();
i.setName("ticket:1228");
i.linkAnnotation(ta);
// Linking
p.addWell(w1);
w1.addWellSample(ws);
ws.setImage(i);
ws.setWell(w1);
i.addWellSample(ws);
p = iUpdate.saveAndReturnObject(p);
factory.getDeleteService().deletePlate(p.getId());
try {
iQuery.get(Plate.class, p.getId());
fail("This should throw");
} catch (ApiUsageException aue) {
// good, it's gone.
}
}
// Misc
public void testDeleteImageWithFileAnnotation() throws Exception {
Image i1 = makeImage(true);
ImageAnnotationLink link = new ImageAnnotationLink();
FileAnnotation fa = new FileAnnotation();
OriginalFile of = new OriginalFile("", "");
fa.setFile(of);
link.link(i1, fa);
iUpdate.saveObject(fa);
IDelete srv = this.factory.getDeleteService();
srv.deleteImage(i1.getId(), true);
}
}