import omero.ServerError;
import omero.api.ServiceFactoryPrx;
import omero.grid.Column;
import omero.grid.Data;
import omero.grid.LongColumn;
import omero.grid.SharedResourcesPrx;
import omero.grid.TablePrx;
import omero.model.FileAnnotation;
import omero.model.FileAnnotationI;
import omero.model.Image;
import omero.model.ImageAnnotationLink;
import omero.model.ImageAnnotationLinkI;
import omero.model.ImageI;
import omero.model.OriginalFile;
/**
* Example of working with the {@link omero.grid.TablePrx OMERO.tables API}. A
* Table is created, attached to an {@link Image} and then queried.
*/
public class MeasurementTable {
/**
* The main method takes an optional long from the command line which should
* be the id of a valid Image for the current user. If no id is provided, a
* test image is created.
*/
public static void main(String[] args) throws Exception {
// Configuration for the client object in this case comes
// from the ICE_CONFIG environment variable.
omero.client client = new omero.client();
client.createSession();
try {
// Get or create a valid Image id.
Long imageId = null;
if (args.length > 0) {
imageId = Long.valueOf(args[0]);
}
MeasurementTable table = new MeasurementTable(client, imageId);
table.query();
} finally {
client.closeSession();
System.exit(0);
}
}
public final Long imageId;
TablePrx table;
OriginalFile file;
ServiceFactoryPrx factory;
SharedResourcesPrx resources;
/**
* Creates a new Table service and saves some sample data in it.
*/
MeasurementTable(omero.client client, Long imageId) throws ServerError {
factory = client.getSession();
resources = factory.sharedResources();
if (imageId != null) {
System.out.println("Using image " + imageId);
} else {
imageId = makeImage(client);
System.out.println("Created image " + imageId);
}
this.imageId = imageId;
table = resources.newTable(1, "/examples/test.h5");
try {
attachAnnotation(factory, imageId, table);
// Nulls here mean that column has no data
// We first pass a truncated column to prevent unnecessary network
// communication
LongColumn lc = new LongColumn("a1", "desc", null);
Column[] cols = new Column[] { lc };
table.initialize(cols);
// To send data, we need to initialize the array and set values.
lc.values = new long[10];
for (int i = 0; i < 10; i++) {
lc.values[i] = i;
}
// addData can be called as many times as necessary.
table.addData(cols);
} finally {
table.close();
}
}
/**
* Creates a simple Image with no attached binary data for the example.
*/
Long makeImage(omero.client client) throws ServerError {
Image image = new ImageI();
image.setName(omero.rtypes.rstring("MeasurementTable Example"));
image = (Image) factory.getUpdateService().saveAndReturnObject(image);
return image.getId().getValue();
}
/**
* Creates a {@link FileAnnotation} and attaches it to the given image id.
*/
void attachAnnotation(ServiceFactoryPrx factory, long imageId,
TablePrx table) throws ServerError {
file = table.getOriginalFile();
FileAnnotation annotation = new FileAnnotationI();
annotation.setNs(omero.rtypes
.rstring(omero.constants.namespaces.NSMEASUREMENT.value));
annotation.setFile(file);
ImageAnnotationLink link = new ImageAnnotationLinkI();
link.link(new ImageI(imageId, false), annotation);
link = (ImageAnnotationLink) factory.getUpdateService()
.saveAndReturnObject(link);
}
/**
* A few example queries are made on the table.
*/
void query() throws ServerError {
table = resources.openTable(file);
try {
System.out.println("Rows found:"
+ table.getWhereList("(a1==5)", null, 0, -1, 0).length);
Data data = table.readCoordinates(new long[] { 0, 1, 2, 3, 4, 5, 6,
7, 8, 9 });
LongColumn lc = (LongColumn) data.columns[0];
for (int i = 0; i < lc.values.length; i++) {
System.out.println(i + ":" + lc.values[i]);
}
} finally {
table.close();
}
}
}