/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2008 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.agents.dataBrowser;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageDisplay;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageNode;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.ImageSet;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.WellImageSet;
import org.openmicroscopy.shoola.agents.dataBrowser.browser.WellSampleNode;
import org.openmicroscopy.shoola.util.ui.UIUtilities;
import omero.gateway.model.DataObject;
import omero.gateway.model.DatasetData;
import omero.gateway.model.ExperimenterData;
import omero.gateway.model.FileData;
import omero.gateway.model.GroupData;
import omero.gateway.model.ImageData;
import omero.gateway.model.PermissionData;
import omero.gateway.model.ProjectData;
import omero.gateway.model.TagAnnotationData;
import omero.gateway.model.WellData;
import omero.gateway.model.WellSampleData;
/**
* This class contains a collection of utility static methods that transform
* an hierarchy of {@link DataObject}s into a visualization tree.
* The tree is then displayed in the DataBrowser. For example,
* A list of Projects-Datasets-Images is passed to the
* {@link #transformProjects(Set)} method and transforms into a set
* of ImageSet-ImageSet-ImageNode.
*
* @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
* @since OME3.0
*/
public class DataBrowserTranslator
{
/**
* The left element displayed before the number of items contained in a
* given container.
*/
private static final String LEFT = "[";
/**
* The left element displayed before the number of items contained in a
* given container.
*/
private static final String RIGHT = "]";
/**
* Formats the toolTip of the specified {@link ImageDisplay} node.
*
* @param node The specified node. Mustn't be <code>null</code>.
*/
private static void formatToolTipFor(ImageDisplay node)
{
if (node == null) throw new IllegalArgumentException("No node");
String toolTip = UIUtilities.formatToolTipText(node.getTitle());
node.getTitleBar().setToolTipText(toolTip);
}
/**
* Returns the first element of the specified set.
* Returns <code>null</code> if the set is empty or <code>null</code>.
*
* @param set The set to analyze.
* @return See above.
*/
private static ImageDisplay getFirstElement(Set set)
{
if (set == null || set.size() == 0) return null;
ImageDisplay display = null;
Iterator i = set.iterator();
while (i.hasNext()) {
display = (ImageDisplay) i.next();
break;
}
return display;
}
/**
* Transforms each {@link ImageData} object into a visualization object
* i.e. {@link ImageNode}.
* Then adds the newly created {@link ImageNode} to the specified
* {@link ImageSet parent}.
*
* @param is The {@link ImageData} to transform.
* @param parent The {@link ImageSet parent} of the image node.
* @return The new created {@link ImageNode}.
*/
private static ImageNode linkImageTo(ImageData is, ImageSet parent)
{
long id = is.getId();
String name = "";
if (id >= 0) name = is.getName();
ThumbnailProvider provider = new ThumbnailProvider(is);
ImageNode node = new ImageNode(name, is, provider);
//formatToolTipFor(node);
provider.setImageNode(node);
if (parent != null) parent.addChildDisplay(node);
return node;
}
/**
* Transforms each {@link ExperimenterData} object into a visualization
* object i.e. {@link ImageNode}.
* Then adds the newly created {@link ImageNode} to the specified
* {@link ImageSet parent}.
*
* @param is The {@link ExperimenterData} to transform.
* @param parent The {@link ImageSet parent} of the image node.
* @return The new created {@link ImageNode}.
*/
private static ImageNode linkExperimenterTo(ExperimenterData is,
ImageSet parent)
{
long id = is.getId();
String name = "";
if (id >= 0) name = is.getFirstName()+" "+is.getLastName();
ThumbnailProvider provider = new ThumbnailProvider(is);
ImageNode node = new ImageNode(name, is, provider);
//formatToolTipFor(node);
provider.setImageNode(node);
if (parent != null) parent.addChildDisplay(node);
return node;
}
/**
* Transforms each {@link FileData} object into a visualization
* object i.e. {@link ImageNode}.
* Then adds the newly created {@link ImageNode} to the specified
* {@link ImageSet parent}.
*
* @param is The {@link FileData} to transform.
* @param parent The {@link ImageSet parent} of the image node.
* @return The new created {@link ImageNode}.
*/
private static ImageNode linkFileTo(FileData is, ImageSet parent)
{
long id = is.getId();
String name = "";
if (id >= 0) name = is.getName();
ThumbnailProvider provider = new ThumbnailProvider(is);
ImageNode node = new ImageNode(name, is, provider);
//formatToolTipFor(node);
provider.setImageNode(node);
if (parent != null) parent.addChildDisplay(node);
return node;
}
/**
* Transforms each {@link ImageData} object contained in the specified
* list into a visualization object i.e. {@link ImageNode}.
* Then adds the newly created {@link ImageNode} to the specified
* {@link ImageSet parent}.
*
* @param images Collection of {@link ImageData}s.
* @param parent The {@link ImageSet} corresponding to the
* {@link DataObject} containing the images.
*/
private static void linkImagesTo(Set images, ImageSet parent)
{
if (images == null || parent == null) return;
Iterator i = images.iterator();
ImageData child;
while (i.hasNext()) {
child = (ImageData) i.next();
linkImageTo(child, parent);
}
}
/**
* Links the images contained into the specified {@link DataObject}
* to {@link ImageSet} corresponding to the {@link DataObject}.
*
* @param uo Parent object. Either an instance of
* {@link DatasetData}.
* @return The corresponding {@link ImageDisplay} or <code>null</code>.
*/
private static ImageDisplay linkImages(DataObject uo)
{
ImageSet node = null;
Set images;
if (uo instanceof DatasetData) {
DatasetData ds = (DatasetData) uo;
images = ds.getImages();
String note = "";
if (images != null) note = LEFT+images.size()+RIGHT;
node = new ImageSet(ds.getName(), note, ds);
formatToolTipFor(node);
linkImagesTo(images, node);
}
return node;
}
/**
* Transforms a Projects/Datasets/Images hierarchy into a visualization
* tree.
*
* @param projects Collection of {@link ProjectData}s to transform.
* Mustn't be <code>null</code>.
* @return Collection of corresponding {@link ImageDisplay}s.
*/
private static Set transformProjects(Set projects)
{
if (projects == null)
throw new IllegalArgumentException("No projects.");
Set results = new HashSet();
Iterator i = projects.iterator(), j;
//DataObject
ProjectData ps;
DataObject child;
//visualization object.
ImageSet project;
Set datasets;
//String note = "";
StringBuffer buffer;
while (i.hasNext()) {
ps = (ProjectData) i.next();
buffer = new StringBuffer();
datasets = ps.getDatasets();
if (datasets != null) {
buffer.append(LEFT);
buffer.append(datasets.size());
buffer.append(RIGHT);
}
project = new ImageSet(ps.getName(), buffer.toString(), ps);
formatToolTipFor(project);
if (datasets != null) {
j = datasets.iterator();
while (j.hasNext()) {
child = (DataObject) j.next();
project.addChildDisplay(linkImages(child));
}
}
results.add(project);
}
return results;
}
/**
* Transforms the specified <code>Well</code> object into its corresponding
* visualization object.
*
* @param data The <code>Well</code> to transform
* @return See above.
*/
private static ImageDisplay transformWell(WellData data)
{
if (data == null)
throw new IllegalArgumentException("No well.");
WellSampleData wsd;
ImageData img;
WellImageSet node = new WellImageSet(data);
List<WellSampleData> samples = data.getWellSamples();
WellSampleNode child;
int index = 0;
if (samples == null || samples.size() == 0) {
img = new ImageData();
img.setId(-1);
wsd = new WellSampleData();
wsd.setId(-1);
wsd.setImage(img);
child = createWellImage(wsd, index, node);
node.addWellSample(child);
} else {
Iterator<WellSampleData> i = samples.iterator();
while (i.hasNext()) {
wsd = i.next();
img = wsd.getImage();
child = createWellImage(wsd, index, node);
node.addWellSample(child);
index++;
}
}
return node;
}
/**
* Creates node hosting the well sample.
*
* @param wsd The image data to host.
* @param index The field.
* @param parent The parent of the node.
* @return See above.
*/
private static WellSampleNode createWellImage(WellSampleData wsd, int index,
WellImageSet parent)
{
String name = "";
ImageData is = wsd.getImage();
if (is != null && is.getId() >= 0) name = is.getName();
ThumbnailProvider provider = new ThumbnailProvider(is);
WellSampleNode node = new WellSampleNode(name, wsd, provider, index,
parent);
provider.setImageNode(node);
return node;
}
/**
* Transforms a Datasets/Images hierarchy into a visualization
* tree.
*
* @param tag The {@link TagAnnotationData}s to transform.
* Mustn't be <code>null</code>.
* @return The corresponding {@link ImageDisplay}s.
*/
private static ImageDisplay transformTag(TagAnnotationData tag)
{
if (tag == null)
throw new IllegalArgumentException("No tag.");
ImageSet data = null;
Set tags = tag.getTags();
Set dataObjects = tag.getDataObjects();
String note = "";
Iterator i;
if (tags != null && tags.size() > 0) {
note += LEFT+tags.size()+RIGHT;
data = new ImageSet(tag.getTagValue(), note, tag);
i = tags.iterator();
TagAnnotationData child;
while (i.hasNext()) {
child = (TagAnnotationData) i.next();
data.addChildDisplay(transformTag(child));
}
} if (dataObjects != null && dataObjects.size() > 0) {
note += LEFT+dataObjects.size()+RIGHT;
data = new ImageSet(tag.getTagValue(), note, tag);
DataObject child, dataset;
i = dataObjects.iterator();
ProjectData p;
Iterator k;
Set datasets;
while (i.hasNext()) {
child = (DataObject) i.next();
if (child instanceof ImageData)
linkImageTo((ImageData) child, data);
else if (child instanceof DatasetData) {
data.addChildDisplay(linkImages(child));
} else if (child instanceof ProjectData) {
p = (ProjectData) child;
datasets = p.getDatasets();
if (datasets != null) {
k = datasets.iterator();
while (k.hasNext()) {
dataset = (DataObject) k.next();
data.addChildDisplay(linkImages(dataset));
}
}
}
}
} else data = new ImageSet(tag.getTagValue(), "", tag);
formatToolTipFor(data);
return data;
}
/**
* Transforms the specified {@link DataObject} into its corresponding
* visualization element.
*
* @param project The {@link DataObject} to transform.
* Must be an instance of {@link ProjectData}.
* @return See below.
*/
private static Set transformProject(DataObject project)
{
Set set = new HashSet(1);
set.add(project);
return transformProjects(set);
}
/**
* Transforms a Datasets/Images hierarchy into a visualization
* tree.
*
* @param datasets Collection of {@link DatasetData}s to transform.
* Mustn't be <code>null</code>.
* @return Collection of corresponding {@link ImageDisplay}s.
*/
private static Set transformDatasets(Set datasets)
{
if (datasets == null)
throw new IllegalArgumentException("No datasets.");
Set results = new HashSet();
Iterator i = datasets.iterator();
DataObject ho;
while (i.hasNext()) {
//create datasetNode.
ho = (DataObject) i.next();
results.add(linkImages(ho));
}
return results;
}
/**
* Transforms the specified {@link DataObject} into its corresponding
* visualization element.
*
* @param dataset The {@link DataObject} to transform.
* Must be an instance of {@link DatasetData}.
* @return See below.
*/
private static Set transformDataset(DataObject dataset)
{
Set set = new HashSet(1);
set.add(dataset);
return transformDatasets(set);
}
/**
* Transforms a set of {@link DataObject}s into their corresponding
* visualization objects. The elements of the set can either be
* {@link ProjectData}, {@link DatasetData} or {@link ImageData}.
* The {@link ImageData}s are added to an unclassified {@link ImageSet}.
*
* @param dataObjects The {@link DataObject}s to transform.
* Mustn't be <code>null</code>.
* @return See above.
*/
public static Set transformHierarchy(Collection dataObjects)
{
if (dataObjects == null)
throw new IllegalArgumentException("No objects.");
Set results = new HashSet();
Iterator i = dataObjects.iterator();
DataObject ho;
ImageDisplay child;
while (i.hasNext()) {
ho = (DataObject) i.next();
if (ho instanceof ProjectData)
results.add(getFirstElement(transformProject(ho)));
else if (ho instanceof DatasetData)
results.add(getFirstElement(transformDataset(ho)));
else if (ho instanceof ImageData) {
results.add(linkImageTo((ImageData) ho, null));
} else if (ho instanceof TagAnnotationData) {
child = transformTag((TagAnnotationData) ho);
if (child != null) results.add(child);
} else if (ho instanceof WellData) {
child = transformWell((WellData) ho);
if (child != null) results.add(child);
}
}
return results;
}
/**
* Transforms a set of {@link DataObject}s into their corresponding
* visualization objects. The elements of the set only be {@link ImageData}.
* The {@link ImageData}s are added to a {@link ImageSet}.
*
* @param dataObjects The {@link DataObject}s to transform.
* Mustn't be <code>null</code>.
* @param group The the group the current user selects when
* retrieving the data.
* @return See above.
*/
public static ImageSet transformObjects(Collection dataObjects,
GroupData group)
{
if (dataObjects == null)
throw new IllegalArgumentException("No objects.");
Set results = new HashSet();
DataObject ho;
Iterator i = dataObjects.iterator();
ImageSet groupNode = new ImageSet(group.getName(), group);
while (i.hasNext()) {
ho = (DataObject) i.next();
if (ho instanceof ImageData)
linkImageTo((ImageData) ho, groupNode);
}
return groupNode;
}
/**
* Transforms a set of {@link DataObject}s into their corresponding
* visualization objects. The elements of the set only be {@link ImageData}.
* The {@link ImageData}s are added to a {@link ImageSet}.
*
* @param dataObjects The {@link DataObject}s to transform.
* Mustn't be <code>null</code>.
* @return See above.
*/
public static Set<ImageDisplay> transformObjects(Collection dataObjects)
{
if (dataObjects == null)
throw new IllegalArgumentException("No objects.");
Set<ImageDisplay> results = new HashSet<ImageDisplay>();
DataObject ho;
Iterator i = dataObjects.iterator();
while (i.hasNext()) {
ho = (DataObject) i.next();
if (ho instanceof ImageData)
results.add(linkImageTo((ImageData) ho, null));
}
return results;
}
/**
* Transforms a set of {@link DataObject}s into their corresponding
* visualization objects. The elements of the set only be {@link ImageData}.
* The {@link ImageData}s are added to a {@link ImageSet}.
*
* @param dataObjects The {@link DataObject}s to transform.
* Mustn't be <code>null</code>.
* @return See above.
*/
public static Set transformImages(Collection dataObjects)
{
if (dataObjects == null)
throw new IllegalArgumentException("No objects.");
Set results = new HashSet();
DataObject ho;
Iterator i = dataObjects.iterator();
while (i.hasNext()) {
ho = (DataObject) i.next();
if (ho instanceof ImageData)
results.add(linkImageTo((ImageData) ho, null));
}
return results;
}
/**
* Transforms a set of {@link DataObject}s into their corresponding
* visualization objects. The elements of the set only be
* {@link ExperimenterData}.
* The {@link ExperimenterData}s are added to a {@link ImageSet}.
*
* @param dataObjects The {@link DataObject}s to transform.
* Mustn't be <code>null</code>.
* @return See above.
*/
public static Set transformExperimenters(Collection dataObjects)
{
if (dataObjects == null)
throw new IllegalArgumentException("No objects.");
Set results = new HashSet();
DataObject ho;
Iterator i = dataObjects.iterator();
while (i.hasNext()) {
ho = (DataObject) i.next();
if (ho instanceof ExperimenterData)
results.add(linkExperimenterTo((ExperimenterData) ho, null));
}
return results;
}
/**
* Transforms a set of {@link DataObject}s into their corresponding
* visualization objects. The elements of the set only be {@link FileData}.
* The {@link FileData}s are added to a {@link ImageSet}.
*
* @param dataObjects The {@link DataObject}s to transform.
* Mustn't be <code>null</code>.
* @return See above.
*/
public static Set transformFSFolder(Collection dataObjects)
{
if (dataObjects == null)
throw new IllegalArgumentException("No objects.");
Set results = new HashSet();
DataObject ho;
FileData f;
Iterator i = dataObjects.iterator();
while (i.hasNext()) {
ho = (DataObject) i.next();
if (ho instanceof ImageData) {
results.add(linkImageTo((ImageData) ho, null));
}
}
return results;
}
/**
* Transforms a {@link DataObject} into its corresponding visualization
* object. The object can either be
* {@link ProjectData}, {@link DatasetData} or {@link ImageData}.
* The {@link ImageData}s are added to an unclassified {@link ImageSet}.
*
* @param ho The {@link DataObject} to transform.
* Mustn't be <code>null</code>.
* @return See above.
*/
public static Set transform(DataObject ho)
{
if (ho == null) throw new IllegalArgumentException("No objects.");
Set s = new HashSet(1);
s.add(ho);
return transformHierarchy(s);
}
/**
* Returns <code>true</code> if the specified data object is readable,
* <code>false</code> otherwise, depending on the permission.
*
* @param ho The data object to check.
* @param userID The id of the current user.
* @param groupID The id of the group the current user selects when
* retrieving the data.
* @return See above.
*/
public static boolean isWritable(DataObject ho, long userID, long groupID)
{
PermissionData permissions = ho.getPermissions();
if (userID == ho.getOwner().getId())
return permissions.isUserWrite();
/*
Set groups = ho.getOwner().getGroups();
Iterator i = groups.iterator();
long id = -1;
boolean groupRead = false;
while (i.hasNext()) {
id = ((GroupData) i.next()).getId();
if (groupID == id) {
groupRead = true;
break;
}
}
if (groupRead)
*/
return permissions.isGroupWrite();
//return permissions.isWorldWrite();
}
}