/* * Copyright 2006-2015 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package integration; import static omero.rtypes.rdouble; import static omero.rtypes.rint; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.fail; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; import ome.formats.OMEROMetadataStoreClient; import ome.specification.XMLMockObjects; import ome.specification.XMLWriter; import omero.api.IMetadataPrx; import omero.api.IPixelsPrx; import omero.api.IRenderingSettingsPrx; import omero.api.RawFileStorePrx; import omero.cmd.Delete2; import omero.cmd.graphs.ChildOption; import omero.gateway.util.Requests; import omero.grid.Column; import omero.grid.LongColumn; import omero.grid.TablePrx; import omero.model.Annotation; import omero.model.Arc; import omero.model.Channel; import omero.model.Dataset; import omero.model.DatasetAnnotationLink; import omero.model.DatasetAnnotationLinkI; import omero.model.DatasetI; import omero.model.DatasetImageLink; import omero.model.DatasetImageLinkI; import omero.model.Detector; import omero.model.DetectorSettings; import omero.model.Dichroic; import omero.model.Experiment; import omero.model.Filament; import omero.model.FileAnnotation; import omero.model.FileAnnotationI; import omero.model.Fileset; import omero.model.Filter; import omero.model.FilterSet; import omero.model.IObject; import omero.model.Image; import omero.model.ImageAnnotationLink; import omero.model.ImageAnnotationLinkI; import omero.model.ImageI; import omero.model.ImagingEnvironment; import omero.model.Instrument; import omero.model.Laser; import omero.model.LightEmittingDiode; import omero.model.LightPath; import omero.model.LightSettings; import omero.model.LightSource; import omero.model.LogicalChannel; import omero.model.Microscope; import omero.model.OTF; import omero.model.Objective; import omero.model.ObjectiveSettings; import omero.model.OriginalFile; import omero.model.Pixels; import omero.model.PixelsI; import omero.model.PixelsOriginalFileMapI; import omero.model.PlaneInfo; import omero.model.Plate; import omero.model.PlateAcquisition; import omero.model.PlateAnnotationLink; import omero.model.PlateAnnotationLinkI; import omero.model.PlateI; import omero.model.Project; import omero.model.ProjectAnnotationLink; import omero.model.ProjectAnnotationLinkI; import omero.model.ProjectDatasetLink; import omero.model.ProjectDatasetLinkI; import omero.model.ProjectI; import omero.model.Reagent; 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.Screen; import omero.model.ScreenAnnotationLink; import omero.model.ScreenAnnotationLinkI; import omero.model.ScreenI; import omero.model.ScreenPlateLink; import omero.model.ScreenPlateLinkI; import omero.model.Shape; import omero.model.StageLabel; import omero.model.StatsInfo; import omero.model.TagAnnotation; import omero.model.TagAnnotationI; import omero.model.TermAnnotation; import omero.model.TermAnnotationI; import omero.model.Thumbnail; import omero.model.Well; import omero.model.WellSample; import omero.sys.ParametersI; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import omero.gateway.model.FileAnnotationData; /** * Collections of tests for the <code>Delete</code> service. * * @author Jean-Marie Burel      <a * href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      <a * href="mailto:donald@lifesci.dundee.ac.uk" * >donald@lifesci.dundee.ac.uk</a> * @version 3.0 <small> (<b>Internal version:</b> $Revision: $Date: $) </small> * @since 3.0-Beta4 */ public class DeleteServiceTest extends AbstractServerTest { /** The namespace. */ public static final String NAMESPACE = "omero.test.namespace"; /** The namespace. */ public static final String NAMESPACE_2 = "omero.test.namespace2"; /** Identifies the fileset as root. */ public static final String REF_FILESET = "/Fileset"; /** Identifies the image as root. */ public static final String REF_IMAGE = "/Image"; /** Identifies the dataset as root. */ public static final String REF_DATASET = "/Dataset"; /** Identifies the project as root. */ public static final String REF_PROJECT = "/Project"; /** Identifies the screen as root. */ public static final String REF_SCREEN = "/Screen"; /** Identifies the plate as root. */ public static final String REF_PLATE = "/Plate"; /** Identifies the detector as root. */ public static final String REF_DETECTOR = "/Detector"; /** Identifies the detector as root. */ public static final String REF_FILAMENT = "Filament"; /** Identifies the detector as root. */ public static final String REF_ARC = "Arc"; /** Identifies the detector as root. */ public static final String REF_LED = "LightEmittingDiode"; /** Identifies the detector as root. */ public static final String REF_LASER = "Laser"; /** Identifies the instrument as root. */ public static final String REF_INSTRUMENT = "/Instrument"; /** Identifies the light source as root. */ public static final String REF_LIGHTSOURCE = "/LightSource"; /** Identifies the ROI as root. */ public static final String REF_ROI = "/Roi"; /** Identifies the Plate Acquisition as root. */ public static final String REF_PLATE_ACQUISITION = "/PlateAcquisition"; /** Identifies the Original file as root. */ public static final String REF_ORIGINAL_FILE = "/OriginalFile"; /** * Identifies annotation paths. This should be used in the * {@link Delete#type} string, while the other paths can be used in for * {@link Delete#options} keys. */ public static final String REF_ANN = "/Annotation"; /** Identifies the Tag. */ public static final String REF_TAG = "/TagAnnotation"; /** Identifies the Term. */ public static final String REF_TERM = "/TermAnnotation"; /** Identifies the File. */ public static final String REF_FILE = "/FileAnnotation"; /** Identifies the MapAnnotation. */ public static final String REF_MAP = "/MapAnnotation"; /** Indicates to force the deletion. */ public static final String FORCE = "FORCE"; /** Indicates to keep a certain type of annotations. */ public static final String KEEP = "KEEP"; /** Indicates to exclude name space. */ public static final String EXCLUDE = "excludes="; /** Indicates to include name space. */ public static final String INCLUDE = "includes="; /** Separator between option and include/exclude condition. */ public static final String SEPARATOR = ";"; /** Separator between option NS. */ public static final String NS_SEPARATOR = ","; /** * Indicates to delete the annotation even if it is linked to another * object. */ public static final String HARD = "HARD"; /** The options to keep the sharable annotations. */ public static final Map<String, String> SHARABLE_TO_KEEP; static { SHARABLE_TO_KEEP = new HashMap<String, String>(); SHARABLE_TO_KEEP.put(REF_TAG, KEEP); SHARABLE_TO_KEEP.put(REF_TERM, KEEP); SHARABLE_TO_KEEP.put(REF_FILE, KEEP); SHARABLE_TO_KEEP.put(REF_MAP, KEEP); } /** The options to keep the sharable annotations. */ public static final List<String> SHARABLE_TO_KEEP_LIST; static { SHARABLE_TO_KEEP_LIST = new ArrayList<String>(); SHARABLE_TO_KEEP_LIST.add("TagAnnotation"); SHARABLE_TO_KEEP_LIST.add("TermAnnotation"); SHARABLE_TO_KEEP_LIST.add("FileAnnotation"); SHARABLE_TO_KEEP_LIST.add("MapAnnotation"); } /** * Since so many tests rely on counting the number of objects present * globally, we're going to start each method with a new user in a new * group. */ @BeforeMethod public void createNewUser() throws Exception { newUserAndGroup("rw----"); } /** * Since we are creating a new client on each invocation, we should also * clean it up. Note: {@link #newUserAndGroup(String)} also closes, but not * the very last invocation. */ @AfterMethod public void close() throws Exception { clean(); } /** * Returns a map from IObject instance saved to the DB to delete command * need to remove it. E.g. * * <pre> * { * new ProjectI() : "/Project" * } * </pre> */ private Map<String, IObject> createIObjects() throws Exception { Map<String, IObject> objects = new HashMap<String, IObject>(); objects.put(Image.class.getSimpleName(), iUpdate.saveAndReturnObject(mmFactory.createImage())); objects.put(Dataset.class.getSimpleName(), iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject())); objects.put(Project.class.getSimpleName(), iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject())); objects.put(Plate.class.getSimpleName(), iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject())); objects.put(Screen.class.getSimpleName(), iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject())); // objects.put(REF_INSTRUMENT, iUpdate.saveAndReturnObject(mmFactory // .createInstrument())); // Create another instrument to hold the detector to be deleted /* Note: The objects below are not presently legal targets for Delete2 requests. Instrument instrument = (Instrument) iUpdate .saveAndReturnObject(mmFactory.createInstrument()); Detector detector = mmFactory.createDetector(); detector.setInstrument((Instrument) instrument.proxy()); detector = (Detector) iUpdate.saveAndReturnObject(detector); // add detector to the list objects.put(Detector.class.getSimpleName(), detector); Filament lightFilament = mmFactory.createFilament(); lightFilament.setInstrument((Instrument) instrument.proxy()); lightFilament = (Filament) iUpdate.saveAndReturnObject(lightFilament); // add light to the list objects.put(Filament.class.getSimpleName(), lightFilament); Arc lightArc = mmFactory.createArc(); lightArc.setInstrument((Instrument) instrument.proxy()); lightArc = (Arc) iUpdate.saveAndReturnObject(lightArc); // add light to the list objects.put(Arc.class.getSimpleName(), lightArc); LightEmittingDiode lightLed = mmFactory.createLightEmittingDiode(); lightLed.setInstrument((Instrument) instrument.proxy()); lightLed = (LightEmittingDiode) iUpdate.saveAndReturnObject(lightLed); // add light to the list objects.put(LightEmittingDiode.class.getSimpleName(), lightLed); Laser lightLaser = mmFactory.createLaser(); lightLaser.setInstrument((Instrument) instrument.proxy()); lightLaser = (Laser) iUpdate.saveAndReturnObject(lightLaser); // add light to the list objects.put(Laser.class.getSimpleName(), lightLaser); */ return objects; } /** * Converts the key. * * @param value The value to convert. * @return */ private String convert(String value) { if (REF_FILAMENT.equals(value) || REF_ARC.equals(value) || REF_LED.equals(value) || REF_LASER.equals(value)) return LightSource.class.getSimpleName(); return value; } /** * Creates a basic query to check if the object has been deleted. * * @param i * The string identifying the class. * @return See above. */ private String createBasicContainerQuery(Class<? extends IObject> k) { if (Image.class.isAssignableFrom(k)) { return "select i from Image as i where i.id = :id"; } else if (Dataset.class.isAssignableFrom(k)) { return "select d from Dataset as d where d.id = :id"; } else if (Project.class.isAssignableFrom(k)) { return "select p from Project as p where p.id = :id"; } else if (Plate.class.isAssignableFrom(k)) { return "select p from Plate as p where p.id = :id"; } else if (Screen.class.isAssignableFrom(k)) { return "select s from Screen as s where s.id = :id"; } else if (Detector.class.isAssignableFrom(k)) { return "select d from Detector as d where d.id = :id"; } else if (Instrument.class.isAssignableFrom(k)) { return "select i from Instrument as i where i.id = :id"; } else if (Filament.class.isAssignableFrom(k)) { return "select l from LightSource as l where l.id = :id"; } else if (Arc.class.isAssignableFrom(k)) { return "select l from LightSource as l where l.id = :id"; } else if (LightEmittingDiode.class.isAssignableFrom(k)) { return "select l from LightSource as l where l.id = :id"; } else if (Laser.class.isAssignableFrom(k)) { return "select l from LightSource as l where l.id = :id"; } throw new UnsupportedOperationException("Unknown type: " + k); } /** * Test to delete an image w/o pixels. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteBasicImage() throws Exception { Image img = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); assertNotNull(img); long id = img.getId().getValue(); Delete2 dc = Requests.delete("Image", id); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(id); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id = :id"); img = (Image) iQuery.findByQuery(sb.toString(), param); assertNull(img); } /** * Test to delete an empty instrument. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteBasicInstrument() throws Exception { Instrument ins = (Instrument) iUpdate.saveAndReturnObject(mmFactory .createInstrument()); assertNotNull(ins); long id = ins.getId().getValue(); Delete2 dc = Requests.delete("Instrument", id); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(id); StringBuilder sb = new StringBuilder(); sb.append("select i from Instrument i "); sb.append("where i.id = :id"); ins = (Instrument) iQuery.findByQuery(sb.toString(), param); assertNull(ins); } /** * Test to delete an empty instrument. * * @throws Exception * Thrown if an error occurred. */ /* broken because Detector is not a legal target for Delete2 */ @Test(groups = "broken") public void testDeleteBasicDetector() throws Exception { // Create an instrument to hold the detector to be deleted Instrument instrument = (Instrument) iUpdate .saveAndReturnObject(mmFactory.createInstrument()); Detector detector = mmFactory.createDetector(); assertNotNull(detector); detector.setInstrument((Instrument) instrument.proxy()); detector = (Detector) iUpdate.saveAndReturnObject(detector); assertNotNull(detector); // find detector long id = detector.getId().getValue(); ParametersI param = new ParametersI(); param.addId(id); StringBuilder sb = new StringBuilder(); sb.append("select d from Detector d "); sb.append("where d.id = :id"); detector = (Detector) iQuery.findByQuery(sb.toString(), param); assertNotNull(detector); // delete detector Delete2 dc = Requests.delete("Detector", id); callback(true, client, dc); // fail to find detector detector = (Detector) iQuery.findByQuery(sb.toString(), param); assertNull(detector); } /** * Test to delete a simple plate i.e. w/o wells or acquisition. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteEmptyPlate() throws Exception { Plate p = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); assertNotNull(p); long id = p.getId().getValue(); Delete2 dc = Requests.delete("Plate", id); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(id); StringBuilder sb = new StringBuilder(); sb.append("select i from Plate i "); sb.append("where i.id = :id"); p = (Plate) iQuery.findByQuery(sb.toString(), param); assertNull(p); } /** * Test to delete a populated plate. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlate() throws Exception { int[] values = { 0, 1 }; Plate p; List<? extends IObject> results; PlateAcquisition pa = null; StringBuilder sb; Well well; WellSample field; Iterator<? extends IObject> j; ParametersI param; List<Long> wellSampleIds; List<Long> imageIds; int n; for (int i = 0; i < values.length; i++) { n = values[i]; p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, n, false)); results = loadWells(p.getId().getValue(), false); param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb = new StringBuilder(); sb.append("select pa from PlateAcquisition as pa " + "where pa.plate.id = :plateID"); pa = (PlateAcquisition) iQuery.findByQuery(sb.toString(), param); j = results.iterator(); wellSampleIds = new ArrayList<Long>(); imageIds = new ArrayList<Long>(); while (j.hasNext()) { well = (Well) j.next(); for (int k = 0; k < well.sizeOfWellSamples(); k++) { field = well.getWellSample(k); wellSampleIds.add(field.getId().getValue()); assertNotNull(field.getImage()); imageIds.add(field.getImage().getId().getValue()); } } // Now delete the plate Delete2 dc = Requests.delete("Plate", p.getId().getValue()); callback(true, client, dc); param = new ParametersI(); param.addId(p.getId().getValue()); sb = new StringBuilder(); // check the plate sb.append("select p from Plate as p where p.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); // check the well param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb = new StringBuilder(); sb.append("select well from Well as well "); sb.append("left outer join fetch well.plate as pt "); sb.append("where pt.id = :plateID"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the well samples. sb = new StringBuilder(); param = new ParametersI(); param.addIds(wellSampleIds); sb.append("select p from WellSample as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the image. sb = new StringBuilder(); param = new ParametersI(); param.addIds(imageIds); sb.append("select p from Image as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); if (pa != null && n > 0) { param = new ParametersI(); param.addId(pa.getId().getValue()); sb = new StringBuilder(); // check the plate sb.append("select p from PlateAcquisition as p " + "where p.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } } } /** * Test to delete a populated plate. The boolean flag indicates to create or * no plate acquisition. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateUsingQueue() throws Exception { int[] values = { 0, 1 }; int b; Plate p; List<IObject> results; PlateAcquisition pa = null; StringBuilder sb; Well well; WellSample field; Iterator<IObject> j; ParametersI param; List<Long> wellSampleIds; List<Long> imageIds; for (int i = 0; i < values.length; i++) { b = values[i]; p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, b, false)); param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb = new StringBuilder(); sb.append("select well from Well as well "); sb.append("left outer join fetch well.plate as pt "); sb.append("left outer join fetch well.wellSamples as ws "); sb.append("left outer join fetch ws.image as img "); sb.append("where pt.id = :plateID"); results = iQuery.findAllByQuery(sb.toString(), param); sb = new StringBuilder(); sb.append("select pa from PlateAcquisition as pa " + "where pa.plate.id = :plateID"); pa = (PlateAcquisition) iQuery.findByQuery(sb.toString(), param); j = results.iterator(); wellSampleIds = new ArrayList<Long>(); imageIds = new ArrayList<Long>(); while (j.hasNext()) { well = (Well) j.next(); for (int k = 0; k < well.sizeOfWellSamples(); k++) { field = well.getWellSample(k); wellSampleIds.add(field.getId().getValue()); assertNotNull(field.getImage()); imageIds.add(field.getImage().getId().getValue()); } } // Now delete the plate Delete2 dc = Requests.delete("Plate", p.getId().getValue()); callback(true, client, dc); // check the plate assertDoesNotExist(p); // check the well param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb = new StringBuilder(); sb.append("select well from Well as well "); sb.append("left outer join fetch well.plate as pt "); sb.append("where pt.id = :plateID"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the well samples. sb = new StringBuilder(); param = new ParametersI(); param.addIds(wellSampleIds); sb.append("select p from WellSample as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the image. sb = new StringBuilder(); param = new ParametersI(); param.addIds(imageIds); sb.append("select p from Image as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); if (pa != null && b > 0) { param = new ParametersI(); param.addId(pa.getId().getValue()); sb = new StringBuilder(); // check the plate sb.append("select p from PlateAcquisition as p " + "where p.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } } } /** * Tests to delete a dataset with images. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteDataset() throws Exception { Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Image image1 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Image image2 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); List<IObject> links = new ArrayList<IObject>(); DatasetImageLink link = new DatasetImageLinkI(); link.setChild(image1); link.setParent(d); links.add(link); link = new DatasetImageLinkI(); link.setChild(image2); link.setParent(d); links.add(link); iUpdate.saveAndReturnArray(links); List<Long> ids = new ArrayList<Long>(); ids.add(image1.getId().getValue()); ids.add(image2.getId().getValue()); Delete2 dc = Requests.delete("Dataset", d.getId().getValue()); callback(true, client, dc); // Check if objects have been deleted ParametersI param = new ParametersI(); param.addIds(ids); String sql = "select i from Image as i where i.id in (:ids)"; List<IObject> results = iQuery.findAllByQuery(sql, param); assertEquals(results.size(), 0); param = new ParametersI(); param.addId(d.getId().getValue()); sql = "select i from Dataset as i where i.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } /** * Tests to delete a project containing a dataset with images. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteProject() throws Exception { Project p = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Image image1 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Image image2 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); List<IObject> links = new ArrayList<IObject>(); DatasetImageLink link = new DatasetImageLinkI(); link.setChild(image1); link.setParent(d); links.add(link); link = new DatasetImageLinkI(); link.setChild(image2); link.setParent(d); links.add(link); ProjectDatasetLink l = new ProjectDatasetLinkI(); l.setChild(d); l.setParent(p); links.add(l); iUpdate.saveAndReturnArray(links); List<Long> ids = new ArrayList<Long>(); ids.add(image1.getId().getValue()); ids.add(image2.getId().getValue()); Delete2 dc = Requests.delete("Project", p.getId().getValue()); callback(true, client, dc); // Check if objects have been deleted ParametersI param = new ParametersI(); param.addIds(ids); String sql = "select i from Image as i where i.id in (:ids)"; List<IObject> results = iQuery.findAllByQuery(sql, param); assertEquals(results.size(), 0); param = new ParametersI(); param.addId(d.getId().getValue()); sql = "select i from Dataset as i where i.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(p.getId().getValue()); sql = "select i from Project as i where i.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } /** * Tests to delete a screen containing 2 plates, one w/o plate acquisition * and one with plate acquisition. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteScreen() throws Exception { Screen screen = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); // Plate w/o plate acquisition Plate p1 = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, 0, false)); // Plate with plate acquisition Plate p2 = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, 1, false)); List<IObject> links = new ArrayList<IObject>(); ScreenPlateLink link = new ScreenPlateLinkI(); link.setChild(p1); link.setParent(screen); links.add(link); link = new ScreenPlateLinkI(); link.setChild(p2); link.setParent(screen); links.add(link); iUpdate.saveAndReturnArray(links); Delete2 dc = Requests.delete("Screen", screen.getId().getValue()); callback(true, client, dc); List<Long> ids = new ArrayList<Long>(); ids.add(p1.getId().getValue()); ids.add(p2.getId().getValue()); // Check if the plates exist. ParametersI param = new ParametersI(); param.addIds(ids); String sql = "select i from Plate as i where i.id in (:ids)"; List<IObject> results = iQuery.findAllByQuery(sql, param); assertEquals(results.size(), 0); param = new ParametersI(); param.addId(screen.getId().getValue()); sql = "select i from Screen as i where i.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } /** * Test to delete an image with pixels, channels, logical channels and * statistics. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImage() throws Exception { Image img = mmFactory.createImage(); img = (Image) iUpdate.saveAndReturnObject(img); Pixels pixels = img.getPrimaryPixels(); long pixId = pixels.getId().getValue(); // method already tested in PixelsServiceTest // make sure objects are loaded. pixels = factory.getPixelsService().retrievePixDescription(pixId); // channels. long id = img.getId().getValue(); List<Long> channels = new ArrayList<Long>(); List<Long> logicalChannels = new ArrayList<Long>(); List<Long> infos = new ArrayList<Long>(); Channel channel; LogicalChannel lc; StatsInfo info; for (int i = 0; i < pixels.getSizeC().getValue(); i++) { channel = pixels.getChannel(i); assertNotNull(channel); channels.add(channel.getId().getValue()); lc = channel.getLogicalChannel(); assertNotNull(lc); logicalChannels.add(lc.getId().getValue()); info = channel.getStatsInfo(); assertNotNull(info); infos.add(info.getId().getValue()); } Delete2 dc = Requests.delete("Image", id); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(id); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); sb = new StringBuilder(); param = new ParametersI(); param.addId(pixId); sb.append("select i from Pixels i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); Iterator<Long> i = channels.iterator(); while (i.hasNext()) { id = i.next(); param = new ParametersI(); param.addId(id); sb = new StringBuilder(); sb.append("select i from Channel i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } i = infos.iterator(); while (i.hasNext()) { id = i.next(); param = new ParametersI(); param.addId(id); sb = new StringBuilder(); sb.append("select i from StatsInfo i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } i = logicalChannels.iterator(); while (i.hasNext()) { id = i.next(); param = new ParametersI(); param.addId(id); sb = new StringBuilder(); sb.append("select i from LogicalChannel i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } } /** * Test to delete an image with pixels, channels, logical channels and * statistics. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageUsingQueue() throws Exception { Image img = mmFactory.createImage(); img = (Image) iUpdate.saveAndReturnObject(img); Pixels pixels = img.getPrimaryPixels(); long pixId = pixels.getId().getValue(); // method already tested in PixelsServiceTest // make sure objects are loaded. pixels = factory.getPixelsService().retrievePixDescription(pixId); // channels. long id = img.getId().getValue(); List<Long> channels = new ArrayList<Long>(); List<Long> logicalChannels = new ArrayList<Long>(); List<Long> infos = new ArrayList<Long>(); Channel channel; LogicalChannel lc; StatsInfo info; for (int i = 0; i < pixels.getSizeC().getValue(); i++) { channel = pixels.getChannel(i); assertNotNull(channel); channels.add(channel.getId().getValue()); lc = channel.getLogicalChannel(); assertNotNull(lc); logicalChannels.add(lc.getId().getValue()); info = channel.getStatsInfo(); assertNotNull(info); infos.add(info.getId().getValue()); } Delete2 dc = Requests.delete("Image", id); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(id); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); sb = new StringBuilder(); param = new ParametersI(); param.addId(pixId); sb.append("select i from Pixels i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); Iterator<Long> i = channels.iterator(); while (i.hasNext()) { id = i.next(); param = new ParametersI(); param.addId(id); sb = new StringBuilder(); sb.append("select i from Channel i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } i = infos.iterator(); while (i.hasNext()) { id = i.next(); param = new ParametersI(); param.addId(id); sb = new StringBuilder(); sb.append("select i from StatsInfo i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } i = logicalChannels.iterator(); while (i.hasNext()) { id = i.next(); param = new ParametersI(); param.addId(id); sb = new StringBuilder(); sb.append("select i from LogicalChannel i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } } /** * Test to delete an image with rendering settings. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithRenderingSettings() throws Exception { Image img = mmFactory.createImage(); img = (Image) iUpdate.saveAndReturnObject(img); Pixels pixels = img.getPrimaryPixels(); // method already tested in RenderingSettingsServiceTest IRenderingSettingsPrx prx = factory.getRenderingSettingsService(); prx.setOriginalSettingsInSet(Pixels.class.getName(), Arrays.asList(pixels.getId().getValue())); // check if we have settings now. ParametersI param = new ParametersI(); param.addLong("pid", pixels.getId().getValue()); String sql = "select rdef from RenderingDef as rdef " + "where rdef.pixels.id = :pid"; List<IObject> settings = iQuery.findAllByQuery(sql, param); // now delete the image assertTrue(settings.size() > 0); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); // check if the settings have been deleted. Iterator<IObject> i = settings.iterator(); IObject o; while (i.hasNext()) { o = i.next(); param = new ParametersI(); param.addId(o.getId().getValue()); sql = "select rdef from RenderingDef as rdef " + "where rdef.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } } /** * Test to delete an image with rendering settings. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithRenderingSettingsUsingQueue() throws Exception { Image img = mmFactory.createImage(); img = (Image) iUpdate.saveAndReturnObject(img); Pixels pixels = img.getPrimaryPixels(); // method already tested in RenderingSettingsServiceTest IRenderingSettingsPrx prx = factory.getRenderingSettingsService(); prx.setOriginalSettingsInSet(Pixels.class.getName(), Arrays.asList(pixels.getId().getValue())); // check if we have settings now. ParametersI param = new ParametersI(); param.addLong("pid", pixels.getId().getValue()); String sql = "select rdef from RenderingDef as rdef " + "where rdef.pixels.id = :pid"; List<IObject> settings = iQuery.findAllByQuery(sql, param); // now delete the image assertTrue(settings.size() > 0); Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); // check if the settings have been deleted. Iterator<IObject> i = settings.iterator(); IObject o; while (i.hasNext()) { o = i.next(); param = new ParametersI(); param.addId(o.getId().getValue()); sql = "select rdef from RenderingDef as rdef " + "where rdef.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } } /** * Test to delete an image with acquisition data. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithAcquisitionData() throws Exception { Image img = mmFactory.createImage(); img = (Image) iUpdate.saveAndReturnObject(img); Pixels pixels = img.getPrimaryPixels(); long pixId = pixels.getId().getValue(); // method already tested in PixelsServiceTest // make sure objects are loaded. pixels = factory.getPixelsService().retrievePixDescription(pixId); // create an instrument. Instrument instrument = mmFactory .createInstrument(ModelMockFactory.LASER); instrument = (Instrument) iUpdate.saveAndReturnObject(instrument); assertNotNull(instrument); // retrieve the elements we need for the settings. // retrieve the detector. ParametersI param = new ParametersI(); param.addLong("iid", instrument.getId().getValue()); String sql = "select d from Detector as d where d.instrument.id = :iid"; Detector detector = (Detector) iQuery.findByQuery(sql, param); sql = "select d from FilterSet as d where d.instrument.id = :iid"; FilterSet filterSet = (FilterSet) iQuery.findByQuery(sql, param); sql = "select d from Laser as d where d.instrument.id = :iid"; Laser laser = (Laser) iQuery.findByQuery(sql, param); sql = "select d from Dichroic as d where d.instrument.id = :iid"; Dichroic dichroic = (Dichroic) iQuery.findByQuery(sql, param); sql = "select d from OTF as d where d.instrument.id = :iid"; OTF otf = (OTF) iQuery.findByQuery(sql, param); sql = "select d from Objective as d where d.instrument.id = :iid"; Objective objective = (Objective) iQuery.findByQuery(sql, param); img.setInstrument(instrument); img.setImagingEnvironment(mmFactory.createImageEnvironment()); img.setObjectiveSettings(mmFactory.createObjectiveSettings(objective)); img.setStageLabel(mmFactory.createStageLabel()); iUpdate.saveAndReturnObject(img); param = new ParametersI(); param.acquisitionData(); List<Long> ids = new ArrayList<Long>(); ids.add(img.getId().getValue()); // method already tested in omero.gateway.modelService test List<Image> results = factory.getContainerService().getImages( Image.class.getName(), ids, param); img = results.get(0); ObjectiveSettings settings = img.getObjectiveSettings(); StageLabel label = img.getStageLabel(); ImagingEnvironment env = img.getImagingEnvironment(); LogicalChannel lc; Channel channel; ids = new ArrayList<Long>(); long detectorSettingsID = 0; long lightSourceSettingsID = 0; long lightPathID = 0; for (int i = 0; i < pixels.getSizeC().getValue(); i++) { channel = pixels.getChannel(i); lc = channel.getLogicalChannel(); lc.setOtf(otf); lc.setDetectorSettings(mmFactory.createDetectorSettings(detector)); lc.setFilterSet(filterSet); lc.setLightSourceSettings(mmFactory.createLightSettings(laser)); lc.setLightPath(mmFactory.createLightPath(null, dichroic, null)); lc = (LogicalChannel) iUpdate.saveAndReturnObject(lc); assertNotNull(lc); ids.add(lc.getId().getValue()); detectorSettingsID = lc.getDetectorSettings().getId().getValue(); lightSourceSettingsID = lc.getLightSourceSettings().getId() .getValue(); lightPathID = lc.getLightPath().getId().getValue(); } // Now we try to delete the image. Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); // Follow the section with acquisition data. // Now check if the settings are still there. param = new ParametersI(); param.addId(detectorSettingsID); sql = "select d from DetectorSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(lightSourceSettingsID); sql = "select d from LightSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(lightPathID); sql = "select d from LightPath as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // instrument param.addId(instrument.getId().getValue()); sql = "select d from Instrument as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(detector.getId().getValue()); sql = "select d from Detector as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(otf.getId().getValue()); sql = "select d from OTF as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(objective.getId().getValue()); sql = "select d from Objective as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(dichroic.getId().getValue()); sql = "select d from Dichroic as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(filterSet.getId().getValue()); sql = "select d from FilterSet as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(laser.getId().getValue()); sql = "select d from Laser as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(settings.getId().getValue()); sql = "select d from ObjectiveSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(env.getId().getValue()); sql = "select d from ImagingEnvironment as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(env.getId().getValue()); sql = "select d from StageLabel as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } /** * Test to delete an image with ROis. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithROIs() throws Exception { Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Roi roi = new RoiI(); roi.setImage(image); Rectangle rect; Roi serverROI = (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)); serverROI.addShape(rect); } serverROI = (RoiI) iUpdate.saveAndReturnObject(serverROI); List<Long> shapeIds = new ArrayList<Long>(); Shape shape; for (int i = 0; i < serverROI.sizeOfShapes(); i++) { shape = serverROI.getShape(i); shapeIds.add(shape.getId().getValue()); } // Delete the image. Delete2 dc = Requests.delete("Image", image.getId().getValue()); callback(true, client, dc); // check if the objects have been delete. ParametersI param = new ParametersI(); param.addId(serverROI.getId().getValue()); String sql = "select d from Roi as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // shapes param = new ParametersI(); param.addIds(shapeIds); sql = "select d from Shape as d where d.id in (:ids)"; List<IObject> results = iQuery.findAllByQuery(sql, param); assertEquals(results.size(), 0); } /** * Test to deletes rois as root. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteROIs() throws Exception { Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Roi roi = new RoiI(); roi.setImage(image); Rectangle rect; Roi serverROI = (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)); serverROI.addShape(rect); } serverROI = (RoiI) iUpdate.saveAndReturnObject(serverROI); List<Long> shapeIds = new ArrayList<Long>(); Shape shape; for (int i = 0; i < serverROI.sizeOfShapes(); i++) { shape = serverROI.getShape(i); shapeIds.add(shape.getId().getValue()); } Delete2 dc = Requests.delete("Roi", serverROI.getId().getValue()); callback(true, client, dc); // make sure we still have the image ParametersI param = new ParametersI(); param.addId(image.getId().getValue()); String sql = "select d from Image as d where d.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); // check if the objects have been delete. param = new ParametersI(); param.addId(serverROI.getId().getValue()); sql = "select d from Roi as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // shapes param = new ParametersI(); param.addIds(shapeIds); sql = "select d from Shape as d where d.id in (:ids)"; assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); } /** * Test to delete object with annotations that cannot be shared e.g. * Comments. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectWithNonSharableAnnotations() throws Exception { Map<String, IObject> objects = createIObjects(); IObject obj = null; Long id = null; String type = null; List<Long> annotationIds; ParametersI param; String sql; List<IObject> l; for (Map.Entry<String, IObject> entry : objects.entrySet()) { type = entry.getKey(); obj = entry.getValue(); id = obj.getId().getValue(); annotationIds = createNonSharableAnnotation(obj, null); Delete2 dc = Requests.delete(type, id); callback(true, client, dc); assertDoesNotExist(obj); param = new ParametersI(); param.addIds(annotationIds); assertTrue(annotationIds.size() > 0); sql = "select i from Annotation as i where i.id in (:ids)"; l = iQuery.findAllByQuery(sql, param); assertEquals(obj + "-->" + l.toString(), 0, l.size()); } } /** * Test to delete object with annotations that cannot be shared e.g. tags, * terms. One run will delete the annotations, a second will keep them. This * will test the usage of the option parameters. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectWithSharableAnnotations() throws Exception { Boolean[] values = { Boolean.valueOf(false), Boolean.valueOf(true) }; IObject obj = null; String type = null; Long id = null; List<Long> annotationIds; ParametersI param; String sql; List<IObject> l; for (int j = 0; j < values.length; j++) { Map<String, IObject> objects = createIObjects(); for (Map.Entry<String, IObject> entry : objects.entrySet()) { type = entry.getKey(); obj = entry.getValue(); id = obj.getId().getValue(); annotationIds = createSharableAnnotation(obj, null); if (values[j]) { final ChildOption co = Requests.option(null, SHARABLE_TO_KEEP_LIST); final Delete2 dc = Requests.delete(type, id, co); callback(true, client, dc); } else { final Delete2 dc = Requests.delete(type, id); callback(true, client, dc); } param = new ParametersI(); param.addId(id); sql = createBasicContainerQuery(obj.getClass()); assertNull(iQuery.findByQuery(sql, param)); // annotations should be deleted to param = new ParametersI(); param.addIds(annotationIds); assertTrue(annotationIds.size() > 0); sql = "select i from Annotation as i where i.id in (:ids)"; l = iQuery.findAllByQuery(sql, param); if (values[j]) { assertEquals(l.size(), annotationIds.size(), l.size()); } else { assertEquals(l.toString(), 0, l.size()); } } } } /** * Test to delete a plate with non sharable annotations linked to the well * and well samples and plate with Plate acquisition and annotation. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateWithNonSharableAnnotations() throws Exception { Plate p; List<IObject> results; StringBuilder sb; Well well; WellSample field; Iterator<IObject> j; ParametersI param; List<Long> wellSampleIds; List<Long> imageIds; List<Long> annotationIds = new ArrayList<Long>(); List<Long> r; List<IObject> l; p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, 0, false)); param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb = new StringBuilder(); sb.append("select well from Well as well "); sb.append("left outer join fetch well.plate as pt "); sb.append("left outer join fetch well.wellSamples as ws "); sb.append("left outer join fetch ws.image as img "); sb.append("where pt.id = :plateID"); results = iQuery.findAllByQuery(sb.toString(), param); j = results.iterator(); wellSampleIds = new ArrayList<Long>(); imageIds = new ArrayList<Long>(); while (j.hasNext()) { well = (Well) j.next(); r = createNonSharableAnnotation(well, null); if (r.size() > 0) annotationIds.addAll(r); for (int f = 0; f < well.sizeOfWellSamples(); f++) { field = well.getWellSample(f); assertNotNull(field.getImage()); r = createSharableAnnotation(field.getImage(), null); if (r.size() > 0) annotationIds.addAll(r); wellSampleIds.add(field.getId().getValue()); imageIds.add(field.getImage().getId().getValue()); } } // Now delete the plate final Delete2 dc = Requests.delete("Plate", p.getId().getValue()); callback(true, client, dc); param = new ParametersI(); param.addId(p.getId().getValue()); sb = new StringBuilder(); // check the plate sb.append("select p from Plate as p where p.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); // check the well param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb = new StringBuilder(); sb.append("select well from Well as well "); sb.append("left outer join fetch well.plate as pt "); sb.append("where pt.id = :plateID"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the well samples. sb = new StringBuilder(); param = new ParametersI(); param.addIds(wellSampleIds); sb.append("select p from WellSample as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the image. sb = new StringBuilder(); param = new ParametersI(); param.addIds(imageIds); sb.append("select p from Image as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // Check if annotations have been deleted. param = new ParametersI(); param.addIds(annotationIds); assertTrue(annotationIds.size() > 0); sb = new StringBuilder(); sb.append("select i from Annotation as i where i.id in (:ids)"); l = iQuery.findAllByQuery(sb.toString(), param); assertEquals(l.toString(), 0, l.size()); } /** * Test to delete a plate with ROI on images. The ROI will have * measurements. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateWithROIMeasurements() throws Exception { Plate p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, 0, false)); 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); } // 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); long id = fa.getId().getValue(); // link fa to ROI List<IObject> links = new ArrayList<IObject>(); RoiAnnotationLink rl = new RoiAnnotationLinkI(); rl.setChild(new FileAnnotationI(id, false)); rl.setParent(new RoiI(roi.getId().getValue(), false)); links.add(rl); PlateAnnotationLink il = new PlateAnnotationLinkI(); il.setChild(new FileAnnotationI(id, false)); il.setParent(new PlateI(p.getId().getValue(), false)); links.add(il); iUpdate.saveAndReturnArray(links); final ChildOption co = Requests.option(null, "FileAnnotation"); final Delete2 dc = Requests.delete("Plate", p.getId().getValue(), co); callback(true, client, dc); // Shouldn't have measurements ParametersI param = new ParametersI(); param.addId(id); StringBuilder sb = new StringBuilder(); sb.append("select a from Annotation as a "); sb.append("where a.id = :id"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); } /** * Test to delete a plate with sharable annotations linked to the well and * well samples and plate with Plate acquisition and annotation. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateWithSharableAnnotations() throws Exception { int[] values = { 0, 1 }; Boolean[] annotations = { Boolean.valueOf(false), Boolean.valueOf(true) }; int b; Plate p; List<? extends IObject> results; PlateAcquisition pa = null; StringBuilder sb; Well well; WellSample field; Iterator<? extends IObject> j; ParametersI param; List<Long> wellSampleIds; List<Long> imageIds; Set<Long> annotationIds = new HashSet<Long>(); List<Long> r; List<IObject> l; for (int i = 0; i < values.length; i++) { b = values[i]; for (int k = 0; k < annotations.length; k++) { annotationIds.clear(); p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate( 1, 1, 1, b, false)); results = loadWells(p.getId().getValue(), true); sb = new StringBuilder(); param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb.append("select pa from PlateAcquisition as pa " + "where pa.plate.id = :plateID"); pa = (PlateAcquisition) iQuery .findByQuery(sb.toString(), param); j = results.iterator(); wellSampleIds = new ArrayList<Long>(); imageIds = new ArrayList<Long>(); while (j.hasNext()) { well = (Well) j.next(); r = createSharableAnnotation(well, null); if (r.size() > 0) annotationIds.addAll(r); for (int f = 0; f < well.sizeOfWellSamples(); f++) { field = well.getWellSample(f); assertNotNull(field.getImage()); r = createSharableAnnotation(field.getImage(), null); if (r.size() > 0) annotationIds.addAll(r); wellSampleIds.add(field.getId().getValue()); imageIds.add(field.getImage().getId().getValue()); } } if (pa != null && b > 0) { r = createSharableAnnotation(pa, null); if (r.size() > 0) annotationIds.addAll(r); } if (annotations[k]) { final ChildOption co = Requests.option(null, SHARABLE_TO_KEEP_LIST); final Delete2 dc = Requests.delete("Plate", p.getId().getValue(), co); callback(true, client, dc); } else { final Delete2 dc = Requests.delete("Plate", p.getId().getValue()); callback(true, client, dc); } param = new ParametersI(); param.addId(p.getId().getValue()); sb = new StringBuilder(); // check the plate sb.append("select p from Plate as p where p.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); // check the well param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb = new StringBuilder(); sb.append("select well from Well as well "); sb.append("left outer join fetch well.plate as pt "); sb.append("where pt.id = :plateID"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the well samples. sb = new StringBuilder(); param = new ParametersI(); param.addIds(wellSampleIds); sb.append("select p from WellSample as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); // check the image. sb = new StringBuilder(); param = new ParametersI(); param.addIds(imageIds); sb.append("select p from Image as p where p.id in (:ids)"); results = iQuery.findAllByQuery(sb.toString(), param); assertEquals(results.size(), 0); if (pa != null && b > 0) { param = new ParametersI(); param.addId(pa.getId().getValue()); sb = new StringBuilder(); // check the plate sb.append("select p from PlateAcquisition as p " + "where p.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } // Check if annotations have been deleted. param = new ParametersI(); param.addIds(annotationIds); assertTrue(annotationIds.size() > 0); sb = new StringBuilder(); sb.append("select i from Annotation as i where i.id in (:ids)"); l = iQuery.findAllByQuery(sb.toString(), param); if (annotations[k]) { assertEquals(l.toString(), annotationIds.size(), l.size()); } else { assertEquals(l.toString(), 0, l.size()); } } } } /** * Tests to delete a dataset with images. * * @throws Exception * Thrown if an error occurred. */ @Test public void testCascadingDeleteDatasetAsRoot() throws Exception { Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Image img1 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); Image img2 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); DatasetImageLink l = new DatasetImageLinkI(); l.link(new DatasetI(d.getId().getValue(), false), img1); iUpdate.saveAndReturnObject(l); l = new DatasetImageLinkI(); l.link(new DatasetI(d.getId().getValue(), false), img2); iUpdate.saveAndReturnObject(l); final Delete2 dc = Requests.delete("Dataset", d.getId().getValue()); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(d.getId().getValue()); String sql = "select d from Dataset d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); List<Long> ids = new ArrayList<Long>(); ids.add(img1.getId().getValue()); ids.add(img2.getId().getValue()); param = new ParametersI(); param.addIds(ids); sql = "select i from Image i where i.id in (:ids)"; assertEquals(0, iQuery.findAllByQuery(sql, param).size()); } /** * Tests to delete a project with dataset and images. * * @throws Exception * Thrown if an error occurred. */ @Test public void testCascadingDeleteProjectAsRoot() throws Exception { Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Dataset d2 = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Image img1 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); Image img2 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); DatasetImageLink l = new DatasetImageLinkI(); l.link(new DatasetI(d.getId().getValue(), false), img1); iUpdate.saveAndReturnObject(l); l = new DatasetImageLinkI(); l.link(new DatasetI(d.getId().getValue(), false), img2); iUpdate.saveAndReturnObject(l); Project p = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); ProjectDatasetLink pl = new ProjectDatasetLinkI(); pl.link(new ProjectI(p.getId().getValue(), false), new DatasetI(d .getId().getValue(), false)); iUpdate.saveAndReturnObject(pl); pl = new ProjectDatasetLinkI(); pl.link(new ProjectI(p.getId().getValue(), false), d2); iUpdate.saveAndReturnObject(pl); final Delete2 dc = Requests.delete("Project", p.getId().getValue()); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(p.getId().getValue()); String sql = "select p from Project p where p.id = :id"; assertNull(iQuery.findByQuery(sql, param)); List<Long> ids = new ArrayList<Long>(); ids.add(d.getId().getValue()); ids.add(d2.getId().getValue()); param = new ParametersI(); param.addIds(ids); sql = "select d from Dataset d where d.id in (:ids)"; assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); ids.clear(); ids.add(img1.getId().getValue()); ids.add(img2.getId().getValue()); param = new ParametersI(); param.addIds(ids); sql = "select i from Image i where i.id in (:ids)"; assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); } /** * Tests to delete a screen. * * @throws Exception * Thrown if an error occurred. */ @Test public void testCascadingDeleteScreenAsRoot() throws Exception { int[] values = { 0, 1 }; Plate plate; String sql; PlateAcquisition pa = null; ParametersI param; Screen screen; ScreenPlateLink link; for (int i = 0; i < values.length; i++) { param = new ParametersI(); plate = mmFactory.createPlate(1, 1, 1, values[i], false); plate = (Plate) iUpdate.saveAndReturnObject(plate); sql = "select pa from PlateAcquisition as pa " + "where pa.plate.id = :plateID"; param.addLong("plateID", plate.getId().getValue()); pa = (PlateAcquisition) iQuery.findByQuery(sql, param); screen = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); link = new ScreenPlateLinkI(); link.link(screen, plate); iUpdate.saveAndReturnObject(link); final Delete2 dc = Requests.delete("Screen", screen.getId().getValue()); callback(true, client, dc); param = new ParametersI(); sql = "select s from Screen as s where s.id = :id"; param.addId(screen.getId().getValue()); assertNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); sql = "select p from Plate as p where p.id = :id"; param.addId(plate.getId().getValue()); assertNull(iQuery.findByQuery(sql, param)); if (values[i] > 0 && pa != null) { param = new ParametersI(); sql = "select pa from PlateAcquisition as pa " + "where pa.plate.id = :plateID"; param.addLong("plateID", plate.getId().getValue()); assertNull(iQuery.findByQuery(sql, param)); } } } /** * Tests to delete an image with a companion file. This is usually the case * when the image is imported. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithCompanionFile() throws Exception { Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); OriginalFile of = (OriginalFile) iUpdate.saveAndReturnObject(mmFactory .createOriginalFile()); FileAnnotation fa = new FileAnnotationI(); fa.setNs(omero.rtypes.rstring(FileAnnotationData.COMPANION_FILE_NS)); fa.setFile(of); fa = (FileAnnotation) iUpdate.saveAndReturnObject(fa); ImageAnnotationLink l = new ImageAnnotationLinkI(); l.setChild(fa); l.setParent(img); iUpdate.saveAndReturnObject(l); long id = fa.getId().getValue(); final ChildOption co = Requests.option(null, "FileAnnotation"); final Delete2 dc = Requests.delete("Image", img.getId().getValue(), co); callback(true, client, dc); // File annotation should be deleted even if // required to keep file annotation ParametersI param = new ParametersI(); param.addId(id); String sql = "select a from Annotation as a where a.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } /** * Tests to delete an image with a shared Tag. The tag should not be deleted * b/c of the <code>Soft</code> option i.e. default option. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectWithSharedAnnotationSoftOption() throws Exception { int n = SHARABLE_TO_KEEP.size(); // images Image img1 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Image img2 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); List<Long> ids = createSharableAnnotation(img1, img2); assertEquals(n, ids.size()); // now delete the image 1. ChildOption co = Requests.option(null, SHARABLE_TO_KEEP_LIST); Delete2 dc = Requests.delete("Image", img1.getId().getValue(), co); callback(true, client, dc); ParametersI param = new ParametersI(); param.addIds(ids); String sql = "select a from Annotation as a where a.id in (:ids)"; List<IObject> results = iQuery.findAllByQuery(sql, param); assertEquals(n, results.size()); // datasets Dataset d1 = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Dataset d2 = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); ids = createSharableAnnotation(d1, d2); // now delete the dataset 1. co = Requests.option(null, SHARABLE_TO_KEEP_LIST); dc = Requests.delete("Dataset", d1.getId().getValue(), co); callback(true, client, dc); param = new ParametersI(); param.addIds(ids); results = iQuery.findAllByQuery(sql, param); assertEquals(n, results.size()); // projects Project p1 = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); Project p2 = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); ids = createSharableAnnotation(p1, p2); // now delete the project 1. co = Requests.option(null, SHARABLE_TO_KEEP_LIST); dc = Requests.delete("Project", p1.getId().getValue(), co); callback(true, client, dc); param = new ParametersI(); param.addIds(ids); results = iQuery.findAllByQuery(sql, param); assertEquals(n, results.size()); // screens Screen s1 = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); Screen s2 = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); ids = createSharableAnnotation(s1, s2); // now delete the screen 1. co = Requests.option(null, SHARABLE_TO_KEEP_LIST); dc = Requests.delete("Screen", s1.getId().getValue(), co); callback(true, client, dc); param = new ParametersI(); param.addIds(ids); results = iQuery.findAllByQuery(sql, param); assertEquals(n, results.size()); // Plates Plate plate1 = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); Plate plate2 = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); ids = createSharableAnnotation(plate1, plate2); // now delete the plate 1. co = Requests.option(null, SHARABLE_TO_KEEP_LIST); dc = Requests.delete("Plate", plate1.getId().getValue(), co); callback(true, client, dc); param = new ParametersI(); param.addIds(ids); results = iQuery.findAllByQuery(sql, param); assertEquals(n, results.size()); } /** * Tests to delete a shared tag as root. The tag should be deleted but no * the objects linked to it. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteSharableTagAsRoot() throws Exception { Image img1 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Dataset d1 = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Project p1 = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); Screen screen1 = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); Plate plate1 = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); TagAnnotation tag = new TagAnnotationI(); tag.setTextValue(omero.rtypes.rstring("tag shared")); tag = (TagAnnotation) iUpdate.saveAndReturnObject(tag); long tagId = tag.getId().getValue(); List<IObject> links = new ArrayList<IObject>(); ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setChild(tag); link.setParent(img1); links.add(link); DatasetAnnotationLink dl = new DatasetAnnotationLinkI(); dl.setChild(new TagAnnotationI(tagId, false)); dl.setParent(d1); links.add(dl); ProjectAnnotationLink pl = new ProjectAnnotationLinkI(); pl.setChild(new TagAnnotationI(tagId, false)); pl.setParent(p1); links.add(pl); ScreenAnnotationLink sl = new ScreenAnnotationLinkI(); sl.setChild(new TagAnnotationI(tagId, false)); sl.setParent(screen1); links.add(sl); PlateAnnotationLink platel = new PlateAnnotationLinkI(); platel.setChild(new TagAnnotationI(tagId, false)); platel.setParent(plate1); links.add(platel); iUpdate.saveAndReturnArray(links); // delete the tag Delete2 dc = Requests.delete("Annotation", tagId); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(tagId); String sql = "select a from Annotation as a where a.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // We should still have the objects. param = new ParametersI(); param.addId(img1.getId().getValue()); sql = "select a from Image as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(d1.getId().getValue()); sql = "select a from Dataset as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(p1.getId().getValue()); sql = "select a from Project as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(screen1.getId().getValue()); sql = "select a from Screen as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(plate1.getId().getValue()); sql = "select a from Plate as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); } /** * Tests to delete a shared term as root. The tag should be deleted but no * the objects linked to it. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteSharableTermAsRoot() throws Exception { Image img1 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Dataset d1 = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Project p1 = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); Screen screen1 = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); Plate plate1 = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); TermAnnotation tag = new TermAnnotationI(); tag.setTermValue(omero.rtypes.rstring("term shared")); tag = (TermAnnotation) iUpdate.saveAndReturnObject(tag); long tagId = tag.getId().getValue(); List<IObject> links = new ArrayList<IObject>(); ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setChild(tag); link.setParent(img1); links.add(link); DatasetAnnotationLink dl = new DatasetAnnotationLinkI(); dl.setChild(new TagAnnotationI(tagId, false)); dl.setParent(d1); links.add(dl); ProjectAnnotationLink pl = new ProjectAnnotationLinkI(); pl.setChild(new TermAnnotationI(tagId, false)); pl.setParent(p1); links.add(pl); ScreenAnnotationLink sl = new ScreenAnnotationLinkI(); sl.setChild(new TermAnnotationI(tagId, false)); sl.setParent(screen1); links.add(sl); PlateAnnotationLink platel = new PlateAnnotationLinkI(); platel.setChild(new TermAnnotationI(tagId, false)); platel.setParent(plate1); links.add(platel); iUpdate.saveAndReturnArray(links); // delete the tag Delete2 dc = Requests.delete("Annotation", tagId); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(tagId); String sql = "select a from Annotation as a where a.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // We should still have the objects. param = new ParametersI(); param.addId(img1.getId().getValue()); sql = "select a from Image as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(d1.getId().getValue()); sql = "select a from Dataset as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(p1.getId().getValue()); sql = "select a from Project as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(screen1.getId().getValue()); sql = "select a from Screen as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(plate1.getId().getValue()); sql = "select a from Plate as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); } /** * Tests to delete a shared file annotation as root. The tag should be * deleted but no the objects linked to it. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteSharableFileAsRoot() throws Exception { Image img1 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Dataset d1 = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Project p1 = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); Screen screen1 = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); Plate plate1 = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); FileAnnotation tag = new FileAnnotationI(); OriginalFile of = (OriginalFile) iUpdate.saveAndReturnObject(mmFactory .createOriginalFile()); tag.setFile(of); tag = (FileAnnotation) iUpdate.saveAndReturnObject(tag); long tagId = tag.getId().getValue(); List<IObject> links = new ArrayList<IObject>(); ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setChild(tag); link.setParent(img1); links.add(link); DatasetAnnotationLink dl = new DatasetAnnotationLinkI(); dl.setChild(new TagAnnotationI(tagId, false)); dl.setParent(d1); links.add(dl); ProjectAnnotationLink pl = new ProjectAnnotationLinkI(); pl.setChild(new TermAnnotationI(tagId, false)); pl.setParent(p1); links.add(pl); ScreenAnnotationLink sl = new ScreenAnnotationLinkI(); sl.setChild(new TermAnnotationI(tagId, false)); sl.setParent(screen1); links.add(sl); PlateAnnotationLink platel = new PlateAnnotationLinkI(); platel.setChild(new TermAnnotationI(tagId, false)); platel.setParent(plate1); links.add(platel); iUpdate.saveAndReturnArray(links); // delete the tag Delete2 dc = Requests.delete("Annotation", tagId); callback(true, client, dc); ParametersI param = new ParametersI(); param.addId(tagId); String sql = "select a from Annotation as a where a.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // We should still have the objects. param = new ParametersI(); param.addId(img1.getId().getValue()); sql = "select a from Image as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(d1.getId().getValue()); sql = "select a from Dataset as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(p1.getId().getValue()); sql = "select a from Project as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(screen1.getId().getValue()); sql = "select a from Screen as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); param = new ParametersI(); param.addId(plate1.getId().getValue()); sql = "select a from Plate as a where a.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); } /** * Tests to delete screen with a plate and a reagent. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteScreenWithReagent() throws Exception { Screen s = mmFactory.simpleScreenData().asScreen(); Reagent r = mmFactory.createReagent(); s.addReagent(r); Plate p = mmFactory.createPlateWithReagent(1, 1, 1, r); s.linkPlate(p); s = (Screen) iUpdate.saveAndReturnObject(s); long screenId = s.getId().getValue(); // reagent first String sql = "select r from Reagent as r "; sql += "join fetch r.screen as s "; sql += "where s.id = :id"; ParametersI param = new ParametersI(); param.addId(screenId); r = (Reagent) iQuery.findByQuery(sql, param); long reagentID = r.getId().getValue(); // sql = "select s from ScreenPlateLink as s "; sql += "join fetch s.child as c "; sql += "join fetch s.parent as p "; sql += "where p.id = :id"; param = new ParametersI(); param.addId(screenId); ScreenPlateLink link = (ScreenPlateLink) iQuery.findByQuery(sql, param); p = link.getChild(); long plateID = p.getId().getValue(); Delete2 dc = Requests.delete("Screen", screenId); callback(true, client, dc); sql = "select r from Screen as r "; sql += "where r.id = :id"; param = new ParametersI(); param.addId(screenId); assertNull(iQuery.findByQuery(sql, param)); sql = "select r from Reagent as r "; sql += "where r.id = :id"; param = new ParametersI(); param.addId(reagentID); assertNull(iQuery.findByQuery(sql, param)); sql = "select r from Plate as r "; sql += "where r.id = :id"; param = new ParametersI(); param.addId(plateID); assertNull(iQuery.findByQuery(sql, param)); } /** * Tests to delete plate with a reagent. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateWithReagent() throws Exception { Screen s = mmFactory.simpleScreenData().asScreen(); Reagent r = mmFactory.createReagent(); s.addReagent(r); Plate p = mmFactory.createPlateWithReagent(1, 1, 1, r); s.linkPlate(p); s = (Screen) iUpdate.saveAndReturnObject(s); long screenId = s.getId().getValue(); // reagent first String sql = "select r from Reagent as r "; sql += "join fetch r.screen as s "; sql += "where s.id = :id"; ParametersI param = new ParametersI(); param.addId(screenId); r = (Reagent) iQuery.findByQuery(sql, param); long reagentID = r.getId().getValue(); // sql = "select s from ScreenPlateLink as s "; sql += "join fetch s.child as c "; sql += "join fetch s.parent as p "; sql += "where p.id = :id"; param = new ParametersI(); param.addId(screenId); ScreenPlateLink link = (ScreenPlateLink) iQuery.findByQuery(sql, param); p = link.getChild(); long plateID = p.getId().getValue(); Delete2 dc = Requests.delete("Plate", plateID); callback(true, client, dc); sql = "select r from Screen as r "; sql += "where r.id = :id"; param = new ParametersI(); param.addId(screenId); assertNotNull(iQuery.findByQuery(sql, param)); sql = "select r from Reagent as r "; sql += "where r.id = :id"; param = new ParametersI(); param.addId(reagentID); assertNotNull(iQuery.findByQuery(sql, param)); sql = "select r from Plate as r "; sql += "where r.id = :id"; param = new ParametersI(); param.addId(plateID); assertNull(iQuery.findByQuery(sql, param)); } /** * Test to delete a plate with sharable annotations linked to the well and * well samples and plate with Plate acquisition and annotation. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateAcquisitionWithNonSharableAnnotations() throws Exception { Plate p; PlateAcquisition pa = null; StringBuilder sb; ParametersI param; List<Long> annotationIds = new ArrayList<Long>(); p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, 1, false)); sb = new StringBuilder(); param = new ParametersI(); param.addLong("plateID", p.getId().getValue()); sb.append("select pa from PlateAcquisition as pa " + "where pa.plate.id = :plateID"); pa = (PlateAcquisition) iQuery.findByQuery(sb.toString(), param); annotationIds.addAll(createSharableAnnotation(pa, null)); Delete2 dc = Requests.delete("Plate", p.getId().getValue()); callback(true, client, dc); // Check if annotations have been deleted. param = new ParametersI(); param.addIds(annotationIds); sb = new StringBuilder(); sb.append("select i from Annotation as i where i.id in (:ids)"); List<IObject> l = iQuery.findAllByQuery(sb.toString(), param); assertEquals(l.toString(), 0, l.size()); } /** * Test to delete an object with annotations with namespace. All annotations * which do not have the given namespace should be deleted; others should be * kept. * * Example usage: keep all annotations except for comments. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectWithAnnotationWithoutNS() throws Exception { Map<String, IObject> objects = createIObjects(); IObject obj = null; Long id = null; String type = null; List<Long> annotationIds; List<Long> annotationIdsNS; ParametersI param; String sql; List<IObject> l; for (Map.Entry<String, IObject> entry : objects.entrySet()) { type = entry.getKey(); obj = entry.getValue(); id = obj.getId().getValue(); annotationIds = createNonSharableAnnotation(obj, null); annotationIdsNS = createNonSharableAnnotation(obj, NAMESPACE); final ChildOption co = Requests.option(null, "Annotation", NAMESPACE, null); final Delete2 dc = Requests.delete(type, id, co); callback(true, client, dc); assertDoesNotExist(obj); param = new ParametersI(); param.addIds(annotationIds); assertTrue(annotationIds.size() > 0); sql = "select i from Annotation as i where i.id in (:ids)"; l = iQuery.findAllByQuery(sql, param); assertEquals(obj + "-->" + l.toString(), 0, l.size()); param = new ParametersI(); param.addIds(annotationIdsNS); assertTrue(annotationIdsNS.size() > 0); sql = "select i from Annotation as i where i.id in (:ids)"; l = iQuery.findAllByQuery(sql, param); assertEquals(obj + "-->" + l.toString(), annotationIdsNS.size(), l.size()); } } /** * Test to delete an object with annotations with namespace. All annotations * which do not have the given namespace should be deleted; others should be * kept. * * Example usage: keep all annotations except for comments. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteObjectWithAnnotationWithoutNSMultipleNS() throws Exception { Map<String, IObject> objects = createIObjects(); IObject obj = null; Long id = null; String type = null; List<Long> annotationIds; List<Long> annotationIdsNS = new ArrayList<Long>(); ParametersI param; String sql; List<IObject> l; for (Map.Entry<String, IObject> entry : objects.entrySet()) { type = entry.getKey(); obj = entry.getValue(); id = obj.getId().getValue(); annotationIds = createNonSharableAnnotation(obj, null); annotationIdsNS.addAll(createNonSharableAnnotation(obj, NAMESPACE)); annotationIdsNS .addAll(createNonSharableAnnotation(obj, NAMESPACE_2)); List<String> ns = new ArrayList<String>(); ns.add(NAMESPACE); ns.add(NAMESPACE_2); final ChildOption co = Requests.option(null, "Annotation", ns, null); final Delete2 dc = Requests.delete(type, id, co); callback(true, client, dc); assertDoesNotExist(obj); param = new ParametersI(); param.addIds(annotationIds); assertTrue(annotationIds.size() > 0); sql = "select i from Annotation as i where i.id in (:ids)"; l = iQuery.findAllByQuery(sql, param); assertEquals(obj + "-->" + l.toString(), 0, l.size()); param = new ParametersI(); param.addIds(annotationIdsNS); assertTrue(annotationIdsNS.size() > 0); sql = "select i from Annotation as i where i.id in (:ids)"; l = iQuery.findAllByQuery(sql, param); assertEquals(obj + "-->" + l.toString(), annotationIdsNS.size(), l.size()); } } /** * Test to delete an image with acquisition data. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithAcquisitionDataUsingQueue() throws Exception { Image img = mmFactory.createImage(); img = (Image) iUpdate.saveAndReturnObject(img); Pixels pixels = img.getPrimaryPixels(); long pixId = pixels.getId().getValue(); // method already tested in PixelsServiceTest // make sure objects are loaded. pixels = factory.getPixelsService().retrievePixDescription(pixId); // create an instrument. Instrument instrument = mmFactory .createInstrument(ModelMockFactory.LASER); instrument = (Instrument) iUpdate.saveAndReturnObject(instrument); assertNotNull(instrument); // retrieve the elements we need for the settings. // retrieve the detector. ParametersI param = new ParametersI(); param.addLong("iid", instrument.getId().getValue()); String sql = "select d from Detector as d where d.instrument.id = :iid"; Detector detector = (Detector) iQuery.findByQuery(sql, param); sql = "select d from FilterSet as d where d.instrument.id = :iid"; FilterSet filterSet = (FilterSet) iQuery.findByQuery(sql, param); sql = "select d from Laser as d where d.instrument.id = :iid"; Laser laser = (Laser) iQuery.findByQuery(sql, param); sql = "select d from Dichroic as d where d.instrument.id = :iid"; Dichroic dichroic = (Dichroic) iQuery.findByQuery(sql, param); sql = "select d from OTF as d where d.instrument.id = :iid"; OTF otf = (OTF) iQuery.findByQuery(sql, param); sql = "select d from Objective as d where d.instrument.id = :iid"; Objective objective = (Objective) iQuery.findByQuery(sql, param); img.setInstrument(instrument); img.setImagingEnvironment(mmFactory.createImageEnvironment()); img.setObjectiveSettings(mmFactory.createObjectiveSettings(objective)); img.setStageLabel(mmFactory.createStageLabel()); iUpdate.saveAndReturnObject(img); param = new ParametersI(); param.acquisitionData(); List<Long> ids = new ArrayList<Long>(); ids.add(img.getId().getValue()); // method already tested in omero.gateway.modelService test List<Image> results = factory.getContainerService().getImages( Image.class.getName(), ids, param); img = results.get(0); ObjectiveSettings settings = img.getObjectiveSettings(); StageLabel label = img.getStageLabel(); ImagingEnvironment env = img.getImagingEnvironment(); LogicalChannel lc; Channel channel; ids = new ArrayList<Long>(); long detectorSettingsID = 0; long lightSourceSettingsID = 0; long lightPathID = 0; for (int i = 0; i < pixels.getSizeC().getValue(); i++) { channel = pixels.getChannel(i); lc = channel.getLogicalChannel(); lc.setOtf(otf); lc.setDetectorSettings(mmFactory.createDetectorSettings(detector)); lc.setFilterSet(filterSet); lc.setLightSourceSettings(mmFactory.createLightSettings(laser)); lc.setLightPath(mmFactory.createLightPath(null, dichroic, null)); lc = (LogicalChannel) iUpdate.saveAndReturnObject(lc); assertNotNull(lc); ids.add(lc.getId().getValue()); detectorSettingsID = lc.getDetectorSettings().getId().getValue(); lightSourceSettingsID = lc.getLightSourceSettings().getId() .getValue(); lightPathID = lc.getLightPath().getId().getValue(); } // Now we try to delete the image. final Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); // Follow the section with acquisition data. // Now check if the settings are still there. param = new ParametersI(); param.addId(detectorSettingsID); sql = "select d from DetectorSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(lightSourceSettingsID); sql = "select d from LightSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(lightPathID); sql = "select d from LightPath as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // instrument param.addId(instrument.getId().getValue()); sql = "select d from Instrument as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(detector.getId().getValue()); sql = "select d from Detector as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(otf.getId().getValue()); sql = "select d from OTF as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(objective.getId().getValue()); sql = "select d from Objective as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(dichroic.getId().getValue()); sql = "select d from Dichroic as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(filterSet.getId().getValue()); sql = "select d from FilterSet as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(laser.getId().getValue()); sql = "select d from Laser as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(settings.getId().getValue()); sql = "select d from ObjectiveSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(env.getId().getValue()); sql = "select d from ImagingEnvironment as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(label.getId().getValue()); sql = "select d from StageLabel as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } /** * Test to delete an image with an instrument with 2 objectives and 2 OTF. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithInstrument() throws Exception { Image img = mmFactory.createImage(); img = (Image) iUpdate.saveAndReturnObject(img); Pixels pixels = img.getPrimaryPixels(); long pixId = pixels.getId().getValue(); // method already tested in PixelsServiceTest // make sure objects are loaded. pixels = factory.getPixelsService().retrievePixDescription(pixId); // create an instrument. Instrument instrument = mmFactory .createInstrument(ModelMockFactory.LASER); Objective objective = mmFactory.createObjective(); OTF otf = mmFactory.createOTF(instrument.copyFilterSet().get(0), objective); instrument.addOTF(otf); instrument.addObjective(objective); instrument = (Instrument) iUpdate.saveAndReturnObject(instrument); assertNotNull(instrument); // retrieve the elements we need for the settings. // retrieve the detector. ParametersI param = new ParametersI(); param.addLong("iid", instrument.getId().getValue()); String sql = "select d from Detector as d where d.instrument.id = :iid"; Detector detector = (Detector) iQuery.findByQuery(sql, param); sql = "select d from FilterSet as d where d.instrument.id = :iid"; FilterSet filterSet = (FilterSet) iQuery.findByQuery(sql, param); sql = "select d from Laser as d where d.instrument.id = :iid"; Laser laser = (Laser) iQuery.findByQuery(sql, param); sql = "select d from Dichroic as d where d.instrument.id = :iid"; Dichroic dichroic = (Dichroic) iQuery.findByQuery(sql, param); sql = "select d from OTF as d where d.instrument.id = :iid"; List<IObject> l = iQuery.findAllByQuery(sql, param); otf = (OTF) l.get(0); sql = "select d from Objective as d where d.instrument.id = :iid"; l = iQuery.findAllByQuery(sql, param); Iterator<IObject> j = l.iterator(); long objectiveID = otf.getObjective().getId().getValue(); IObject iObject; while (j.hasNext()) { iObject = j.next(); if (objectiveID != iObject.getId().getValue()) { objective = (Objective) iObject; break; } } img.setInstrument(instrument); img.setImagingEnvironment(mmFactory.createImageEnvironment()); img.setObjectiveSettings(mmFactory.createObjectiveSettings(objective)); img.setStageLabel(mmFactory.createStageLabel()); iUpdate.saveAndReturnObject(img); param = new ParametersI(); param.acquisitionData(); List<Long> ids = new ArrayList<Long>(); ids.add(img.getId().getValue()); // method already tested in omero.gateway.modelService test List<Image> results = factory.getContainerService().getImages( Image.class.getName(), ids, param); img = results.get(0); ObjectiveSettings settings = img.getObjectiveSettings(); StageLabel label = img.getStageLabel(); ImagingEnvironment env = img.getImagingEnvironment(); LogicalChannel lc; Channel channel; ids = new ArrayList<Long>(); long detectorSettingsID = 0; long lightSourceSettingsID = 0; long lightPathID = 0; for (int i = 0; i < pixels.getSizeC().getValue(); i++) { channel = pixels.getChannel(i); lc = channel.getLogicalChannel(); lc.setOtf(otf); lc.setDetectorSettings(mmFactory.createDetectorSettings(detector)); lc.setFilterSet(filterSet); lc.setLightSourceSettings(mmFactory.createLightSettings(laser)); lc.setLightPath(mmFactory.createLightPath(null, dichroic, null)); lc = (LogicalChannel) iUpdate.saveAndReturnObject(lc); assertNotNull(lc); ids.add(lc.getId().getValue()); detectorSettingsID = lc.getDetectorSettings().getId().getValue(); lightSourceSettingsID = lc.getLightSourceSettings().getId() .getValue(); lightPathID = lc.getLightPath().getId().getValue(); } // Now we try to delete the image. final Delete2 dc = Requests.delete("Image", img.getId().getValue()); callback(true, client, dc); // Follow the section with acquisition data. // Now check if the settings are still there. param = new ParametersI(); param.addId(detectorSettingsID); sql = "select d from DetectorSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(lightSourceSettingsID); sql = "select d from LightSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(lightPathID); sql = "select d from LightPath as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); // instrument param.addId(instrument.getId().getValue()); sql = "select d from Instrument as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(detector.getId().getValue()); sql = "select d from Detector as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(instrument.getId().getValue()); sql = "select d from OTF as d where d.instrument.id = :id"; assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); sql = "select d from Objective as d where d.instrument.id = :id"; assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); param.addId(dichroic.getId().getValue()); sql = "select d from Dichroic as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(filterSet.getId().getValue()); sql = "select d from FilterSet as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(laser.getId().getValue()); sql = "select d from Laser as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(settings.getId().getValue()); sql = "select d from ObjectiveSettings as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(env.getId().getValue()); sql = "select d from ImagingEnvironment as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); param.addId(env.getId().getValue()); sql = "select d from StageLabel as d where d.id = :id"; assertNull(iQuery.findByQuery(sql, param)); } /** * Test to delete the plate acquisition of a plate with 2 plate * acquisitions. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeletePlateAcquisition() throws Exception { Plate p; ParametersI param; int n = 2; int fields = 3; p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, fields, n, false)); String sql = "select pa from PlateAcquisition as pa "; sql += "where pa.plate.id = :id"; param = new ParametersI(); param.addId(p.getId().getValue()); List<IObject> pas = iQuery.findAllByQuery(sql, param); assertEquals(pas.size(), n); // Delete the first one. long id = pas.get(0).getId().getValue(); param = new ParametersI(); param.addId(id); sql = "select ws from WellSample as ws "; sql += "join fetch ws.plateAcquisition as pa "; sql += "where pa.id = :id"; List<IObject> wellSamples = iQuery.findAllByQuery(sql, param); assertEquals(wellSamples.size(), fields); Delete2 dc = Requests.delete("PlateAcquisition", id); callback(true, client, dc); sql = "select pa from PlateAcquisition as pa "; sql += "where pa.id = :id"; assertNull(iQuery.findByQuery(sql, param)); sql = "select ws from WellSample as ws "; sql += "join fetch ws.plateAcquisition as pa "; sql += "where pa.id = :id"; assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); sql = "select pa from PlateAcquisition as pa "; sql += "where pa.plate.id = :id"; param = new ParametersI(); param.addId(p.getId().getValue()); pas = iQuery.findAllByQuery(sql, param); assertEquals(pas.size(), (n - 1)); PlateAcquisition pa = (PlateAcquisition) pas.get(0); List<Long> annotationIds = new ArrayList<Long>(); annotationIds.addAll(createNonSharableAnnotation(pa, null)); id = pa.getId().getValue(); param = new ParametersI(); param.addId(id); sql = "select ws from WellSample as ws "; sql += "join fetch ws.plateAcquisition as pa "; sql += "where pa.id = :id"; List<IObject> samples = iQuery.findAllByQuery(sql, param); assertEquals(samples.size(), fields); Iterator<IObject> i = samples.iterator(); List<Long> imageIds = new ArrayList<Long>(); WellSample ws; while (i.hasNext()) { ws = (WellSample) i.next(); imageIds.add(ws.getImage().getId().getValue()); annotationIds.addAll(createNonSharableAnnotation(ws.getImage(), null)); } assertEquals(imageIds.size(), fields); assertTrue(annotationIds.size() > 0); // now delete the plate acquisition dc = Requests.delete("PlateAcquisition", id); callback(true, client, dc); // Annotation should be gone sql = "select a from Annotation as a "; sql += "where a.id in (:ids)"; param = new ParametersI(); param.addIds(annotationIds); assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); sql = "select a from Image as a "; sql += "where a.id in (:ids)"; param = new ParametersI(); param.addIds(imageIds); assertEquals(iQuery.findAllByQuery(sql, param).size(), 0); } /** * Test to delete a project but not the datasets. The method tests the * <code>KEEP</code> option. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteProjectNotContent() throws Exception { Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Project p = (Project) iUpdate.saveAndReturnObject(mmFactory .simpleProjectData().asIObject()); ProjectDatasetLink pl = new ProjectDatasetLinkI(); pl.link(new ProjectI(p.getId().getValue(), false), new DatasetI(d .getId().getValue(), false)); iUpdate.saveAndReturnObject(pl); Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); DatasetImageLink dl = new DatasetImageLinkI(); dl.link(new DatasetI(d.getId().getValue(), false), new ImageI(image .getId().getValue(), false)); iUpdate.saveAndReturnObject(dl); // Now delete the project List<String> options = new ArrayList<String>(); options.add(Dataset.class.getSimpleName()); options.add(Image.class.getSimpleName()); long id = p.getId().getValue(); ChildOption co = Requests.option(null, options); Delete2 dc = Requests.delete("Project", id, co); callback(true, client, dc); assertDoesNotExist(p); assertExists(d); assertExists(image); ParametersI param = new ParametersI(); param.addId(image.getId().getValue()); String sql = "select p from DatasetImageLink as p "; sql += "where p.child.id = :id"; assertNotNull(iQuery.findByQuery(sql, param)); } /** * Test to delete a screen but not the plates. The method tests the * <code>KEEP</code> option. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteScreenNotContent() throws Exception { Screen s = (Screen) iUpdate.saveAndReturnObject(mmFactory .simpleScreenData().asIObject()); Plate p = (Plate) iUpdate.saveAndReturnObject(mmFactory .simplePlateData().asIObject()); ScreenPlateLink l = new ScreenPlateLinkI(); l.link(new ScreenI(s.getId().getValue(), false), p); iUpdate.saveAndReturnObject(l); // Now delete the screen long id = s.getId().getValue(); ChildOption co = Requests.option(null, "Plate"); Delete2 dc = Requests.delete("Screen", id, co); callback(true, client, dc); assertDoesNotExist(s); assertExists(p); } /** * Test to delete a dataset but not the images. Test the <code>KEEP</code> * option. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteDatasetNotContent() throws Exception { Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); Pixels pixels = img.getPrimaryPixels(); assertNotNull(pixels); DatasetImageLink l = new DatasetImageLinkI(); l.link(new DatasetI(d.getId().getValue(), false), img); iUpdate.saveAndReturnObject(l); // Now delete the dataset long id = d.getId().getValue(); ChildOption co = Requests.option(null, "Image"); Delete2 dc = Requests.delete("Dataset", id, co); callback(true, client, dc); assertDoesNotExist(d); assertExists(img); assertExists(pixels); } /** * Test to delete images sharing instrument, detector, objective, light etc. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImagesSharingAcquisitionData() throws Exception { Image img1 = mmFactory.createImage(); img1 = (Image) iUpdate.saveAndReturnObject(img1); Pixels pixels = img1.getPrimaryPixels(); long pixId1 = pixels.getId().getValue(); Image img2 = mmFactory.createImage(); img2 = (Image) iUpdate.saveAndReturnObject(img2); pixels = img2.getPrimaryPixels(); long pixId2 = pixels.getId().getValue(); // create an instrument. Instrument instrument = mmFactory .createInstrument(ModelMockFactory.LASER); instrument = (Instrument) iUpdate.saveAndReturnObject(instrument); assertNotNull(instrument); long instrumentID = instrument.getId().getValue(); List<Detector> detectors = instrument.copyDetector(); List<Objective> objectives = instrument.copyObjective(); List<LightSource> lights = instrument.copyLightSource(); List<FilterSet> filterSets = instrument.copyFilterSet(); List<Dichroic> dichroics = instrument.copyDichroic(); assertTrue(detectors.size() > 0); assertTrue(objectives.size() > 0); assertTrue(lights.size() > 0); assertTrue(filterSets.size() > 0); // Objective objective = instrument.c img1.setInstrument(instrument); img1.setObjectiveSettings(mmFactory.createObjectiveSettings(objectives .get(0))); img1 = (Image) iUpdate.saveAndReturnObject(img1); img2.setInstrument(instrument); img2.setObjectiveSettings(mmFactory.createObjectiveSettings(objectives .get(0))); img2 = (Image) iUpdate.saveAndReturnObject(img2); // method already tested in PixelsServiceTest // make sure objects are loaded. IPixelsPrx prx = factory.getPixelsService(); Pixels pixels1 = prx.retrievePixDescription(pixId1); Pixels pixels2 = prx.retrievePixDescription(pixId2); LogicalChannel lc; Channel channel; List<IObject> lcs = new ArrayList<IObject>(); for (int i = 0; i < pixels1.getSizeC().getValue(); i++) { channel = pixels1.getChannel(i); lc = channel.getLogicalChannel(); lc.setDetectorSettings(mmFactory.createDetectorSettings(detectors .get(0))); lc.setFilterSet(filterSets.get(0)); lc.setLightSourceSettings(mmFactory.createLightSettings(lights .get(0))); lc.setLightPath(mmFactory.createLightPath(null, dichroics.get(0), null)); lcs.add(lc); } for (int i = 0; i < pixels2.getSizeC().getValue(); i++) { channel = pixels2.getChannel(i); lc = channel.getLogicalChannel(); lc.setDetectorSettings(mmFactory.createDetectorSettings(detectors .get(0))); lc.setFilterSet(filterSets.get(0)); lc.setLightSourceSettings(mmFactory.createLightSettings(lights .get(0))); lc.setLightPath(mmFactory.createLightPath(null, dichroics.get(0), null)); lcs.add(lc); } iUpdate.saveAndReturnArray(lcs); Delete2 dc = Requests.delete("Image", Arrays.asList(img1.getId().getValue(), img2.getId().getValue())); // Now delete the image. doChange(client, factory, dc, true, null); List<Long> ids = new ArrayList<Long>(); ids.add(img1.getId().getValue()); ids.add(img2.getId().getValue()); ParametersI param = new ParametersI(); param.addIds(ids); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); // check detectors ids.clear(); Iterator<Detector> d = detectors.iterator(); while (d.hasNext()) { ids.add(d.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from Detector i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); ids.clear(); Iterator<Objective> o = objectives.iterator(); while (o.hasNext()) { ids.add(o.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from Objective i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); Iterator<FilterSet> fs = filterSets.iterator(); while (fs.hasNext()) { ids.add(fs.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from FilterSet i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); Iterator<Dichroic> di = dichroics.iterator(); while (di.hasNext()) { ids.add(di.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from Dichroic i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); Iterator<LightSource> l = lights.iterator(); while (l.hasNext()) { ids.add(l.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from LightSource i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); param = new ParametersI(); param.addId(instrumentID); sb = new StringBuilder(); sb.append("select i from Instrument i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } /** * Test to delete images sharing detector settings, objective settings, etc. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImagesSharingAcquisitionSettings() throws Exception { Image img1 = mmFactory.createImage(); img1 = (Image) iUpdate.saveAndReturnObject(img1); Pixels pixels = img1.getPrimaryPixels(); long pixId1 = pixels.getId().getValue(); Image img2 = mmFactory.createImage(); img2 = (Image) iUpdate.saveAndReturnObject(img2); pixels = img2.getPrimaryPixels(); long pixId2 = pixels.getId().getValue(); // create an instrument. Instrument instrument = mmFactory .createInstrument(ModelMockFactory.LASER); instrument = (Instrument) iUpdate.saveAndReturnObject(instrument); assertNotNull(instrument); long instrumentID = instrument.getId().getValue(); List<Detector> detectors = instrument.copyDetector(); List<Objective> objectives = instrument.copyObjective(); List<LightSource> lights = instrument.copyLightSource(); List<FilterSet> filterSets = instrument.copyFilterSet(); List<Dichroic> dichroics = instrument.copyDichroic(); assertTrue(detectors.size() > 0); assertTrue(objectives.size() > 0); assertTrue(lights.size() > 0); assertTrue(filterSets.size() > 0); // Objective objective = instrument. ObjectiveSettings os = mmFactory.createObjectiveSettings(objectives .get(0)); img1.setInstrument(instrument); img1.setObjectiveSettings(os); img1 = (Image) iUpdate.saveAndReturnObject(img1); img2.setInstrument(instrument); img2.setObjectiveSettings(os); img2 = (Image) iUpdate.saveAndReturnObject(img2); // method already tested in PixelsServiceTest // make sure objects are loaded. IPixelsPrx prx = factory.getPixelsService(); Pixels pixels1 = prx.retrievePixDescription(pixId1); Pixels pixels2 = prx.retrievePixDescription(pixId2); LogicalChannel lc; Channel channel; DetectorSettings ds = mmFactory .createDetectorSettings(detectors.get(0)); LightSettings ls = mmFactory.createLightSettings(lights.get(0)); LightPath lp = mmFactory.createLightPath(null, dichroics.get(0), null); List<IObject> lcs = new ArrayList<IObject>(); for (int i = 0; i < pixels1.getSizeC().getValue(); i++) { channel = pixels1.getChannel(i); lc = channel.getLogicalChannel(); lc.setDetectorSettings(ds); lc.setFilterSet(filterSets.get(0)); lc.setLightSourceSettings(ls); lc.setLightPath(lp); lcs.add(lc); } for (int i = 0; i < pixels2.getSizeC().getValue(); i++) { channel = pixels2.getChannel(i); lc = channel.getLogicalChannel(); lc.setDetectorSettings(ds); lc.setFilterSet(filterSets.get(0)); lc.setLightSourceSettings(ls); lc.setLightPath(lp); lcs.add(lc); } iUpdate.saveAndReturnArray(lcs); Delete2 dc = Requests.delete("Image", Arrays.asList(img1.getId().getValue(), img2.getId().getValue())); doChange(client, factory, dc, true, null); // Now delete the image. List<Long> ids = new ArrayList<Long>(); ids.add(img1.getId().getValue()); ids.add(img2.getId().getValue()); ParametersI param = new ParametersI(); param.addIds(ids); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); // check detectors ids.clear(); Iterator<Detector> d = detectors.iterator(); while (d.hasNext()) { ids.add(d.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from Detector i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); ids.clear(); Iterator<Objective> o = objectives.iterator(); while (o.hasNext()) { ids.add(o.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from Objective i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); Iterator<FilterSet> fs = filterSets.iterator(); while (fs.hasNext()) { ids.add(fs.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from FilterSet i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); Iterator<Dichroic> di = dichroics.iterator(); while (di.hasNext()) { ids.add(di.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from Dichroic i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); Iterator<LightSource> l = lights.iterator(); while (l.hasNext()) { ids.add(l.next().getId().getValue()); } param = new ParametersI(); param.addIds(ids); sb = new StringBuilder(); sb.append("select i from LightSource i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); param = new ParametersI(); param.addId(instrumentID); sb = new StringBuilder(); sb.append("select i from Instrument i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } /** * Test to delete images sharing logical channels. This case may happen when * handling Plate. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImagesSharingLogicalChannels() throws Exception { Image img1 = mmFactory.createImage(); img1 = (Image) iUpdate.saveAndReturnObject(img1); Pixels pixels = img1.getPrimaryPixels(); long pixId1 = pixels.getId().getValue(); Image img2 = mmFactory.createImage(); img2 = (Image) iUpdate.saveAndReturnObject(img2); pixels = img2.getPrimaryPixels(); long pixId2 = pixels.getId().getValue(); IPixelsPrx prx = factory.getPixelsService(); Pixels pixels1 = prx.retrievePixDescription(pixId1); Pixels pixels2 = prx.retrievePixDescription(pixId2); Channel channel; LogicalChannel lc; List<LogicalChannel> list = new ArrayList<LogicalChannel>(); for (int i = 0; i < pixels1.getSizeC().getValue(); i++) { channel = pixels1.getChannel(i); lc = channel.getLogicalChannel(); list.add(lc); } List<IObject> l = new ArrayList<IObject>(); for (int i = 0; i < pixels2.getSizeC().getValue(); i++) { channel = pixels1.getChannel(i); channel.setLogicalChannel(list.get(i)); l.add(channel); } iUpdate.saveAndReturnArray(l); Delete2 dc = Requests.delete("Image", Arrays.asList(img1.getId().getValue(), img2.getId().getValue())); doChange(client, factory, dc, true, null); List<Long> ids = new ArrayList<Long>(); ids.add(img1.getId().getValue()); ids.add(img2.getId().getValue()); ParametersI param = new ParametersI(); param.addIds(ids); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); ids.clear(); Iterator<LogicalChannel> j = list.iterator(); while (j.hasNext()) { ids.add(j.next().getId().getValue()); } sb = new StringBuilder(); sb.append("select i from LogicalChannel i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); } /** * After a discussion Sept. 2010, this is expected to fail. An Image in a * Well can only be deleted via the Well or the Plate. */ @Test(groups = {"ticket:2768"}) public void testDeleteImageThatsInAWell() throws Exception { Plate p = (Plate) iUpdate.saveAndReturnObject(mmFactory.createPlate(1, 1, 1, 0, false)); List<Well> wells = loadWells(p.getId().getValue(), false); List<Image> images = new ArrayList<Image>(); for (Well well : wells) { for (WellSample ws : well.copyWellSamples()) { images.add(ws.getImage()); } } assertTrue(images.size() > 0); try { Delete2 dc = Requests.delete("Image", images.get(0).getId().getValue()); callback(true, client, dc); fail("Should not be allowed."); } catch (AssertionError afe) { // Ok. } assertExists(wells.get(0)); assertExists(images.get(0)); } /** * Test to delete multiple images at the same time. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:2877") public void testDeleteMultipleObjectsOfSameType() throws Exception { Image img1 = mmFactory.createImage(); img1 = (Image) iUpdate.saveAndReturnObject(img1); Image img2 = mmFactory.createImage(); img2 = (Image) iUpdate.saveAndReturnObject(img2); List<Long> ids = new ArrayList<Long>(); ids.add(img1.getId().getValue()); ids.add(img2.getId().getValue()); Delete2 dc = Requests.delete("Image", ids); callback(true, client, dc); ParametersI param = new ParametersI(); param.addIds(ids); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), 0); } /** * Test to delete multiple images at the same time. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteMultipleObjectsOfDifferentTypes() throws Exception { Image img1 = mmFactory.createImage(); img1 = (Image) iUpdate.saveAndReturnObject(img1); Dataset d = (Dataset) iUpdate.saveAndReturnObject(mmFactory .simpleDatasetData().asIObject()); Delete2 dc = new Delete2(); dc.targetObjects = ImmutableMap.<String, List<Long>>of( Image.class.getSimpleName(), Collections.singletonList(img1.getId().getValue()), Dataset.class.getSimpleName(), Collections.singletonList(d.getId().getValue())); doChange(client, factory, dc, true, null); ParametersI param = new ParametersI(); param.addId(img1.getId().getValue()); StringBuilder sb = new StringBuilder(); sb.append("select i from Image i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); param = new ParametersI(); param.addId(d.getId().getValue()); sb = new StringBuilder(); sb.append("select i from Dataset i "); sb.append("where i.id = :id"); assertNull(iQuery.findByQuery(sb.toString(), param)); } /** * Test to delete a tagged image. The tag is also linked to another image. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = { "ticket:2945" }) public void testDeleteTaggedImages() throws Exception { Image img1 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); Image img2 = (Image) iUpdate.saveAndReturnObject(mmFactory .simpleImage()); List<Long> ids = createSharableAnnotation(img1, img2); assertTrue(ids.size() > 0); Delete2 dc = Requests.delete("Image", img1.getId().getValue()); callback(true, client, dc); ParametersI param = new ParametersI(); param.addIds(ids); StringBuilder sb = new StringBuilder(); sb.append("select i from Annotation i "); sb.append("where i.id in (:ids)"); assertEquals(iQuery.findAllByQuery(sb.toString(), param).size(), ids.size()); } /** * Tests to delete a file annotation and make sure that the original file is * deleted to. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = { "ticket:2884" }) public void testDeleteFileAnnotation() throws Exception { // creation and linkage have already been tested // File OriginalFile of = (OriginalFile) iUpdate.saveAndReturnObject(mmFactory .createOriginalFile()); FileAnnotation fa = new FileAnnotationI(); fa.setFile(of); Annotation data = (Annotation) iUpdate.saveAndReturnObject(fa); long id = data.getId().getValue(); Delete2 dc = Requests.delete("Annotation", id); callback(true, client, dc); assertDoesNotExist(data); assertDoesNotExist(of); } /** * Test to make sure that the file annotation linked to several images is * kept when one of the images is deleted. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = { "ticket:2884" }) public void testDeleteFileAnnotationMultiplyLinked() throws Exception { // // Create two images // Image image0 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); Image image1 = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); OriginalFile of = (OriginalFile) iUpdate.saveAndReturnObject(mmFactory .createOriginalFile()); of.unload(); // // Create an annotation with a dummy file. // FileAnnotation fa = new FileAnnotationI(); fa.setFile(of); long ofId = of.getId().getValue(); Annotation data = (Annotation) iUpdate.saveAndReturnObject(fa); long id = data.getId().getValue(); RawFileStorePrx prx = factory.createRawFileStore(); try { prx.setFileId(ofId); prx.write(new byte[] { 1, 2, 3, 4 }, 0, 4); } finally { prx.close(); } // // Link annotation to both images // ImageAnnotationLink link0 = new ImageAnnotationLinkI(); link0.link(image0, fa); link0 = (ImageAnnotationLink) iUpdate.saveAndReturnObject(link0); ImageAnnotationLink link1 = new ImageAnnotationLinkI(); link1.link(image1, fa); link1 = (ImageAnnotationLink) iUpdate.saveAndReturnObject(link1); Delete2 dc = Requests.delete("Image", image0.getId().getValue()); callback(true, client, dc); // // Check results // assertExists(of); assertExists(data); assertExists(image1); assertExists(link1); prx = factory.createRawFileStore(); byte[] buf = null; try { prx.setFileId(ofId); buf = prx.read(0, 4); } finally { prx.close(); } assertEquals(new byte[] { 1, 2, 3, 4 }, buf); } /** * Test to delete an image and make sure the original files are removed. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = { "ticket:2884" }) public void testDeleteImageAndOriginalFile() throws Exception { // First create an image Image image = mmFactory.createImage(); image = (Image) iUpdate.saveAndReturnObject(image); Pixels pixels = image.getPrimaryPixels(); OriginalFile f = mmFactory.createOriginalFile(); f = (OriginalFile) iUpdate.saveAndReturnObject(f); RawFileStorePrx svc = factory.createRawFileStore(); svc.setFileId(f.getId().getValue()); byte[] data = new byte[] { 1, 2 }; svc.write(data, 0, data.length); svc.close(); long fileID = f.getId().getValue(); String sql = "select i from OriginalFile i where i.id = :id"; ParametersI param = new ParametersI(); param.addId(fileID); f = (OriginalFile) iQuery.findByQuery(sql, param); // upload file, method tested in RawFileStore assertNotNull(f); PixelsOriginalFileMapI m = new PixelsOriginalFileMapI(); m.setChild(new PixelsI(pixels.getId().getValue(), false)); m.setParent(f); m = (PixelsOriginalFileMapI) iUpdate.saveAndReturnObject(m); long imageID = image.getId().getValue(); Delete2 dc = Requests.delete("Image", imageID); callback(true, client, dc); sql = "select i from Pixels i where i.id = :id"; param = new ParametersI(); param.addId(pixels.getId().getValue()); assertNull(iQuery.findByQuery(sql, param)); assertDoesNotExist(f); } /** * Test to delete an image and make sure the thumbnail is deleted. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithThumbnail() throws Exception { Image image = mmFactory.createImage(); image = (Image) iUpdate.saveAndReturnObject(image); Pixels pixels = image.getPrimaryPixels(); Thumbnail thumbnail = mmFactory.createThumbnail(); thumbnail.setPixels(pixels); thumbnail = (Thumbnail) iUpdate.saveAndReturnObject(thumbnail); assertNotNull(thumbnail); long imageID = image.getId().getValue(); long thumbnailID = thumbnail.getId().getValue(); Delete2 dc = Requests.delete("Image", imageID); callback(true, client, dc); String sql = "select i from Thumbnail i where i.id = :id"; ParametersI param = new ParametersI(); param.addId(thumbnailID); assertNull(iQuery.findByQuery(sql, param)); } /** * Use of the savepoint/release/rollback methods in * {@link ome.services.graphs.BaseGraphSpec} seem to prevent transactions * from being properly rolled back. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = {"ticket:2917"}) public void testTxIntegrity() throws Exception { List<IObject> images = new ArrayList<IObject>(); images.add(mmFactory.createImage()); images.add(mmFactory.createImage()); Fileset fileset = mmFactory.simpleFileset(); ((Image) images.get(0)).setFileset(fileset); ((Image) images.get(1)).setFileset(fileset); List<IObject> objs = iUpdate.saveAndReturnArray(images); Image image0 = (Image) objs.get(0); Image image1 = (Image) objs.get(1); fileset = image0.getFileset(); assertEquals(fileset, image1.getFileset()); try { Delete2 dc = Requests.delete("Image", image0.getId().getValue()); callback(true, client, dc); fail("Should throw on constraint violation"); } catch (AssertionError e) { // ok. constraint violation was thrown, there for the delete() // method failed, so now we can test that the tx was actually // rolled back. } // Now check that everything still exists. assertExists(image0); assertExists(image0.getPrimaryPixels()); assertExists(image1); assertExists(image1.getPrimaryPixels()); assertExists(fileset); } /** * Tests to delete the original file not linked to anything. * * @throws Exception * Thrown if an error occurred. */ @Test public void testSlowDeleteOfOriginalFile() throws Exception { OriginalFile of = (OriginalFile) iUpdate.saveAndReturnObject(mmFactory .createOriginalFile()); Delete2 dc = Requests.delete("OriginalFile", of.getId().getValue()); callback(true, client, dc); assertDoesNotExist(of); } /** * Tests to delete the original file linked to file annotation. * * @throws Exception * Thrown if an error occurred. */ @Test public void testSlowDeleteOfOriginalFileWithAnnotation() throws Exception { OriginalFile of = (OriginalFile) iUpdate.saveAndReturnObject(mmFactory .createOriginalFile()); createSharableAnnotation(of, null); Delete2 dc = Requests.delete("OriginalFile", of.getId().getValue()); callback(true, client, dc); assertDoesNotExist(of); } /** * Tests to delete an object already deleted. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteTwice() throws Exception { Image img = (Image) iUpdate .saveAndReturnObject(mmFactory.createImage()); long id = img.getId().getValue(); Delete2 dc = Requests.delete("Image", id); callback(true, client, dc); callback(false, client, dc); } /** * Tests to delete an image with annotation using the * <code>deleteImage</code> method. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteFullImage() throws Exception { Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); List<Long> ids = createNonSharableAnnotation(image, null); Delete2 dc = Requests.delete("Image", image.getId().getValue()); callback(true, client, dc); String sql = "select a from Annotation as a where a.id in (:ids)"; ParametersI p = new ParametersI(); p.addIds(ids); assertEquals(iQuery.findAllByQuery(sql, p).size(), 0); } /** * Tests to delete an image with plane info linked to the pixels set using * the <code>deleteImage</code> method. * * @throws Exception * Thrown if an error occurred. */ @Test public void testDeleteImageWithPlaneInfo() throws Exception { Image image = (Image) iUpdate.saveAndReturnObject(mmFactory .createImage()); Pixels pixels = image.getPrimaryPixels(); pixels.clearPlaneInfo(); PlaneInfo planeInfo = mmFactory.createPlaneInfo(); planeInfo.setPixels(pixels); planeInfo = (PlaneInfo) iUpdate.saveAndReturnObject(planeInfo); // now Delete the image. assertExists(planeInfo); Delete2 dc = Requests.delete("Image", image.getId().getValue()); callback(true, client, dc); assertDoesNotExist(image); assertDoesNotExist(pixels); assertDoesNotExist(planeInfo); } /** * Tests to delete an imported image. The image should have all the model * objects, a companion file and a thumbnail. * * @throws Exception * Thrown if an error occurred. */ @Test(groups = "ticket:3030") public void testDeleteImportedImage() throws Exception { File f = File.createTempFile("testDeleteImportedImage", "." + ImporterTest.OME_FORMAT); f.deleteOnExit(); mmFactory.createImageFile(f, ModelMockFactory.FORMATS[0]); XMLMockObjects xml = new XMLMockObjects(); XMLWriter writer = new XMLWriter(); writer.writeFile(f, xml.createImageWithAcquisitionData(), true); OMEROMetadataStoreClient importer = new OMEROMetadataStoreClient(); importer.initialize(factory); List<Pixels> list; try { list = importFile(importer, f, ImporterTest.OME_FORMAT, false); } catch (Throwable e) { throw new Exception("cannot import image", e); } IMetadataPrx iMetadata = factory.getMetadataService(); Pixels pixels = list.get(0); long id = pixels.getId().getValue(); pixels = factory.getPixelsService().retrievePixDescription(id); List<Channel> channels = pixels.copyChannels(); assertTrue(channels.size() > 0); Channel channel; Iterator<Channel> j = channels.iterator(); long lcID; List<Long> ids; LogicalChannel lc; List<LogicalChannel> l; List<LogicalChannel> logicalChannels = new ArrayList<LogicalChannel>(); List<LightPath> lightPaths = new ArrayList<LightPath>(); List<DetectorSettings> detectorSettings = new ArrayList<DetectorSettings>(); List<LightSettings> lightSourceSettings = new ArrayList<LightSettings>(); while (j.hasNext()) { channel = j.next(); ids = new ArrayList<Long>(1); lcID = channel.getLogicalChannel().getId().getValue(); ids.add(lcID); l = iMetadata.loadChannelAcquisitionData(ids); lc = (LogicalChannel) l.get(0); logicalChannels.add(lc); lightPaths.add(lc.getLightPath()); detectorSettings.add(lc.getDetectorSettings()); lightSourceSettings.add(lc.getLightSourceSettings()); } String sql = "select info from PlaneInfo as info where pixels.id = :id"; ParametersI param = new ParametersI(); param.addId(id); List<IObject> planes = iQuery.findAllByQuery(sql, param); assertTrue(planes.size() > 0); long imageID = pixels.getImage().getId().getValue(); ParametersI po = new ParametersI(); po.acquisitionData(); ids = new ArrayList<Long>(1); ids.add(imageID); List<Image> images = factory.getContainerService().getImages( Image.class.getName(), ids, po); Image image = images.get(0); long instrumentID = image.getInstrument().getId().getValue(); Instrument instrument = factory.getMetadataService().loadInstrument( instrumentID); ImagingEnvironment env = image.getImagingEnvironment(); Microscope miscrocope = instrument.getMicroscope(); StageLabel stage = image.getStageLabel(); ObjectiveSettings settings = image.getObjectiveSettings(); Experiment experiment = image.getExperiment(); // from instrument List<Detector> detectors = instrument.copyDetector(); List<Dichroic> dichroics = instrument.copyDichroic(); List<Filter> filters = instrument.copyFilter(); List<Objective> objectives = instrument.copyObjective(); List<LightSource> lightSources = instrument.copyLightSource(); List<OTF> otfs = instrument.copyOtf(); // Delete the image. Delete2 dc = Requests.delete("Image", image.getId().getValue()); callback(true, client, dc); assertDoesNotExist(image); assertDoesNotExist(pixels); assertDoesNotExist(instrument); assertDoesNotExist(miscrocope); assertDoesNotExist(env); assertDoesNotExist(stage); assertDoesNotExist(settings); assertDoesNotExist(experiment); Iterator<? extends IObject> i = planes.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = detectors.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = dichroics.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = filters.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = objectives.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = lightSources.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = otfs.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = planes.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = channels.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = logicalChannels.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = lightPaths.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = detectorSettings.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } i = lightSourceSettings.iterator(); while (i.hasNext()) { assertDoesNotExist((IObject) i.next()); } } /** * Simulates an SVS import in which many Pixels are attached to a single, * archived OriginalFile. */ public void testDeletePixelsAndFiles() throws Exception { Image img1 = mmFactory.createImage(); Image img2 = mmFactory.createImage(); OriginalFile file = mmFactory.createOriginalFile(); img1.getPrimaryPixels().linkOriginalFile(file); img2.getPrimaryPixels().linkOriginalFile(file); file = (OriginalFile) iUpdate.saveAndReturnObject(file); img1 = file.linkedPixelsList().get(0).getImage(); img2 = file.linkedPixelsList().get(1).getImage(); assertExists(img1); assertExists(img2); assertExists(file); Delete2 dc = Requests.delete("Image", img1.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img1); assertExists(img2); assertExists(file); dc = Requests.delete("Image", img2.getId().getValue()); callback(true, client, dc); assertDoesNotExist(img1); assertDoesNotExist(img2); assertDoesNotExist(file); } }