/* * Copyright 2010 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package integration.delete; import static omero.rtypes.rdouble; import static omero.rtypes.rint; import integration.AbstractServerTest; import java.util.ArrayList; import java.util.List; import java.util.UUID; import omero.api.IRoiPrx; import omero.api.RoiOptions; import omero.cmd.Delete2; import omero.gateway.util.Requests; import omero.grid.Column; import omero.grid.LongColumn; import omero.grid.TablePrx; import omero.model.Annotation; import omero.model.FileAnnotation; import omero.model.FileAnnotationI; import omero.model.IObject; import omero.model.Image; import omero.model.OriginalFile; import omero.model.Plate; import omero.model.PlateAnnotationLink; import omero.model.PlateAnnotationLinkI; import omero.model.PlateI; import omero.model.Rectangle; import omero.model.RectangleI; import omero.model.Roi; import omero.model.RoiAnnotationLink; import omero.model.RoiAnnotationLinkI; import omero.model.RoiI; import omero.model.Well; import omero.sys.EventContext; import org.testng.annotations.Test; import static org.testng.AssertJUnit.*; import omero.gateway.model.FileAnnotationData; /** * Tests for deleting rois and images which have rois. * * @since 4.2.1 */ @Test(groups = "ticket:2615") public class RoiDeleteTest extends AbstractServerTest { /** * Test to delete an image with ROIs owned by another user. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = { "ticket:2962", "ticket:3010" }) public void testDeleteWithAnotherUsersRoi() throws Exception { EventContext owner = newUserAndGroup("rwrw--"); Image i1 = (Image) iUpdate.saveAndReturnObject(mmFactory.createImage()); disconnect(); newUserInGroup(owner); Roi roi = new RoiI(); roi.setImage((Image) i1.proxy()); roi = (Roi) iUpdate.saveAndReturnObject(roi); disconnect(); loginUser(owner); final Delete2 dc = Requests.delete("Image", i1.getId().getValue()); callback(true, client, dc); assertDoesNotExist(i1); assertDoesNotExist(roi); } /** * Test to delete ROI with measurement. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteROIAndResults() throws Exception { Plate p = mmFactory.createPlate(1, 1, 1, 0, true); p = (Plate) iUpdate.saveAndReturnObject(p); List<Well> results = loadWells(p.getId().getValue(), true); Well well = results.get(0); // create the roi. Image image = well.getWellSample(0).getImage(); Roi roi = new RoiI(); roi.setImage(image); Rectangle rect; roi = (Roi) iUpdate.saveAndReturnObject(roi); for (int i = 0; i < 3; i++) { rect = new RectangleI(); rect.setX(rdouble(10)); rect.setY(rdouble(10)); rect.setWidth(rdouble(10)); rect.setHeight(rdouble(10)); rect.setTheZ(rint(i)); rect.setTheT(rint(0)); roi.addShape(rect); } roi = (RoiI) iUpdate.saveAndReturnObject(roi); long roiID = roi.getId().getValue(); // no measurements RoiOptions options = new RoiOptions(); options.userId = omero.rtypes.rlong(iAdmin.getEventContext().userId); IRoiPrx svc = factory.getRoiService(); List<Annotation> l = svc.getRoiMeasurements(image.getId().getValue(), options); assertEquals(l.size(), 0); // create measurements. // First create a table String uuid = "Measurement_" + UUID.randomUUID().toString(); TablePrx table = factory.sharedResources().newTable(1, uuid); Column[] columns = new Column[1]; columns[0] = new LongColumn("Uid", "", new long[1]); table.initialize(columns); assertNotNull(table); OriginalFile of = table.getOriginalFile(); assertTrue(of.getId().getValue() > 0); FileAnnotation fa = new FileAnnotationI(); fa.setNs(omero.rtypes.rstring(FileAnnotationData.MEASUREMENT_NS)); fa.setFile(of); fa = (FileAnnotation) iUpdate.saveAndReturnObject(fa); // link fa to ROI List<IObject> links = new ArrayList<IObject>(); RoiAnnotationLink rl = new RoiAnnotationLinkI(); rl.setChild(new FileAnnotationI(fa.getId().getValue(), false)); rl.setParent(new RoiI(roiID, false)); links.add(rl); PlateAnnotationLink il = new PlateAnnotationLinkI(); il.setChild(new FileAnnotationI(fa.getId().getValue(), false)); il.setParent(new PlateI(p.getId().getValue(), false)); links.add(il); iUpdate.saveAndReturnArray(links); // Now delete the rois. final Delete2 dc = Requests.delete("Roi", roiID); callback(true, client, dc); assertDoesNotExist(roi); l = svc.getRoiMeasurements(image.getId().getValue(), options); assertEquals(l.size(), 0); } /** * Test to delete ROI with measurement. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateWithROIAndResults() throws Exception { Plate p = mmFactory.createPlate(1, 1, 1, 0, true); p = (Plate) iUpdate.saveAndReturnObject(p); List<Well> results = loadWells(p.getId().getValue(), true); Well well = results.get(0); // create the roi. Image image = well.getWellSample(0).getImage(); Roi roi = new RoiI(); roi.setImage(image); Rectangle rect; roi = (Roi) iUpdate.saveAndReturnObject(roi); for (int i = 0; i < 3; i++) { rect = new RectangleI(); rect.setX(rdouble(10)); rect.setY(rdouble(10)); rect.setWidth(rdouble(10)); rect.setHeight(rdouble(10)); rect.setTheZ(rint(i)); rect.setTheT(rint(0)); roi.addShape(rect); } roi = (RoiI) iUpdate.saveAndReturnObject(roi); long roiID = roi.getId().getValue(); // no measurements RoiOptions options = new RoiOptions(); options.userId = omero.rtypes.rlong(iAdmin.getEventContext().userId); IRoiPrx svc = factory.getRoiService(); List<Annotation> l = svc.getRoiMeasurements(image.getId().getValue(), options); assertEquals(l.size(), 0); // create measurements. // First create a table String uuid = "Measurement_" + UUID.randomUUID().toString(); TablePrx table = factory.sharedResources().newTable(1, uuid); Column[] columns = new Column[1]; columns[0] = new LongColumn("Uid", "", new long[1]); table.initialize(columns); assertNotNull(table); OriginalFile of = table.getOriginalFile(); assertTrue(of.getId().getValue() > 0); FileAnnotation fa = new FileAnnotationI(); fa.setNs(omero.rtypes.rstring(FileAnnotationData.MEASUREMENT_NS)); fa.setFile(of); fa = (FileAnnotation) iUpdate.saveAndReturnObject(fa); // link fa to ROI List<IObject> links = new ArrayList<IObject>(); RoiAnnotationLink rl = new RoiAnnotationLinkI(); rl.setChild(new FileAnnotationI(fa.getId().getValue(), false)); rl.setParent(new RoiI(roiID, false)); links.add(rl); PlateAnnotationLink il = new PlateAnnotationLinkI(); il.setChild(new FileAnnotationI(fa.getId().getValue(), false)); il.setParent(new PlateI(p.getId().getValue(), false)); links.add(il); iUpdate.saveAndReturnArray(links); // Now delete the plate final Delete2 dc = Requests.delete("Plate", p.getId().getValue()); callback(true, client, dc); assertDoesNotExist(p); assertDoesNotExist(roi); l = svc.getRoiMeasurements(image.getId().getValue(), options); assertEquals(l.size(), 0); } }