/** * Walks the {@link Image} graph collecting unloaded instances of all entities for later delete. */ protected void collect(final UnloadedCollector delete, final Image i) { i.collectPixels( new CBlock<Pixels>() { public Pixels call(IObject object) { if (object == null) { return null; // EARLY EXIT. Happening due to image_index=1 } Pixels p = (Pixels) object; p.eachLinkedOriginalFile(delete); p.collectPlaneInfo(delete); for (RenderingDef rdef : p.collectSettings((CBlock<RenderingDef>) null)) { for (ChannelBinding binding : rdef.unmodifiableWaveRendering()) { delete.call(binding); } delete.call(rdef); delete.call(rdef.getQuantization()); } p.collectThumbnails(delete); // Why do we set channel to null here and not waveRendering // above? List<Channel> channels = p.collectChannels((CBlock<Channel>) null); for (int i = 0; i < channels.size(); i++) { Channel channel = channels.set(i, null); delete.call(channel); delete.call(channel.getStatsInfo()); LogicalChannel lc = channel.getLogicalChannel(); if (lc.sizeOfChannels() < 2) { delete.call(lc); } // delete.call(lc.getLightSource()); // // TODO lightsource // delete.call(lc.getAuxLightSource()); // // TODO lightsource // delete.call(lc.getOtf()); // delete.call(lc.getDetectorSettings()); // DetectorSettings ds = lc.getDetectorSettings(); // delete.call(ds.getDetector()); } delete.call(p); return null; } }); for (DatasetImageLink link : i.collectDatasetLinks((CBlock<DatasetImageLink>) null)) { i.removeDatasetImageLink(link, true); delete.call(link); } for (ImageAnnotationLink link : i.collectAnnotationLinks((CBlock<ImageAnnotationLink>) null)) { i.removeImageAnnotationLink(link, true); delete.call(link); } delete.call(i); }