public interface IContainer extends ServiceInterface
The names of the methods correlate to how the function operates:
The options are used to add some constraints to the generic method e.g. load hierarchy trees images for a given user. This mechanism should give us enough flexibility to extend the API if necessary, e.g. in some cases we might want to retrieve the images with or without annotations
Most methods take such an options
map which is built on the
client-side using the Parameters
class. The currently supported
options are:
As outlined in TODO, the semantics of the Omero write API are based on three rules:
isLoaded()
returns false
are assumed filteredgetDetails().isFiltered(String collectionName)
returns true
are assumed filtered. TODO: should we accept isFiltered for all fields?
For all write calls, the options map (see below) must contain the userId and the userGroupId for the newly created objects. TODO umask.
Modifier and Type | Method and Description |
---|---|
<T extends ome.model.IObject> |
createDataObject(T object,
ome.parameters.Parameters options)
Creates the specified data object.
|
ome.model.IObject[] |
createDataObjects(ome.model.IObject[] dataObjects,
ome.parameters.Parameters options)
convenience method to save network calls.
|
<T extends ome.model.IObject> |
findContainerHierarchies(java.lang.Class<T> rootNodeType,
java.util.Set<java.lang.Long> imagesIds,
ome.parameters.Parameters options)
Retrieves hierarchy trees in various hierarchies that contain the
specified Images.
|
java.util.Map |
getCollectionCount(java.lang.String type,
java.lang.String property,
java.util.Set<java.lang.Long> ids,
ome.parameters.Parameters options)
Counts the number of members in a collection for a given object.
|
<T extends ome.model.IObject> |
getImages(java.lang.Class<T> rootNodeType,
java.util.Set<java.lang.Long> rootNodeIds,
ome.parameters.Parameters options)
Retrieve a user's (or all users') images within any given container.
|
java.util.Set<ome.model.core.Image> |
getImagesByOptions(ome.parameters.Parameters options)
Retrieve images by options.
|
java.util.Map<java.lang.Long,java.util.Map<java.lang.Boolean,java.util.List<java.lang.Long>>> |
getImagesBySplitFilesets(java.util.Map<java.lang.Class<? extends ome.model.IObject>,java.util.List<java.lang.Long>> included,
ome.parameters.Parameters options)
Given a list of IDs of certain entity types, calculates which filesets are split such that
a non-empty proper subset of their images are referenced, directly or indirectly, as being
included.
|
java.util.Set<ome.model.core.Image> |
getUserImages(ome.parameters.Parameters options)
Retrieve a user's images.
|
ome.model.ILink[] |
link(ome.model.ILink[] dataObjectLinks,
ome.parameters.Parameters options)
Convenience method for creating links.
|
<T extends ome.model.IObject> |
loadContainerHierarchy(java.lang.Class<T> rootNodeType,
java.util.Set<java.lang.Long> rootNodeIds,
ome.parameters.Parameters options)
Retrieves hierarchy trees rooted by a given node (unless orphan is
specified -- See below)
|
java.util.Collection |
retrieveCollection(ome.model.IObject dataObject,
java.lang.String collectionName,
ome.parameters.Parameters options)
Retrieves a collection with all members initialized ("loaded").
|
void |
unlink(ome.model.ILink[] dataObjectLinks,
ome.parameters.Parameters options)
Removes links between OmeroDataObjects e.g Project-Dataset, Dataset-Image
Note that the objects themselves aren't deleted, only the Link objects.
|
<T extends ome.model.IObject> |
updateDataObject(T dataObject,
ome.parameters.Parameters options)
Updates a data object.
|
ome.model.IObject[] |
updateDataObjects(ome.model.IObject[] dataObjects,
ome.parameters.Parameters options)
convenience method to save network calls.
|
<T extends ome.model.IObject> java.util.Set<ome.model.IObject> loadContainerHierarchy(java.lang.Class<T> rootNodeType, java.util.Set<java.lang.Long> rootNodeIds, ome.parameters.Parameters options)
This method also retrieves the Experimenters linked to the objects in the tree. Similarly, all Images will be linked to their Pixel objects if included.
Note that objects are never duplicated. For example, if an Experimenter
owns all the objects in the retrieved tree, then those objects will be
linked to the same instance of
Experimenter
. Or if an
Image is contained in more than one Dataset in the retrieved tree, then
all enclosing Dataset
objects will point
to the same Image
object. And so on.
rootNodeType
- The type of the root node. Can be
Project
,
Dataset
,
Screen
or
Plate
.
Cannot be null.rootNodeIds
- The ids of the root nodes. Can be null if an Experimenter is
specified in options
, otherwise an Exception
is thrown to prevent all images in the entire database from
being downloaded.options
- Parameters as above. annotator
, leaves
,
orphan
, acquisition data
used.
acquisition data
is only relevant for images
and taken into account if the images are loaded.
If rootNodeIds==null
,
experimenter|group
must be set and filtering
will be applied at the Class-level; e.g. to retrieve a
user's Projects, or user's Datasets. If
rootNodeIds!=null
, the result will be filtered
by the experimenter|group
at the
Image
and intermediate levels if available.
Due to the amount of data potentially linked a Screen/Plate,
the leaves
option is not taken into account.
when the root node is a Screen
.
orphan
implies that objects which are not contained
in an object of rootNodeType should also be returned.
TODO should it be applied at all levels?rootNodeType
, unless orphan
is specified
in which case objects of type rootNodeType
and below
may be returned.<T extends ome.model.IObject> java.util.Set<ome.model.IObject> findContainerHierarchies(java.lang.Class<T> rootNodeType, java.util.Set<java.lang.Long> imagesIds, ome.parameters.Parameters options)
This method will look for all the containers containing the specified Images and then for all containers containing those containers and on up the container hierarchy.
This method returns a Set
with all root nodes that were
found. Every root node is linked to the found objects and so on until the
leaf nodes, which are Image
objects. Note that the type of any
root node in the returned set can be the given rootNodeType, any of its
containees or an image
.
For example, say that you pass in the ids of six Images: i1, i2,
i3, i4, i5, i6
.
If the P/D/I hierarchy in the DB looks like this:
__p1__ / \ _d1_ _d2_ d3 / \ / \ | i1 i2 i3 i4 i5 i6
Then the returned set will contain p1, d3, i5, i6
. All
objects will be properly linked up.
Finally, this method will only retrieve the nodes that are
connected in a tree to the specified leaf image nodes. Back to the
previous example, if d1
contained image
img500
, then the returned object would not
contain img500
. In a similar way, if p1
contained ds300
and this dataset weren't linked to any of
the i1, i2, i3, i4, i5, i6
images, then ds300
would not be part of the returned tree rooted by p1
.
rootNodeType
- top-most type which will be searched for Can be
Project
. Not null.imagesIds
- Contains the ids of the Images that sit at the bottom of the
trees. Not null.options
- Parameters as above. annotator
used.
experimenter|group
may be applied at the
top-level only or at each level in the hierarchy, but will not
apply to the leaf (Image) level.Set
with all root nodes that were found.
TODO decide on use of experimenter option<T extends ome.model.IObject> java.util.Set<ome.model.core.Image> getImages(java.lang.Class<T> rootNodeType, java.util.Set<java.lang.Long> rootNodeIds, ome.parameters.Parameters options)
rootNodeType
- A Class which will have its hierarchy searched for Images. Not
null. TODO types?rootNodeIds
- A set of ids of type rootNodeType
Not null.options
- Parameters as above. No notion of leaves
.
experimenter|group
apply at the Image level.
OPTIONS: - startTime and/or endTime should be
Timestamp.valueOf("YYYY-MM-DD hh:mm:ss.ms");
limit
and offset
are applied at
the Image-level. That is, calling with Dataset.class,
limit == 10 and offset == 0 will
first perform one query to get an effective set of
rootNodeIds, then getImages will be called with an effective
rootNodeType of Image.class and the new ids.
acquisition data
is only relevant for images.Parameters.paginate(Integer, Integer)
,
Parameters.startTime(java.sql.Timestamp)
,
Parameters.endTime(java.sql.Timestamp)
java.util.Set<ome.model.core.Image> getImagesByOptions(ome.parameters.Parameters options)
options
- Parameters as above. No notion of leaves
.
experimenter|group
apply at the Image level and
must be present. OPTIONS: - startTime and/or endTime
should be Timestamp.valueOf("YYYY-MM-DD hh:mm:ss.ms").
acquisition data
is only relevant for images.java.util.Set<ome.model.core.Image> getUserImages(ome.parameters.Parameters options)
options
- Parameters as above. No notion of leaves
.
experimenter|group
apply at the Image level and
must be present.java.util.Map getCollectionCount(java.lang.String type, java.lang.String property, java.util.Set<java.lang.Long> ids, ome.parameters.Parameters options)
type
- The fully-qualified classname of the object to be testedproperty
- Name of the property on that class, omitting getters and
setters.ids
- Set of Longs, the ids of the objects to testoptions
- Parameters. Unused.java.util.Map<java.lang.Long,java.util.Map<java.lang.Boolean,java.util.List<java.lang.Long>>> getImagesBySplitFilesets(java.util.Map<java.lang.Class<? extends ome.model.IObject>,java.util.List<java.lang.Long>> included, ome.parameters.Parameters options)
included
- the entities includedoptions
- parameters, presently ignoredjava.util.Collection retrieveCollection(ome.model.IObject dataObject, java.lang.String collectionName, ome.parameters.Parameters options)
dataObject
- Can be "unloaded".collectionName
- public final static String
from the
IObject.classoptions
- Parameters. Unused.<T extends ome.model.IObject> T createDataObject(T object, ome.parameters.Parameters options)
A placeholder parent object is created if the data object is to be put in a collection.
For example, if the object is a Dataset
, we first create
a Project
as parent then we set the Dataset parent as
follows:
//pseudo-code TODO
Project p = new Project(id,false);
dataset.addProject(p);
then for each parent relationship a DataObject ILink
is
created.
object
- IObject. Supported: Project, Dataset,
Annotation, Group, Experimenter. Not null.options
- Parameters as above.ome.model.IObject[] createDataObjects(ome.model.IObject[] dataObjects, ome.parameters.Parameters options)
dataObjects
- Array of Omero IObjects
options
- Parameters as above.createDataObject(IObject, Parameters)
void unlink(ome.model.ILink[] dataObjectLinks, ome.parameters.Parameters options)
dataObjectLinks
- Not null.options
- Parameters as above.ome.model.ILink[] link(ome.model.ILink[] dataObjectLinks, ome.parameters.Parameters options)
createDataObject(IObject, Parameters)
dataObjectLinks
- Array of links to be created.options
- Parameters as above.<T extends ome.model.IObject> T updateDataObject(T dataObject, ome.parameters.Parameters options)
To link or unlink objects to the specified object, we should call the
methods link or unlink. TODO Or do we use for example
dataset.setProjects(set of projects) to add. Link has to be set as
follows dataset to project and project to dataset.
Alternatively, you can make sure that the collection is exactly
how it should be in the database. If you can't guarantee this, it's best
to send all your collections back as null
dataObject
- Pojos-based IObject. Supported: supported: Project, Dataset,
Annotation, Group, Experimenter.options
- Parameters as above.ome.model.IObject[] updateDataObjects(ome.model.IObject[] dataObjects, ome.parameters.Parameters options)
dataObjects
- options
- Parameters as above.updateDataObject(IObject, Parameters)