/* * ome.tools.HierarchyTransformations * * Copyright 2006 University of Dundee. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.tools; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import ome.model.IObject; import ome.model.containers.Dataset; import ome.model.containers.Project; import ome.model.core.Image; import ome.util.CBlock; public class HierarchyTransformations { /** * * @param imagesAll * @param block * @return a Set with {@link Image}, {@link Dataset}, and {@link Project}, * instances. */ public static <T extends IObject> Set<T> invertPDI(Set<Image> imagesAll, CBlock<T> block) { Set<T> cleared = new HashSet<T>(); Set<T> hierarchies = new HashSet<T>(); Iterator<Image> i = imagesAll.iterator(); while (i.hasNext()) { Image img = (Image) block.call(i.next()); // Copy needed to prevent ConcurrentModificationExceptions List<Dataset> d_list = img.linkedDatasetList(); Iterator<Dataset> d = d_list.iterator(); if (!d.hasNext()) { hierarchies.add((T) img); } else { while (d.hasNext()) { Dataset ds = (Dataset) block.call(d.next()); if (!cleared.contains(ds)) { // ds.clearImageLinks(); ds.putAt(Dataset.IMAGELINKS, new HashSet()); cleared.add((T) ds); } ds.linkImage(img); // Copy needed to prevent ConcurrentModificationExceptions List<Project> p_list = ds.linkedProjectList(); Iterator<Project> p = p_list.iterator(); if (!p.hasNext()) { hierarchies.add((T) ds); } else { while (p.hasNext()) { Project prj = (Project) block.call(p.next()); if (!cleared.contains(prj)) { // prj.clearDatasetLinks(); prj.putAt(Project.DATASETLINKS, new HashSet()); cleared.add((T) prj); } prj.linkDataset(ds); hierarchies.add((T) prj); } } } } } return hierarchies; } }