/* *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 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.env.data; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import javax.imageio.ImageIO; import javax.swing.filechooser.FileFilter; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; import javax.xml.transform.Templates; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import loci.common.Constants; import loci.common.RandomAccessInputStream; import loci.formats.ImageReader; import loci.formats.tiff.TiffParser; import loci.formats.tiff.TiffSaver; import ome.formats.importer.ImportCandidates; import ome.formats.importer.ImportContainer; import omero.ValidationException; import omero.api.RawPixelsStorePrx; import omero.api.RenderingEnginePrx; import omero.api.ThumbnailStorePrx; import omero.model.Annotation; import omero.model.Channel; import omero.model.Dataset; import omero.model.IObject; import omero.model.Image; import omero.model.Pixels; import omero.model.Project; import omero.model.ProjectDatasetLink; import omero.model.RenderingDef; import omero.model.Screen; import omero.model.ScreenI; import omero.model.TagAnnotation; import omero.romio.PlaneDef; import omero.sys.Parameters; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.RandomStringUtils; import org.openmicroscopy.shoola.env.LookupNames; import org.openmicroscopy.shoola.env.config.Registry; import org.openmicroscopy.shoola.env.data.login.UserCredentials; import org.openmicroscopy.shoola.env.data.model.FileObject; import org.openmicroscopy.shoola.env.data.model.ImportableFile; import org.openmicroscopy.shoola.env.data.model.ImportableObject; import org.openmicroscopy.shoola.env.data.model.MovieExportParam; import org.openmicroscopy.shoola.env.data.model.ProjectionParam; import omero.gateway.model.ROIResult; import org.openmicroscopy.shoola.env.data.model.FigureParam; import org.openmicroscopy.shoola.env.data.model.SaveAsParam; import org.openmicroscopy.shoola.env.data.model.ScriptObject; import org.openmicroscopy.shoola.env.data.util.ModelMapper; import omero.gateway.util.PojoMapper; import org.openmicroscopy.shoola.env.data.util.Resolver; import omero.gateway.SecurityContext; import omero.gateway.exception.DSAccessException; import omero.gateway.exception.DSOutOfServiceException; import omero.gateway.exception.RenderingServiceException; import org.openmicroscopy.shoola.env.data.util.StatusLabel; import org.openmicroscopy.shoola.env.data.util.Target; import omero.log.LogMessage; import org.openmicroscopy.shoola.env.rnd.RenderingControl; import org.openmicroscopy.shoola.env.rnd.PixelsServicesFactory; import org.openmicroscopy.shoola.env.rnd.RndProxyDef; import org.openmicroscopy.shoola.util.filter.file.OMETIFFFilter; import org.openmicroscopy.shoola.util.filter.file.XMLFilter; import org.openmicroscopy.shoola.util.image.geom.Factory; import org.openmicroscopy.shoola.util.image.io.WriterImage; import omero.gateway.model.ChannelData; import omero.gateway.model.DataObject; import omero.gateway.model.DatasetData; import omero.gateway.model.ExperimenterData; import omero.gateway.model.FileAnnotationData; import omero.gateway.model.ImageData; import omero.gateway.model.PixelsData; import omero.gateway.model.ROIData; import omero.gateway.model.ScreenData; import omero.gateway.model.TagAnnotationData; /** * Implementation of the {@link OmeroImageService} I/F. * * @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> * @since OME3.0 */ class OmeroImageServiceImpl implements OmeroImageService { /** The collection of supported file filters. */ private FileFilter[] filters; /** Uses it to gain access to the container's services. */ private Registry context; /** Reference to the entry point to access the <i>OMERO</i> services. */ private OMEROGateway gateway; /** * Returns the number of rendering engines to initialize or reload. * * @param ctx The security context. * @param pixelsID The id of pixels set. * @return See above. * @throws DSOutOfServiceException If the connection is broken, or logged * in. * @throws DSAccessException If an error occurred while trying to * retrieve data from OMEDS service. */ private int getNumberOfRenderingEngines(SecurityContext ctx, long pixelsID) throws DSOutOfServiceException, DSAccessException { int number = 1; Integer workers = (Integer) context.lookup(LookupNames.RE_WORKER); if (workers != null) { number = workers.intValue(); if (number <= 0) number = 1; } if (!gateway.isLargeImage(ctx, pixelsID)) number = 1; return number; } /** * Imports the specified candidates. * * @param ctx The security context. * @param candidates The file to import. * @param status The original status. * @param object The object hosting information about the import. * @param ioList The containers where to import the files. * @param list The list of annotations. * @param userID The identifier of the user. * @param hcs Value returns by the import containers. * @param userName The login name of the user to import for. */ private Object importCandidates(SecurityContext ctx, Map<File, StatusLabel> files, StatusLabel status, ImportableObject object, IObject ioContainer, List<Annotation> list, long userID, boolean close, boolean hcs, String userName) throws DSAccessException, DSOutOfServiceException { if (status.isMarkedAsCancel()) { if (close) gateway.closeImport(ctx, userName); return Boolean.valueOf(false); } Entry<File, StatusLabel> entry; Iterator<Entry<File, StatusLabel>> jj = files.entrySet().iterator(); StatusLabel label = null; File file; boolean toClose = false; int n = files.size()-1; int index = 0; ImportCandidates ic; List<ImportContainer> icContainers; ImportContainer importIc; while (jj.hasNext()) { entry = jj.next(); file = (File) entry.getKey(); if (hcs && !file.getName().endsWith(ImportableObject.DAT_EXTENSION)) if (ioContainer != null && !(ioContainer.getClass().equals(Screen.class) || ioContainer.getClass().equals(ScreenI.class))) ioContainer = null; label = (StatusLabel) entry.getValue(); if (close) { toClose = index == n; index++; } if (!label.isMarkedAsCancel()) { try { if (ioContainer == null) label.setNoContainer(); ic = gateway.getImportCandidates(ctx, object, file, status); icContainers = ic.getContainers(); if (icContainers.size() == 0) { Object o = status.getImportResult(); if (o instanceof ImportException) { label.setCallback(o); } else { label.setCallback(new ImportException( ImportException.FILE_NOT_VALID_TEXT)); } } else { //Check after scanning if (label.isMarkedAsCancel()) label.setCallback(Boolean.valueOf(false)); else { importIc = icContainers.get(0); importIc.setCustomAnnotationList(list); label.setCallback(gateway.importImageFile(ctx, object, ioContainer, importIc, label, toClose, userName)); } } } catch (Exception e) { label.setCallback(e); } } else { label.setCallback(Boolean.valueOf(false)); } } if (close) gateway.closeImport(ctx, userName); return null; } /** * Returns <code>true</code> if the binary data are available, * <code>false</code> otherwise. * * @return See above. */ private boolean isBinaryAvailable() { Boolean b = (Boolean) context.lookup(LookupNames.BINARY_AVAILABLE); if (b == null) return true; return b.booleanValue(); } /** * Creates a <code>BufferedImage</code> from the passed array of bytes. * * @param values The array of bytes. * @return See above. * @throws RenderingServiceException If we cannot create an image. */ private BufferedImage createImage(byte[] values) throws RenderingServiceException { try { return WriterImage.bytesToImage(values); } catch (Exception e) { throw new RenderingServiceException("Cannot create buffered image", e); } } /** * Creates a <code>BufferedImage</code> from the passed array of bytes. * * @param values The array of bytes. * @return See above. * @throws RenderingServiceException If we cannot create an image. */ private BufferedImage createImage(String path) throws FSAccessException { try { return ImageIO.read(new File(path)); } catch (Exception e) { throw new FSAccessException("Cannot create buffered image", e); } } /** * Recycles or creates the container. * * @param ctx The security context. * @param dataset The dataset to create or recycle. * @param container The container to create and link the dataset to. * @param object The object hosting the import option. * @param userName The name of the user to create the data for. * @return See above. * @throws DSOutOfServiceException If the connection is broken, or logged in * @throws DSAccessException If an error occurred while trying to * retrieve data from OMERO service. */ private IObject determineContainer(SecurityContext ctx, DatasetData dataset, DataObject container, ImportableObject object, String userName) throws DSOutOfServiceException, DSAccessException { IObject ioContainer = null; Map<Object, Object> parameters = new HashMap<Object, Object>(); DataObject createdData; IObject project = null; IObject link; if (dataset != null) { //dataset if (dataset.getId() <= 0) { //Check if it has been already been created. //need to create it first if (container != null) { if (container.getId() <= 0) { //project needs to be created to. createdData = object.hasObjectBeenCreated( container, ctx); if (createdData == null) { project = gateway.saveAndReturnObject(ctx, container.asIObject(), parameters, userName); //register object.addNewDataObject( PojoMapper.asDataObject( project)); //now create the dataset ioContainer = gateway.saveAndReturnObject(ctx, dataset.asIObject(), parameters, userName); //register object.registerDataset( project.getId().getValue(), (DatasetData) PojoMapper.asDataObject( ioContainer)); link = (ProjectDatasetLink) ModelMapper.linkParentToChild( (Dataset) ioContainer, (Project) project); link = (ProjectDatasetLink) gateway.saveAndReturnObject(ctx, link, parameters, userName); } else { DatasetData d; d = object.isDatasetCreated( createdData.getId(), dataset); if (d == null) { ioContainer = gateway.saveAndReturnObject(ctx, dataset.asIObject(), parameters, userName); //register object.registerDataset( createdData.getId(), (DatasetData) PojoMapper.asDataObject( ioContainer)); link = (ProjectDatasetLink) ModelMapper.linkParentToChild( (Dataset) ioContainer, (Project) createdData.asProject()); link = (ProjectDatasetLink) gateway.saveAndReturnObject(ctx, link, parameters, userName); } else ioContainer = d.asIObject(); } } else { //project already exists. createdData = object.isDatasetCreated( container.getId(), dataset); if (createdData == null) { ioContainer = gateway.saveAndReturnObject(ctx, dataset.asIObject(), parameters, userName); //register object.registerDataset( container.getId(), (DatasetData) PojoMapper.asDataObject( ioContainer)); //Check that the project still exists IObject ho = gateway.findIObject(ctx, container.asIObject()); if (ho != null) { link = (ProjectDatasetLink) ModelMapper.linkParentToChild( (Dataset) ioContainer, (Project) container.asProject()); link = (ProjectDatasetLink) gateway.saveAndReturnObject(ctx, link, parameters, userName); } } else ioContainer = createdData.asIObject(); } } else { //dataset w/o project. createdData = object.hasObjectBeenCreated(dataset, ctx); if (createdData == null) { ioContainer = gateway.saveAndReturnObject(ctx, dataset.asIObject(), parameters, userName); //register object.addNewDataObject(PojoMapper.asDataObject( ioContainer)); } else ioContainer = createdData.asIObject(); } } else ioContainer = dataset.asIObject(); } else { //check on the container. if (container != null) { if (container.getId() <= 0) { //container needs to be created to. createdData = object.hasObjectBeenCreated( container, ctx); if (createdData == null) { ioContainer = gateway.saveAndReturnObject(ctx, container.asIObject(), parameters, userName); //register object.addNewDataObject( PojoMapper.asDataObject( project)); } else { ioContainer = createdData.asIObject(); } } else ioContainer = container.asIObject(); } } //Check that the container still exist return gateway.findIObject(ctx, ioContainer); } /** * Creates a new instance. * * @param gateway Reference to the OMERO entry point. * Mustn't be <code>null</code>. * @param registry Reference to the registry. Mustn't be <code>null</code>. */ OmeroImageServiceImpl(OMEROGateway gateway, Registry registry) { if (registry == null) throw new IllegalArgumentException("No registry."); if (gateway == null) throw new IllegalArgumentException("No gateway."); context = registry; this.gateway = gateway; } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#loadRenderingControl(SecurityContext, long) */ public RenderingControl loadRenderingControl(SecurityContext ctx, long pixelsID) throws DSOutOfServiceException, DSAccessException, FSAccessException { RenderingControl proxy = PixelsServicesFactory.getRenderingControl(context, Long.valueOf(pixelsID), true); if (proxy == null) { UserCredentials uc = (UserCredentials) context.lookup(LookupNames.USER_CREDENTIALS); int compressionLevel; switch (uc.getSpeedLevel()) { case UserCredentials.MEDIUM: compressionLevel = RenderingControl.MEDIUM; break; case UserCredentials.LOW: compressionLevel = RenderingControl.LOW; break; default: compressionLevel = RenderingControl.UNCOMPRESSED; } Pixels pixels = gateway.getPixels(ctx, pixelsID); if (pixels == null) return null; int number = getNumberOfRenderingEngines(ctx, pixelsID); ExperimenterData exp = (ExperimenterData) context.lookup( LookupNames.CURRENT_USER_DETAILS); List<RenderingEnginePrx> reList = new ArrayList<RenderingEnginePrx>(number); for (int i = 0; i < number; i++) { reList.add(gateway.createRenderingEngine(ctx, pixelsID)); } List<RndProxyDef> defs = gateway.getRenderingSettingsFor( ctx, pixelsID, exp.getId()); Collection<Channel> l = pixels.copyChannels(); Iterator<Channel> i = l.iterator(); List<ChannelData> m = new ArrayList<ChannelData>(l.size()); int index = 0; while (i.hasNext()) { m.add(new ChannelData(index, i.next())); index++; } proxy = PixelsServicesFactory.createRenderingControl(context, ctx, reList, pixels, m, compressionLevel, defs); } return proxy; } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#renderImage(SecurityContext, long, PlaneDef, * boolean, int) */ public Object renderImage(SecurityContext ctx, long pixelsID, PlaneDef pDef, boolean largeImage, int compression) throws RenderingServiceException { try { return PixelsServicesFactory.render(context, ctx, Long.valueOf(pixelsID), pDef, largeImage, compression); } catch (Exception e) { throw new RenderingServiceException("RenderImage", e); } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#isAlive(SecurityContext) */ public boolean isAlive(SecurityContext ctx) throws DSOutOfServiceException { return gateway.getGateway().isAlive(ctx); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#shutDown(SecurityContext,long) */ public void shutDown(SecurityContext ctx, long pixelsID) { try { if (!PixelsServicesFactory.shutDownRenderingControl(context, pixelsID)) gateway.removeREService(ctx, pixelsID); } catch (Exception e) { context.getLogger().error(this, e.getMessage()); } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#getThumbnail(SecurityContext, long, int, int, long) */ public BufferedImage getThumbnail(SecurityContext ctx,long pixID, int sizeX, int sizeY, long userID) throws RenderingServiceException { try { if (pixID < 0) return null; if (!isBinaryAvailable()) return null; return createImage(gateway.getThumbnail(ctx, pixID, sizeX, sizeY, userID)); } catch (Exception e) { if (e instanceof DSOutOfServiceException) { context.getLogger().error(this, e.getMessage()); return null;//getThumbnail(pixID, sizeX, sizeY, userID); } throw new RenderingServiceException("Get Thumbnail", e); } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#getThumbnailSet(SecurityContext, List, int) */ public Map<Long, BufferedImage> getThumbnailSet(SecurityContext ctx, Collection<Long> pixelsID, int max) throws RenderingServiceException { Map<Long, BufferedImage> r = new HashMap<Long, BufferedImage>(); List<Long> ids = new ArrayList<Long>(); Iterator i; try { if (pixelsID == null || pixelsID.size() == 0) return r; Iterator j = pixelsID.iterator(); long id; if (!isBinaryAvailable()) { while (j.hasNext()) { id = (Long) j.next(); r.put(id, null); } return r; } List blocks = new ArrayList(); int index = 0; List l = null; while (j.hasNext()) { if (index == 0) { l = new ArrayList(); } l.add(j.next()); index++; if (index == OMEROGateway.MAX_RETRIEVAL) { blocks.add(l); index = 0; } } if (l != null && l.size() > 0) blocks.add(l); ids.addAll(pixelsID); j = blocks.iterator(); Map m = new HashMap(); Map map; while (j.hasNext()) { map = gateway.getThumbnailSet(ctx, (List) j.next(), max, false); m.putAll(map); } //m = gateway.getThumbnailSet(pixelsID, max, false); if (m == null || m.size() == 0) { i = ids.iterator(); while (i.hasNext()) r.put((Long) i.next(), null); return r; } i = m.keySet().iterator(); byte[] values; while (i.hasNext()) { id = (Long) i.next(); values = (byte[]) m.get(id); ids.remove(id); if (values == null || values.length == 0) r.put(id, null); else { try { r.put(id, createImage(values)); } catch (Exception e) { r.put(id, null); } } } //could not get a thumbnail for remaining images if (ids.size() > 0) { i = ids.iterator(); while (i.hasNext()) r.put((Long) i.next(), null); } return r; } catch (Exception e) { context.getLogger().error(this, e.getMessage()); if (ids.size() > 0) { i = ids.iterator(); while (i.hasNext()) r.put((Long) i.next(), null); } return r; } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#reloadRenderingService(SecurityContext, long) */ public RenderingControl reloadRenderingService(SecurityContext ctx, long pixelsID) throws RenderingServiceException { RenderingControl proxy = PixelsServicesFactory.getRenderingControl(context, Long.valueOf(pixelsID), false); if (proxy == null) return null; try { int number = getNumberOfRenderingEngines(ctx, pixelsID); List<RenderingEnginePrx> proxies = new ArrayList<RenderingEnginePrx>(number); for (int i = 0; i < number; i++) { proxies.add(gateway.createRenderingEngine(ctx, pixelsID)); } return PixelsServicesFactory.reloadRenderingControl(context, pixelsID, proxies); } catch (Exception e) { throw new RenderingServiceException("Cannot restart the " + "rendering engine for : "+pixelsID, e); } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#resetRenderingService(SecurityContext, long) */ public RenderingControl resetRenderingService(SecurityContext ctx, long pixelsID) throws RenderingServiceException { RenderingControl proxy = PixelsServicesFactory.getRenderingControl(context, Long.valueOf(pixelsID), false); if (proxy == null) return null; try { int number = getNumberOfRenderingEngines(ctx, pixelsID); List<RenderingEnginePrx> proxies = new ArrayList<RenderingEnginePrx>(number); for (int i = 0; i < number; i++) { proxies.add(gateway.createRenderingEngine(ctx, pixelsID)); } ExperimenterData exp = (ExperimenterData) context.lookup( LookupNames.CURRENT_USER_DETAILS); RenderingDef def = gateway.getRenderingDef(ctx, pixelsID, exp.getId()); return PixelsServicesFactory.resetRenderingControl(context, pixelsID, proxies, def); } catch (Exception e) { throw new RenderingServiceException("Cannot restart the " + "rendering engine for : "+pixelsID, e); } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#loadPixels(SecurityContext, long) */ public PixelsData loadPixels(SecurityContext ctx, long pixelsID) throws DSOutOfServiceException, DSAccessException { if (pixelsID < 0) throw new IllegalArgumentException("Pixels' ID not valid."); return (PixelsData) PojoMapper.asDataObject( gateway.getPixels(ctx, pixelsID)); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#getPlane(SecurityContext, long, int, int, int) */ public byte[] getPlane(SecurityContext ctx, long pixelsID, int z, int t, int c) throws DSOutOfServiceException, DSAccessException, FSAccessException { if (pixelsID < 0) throw new IllegalArgumentException("Pixels' ID not valid."); return gateway.getPlane(ctx, pixelsID, z, t, c); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#pasteRenderingSettings(SecurityContext, long, * Class, List) */ public Map pasteRenderingSettings(SecurityContext ctx, long pixelsID, Class rootNodeType, List nodesID) throws DSOutOfServiceException, DSAccessException { if (nodesID == null || nodesID.size() == 0) throw new IllegalArgumentException("No nodes specified."); return gateway.pasteRenderingSettings(ctx, pixelsID, rootNodeType, nodesID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#resetRenderingSettings(Class, List) */ public Map resetRenderingSettings(SecurityContext ctx, Class rootNodeType, List nodesID) throws DSOutOfServiceException, DSAccessException { if (nodesID == null || nodesID.size() == 0) throw new IllegalArgumentException("No nodes specified."); return gateway.resetRenderingSettings(ctx, rootNodeType, nodesID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#setMinMaxSettings(SecurityContext, Class, List) */ public Map setMinMaxSettings(SecurityContext ctx, Class rootNodeType, List nodesID) throws DSOutOfServiceException, DSAccessException { if (nodesID == null || nodesID.size() == 0) throw new IllegalArgumentException("No nodes specified."); return gateway.setMinMaxSettings(ctx, rootNodeType, nodesID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#setOwnerRenderingSettings(SecurityContext, Class, * List) */ public Map setOwnerRenderingSettings(SecurityContext ctx, Class rootNodeType, List nodesID) throws DSOutOfServiceException, DSAccessException { if (nodesID == null || nodesID.size() == 0) throw new IllegalArgumentException("No nodes specified."); return gateway.setOwnerRenderingSettings(ctx, rootNodeType, nodesID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#getRenderingSettings(ctx, long, long) */ public Map<DataObject, Collection<RndProxyDef>> getRenderingSettings( SecurityContext ctx, long pixelsID, long userID) throws DSOutOfServiceException, DSAccessException { return gateway.getRenderingSettings(ctx, pixelsID, userID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#getRenderingSettingsFor(long, long) */ public List<RndProxyDef> getRenderingSettingsFor(SecurityContext ctx, long pixelsID, long userID) throws DSOutOfServiceException, DSAccessException { return gateway.getRenderingSettingsFor(ctx, pixelsID, userID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#renderProjected(SecurityContext, long, int, int, * int, int, List) */ public BufferedImage renderProjected(SecurityContext ctx, long pixelsID, int startZ, int endZ, int stepping, int type, List<Integer> channels) throws RenderingServiceException, DSOutOfServiceException { return PixelsServicesFactory.renderProjected(context, pixelsID, startZ, endZ, type, stepping, channels); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#projectImage(SecurityContext, ProjectionParam) */ public ImageData projectImage(SecurityContext ctx, ProjectionParam ref) throws DSOutOfServiceException, DSAccessException { if (ref == null) return null; ImageData image = gateway.projectImage(ctx, ref.getPixelsID(), ref.getStartT(), ref.getEndT(), ref.getStartZ(), ref.getEndZ(), ref.getStepping(), ref.getProjectionType(), ref.getChannels(), ref.getName(), ref.getPixelsType()); if (image == null) return null; Image img = image.asImage(); img.setDescription(omero.rtypes.rstring(ref.getDescription())); image = (ImageData) PojoMapper.asDataObject(gateway.updateObject(ctx, img, new Parameters())); image = gateway.getImage(ctx, image.getId(), new Parameters()); List<DatasetData> datasets = ref.getDatasets(); if (datasets != null && datasets.size() > 0) { Iterator<DatasetData> i = datasets.iterator(); //Check if we need to create a dataset. List<DatasetData> existing = new ArrayList<DatasetData>(); List<DatasetData> toCreate = new ArrayList<DatasetData>(); DatasetData dataset; while (i.hasNext()) { dataset = i.next(); if (dataset.getId() > 0) existing.add(dataset); else toCreate.add(dataset); } if (toCreate.size() > 0) { i = toCreate.iterator(); OmeroDataService svc = context.getDataService(); while (i.hasNext()) { existing.add((DatasetData) svc.createDataObject(ctx, i.next(), ref.getDatasetParent(), null)); } } List<IObject> links = new ArrayList<IObject>(datasets.size()); img = image.asImage(); IObject l; i = existing.iterator(); while (i.hasNext()) { l = ModelMapper.linkParentToChild(img, i.next().asIObject()); links.add(l); } gateway.createObjects(ctx, links); } return image; } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#createRenderingSettings(SecurityContext, long, * RndProxyDef, List) */ public Boolean createRenderingSettings(SecurityContext ctx, long pixelsID, RndProxyDef rndToCopy, List<Integer> indexes) throws DSOutOfServiceException, DSAccessException, FSAccessException { if (rndToCopy == null) { RenderingDef def = gateway.createRenderingDef(ctx, pixelsID); return (def != null); } RenderingControl rndControl = loadRenderingControl(ctx, pixelsID); try { rndControl.copyRenderingSettings(rndToCopy, indexes); //save them rndControl.saveCurrentSettings(); //discard it shutDown(ctx, pixelsID); } catch (Exception e) { throw new DSAccessException("Unable to copy the " + "rendering settings."); } return Boolean.TRUE; } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#loadPlaneInfo(SecurityContext, long, int, int, int) */ public Collection loadPlaneInfo(SecurityContext ctx, long pixelsID, int z, int t, int channel) throws DSOutOfServiceException, DSAccessException { return gateway.loadPlaneInfo(ctx, pixelsID, z, t, channel); } /** * Returns <code>true</code> if the containers are <code>HCS</code> * containers, <code>false</code> otherwise. * * @param containers The collection to handle. * @return See above. */ private boolean isHCS(List<ImportContainer> containers) { if (CollectionUtils.isEmpty(containers)) return false; int count = 0; Iterator<ImportContainer> i = containers.iterator(); ImportContainer ic; while (i.hasNext()) { ic = i.next(); if (ic.getIsSPW()) count++; } return count == containers.size(); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#importFile(ImportableObject, * ImportableFile, long, long, boolean) */ public Object importFile(ImportableObject object, ImportableFile importable, boolean close) throws ImportException, DSAccessException, DSOutOfServiceException { if (importable == null || importable.getFile() == null) throw new IllegalArgumentException("No images to import."); StatusLabel status = importable.getStatus(); SecurityContext ctx = new SecurityContext(importable.getGroup().getId()); //If import as. ExperimenterData loggedIn = context.getAdminService().getUserDetails(); long userID = loggedIn.getId(); String userName = null; if (importable.getUser() != null) { ExperimenterData exp = importable.getUser(); userID = exp.getId(); if (exp.getId() != loggedIn.getId()) userName = exp.getUserName(); } if (status.isMarkedAsCancel()) { if (close) gateway.closeImport(ctx, userName); return Boolean.valueOf(false); } Collection<TagAnnotationData> tags = object.getTags(); List<Annotation> customAnnotationList = new ArrayList<Annotation>(); List<IObject> l; //Tags Map<Object, Object> parameters = new HashMap<Object, Object>(); if (!CollectionUtils.isEmpty(tags)) { List<TagAnnotationData> values = new ArrayList<TagAnnotationData>(); Iterator<TagAnnotationData> i = tags.iterator(); TagAnnotationData tag; l = new ArrayList<IObject>(); while (i.hasNext()) { tag = i.next(); if (tag.getId() > 0) { values.add(tag); customAnnotationList.add((Annotation) tag.asIObject()); } else l.add(tag.asIObject()); } //save the tag. try { if (l.size() > 0) { l = gateway.saveAndReturnObject(ctx, l, parameters, userName); } Iterator<IObject> j = l.iterator(); Annotation a; while (j.hasNext()) { a = (Annotation) j.next(); values.add(new TagAnnotationData((TagAnnotation) a)); customAnnotationList.add(a); // THIS! } object.setTags(values); } catch (Exception e) { LogMessage msg = new LogMessage(); msg.print("Cannot create the tags."); msg.print(e); context.getLogger().error(this, msg); } } IObject link; //prepare the container. List<String> candidates; ImportCandidates ic = null; File file = importable.getFile().getFileToImport(); DatasetData dataset = importable.getDataset(); DataObject container = importable.getParent(); IObject ioContainer = null; DataObject createdData; IObject project = null; DataObject folder = null; boolean hcsFile; boolean hcs; ImportContainer importIc; List<ImportContainer> icContainers; if (file.isFile()) { ic = gateway.getImportCandidates(ctx, object, file, status); if (CollectionUtils.isEmpty(ic.getContainers())) { Object o = status.getImportResult(); if (o instanceof ImportException) { return o; } ImportException e = new ImportException( ImportException.FILE_NOT_VALID_TEXT); status.setCallback(e); status.setText(ImportException.FILE_NOT_VALID_TEXT); return e; } hcsFile = isHCS(ic.getContainers()); //Create the container if required. if (hcsFile) { if (ic != null) { candidates = ic.getPaths(); if (candidates.size() == 1) { String value = candidates.get(0); if (!file.getAbsolutePath().equals(value) && object.isFileinQueue(value)) { if (close) gateway.closeImport(ctx, userName); status.markedAsDuplicate(); return Boolean.valueOf(true); } } } dataset = null; if (!(container instanceof ScreenData)) container = null; } //remove hcs check if we want to create screen from folder. if (!hcsFile && importable.isFolderAsContainer()) { //we have to import the image in this container. folder = object.createFolderAsContainer(importable, hcsFile); DatasetData d = null; DataObject c = container; if (folder instanceof DatasetData) d = (DatasetData) folder; else if (folder instanceof ScreenData) c = folder; try { ioContainer = determineContainer(ctx, d, c, object, userName); status.setContainerFromFolder(PojoMapper.asDataObject( ioContainer)); } catch (Exception e) { LogMessage msg = new LogMessage(); msg.print("Cannot create the container."); msg.print(e); context.getLogger().error(this, msg); } } if (folder == null && dataset != null) { //dataset try { ioContainer = determineContainer(ctx, dataset, container, object, userName); } catch (Exception e) { LogMessage msg = new LogMessage(); msg.print("Cannot create the container hosting the images."); msg.print(e); context.getLogger().error(this, msg); } } else { //no dataset specified. if (container instanceof ScreenData) { if (container.getId() <= 0) { //project needs to be created to. createdData = object.hasObjectBeenCreated( container, ctx); if (createdData == null) { try { ioContainer = gateway.saveAndReturnObject(ctx, container.asIObject(), parameters, userName); //register object.addNewDataObject( PojoMapper.asDataObject( ioContainer)); } catch (Exception e) { LogMessage msg = new LogMessage(); msg.print("Cannot create the Screen hosting " + "the plate."); msg.print(e); context.getLogger().error(this, msg); } } } else { //Check that the container still exists ioContainer = gateway.findIObject(ctx, container.asIObject()); } } } if (ImportableObject.isArbitraryFile(file)) { if (ic == null) //already check if hcs. ic = gateway.getImportCandidates(ctx, object, file, status); candidates = ic.getPaths(); int size = candidates.size(); if (size == 0) { Object o = status.getImportResult(); if (o instanceof ImportException) { return o; } ImportException e = new ImportException( ImportException.FILE_NOT_VALID_TEXT); status.setCallback(e); status.setText(ImportException.FILE_NOT_VALID_TEXT); return e; } else if (size == 1) { String value = candidates.get(0); if (!file.getAbsolutePath().equals(value) && object.isFileinQueue(value)) { if (close) gateway.closeImport(ctx, userName); status.markedAsDuplicate(); return Boolean.valueOf(true); } File f = new File(value); status.resetFile(f); if (ioContainer == null) status.setNoContainer(); importIc = ic.getContainers().get(0); importIc.setCustomAnnotationList(customAnnotationList); status.setUsedFiles(importIc.getUsedFiles()); //Check after scanning if (status.isMarkedAsCancel()) return Boolean.valueOf(false); return gateway.importImageFile(ctx, object, ioContainer, importIc, status, close, userName); } else { List<ImportContainer> containers = ic.getContainers(); hcs = isHCS(containers); Map<File, StatusLabel> files = new HashMap<File, StatusLabel>(); Iterator<String> i = candidates.iterator(); StatusLabel label; int index = 0; File f; while (i.hasNext()) { f = new File(i.next()); label = new StatusLabel(new FileObject(f)); label.setUsedFiles(containers.get(index).getUsedFiles()); files.put(f, label); index++; } status.setFiles(files); Object v = importCandidates(ctx, files, status, object, ioContainer, customAnnotationList, userID, close, hcs, userName); if (v != null) return v; } } else { //single file let's try to import it. if (ioContainer == null) status.setNoContainer(); ic = gateway.getImportCandidates(ctx, object, file, status); icContainers = ic.getContainers(); if (icContainers.size() == 0) { Object o = status.getImportResult(); if (o instanceof ImportException) { return o; } return new ImportException( ImportException.FILE_NOT_VALID_TEXT); } importIc = icContainers.get(0); importIc.setCustomAnnotationList(customAnnotationList); status.setUsedFiles(importIc.getUsedFiles()); //Check after scanning if (status.isMarkedAsCancel()) return Boolean.valueOf(false); return gateway.importImageFile(ctx, object, ioContainer, importIc, status, close, userName); } } //file import ends. //Checks folder import. ic = gateway.getImportCandidates(ctx, object, file, status); List<ImportContainer> lic = ic.getContainers(); if (lic.size() == 0) { Object o = status.getImportResult(); if (o instanceof ImportException) { return o; } return new ImportException(ImportException.FILE_NOT_VALID_TEXT); } if (status.isMarkedAsCancel()) { return Boolean.valueOf(false); } Map<File, StatusLabel> hcsFiles = new HashMap<File, StatusLabel>(); Map<File, StatusLabel> otherFiles = new HashMap<File, StatusLabel>(); Map<File, StatusLabel> files = new HashMap<File, StatusLabel>(); File f; StatusLabel sl; int n = lic.size(); Iterator<ImportContainer> j = lic.iterator(); ImportContainer c; while (j.hasNext()) { c = j.next(); hcs = c.getIsSPW(); f = c.getFile(); sl = new StatusLabel(new FileObject(f)); sl.setUsedFiles(c.getUsedFiles()); if (hcs) { if (n == 1 && file.list().length > 1) hcsFiles.put(f, sl); else if (n > 1) { if (f.getName().endsWith(ImportableObject.DAT_EXTENSION)) otherFiles.put(f, sl); else hcsFiles.put(f, sl); } else hcsFiles.put(f, sl); } else otherFiles.put(f, sl); files.put(f, sl); } status.setFiles(files); //check candidates and see if we are dealing with HCS data if (hcsFiles.size() > 0) { if (container != null && container instanceof ScreenData) { if (container.getId() <= 0) { //project needs to be created to. createdData = object.hasObjectBeenCreated( container, ctx); if (createdData == null) { try { ioContainer = gateway.saveAndReturnObject(ctx, container.asIObject(), parameters, userName); //register object.addNewDataObject( PojoMapper.asDataObject( ioContainer)); } catch (Exception e) { LogMessage msg = new LogMessage(); msg.print("Cannot create the Screen hosting the " + "plates."); msg.print(e); context.getLogger().error(this, msg); } } } else ioContainer = gateway.findIObject(ctx, container.asIObject()); } importCandidates(ctx, hcsFiles, status, object, ioContainer, customAnnotationList, userID, close, true, userName); } if (otherFiles.size() > 0) { folder = object.createFolderAsContainer(importable); if (folder != null) { //folder //we have to import the image in this container. try { ioContainer = gateway.saveAndReturnObject(ctx, folder.asIObject(), parameters, userName); status.setContainerFromFolder(PojoMapper.asDataObject( ioContainer)); if (folder instanceof DatasetData) { if (container != null) { try { Project p; if (container.getId() <= 0) { //project needs to be created to. createdData = object.hasObjectBeenCreated( container, ctx); if (createdData == null) { project = gateway.saveAndReturnObject( ctx, container.asIObject(), parameters, userName); object.addNewDataObject( PojoMapper.asDataObject(project)); p = (Project) project; } else { p = (Project) createdData.asProject(); } } else { //project already exists. p = (Project) container.asProject(); } link = (ProjectDatasetLink) ModelMapper.linkParentToChild( (Dataset) ioContainer, p); link = (ProjectDatasetLink) gateway.saveAndReturnObject(ctx, link, parameters, userName); } catch (Exception e) { LogMessage msg = new LogMessage(); msg.print("Cannot create the container " + "hosting the data."); msg.print(e); context.getLogger().error(this, msg); } } } } catch (Exception e) { } } else { //folder if (dataset != null) { //dataset try { ioContainer = determineContainer(ctx, dataset, container, object, userName); } catch (Exception e) { LogMessage msg = new LogMessage(); msg.print("Cannot create the container " + "hosting the data."); msg.print(e); context.getLogger().error(this, msg); } } } //import the files that are not hcs files. importCandidates(ctx, otherFiles, status, object, ioContainer, customAnnotationList, userID, close, false, userName); } return Boolean.valueOf(true); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#getSupportedFileFormats() */ public FileFilter[] getSupportedFileFormats() { if (filters != null) return filters; //improve that code. ImageReader reader = new ImageReader(); FileFilter[] array = loci.formats.gui.GUITools.buildFileFilters(reader); if (array != null) { filters = new FileFilter[array.length]; System.arraycopy(array, 0, filters, 0, array.length); } else filters = new FileFilter[0]; return filters; } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#createMovie(SecurityContext, long, long, List, * MovieExportParam) */ public ScriptCallback createMovie(SecurityContext ctx, long imageID, long pixelsID, List<Integer> channels, MovieExportParam param) throws ProcessException, DSOutOfServiceException, DSAccessException { if (imageID <= 0) throw new IllegalArgumentException("Image ID not valid."); if (param == null) throw new IllegalArgumentException("No parameters specified."); if (channels == null) channels = new ArrayList<Integer>(); ExperimenterData exp = (ExperimenterData) context.lookup( LookupNames.CURRENT_USER_DETAILS); return gateway.createMovie(ctx, imageID, pixelsID, exp.getId(), channels, param); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#loadROI(SecurityContext, long, List, long) */ public List<ROIResult> loadROI(SecurityContext ctx, long imageID, List<Long> fileID, long userID) throws DSOutOfServiceException, DSAccessException { if (imageID <= 0) throw new IllegalArgumentException("No image specified."); return gateway.loadROI(ctx, imageID, fileID, userID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#saveROI(SecurityContext, long, long, List) */ public Collection<ROIData> saveROI(SecurityContext ctx, long imageID, long userID, List<ROIData> roiList) throws DSOutOfServiceException, DSAccessException { if (imageID <= 0) throw new IllegalArgumentException("No image specified."); return gateway.saveROI(ctx, imageID, userID, roiList); } /** * Applies the transforms to the specified XML file. * * @param inputXML * The file to transforms. * @param transforms * The collection of transforms. * @param encoding The encoding to use. * @return See above. * @throws Exception * Thrown if an error occurred during the transformations. */ private File applyTransforms(File inputXML, List<InputStream> transforms, String encoding) throws Exception { TransformerFactory factory; Transformer transformer; InputStream stream; Iterator<InputStream> i = transforms.iterator(); File output; InputStream in = null; OutputStream out = null; Resolver resolver = null; while (i.hasNext()) { stream = i.next(); try { factory = TransformerFactory.newInstance(); resolver = new Resolver(); factory.setURIResolver(resolver); output = File.createTempFile( RandomStringUtils.random(60, false, true), "."+XMLFilter.OME_XML); output.deleteOnExit(); Source src = new StreamSource(stream); Templates template = factory.newTemplates(src); transformer = template.newTransformer(); transformer.setParameter(OutputKeys.ENCODING, encoding); out = new FileOutputStream(output); in = new FileInputStream(inputXML); transformer.transform(new StreamSource(in), new StreamResult(out)); inputXML = output; } catch (Exception e) { throw new Exception("Cannot apply transform", e); } finally { if (resolver != null) resolver.close(); if (stream != null) stream.close(); if (in != null) in.close(); if (out != null) out.close(); } } File f = File.createTempFile( RandomStringUtils.random(60, false, true), "."+XMLFilter.OME_XML); FileUtils.copyFile(inputXML, f); return f; } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#exportImageAsOMEObject(SecurityContext, int, long, * File, Target) */ public Object exportImageAsOMEFormat(SecurityContext ctx, int index, long imageID, File file, Target target) throws DSOutOfServiceException, DSAccessException { if (imageID <= 0) throw new IllegalArgumentException("No image specified."); if (file == null) throw new IllegalArgumentException("No File specified."); //To be modified //check file name and index. String path = file.getAbsolutePath(); switch (index) { case EXPORT_AS_OMETIFF: if (!(path.endsWith(OMETIFFFilter.OME_TIFF)|| path.endsWith(OMETIFFFilter.OME_TIF))) { path += "."+OMETIFFFilter.OME_TIFF; file.delete(); file = new File(path); } break; case EXPORT_AS_OME_XML: if (!(path.endsWith(XMLFilter.OME_XML))) { path += "."+XMLFilter.OME_XML; file.delete(); file = new File(path); } } gateway.exportImageAsOMEObject(ctx, index, file, imageID); if (target == null) return file; //Apply the transformations List<InputStream> transforms = target.getTransforms(); if (CollectionUtils.isEmpty(transforms)) return file; //Apply each transform one after another. File r; File tmp = null; File result = null; File transformed = null; RandomAccessInputStream ra = null; String encoding = Constants.ENCODING; try { if (index == EXPORT_AS_OMETIFF) { tmp = File.createTempFile(RandomStringUtils.random(60, false, true), "."+XMLFilter.OME_XML); String c = new TiffParser(file.getAbsolutePath()).getComment(); FileUtils.writeStringToFile(tmp, c, encoding); transformed = applyTransforms(tmp, transforms, encoding); } else { transformed = applyTransforms(file, transforms, encoding); } //Copy the result if (index == EXPORT_AS_OME_XML) { file.delete(); r = new File(path); FileUtils.copyFile(transformed, r); return r; } else { TiffSaver saver = new TiffSaver(file.getAbsolutePath()); ra = new RandomAccessInputStream(file.getAbsolutePath()); saver.overwriteComment(ra, FileUtils.readFileToString(transformed, encoding)); return file; } } catch (Exception e) { throw new IllegalArgumentException("Unable to apply the transforms", e); } finally { if (transformed != null) transformed.delete(); if (tmp != null) tmp.delete(); try { if (ra != null) ra.close(); } catch (Exception e2) {} if (result != null) result.delete(); } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#createFigure(SecurityContext, List, Class, Object) */ public ScriptCallback createFigure(SecurityContext ctx, List<Long> ids, Class type, Object parameters) throws ProcessException, DSOutOfServiceException, DSAccessException { if (parameters == null) throw new IllegalArgumentException("No parameters"); ExperimenterData exp = (ExperimenterData) context.lookup( LookupNames.CURRENT_USER_DETAILS); if (parameters instanceof FigureParam) { FigureParam p = (FigureParam) parameters; return gateway.createFigure(ctx, ids, type, p, exp.getId()); } return null; } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#loadROIFromServer(SecurityContext, long, long) */ public List<ROIResult> loadROIFromServer(SecurityContext ctx, long imageID, long userID) throws DSOutOfServiceException, DSAccessException { if (imageID <= 0) throw new IllegalArgumentException("No image specified."); return gateway.loadROI(ctx, imageID, null, userID); } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#renderOverLays(SecurityContext, long, PlaneDef, * long, Map) */ public Object renderOverLays(SecurityContext ctx, long pixelsID, PlaneDef pd, long tableID, Map<Long, Integer> overlays) throws RenderingServiceException { try { return PixelsServicesFactory.renderOverlays(context, pixelsID, pd, tableID, overlays); } catch (Exception e) { throw new RenderingServiceException("RenderImage", e); } } /** * Implemented as specified by {@link OmeroImageService}. * @see OmeroImageService#runScript(SecurityContext, ScriptObject) */ public ScriptCallback runScript(SecurityContext ctx, ScriptObject script) throws ProcessException, DSOutOfServiceException, DSAccessException { if (script == null) throw new IllegalArgumentException("No script to run."); if (!script.allRequiredValuesPopulated()) throw new ProcessException("No all required parameters have been" + " filled."); return gateway.runScript(ctx, script); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#loadAvailableScriptsWithUI(SecurityContext) */ public List<ScriptObject> loadAvailableScriptsWithUI(SecurityContext ctx) throws DSOutOfServiceException, DSAccessException { return gateway.loadRunnableScriptsWithUI(ctx); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#loadAvailableScripts(SecurityContext, long) */ public List<ScriptObject> loadAvailableScripts(SecurityContext ctx, long userID) throws DSOutOfServiceException, DSAccessException { return gateway.loadRunnableScripts(ctx); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#loadScript(SecurityContext, long) */ public ScriptObject loadScript(SecurityContext ctx, long scriptID) throws ProcessException { return gateway.loadScript(ctx, scriptID); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#getScriptsAsString(SecurityContext) */ public Map<Long, String> getScriptsAsString(SecurityContext ctx) throws DSOutOfServiceException, DSAccessException { return gateway.getScriptsAsString(ctx); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#uploadScript(SecurityContext, ScriptObject) */ public Object uploadScript(SecurityContext ctx, ScriptObject script) throws DSOutOfServiceException, DSAccessException, ValidationException { if (script == null) throw new IllegalArgumentException("No script to upload."); Boolean b = (Boolean) context.lookup( LookupNames.USER_ADMINISTRATOR); boolean value = false; if (b != null) value = b.booleanValue(); return gateway.uploadScript(ctx, script, value); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#loadRatings(SecurityContext, Class, long, long) */ public Collection loadROIMeasurements(SecurityContext ctx, Class type, long id, long userID) throws DSOutOfServiceException, DSAccessException { if (ImageData.class.equals(type)) { return gateway.loadROIMeasurements(ctx, id, userID); } List<Long> ids = null; if (userID != -1) { ids = new ArrayList<Long>(1); ids.add(userID); } List<Long> nodeIds = new ArrayList<Long>(1); nodeIds.add(id); List<Class> types = new ArrayList<Class>(); types.add(FileAnnotationData.class); Map map = gateway.loadAnnotations(ctx, type, nodeIds, types, ids, new Parameters()); if (map == null || map.size() == 0) return new ArrayList(); Collection l = (Collection) map.get(id); List<FileAnnotationData> list = new ArrayList<FileAnnotationData>(); if (l != null) { Iterator i = l.iterator(); FileAnnotationData fa; String ns; while (i.hasNext()) { fa = (FileAnnotationData) i.next(); ns = fa.getNameSpace(); if (FileAnnotationData.MEASUREMENT_NS.equals(ns)) list.add(fa); } } return list; } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#getFSThumbnailSet(SecurityContext, List, int, long) */ public Map<DataObject, BufferedImage> getFSThumbnailSet(SecurityContext ctx, List<DataObject> files, int maxLength, long userID) throws DSAccessException, DSOutOfServiceException, FSAccessException { Map<DataObject, BufferedImage> m = new HashMap<DataObject, BufferedImage>(); if (files == null || files.size() == 0) return m; Iterator<DataObject> i = files.iterator(); DataObject file; if (!isBinaryAvailable()) { while (i.hasNext()) { file = i.next(); m.put(file, null); } return m; } FSFileSystemView view = gateway.getFSRepositories(ctx, userID); String path; while (i.hasNext()) { file = i.next(); path = view.getThumbnail(file); try { if (path != null) m.put(file, Factory.scaleBufferedImage(createImage(path), maxLength)); else m.put(file, null); } catch (Exception e) { m.put(file, null); } } return m; } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#getExperimenterThumbnailSet(SecurityContext, List, int) */ public Map<DataObject, BufferedImage> getExperimenterThumbnailSet( SecurityContext ctx, List<DataObject> experimenters, int maxLength) throws DSAccessException, DSOutOfServiceException { Map<DataObject, BufferedImage> m = new HashMap<DataObject, BufferedImage>(); if (experimenters == null || experimenters.size() == 0) return m; List<Long> ids = new ArrayList<Long>(); Iterator<DataObject> i = experimenters.iterator(); DataObject exp; if (!isBinaryAvailable()) { while (i.hasNext()) { m.put(i.next(), null); } return m; } String path; List<Class> types = new ArrayList<Class>(); types.add(FileAnnotationData.class); Map<Long, DataObject> exps = new HashMap<Long, DataObject>(); while (i.hasNext()) { exp = i.next(); ids.add(exp.getId()); m.put(exp, null); exps.put(exp.getId(), exp); } Map annotations; try { annotations = gateway.loadAnnotations(ctx, ExperimenterData.class, ids, types, new ArrayList(), new Parameters()); } catch (Exception e) { return m; } if (annotations == null || annotations.size() == 0) return m; //Make Entry entry; Iterator j = annotations.entrySet().iterator(); Long id; Collection values; Iterator k; Object object; String ns; FileAnnotationData fa, ann; BufferedImage img; while (j.hasNext()) { entry = (Entry) j.next(); id = (Long) entry.getKey(); values = (Collection) entry.getValue(); k = values.iterator(); ann = null; while (k.hasNext()) { object = k.next(); if (object instanceof FileAnnotationData) { fa = (FileAnnotationData) object; if (FileAnnotationData.EXPERIMENTER_PHOTO_NS.equals( fa.getNameSpace())) { if (ann == null) ann = fa; else { if (fa.getId() > ann.getId()) ann = fa; } } } } if (ann != null) { exp = exps.get(id); try { img = createImage(gateway.getUserPhoto(ctx, ann.getFileID(), ann.getFileSize())); m.put(exps.get(id), Factory.scaleBufferedImage(img, maxLength)); } catch (Exception e) { //nothing to do. } } } return m; } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#saveAs(SecurityContext, SaveAsParam) */ public ScriptCallback saveAs(SecurityContext ctx, SaveAsParam param) throws ProcessException, DSAccessException, DSOutOfServiceException { if (param == null) throw new IllegalArgumentException("No parameters specified."); List<DataObject> objects = param.getObjects(); if (objects == null || objects.size() == 0) throw new IllegalArgumentException("No objects specified."); ExperimenterData exp = (ExperimenterData) context.lookup( LookupNames.CURRENT_USER_DETAILS); return gateway.saveAs(ctx, exp.getId(), param); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#isLargeImage(SecurityContext, long) */ public Boolean isLargeImage(SecurityContext ctx, long pixelsId) throws DSAccessException, DSOutOfServiceException { return gateway.isLargeImage(ctx, pixelsId); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#getFileSet(SecurityContext, long) */ public Set<DataObject> getFileSet(SecurityContext ctx, long imageId) throws DSAccessException, DSOutOfServiceException { return gateway.getFileSet(ctx, Arrays.asList(imageId)); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#createThumbnailStore(SecurityContext) */ public ThumbnailStorePrx createThumbnailStore(SecurityContext ctx) throws DSAccessException, DSOutOfServiceException { if (ctx != null) return gateway.getGateway().createThumbnailStore(ctx); return null; } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#getRenderingDef(SecurityContext, long, long) */ public Long getRenderingDef(SecurityContext ctx, long pixelsID, long userID) throws DSOutOfServiceException, DSAccessException { RenderingDef def = gateway.getRenderingDef(ctx, pixelsID, userID); if (def == null) return -1L; return def.getId().getValue(); } /** * Implemented as specified by {@link OmeroDataService}. * @see OmeroImageService#getRenderingDef(SecurityContext, long) */ public RndProxyDef getSettings(SecurityContext ctx, long rndID) throws DSOutOfServiceException, DSAccessException { if (rndID < 0) return null; RenderingDef def = gateway.getRenderingDef(ctx, rndID); if (def == null) return null; return PixelsServicesFactory.convert(def); } /** * Implemented as specified by {@link OmeroDataService}. * * @see OmeroImageService#createPixelsStore(SecurityContext) */ public RawPixelsStorePrx createPixelsStore(SecurityContext ctx) throws DSAccessException, DSOutOfServiceException { if (ctx != null) return gateway.getGateway().createPixelsStore(ctx); return null; } }