/*
* 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);
}
}