/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2016 University of Dundee & Open Microscopy Environment. * 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 training; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import omero.api.IMetadataPrx; import omero.api.IQueryPrx; import omero.api.RawFileStorePrx; import omero.gateway.Gateway; import omero.gateway.LoginCredentials; import omero.gateway.SecurityContext; import omero.gateway.facility.BrowseFacility; import omero.gateway.facility.DataManagerFacility; import omero.log.SimpleLogger; import omero.model.Annotation; import omero.model.ChecksumAlgorithm; import omero.model.ChecksumAlgorithmI; import omero.model.Dataset; import omero.model.DatasetI; import omero.model.FileAnnotation; import omero.model.FileAnnotationI; import omero.model.IObject; import omero.model.ImageAnnotationLink; import omero.model.ImageAnnotationLinkI; import omero.model.OriginalFile; import omero.model.OriginalFileI; import omero.model.ProjectAnnotationLink; import omero.model.ProjectAnnotationLinkI; import omero.model.ProjectDatasetLink; import omero.model.ProjectDatasetLinkI; import omero.model.ProjectI; import omero.model.TagAnnotation; import omero.model.TagAnnotationI; import omero.model.enums.ChecksumAlgorithmSHA1160; import omero.sys.ParametersI; import omero.gateway.model.DatasetData; import omero.gateway.model.ExperimenterData; import omero.gateway.model.FileAnnotationData; import omero.gateway.model.ImageData; import omero.gateway.model.TagAnnotationData; /** * Sample code showing how to write data. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @since Beta4.3.2 */ public class WriteData { //The value used if the configuration file is not used. To edit*/ /** The server address.*/ private static String hostName = "serverName"; /** The username.*/ private static String userName = "userName"; /** The password.*/ private static String password = "password"; /** The id of an image.*/ private static long imageId = 1; /** The id of a project.*/ private static long projectId = 1; //end edit /** Maximum size of data read at once. */ private static final int INC = 262144; /** The image.*/ private ImageData image; private String fileMimeType = "application/octet-stream"; private String description = "description"; private Gateway gateway; private SecurityContext ctx; /** * start-code */ /** * Loads the image. * @param imageID The id of the image to load. * @return See above. */ private ImageData loadImage(long imageID) throws Exception { BrowseFacility browse = gateway.getFacility(BrowseFacility.class); return browse.getImage(ctx, imageID); } // Create dataset // ============== /** * Create a new dataset and link it to existing project. * @param projectId The id of the project. */ private void createNewDataset(long projectId) throws Exception { DataManagerFacility dm = gateway.getFacility(DataManagerFacility.class); //Using IObject directly Dataset dataset = new DatasetI(); dataset.setName(omero.rtypes.rstring("new Name 1")); dataset.setDescription(omero.rtypes.rstring("new description 1")); //Using the pojo DatasetData datasetData = new DatasetData(); datasetData.setName("new Name 2"); datasetData.setDescription("new description 2"); ProjectDatasetLink link = new ProjectDatasetLinkI(); link.setChild(dataset); link.setParent(new ProjectI(projectId, false)); IObject r = dm.saveAndReturnObject(ctx, link); //With pojo link = new ProjectDatasetLinkI(); link.setChild(datasetData.asDataset()); link.setParent(new ProjectI(projectId, false)); r = dm.saveAndReturnObject(ctx, link); } // Create tag // ========== /** * Create a new tag and link it to existing project. * @param projectId The id of the project. */ private void createNewTag(long projectId) throws Exception { DataManagerFacility dm = gateway.getFacility(DataManagerFacility.class); TagAnnotation tag = new TagAnnotationI(); tag.setTextValue(omero.rtypes.rstring("new tag 1")); tag.setDescription(omero.rtypes.rstring("new tag 1")); //Using the pojo TagAnnotationData tagData = new TagAnnotationData("new tag 2"); tagData.setTagDescription("new tag 2"); ProjectAnnotationLink link = new ProjectAnnotationLinkI(); link.setChild(tag); link.setParent(new ProjectI(projectId, false)); IObject r = dm.saveAndReturnObject(ctx, link); //With pojo link = new ProjectAnnotationLinkI(); link.setChild(tagData.asAnnotation()); link.setParent(new ProjectI(projectId, false)); r = dm.saveAndReturnObject(ctx, link); } // Create file annotation // ====================== /** * How to create a file annotation and link to an image. * To attach a file to an object e.g. an image, few objects need to be created: * - an OriginalFile * - a FileAnnotation * - a link between the Image and the FileAnnotation. */ private void createFileAnnotationAndLinkToImage() throws Exception { DataManagerFacility dm = gateway.getFacility(DataManagerFacility.class); // To retrieve the image see above. File file = File.createTempFile("temp-file-name_", ".tmp"); String name = file.getName(); String absolutePath = file.getAbsolutePath(); String path = absolutePath.substring(0, absolutePath.length()-name.length()); // create the original file object. OriginalFile originalFile = new OriginalFileI(); originalFile.setName(omero.rtypes.rstring(name)); originalFile.setPath(omero.rtypes.rstring(path)); originalFile.setSize(omero.rtypes.rlong(file.length())); final ChecksumAlgorithm checksumAlgorithm = new ChecksumAlgorithmI(); checksumAlgorithm.setValue(omero.rtypes.rstring(ChecksumAlgorithmSHA1160.value)); originalFile.setHasher(checksumAlgorithm); originalFile.setMimetype(omero.rtypes.rstring(fileMimeType)); // or "application/octet-stream" // now we save the originalFile object originalFile = (OriginalFile) dm.saveAndReturnObject(ctx, originalFile); // Initialize the service to load the raw data RawFileStorePrx rawFileStore = null; FileInputStream stream = null; try { rawFileStore = gateway.getRawFileService(ctx); rawFileStore.setFileId(originalFile.getId().getValue()); // open file and read stream. stream = new FileInputStream(file); long pos = 0; int rlen; byte[] buf = new byte[INC]; ByteBuffer bbuf; while ((rlen = stream.read(buf)) > 0) { rawFileStore.write(buf, pos, rlen); pos += rlen; bbuf = ByteBuffer.wrap(buf); bbuf.limit(rlen); } originalFile = rawFileStore.save(); } catch (Exception e) { throw new Exception("Cannot read data", e); } finally { if (rawFileStore != null) rawFileStore.close(); if (stream != null) stream.close(); if (file != null) file.delete(); } //now we have an original File in DB and raw data uploaded. // We now need to link the Original file to the image using // the File annotation object. That's the way to do it. FileAnnotation fa = new FileAnnotationI(); fa.setFile(originalFile); fa.setDescription(omero.rtypes.rstring(description)); // The description set above e.g. PointsModel fa.setNs(omero.rtypes.rstring(Setup.TRAINING_NS)); // The name space you have set to identify the file annotation. // save the file annotation. fa = (FileAnnotation) dm.saveAndReturnObject(ctx, fa); // now link the image and the annotation ImageAnnotationLink link = new ImageAnnotationLinkI(); link.setChild(fa); link.setParent(image.asImage()); // save the link back to the server. link = (ImageAnnotationLink) dm.saveAndReturnObject(ctx, link); // To attach to a Dataset use DatasetAnnotationLink; } // Load annotation // =============== /** * Load all the annotations with a given namespace linked to images. */ private void loadAnnotationsLinkedToImage() throws Exception { long userId = gateway.getLoggedInUser().getId(); List<String> nsToInclude = new ArrayList<String>(); nsToInclude.add(Setup.TRAINING_NS); List<String> nsToExclude = new ArrayList<String>(); ParametersI param = new ParametersI(); param.exp(omero.rtypes.rlong(userId)); //load the annotation for a given user. IMetadataPrx proxy = gateway.getMetadataService(ctx); // retrieve the annotations linked to images, for datasets use: omero.model.Dataset.class List<Annotation> annotations = proxy.loadSpecifiedAnnotations( FileAnnotation.class.getName(), nsToInclude, nsToExclude, param); //Do something with annotations. Iterator<Annotation> j = annotations.iterator(); Annotation annotation; FileAnnotationData fa; RawFileStorePrx store = null; File file = File.createTempFile("temp-file-name_", ".tmp"); try { store = gateway.getRawFileService(ctx); int index = 0; FileOutputStream stream = new FileOutputStream(file); OriginalFile of; while (j.hasNext()) { annotation = j.next(); if (annotation instanceof FileAnnotation && index == 0) { fa = new FileAnnotationData((FileAnnotation) annotation); //The id of te original file of = getOriginalFile(fa.getFileID()); store.setFileId(fa.getFileID()); int offset = 0; long size = of.getSize().getValue(); //name of the file of.getName().getValue(); try { for (offset = 0; (offset+INC) < size;) { stream.write(store.read(offset, INC)); offset += INC; } } finally { stream.write(store.read(offset, (int) (size-offset))); stream.close(); } index++; } } } catch (Exception e) { throw new Exception("cannot read the data", e); } finally { if (store != null) store.close(); if (file != null) file.delete(); } } /** * Returns the original file corresponding to the passed id. * @param id The id identifying the file. * @return See above. * @throws Exception If an error occurred. */ private OriginalFile getOriginalFile(long id) throws Exception { ParametersI param = new ParametersI(); param.map.put("id", omero.rtypes.rlong(id)); IQueryPrx svc = gateway.getQueryService(ctx); return (OriginalFile) svc.findByQuery( "select p from OriginalFile as p " + "where p.id = :id", param); } /** * end-code */ /** * Connects and invokes the various methods. * * @param args The login credentials. * @param imageId The image id. * @param projectId The project id. */ WriteData(String[] args, long imageId, long projectId) { LoginCredentials cred = new LoginCredentials(args); gateway = new Gateway(new SimpleLogger()); try { ExperimenterData user = gateway.connect(cred); ctx = new SecurityContext(user.getGroupId()); image = loadImage(imageId); createFileAnnotationAndLinkToImage(); loadAnnotationsLinkedToImage(); createNewDataset(projectId); createNewTag(projectId); } catch (Exception e) { e.printStackTrace(); } finally { try { gateway.disconnect(); // Be sure to disconnect } catch (Exception e) { e.printStackTrace(); } } } /** * Runs the script without configuration options. * * @param args The login credentials. */ public static void main(String[] args) { if (args == null || args.length == 0) args = new String[] { "--omero.host=" + hostName, "--omero.user=" + userName, "--omero.pass=" + password }; new WriteData(args, imageId, projectId); System.exit(0); } }